From afc235a59226f7eb44c74e23f25636bf38a1ae05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Colin?= Date: Wed, 10 Jan 2024 10:52:10 +0100 Subject: [PATCH] check --- README.md | 112 + app/.babelrc | 5 + app/.bundle/config | 2 + app/.env.example | 6 + app/.eslintrc.js | 4 + app/.gitignore | 70 + app/.prettierrc.js | 7 + app/App.tsx | 652 + app/Gemfile | 6 + app/Gemfile.lock | 100 + app/README.md | 54 + app/__tests__/App.test.tsx | 17 + app/android/app/build.gradle | 131 + app/android/app/debug.keystore | Bin 0 -> 2257 bytes app/android/app/proguard-rules.pro | 10 + app/android/app/src/debug/AndroidManifest.xml | 16 + .../awesomeproject/ReactNativeFlipper.java | 75 + app/android/app/src/main/AndroidManifest.xml | 36 + app/android/app/src/main/assets/masterList | Bin 0 -> 710780 bytes .../java/com/awesomeproject/MainActivity.java | 55 + .../com/awesomeproject/MainApplication.java | 67 + .../res/drawable/rn_edit_text_material.xml | 36 + .../main/res/mipmap-hdpi/passport_logo.png | Bin 0 -> 7079 bytes .../main/res/mipmap-mdpi/passport_logo.png | Bin 0 -> 3566 bytes .../main/res/mipmap-xhdpi/passport_logo.png | Bin 0 -> 11746 bytes .../main/res/mipmap-xxhdpi/passport_logo.png | Bin 0 -> 24805 bytes .../main/res/mipmap-xxxhdpi/passport_logo.png | Bin 0 -> 43194 bytes .../app/src/main/res/values/strings.xml | 3 + .../app/src/main/res/values/styles.xml | 9 + .../app/src/main/res/xml/nfc_tech_filter.xml | 5 + .../awesomeproject/ReactNativeFlipper.java | 20 + app/android/build.gradle | 38 + app/android/gradle.properties | 44 + app/android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 61574 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + app/android/gradlew | 244 + app/android/gradlew.bat | 92 + .../react-native-passport-reader/.gitignore | 2 + .../ORIGINAL_LICENSE.md | 15 + .../react-native-passport-reader/README.md | 61 + .../android/build.gradle | 63 + .../android/src/main/AndroidManifest.xml | 4 + .../android/src/main/assets/masterList | Bin 0 -> 710780 bytes .../src/main/java/io/tradle/nfc/ImageUtil.kt | 57 + .../io/tradle/nfc/RNPassportReaderModule.kt | 649 + .../io/tradle/nfc/RNPassportReaderPackage.kt | 35 + .../index.android.js | 28 + .../react-native-passport-reader/package.json | 15 + app/android/settings.gradle | 6 + app/app.json | 4 + app/ark-circom-passport/.gitignore | 3 + app/ark-circom-passport/Cargo.lock | 4958 +++++ app/ark-circom-passport/Cargo.toml | 46 + app/ark-circom-passport/README.md | 6 + .../artifacts/verifier_artifact.json | 1 + app/ark-circom-passport/rust-toolchain.toml | 3 + app/ark-circom-passport/src/passport.rs | 460 + app/ark-circom-passport/src/zkey.rs | 379 + app/babel.config.js | 6 + app/countries.md | 30 + app/declarations.d.ts | 1 + app/deployments/Groth16Verifier.json | 45 + app/deployments/ProofOfPassport.json | 655 + app/deployments/addresses.json | 1 + app/index.js | 9 + app/ios/.xcode.env | 11 + app/ios/AwesomeProject-Bridging-Header.h | 5 + .../AwesomeProject.xcodeproj/project.pbxproj | 712 + .../xcschemes/AwesomeProject.xcscheme | 88 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../AES_3DES_DESEncryption.swift | 368 + app/ios/AwesomeProject/AppDelegate.h | 6 + app/ios/AwesomeProject/AppDelegate.mm | 26 + .../AwesomeProject.entitlements | 10 + .../DataGroups/ActiveAuthenticationInfo.swift | 62 + app/ios/AwesomeProject/DataGroups/COM.swift | 59 + .../DataGroups/CardAccess.swift | 31 + .../DataGroups/ChipAuthenticationInfo.swift | 128 + .../ChipAuthenticationPublicKeyInfo.swift | 46 + .../AwesomeProject/DataGroups/DataGroup.swift | 78 + .../DataGroups/DataGroup1.swift | 108 + .../DataGroups/DataGroup11.swift | 62 + .../DataGroups/DataGroup12.swift | 72 + .../DataGroups/DataGroup14.swift | 31 + .../DataGroups/DataGroup15.swift | 40 + .../DataGroups/DataGroup2.swift | 164 + .../DataGroups/DataGroup7.swift | 44 + .../DataGroups/DataGroupId.swift | 98 + .../DataGroups/NotImplementedDG.swift | 11 + .../AwesomeProject/DataGroups/PACEInfo.swift | 397 + app/ios/AwesomeProject/DataGroups/SOD.swift | 234 + .../DataGroups/SecurityInfo.swift | 130 + .../AppIcon.appiconset/Contents.json | 53 + .../Images.xcassets/Contents.json | 6 + app/ios/AwesomeProject/Info.plist | 56 + .../NFCViewDisplayMessage.swift | 50 + app/ios/AwesomeProject/OpenSSLUtils.swift | 697 + app/ios/AwesomeProject/PACEHandler.swift | 614 + app/ios/AwesomeProject/PassportReader.swift | 405 + app/ios/AwesomeProject/ResponseAPDU.swift | 17 + app/ios/AwesomeProject/SecureMessaging.swift | 292 + .../SecureMessagingSessionKeyGenerator.swift | 149 + .../AwesomeProject/SimpleASN1DumpParser.swift | 166 + app/ios/AwesomeProject/TagReader.swift | 349 + app/ios/AwesomeProject/Utils.swift | 415 + app/ios/AwesomeProject/X509Wrapper.swift | 161 + app/ios/AwesomeProject/main.m | 10 + app/ios/AwesomeProject/masterList.pem | 32 + .../AwesomeProjectTests/AwesomeProjectTests.m | 66 + app/ios/AwesomeProjectTests/Info.plist | 24 + app/ios/NFCPassportReader/BACHandler.swift | 193 + .../ChipAuthenticationHandler.swift | 223 + app/ios/NFCPassportReader/DataGroupHash.swift | 16 + .../NFCPassportReader/DataGroupParser.swift | 36 + app/ios/NFCPassportReader/Errors.swift | 145 + .../NFCPassportReader/LaunchScreen.storyboard | 47 + app/ios/NFCPassportReader/Logging.swift | 68 + .../NFCPassportReader/NFCPassportModel.swift | 534 + app/ios/PassportReader.m | 19 + app/ios/PassportReader.swift | 101 + app/ios/Podfile | 65 + app/ios/Podfile.lock | 581 + app/jest.config.js | 3 + app/metro.config.js | 23 + app/package.json | 59 + app/scripts/build_rust.sh | 10 + app/tsconfig.json | 3 + app/utils/snarkjs.ts | 45 + app/utils/utils.ts | 40 + app/yarn.lock | 8597 ++++++++ circuits/.gitignore | 3 + circuits/README.md | 37 + circuits/circuits/helpers/LICENSE | 21 + circuits/circuits/helpers/bigint.circom | 561 + circuits/circuits/helpers/bigint_func.circom | 442 + circuits/circuits/helpers/extract.circom | 175 + circuits/circuits/helpers/fp.circom | 145 + circuits/circuits/helpers/utils.circom | 149 + circuits/circuits/passport_verifier.circom | 76 + circuits/circuits/proof_of_passport.circom | 56 + circuits/circuits/rsa/LICENSE | 21 + circuits/circuits/rsa/rsa.circom | 156 + circuits/circuits/sha256Bytes.circom | 28 + circuits/package.json | 27 + circuits/scripts/build_circuit.sh | 48 + circuits/scripts/mrzToSig.ts | 79 + circuits/test/passport.test.ts | 215 + circuits/tsconfig.json | 8 + circuits/yarn.lock | 1006 + common/.gitignore | 2 + common/README.md | 3 + common/package.json | 10 + common/src/constants/constants.ts | 263 + common/src/utils/passportData.ts | 95 + common/src/utils/passportDataStatic.ts | 19 + common/src/utils/types.ts | 10 + common/src/utils/utils.ts | 179 + common/tsconfig.json | 8 + common/yarn.lock | 44 + contracts/.gitignore | 11 + contracts/README.md | 15 + contracts/contracts/ProofOfPassport.sol | 203 + contracts/contracts/Verifier.sol | 275 + contracts/contracts/libraries/Base64.sol | 63 + contracts/contracts/libraries/Formatter.sol | 166 + contracts/hardhat.config.ts | 25 + contracts/package-lock.json | 16751 ++++++++++++++++ contracts/package.json | 17 + contracts/scripts/deploy.ts | 51 + contracts/scripts/mint.ts | 93 + contracts/test/ProofOfPassport.ts | 274 + contracts/tsconfig.json | 10 + proof-of-passport | 1 + 174 files changed, 48714 insertions(+) create mode 100644 README.md create mode 100644 app/.babelrc create mode 100644 app/.bundle/config create mode 100644 app/.env.example create mode 100644 app/.eslintrc.js create mode 100644 app/.gitignore create mode 100644 app/.prettierrc.js create mode 100644 app/App.tsx create mode 100644 app/Gemfile create mode 100644 app/Gemfile.lock create mode 100644 app/README.md create mode 100644 app/__tests__/App.test.tsx create mode 100644 app/android/app/build.gradle create mode 100644 app/android/app/debug.keystore create mode 100644 app/android/app/proguard-rules.pro create mode 100644 app/android/app/src/debug/AndroidManifest.xml create mode 100644 app/android/app/src/debug/java/com/awesomeproject/ReactNativeFlipper.java create mode 100644 app/android/app/src/main/AndroidManifest.xml create mode 100644 app/android/app/src/main/assets/masterList create mode 100644 app/android/app/src/main/java/com/awesomeproject/MainActivity.java create mode 100644 app/android/app/src/main/java/com/awesomeproject/MainApplication.java create mode 100644 app/android/app/src/main/res/drawable/rn_edit_text_material.xml create mode 100644 app/android/app/src/main/res/mipmap-hdpi/passport_logo.png create mode 100644 app/android/app/src/main/res/mipmap-mdpi/passport_logo.png create mode 100644 app/android/app/src/main/res/mipmap-xhdpi/passport_logo.png create mode 100644 app/android/app/src/main/res/mipmap-xxhdpi/passport_logo.png create mode 100644 app/android/app/src/main/res/mipmap-xxxhdpi/passport_logo.png create mode 100644 app/android/app/src/main/res/values/strings.xml create mode 100644 app/android/app/src/main/res/values/styles.xml create mode 100644 app/android/app/src/main/res/xml/nfc_tech_filter.xml create mode 100644 app/android/app/src/release/java/com/awesomeproject/ReactNativeFlipper.java create mode 100644 app/android/build.gradle create mode 100644 app/android/gradle.properties create mode 100644 app/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 app/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 app/android/gradlew create mode 100644 app/android/gradlew.bat create mode 100644 app/android/react-native-passport-reader/.gitignore create mode 100644 app/android/react-native-passport-reader/ORIGINAL_LICENSE.md create mode 100644 app/android/react-native-passport-reader/README.md create mode 100644 app/android/react-native-passport-reader/android/build.gradle create mode 100644 app/android/react-native-passport-reader/android/src/main/AndroidManifest.xml create mode 100644 app/android/react-native-passport-reader/android/src/main/assets/masterList create mode 100644 app/android/react-native-passport-reader/android/src/main/java/io/tradle/nfc/ImageUtil.kt create mode 100644 app/android/react-native-passport-reader/android/src/main/java/io/tradle/nfc/RNPassportReaderModule.kt create mode 100644 app/android/react-native-passport-reader/android/src/main/java/io/tradle/nfc/RNPassportReaderPackage.kt create mode 100644 app/android/react-native-passport-reader/index.android.js create mode 100644 app/android/react-native-passport-reader/package.json create mode 100644 app/android/settings.gradle create mode 100644 app/app.json create mode 100644 app/ark-circom-passport/.gitignore create mode 100644 app/ark-circom-passport/Cargo.lock create mode 100644 app/ark-circom-passport/Cargo.toml create mode 100644 app/ark-circom-passport/README.md create mode 100644 app/ark-circom-passport/artifacts/verifier_artifact.json create mode 100644 app/ark-circom-passport/rust-toolchain.toml create mode 100644 app/ark-circom-passport/src/passport.rs create mode 100644 app/ark-circom-passport/src/zkey.rs create mode 100644 app/babel.config.js create mode 100644 app/countries.md create mode 100644 app/declarations.d.ts create mode 100644 app/deployments/Groth16Verifier.json create mode 100644 app/deployments/ProofOfPassport.json create mode 100644 app/deployments/addresses.json create mode 100644 app/index.js create mode 100644 app/ios/.xcode.env create mode 100644 app/ios/AwesomeProject-Bridging-Header.h create mode 100644 app/ios/AwesomeProject.xcodeproj/project.pbxproj create mode 100644 app/ios/AwesomeProject.xcodeproj/xcshareddata/xcschemes/AwesomeProject.xcscheme create mode 100644 app/ios/AwesomeProject.xcworkspace/contents.xcworkspacedata create mode 100644 app/ios/AwesomeProject.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 app/ios/AwesomeProject/AES_3DES_DESEncryption.swift create mode 100644 app/ios/AwesomeProject/AppDelegate.h create mode 100644 app/ios/AwesomeProject/AppDelegate.mm create mode 100644 app/ios/AwesomeProject/AwesomeProject.entitlements create mode 100644 app/ios/AwesomeProject/DataGroups/ActiveAuthenticationInfo.swift create mode 100644 app/ios/AwesomeProject/DataGroups/COM.swift create mode 100644 app/ios/AwesomeProject/DataGroups/CardAccess.swift create mode 100644 app/ios/AwesomeProject/DataGroups/ChipAuthenticationInfo.swift create mode 100644 app/ios/AwesomeProject/DataGroups/ChipAuthenticationPublicKeyInfo.swift create mode 100644 app/ios/AwesomeProject/DataGroups/DataGroup.swift create mode 100644 app/ios/AwesomeProject/DataGroups/DataGroup1.swift create mode 100644 app/ios/AwesomeProject/DataGroups/DataGroup11.swift create mode 100644 app/ios/AwesomeProject/DataGroups/DataGroup12.swift create mode 100644 app/ios/AwesomeProject/DataGroups/DataGroup14.swift create mode 100644 app/ios/AwesomeProject/DataGroups/DataGroup15.swift create mode 100644 app/ios/AwesomeProject/DataGroups/DataGroup2.swift create mode 100644 app/ios/AwesomeProject/DataGroups/DataGroup7.swift create mode 100644 app/ios/AwesomeProject/DataGroups/DataGroupId.swift create mode 100644 app/ios/AwesomeProject/DataGroups/NotImplementedDG.swift create mode 100644 app/ios/AwesomeProject/DataGroups/PACEInfo.swift create mode 100644 app/ios/AwesomeProject/DataGroups/SOD.swift create mode 100644 app/ios/AwesomeProject/DataGroups/SecurityInfo.swift create mode 100644 app/ios/AwesomeProject/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 app/ios/AwesomeProject/Images.xcassets/Contents.json create mode 100644 app/ios/AwesomeProject/Info.plist create mode 100644 app/ios/AwesomeProject/NFCViewDisplayMessage.swift create mode 100644 app/ios/AwesomeProject/OpenSSLUtils.swift create mode 100644 app/ios/AwesomeProject/PACEHandler.swift create mode 100644 app/ios/AwesomeProject/PassportReader.swift create mode 100644 app/ios/AwesomeProject/ResponseAPDU.swift create mode 100644 app/ios/AwesomeProject/SecureMessaging.swift create mode 100644 app/ios/AwesomeProject/SecureMessagingSessionKeyGenerator.swift create mode 100644 app/ios/AwesomeProject/SimpleASN1DumpParser.swift create mode 100644 app/ios/AwesomeProject/TagReader.swift create mode 100644 app/ios/AwesomeProject/Utils.swift create mode 100644 app/ios/AwesomeProject/X509Wrapper.swift create mode 100644 app/ios/AwesomeProject/main.m create mode 100644 app/ios/AwesomeProject/masterList.pem create mode 100644 app/ios/AwesomeProjectTests/AwesomeProjectTests.m create mode 100644 app/ios/AwesomeProjectTests/Info.plist create mode 100644 app/ios/NFCPassportReader/BACHandler.swift create mode 100644 app/ios/NFCPassportReader/ChipAuthenticationHandler.swift create mode 100644 app/ios/NFCPassportReader/DataGroupHash.swift create mode 100644 app/ios/NFCPassportReader/DataGroupParser.swift create mode 100644 app/ios/NFCPassportReader/Errors.swift create mode 100644 app/ios/NFCPassportReader/LaunchScreen.storyboard create mode 100644 app/ios/NFCPassportReader/Logging.swift create mode 100644 app/ios/NFCPassportReader/NFCPassportModel.swift create mode 100644 app/ios/PassportReader.m create mode 100644 app/ios/PassportReader.swift create mode 100644 app/ios/Podfile create mode 100644 app/ios/Podfile.lock create mode 100644 app/jest.config.js create mode 100644 app/metro.config.js create mode 100644 app/package.json create mode 100755 app/scripts/build_rust.sh create mode 100644 app/tsconfig.json create mode 100644 app/utils/snarkjs.ts create mode 100644 app/utils/utils.ts create mode 100644 app/yarn.lock create mode 100644 circuits/.gitignore create mode 100644 circuits/README.md create mode 100644 circuits/circuits/helpers/LICENSE create mode 100644 circuits/circuits/helpers/bigint.circom create mode 100644 circuits/circuits/helpers/bigint_func.circom create mode 100644 circuits/circuits/helpers/extract.circom create mode 100644 circuits/circuits/helpers/fp.circom create mode 100644 circuits/circuits/helpers/utils.circom create mode 100644 circuits/circuits/passport_verifier.circom create mode 100644 circuits/circuits/proof_of_passport.circom create mode 100644 circuits/circuits/rsa/LICENSE create mode 100644 circuits/circuits/rsa/rsa.circom create mode 100644 circuits/circuits/sha256Bytes.circom create mode 100644 circuits/package.json create mode 100755 circuits/scripts/build_circuit.sh create mode 100644 circuits/scripts/mrzToSig.ts create mode 100644 circuits/test/passport.test.ts create mode 100644 circuits/tsconfig.json create mode 100644 circuits/yarn.lock create mode 100644 common/.gitignore create mode 100644 common/README.md create mode 100644 common/package.json create mode 100644 common/src/constants/constants.ts create mode 100644 common/src/utils/passportData.ts create mode 100644 common/src/utils/passportDataStatic.ts create mode 100644 common/src/utils/types.ts create mode 100644 common/src/utils/utils.ts create mode 100644 common/tsconfig.json create mode 100644 common/yarn.lock create mode 100644 contracts/.gitignore create mode 100644 contracts/README.md create mode 100644 contracts/contracts/ProofOfPassport.sol create mode 100644 contracts/contracts/Verifier.sol create mode 100644 contracts/contracts/libraries/Base64.sol create mode 100644 contracts/contracts/libraries/Formatter.sol create mode 100644 contracts/hardhat.config.ts create mode 100644 contracts/package-lock.json create mode 100644 contracts/package.json create mode 100644 contracts/scripts/deploy.ts create mode 100644 contracts/scripts/mint.ts create mode 100644 contracts/test/ProofOfPassport.ts create mode 100644 contracts/tsconfig.json create mode 160000 proof-of-passport diff --git a/README.md b/README.md new file mode 100644 index 00000000..b62c6b50 --- /dev/null +++ b/README.md @@ -0,0 +1,112 @@ +![DALLΒ·E 2023-10-25 11 57 47 - tight AF](https://github.com/zk-passport/proof-of-passport/assets/62038140/514ae671-3c02-434f-ac6a-31ce20eec24d) + +Monorepo for the Proof of Passport protocol. + +Proof of Passport lets users scan the NFC chip in their government-issued passport and prove the correctness of the signature in a zk-SNARK. +This unlocks two interesting use cases: +- For sybil-resistance, proof of passport can provide a source of unique identity. +- For identity and privacy, proof of passport allows selective disclosure of private data. For instance, users can disclose their nationality or their date of birth without revealing any other private information. + +As a first application, users who can prove they indeed hold a valid passport can verify this proof on-chain to mint a Soulbound Token (SBT). + +## Subdirectories + +- `app`: Mobile app +- `circuits`: Circom circuits +- `contracts`: Solidity contracts + +## Roadmap + +- βœ… Basic passport verifier circuit +- 🚧 Optimization +- 🚧 Selective disclosure +- βœ… Basic react native frontend +- βœ… Passport verification pipeline, android +- 🚧 Passport verification pipeline, iOS +- 🚧 Reimplementation of the passport NFC specs in javascript +- 🚧 Contracts +- 🚧 On-chain registry of CSCA pubkeys based on the official ICAO masterlist + +## FAQ + +#### What exactly is being signed ? + +The circuit looks like this: + +

+ +

+ +Most of the data of interest is in the Datagroup 1, which contains the following info: +- First name +- Last name +- Nationality +- Date of birth +- Gender +- Expiration date of passport +- Passport number + +This goes through a bunch of hashes, concatenations with other data, and then is signed. By verifying the signature, we can make sure the personnal information cannot be altered. + +#### What is the signature algorithm ? + +Most countries use RSA with sha256 but some of them use other signature algorithms like ECDSA and other hash functions like SHA-512. You can find a summary of the signature algorithm used [here](https://github.com/zk-passport/modulus-extractooor/blob/main/signature_algorithms.json) + +#### I just read my passport but it says my signature algorithm is not implemented. What do I do ? + +Currently we only support the most common one `SHA256withRSA`. We will support the others shortly. Feel free to try your hand at implementing one! + +#### What's the ICAO ? + +The International Civil Aviation Organization (ICAO) is a specialized agency of the United Nations. Among other things, it establishes the specifications for passports, that have to be followed by all countries. The full passport specs are available [here](https://www.icao.int/publications/pages/publication.aspx?docnum=9303). + +#### Where can I see those public keys ? + +You can download the full list of public keys on the [ICAO website](https://download.pkd.icao.int/), in the strange `.ldif` format. The parsed list is [here](https://github.com/zk-passport/modulus-extractooor/blob/main/publicKeysParsed.json) + +#### What can be proven ? + +Here is all that can be proven: + +

+ +

+ +Note that we can't access DG3 and DG4 which are optional fingerprint and iris scan without government authorization. + +#### Even the photo is signed ?! + +Yep. Currently we don't use it. If you have an idea of some fun zkml to do with it, let us know! + +#### When I mint a Proof of passport SBT, what prevents someone else to frontrun my transaction ? + +The SBT circuit includes a commitment to your address. If someone else tries to mint it, they will mint it to your address. + +## Project Ideas + +- Integrate Proof of Passport to Gitcoin passport or a similar system to allow better sybil resistance in quadratic funding +- Combine with other sources of identity to provide quantified levels of uniqueness, [totem](https://github.com/0xturboblitz/totem)-style. Examples can be [anon aadhaar](https://github.com/privacy-scaling-explorations/anon-aadhaar), [Japan's my number cards](https://github.com/MynaWallet/monorepo) or [Taiwan DID](https://github.com/tw-did/tw-did/) + +- Add Proof of Passport as a [Zupass](https://github.com/proofcarryingdata/zupass) PCD +- Build a social network/anonymous message board for people from one specific country +- Create a sybil-resistance tool to protect social networks against spambots +- Do an airdrop farming protection tool +- Gate an adult content website to a specific age +- Passport Wallet: use [active authentication](https://en.wikipedia.org/wiki/Biometric_passport#:~:text=Active%20Authentication%20(AA),Using%20AA%20is%20optional.) to build a wallet, a multisig or a recovery module using passport signatures + +## Licensing + +Everything we write is MIT licensed. Circom and circomlib are GPL tho. + +## Contributing + +We are actively looking for contributors. Please check the [open issues](https://github.com/zk-passport/proof-of-passport/issues) if you don't know were to start! + +## Contact us + +Contact me @FlorentTavernier on telegram for any feedback. + +Thanks to [Youssef](https://github.com/yssf-io), [Aayush](https://twitter.com/yush_g), [Andy](https://twitter.com/viv_boop), [Vivek](https://twitter.com/viv_boop), [Marcus](https://github.com/base0010) and [Andrew](https://github.com/AndrewCLu) for contributing ideas and helping build this technology, and to [EF PSE](https://pse.dev/) for supporting this work through grants! + + +//check \ No newline at end of file diff --git a/app/.babelrc b/app/.babelrc new file mode 100644 index 00000000..efd56e87 --- /dev/null +++ b/app/.babelrc @@ -0,0 +1,5 @@ +{ + "plugins": [ + ["module:react-native-dotenv"] + ] +} \ No newline at end of file diff --git a/app/.bundle/config b/app/.bundle/config new file mode 100644 index 00000000..848943bb --- /dev/null +++ b/app/.bundle/config @@ -0,0 +1,2 @@ +BUNDLE_PATH: "vendor/bundle" +BUNDLE_FORCE_RUBY_PLATFORM: 1 diff --git a/app/.env.example b/app/.env.example new file mode 100644 index 00000000..0919aa6c --- /dev/null +++ b/app/.env.example @@ -0,0 +1,6 @@ +# replace with your values +DEFAULT_PNUMBER=13HF12435 +DEFAULT_DOB=060222 +DEFAULT_DOE=240312 +DEFAULT_ADDRESS=0xf4a...a2f +LOCAL_IP=http://192.168.1.1:3000 \ No newline at end of file diff --git a/app/.eslintrc.js b/app/.eslintrc.js new file mode 100644 index 00000000..187894b6 --- /dev/null +++ b/app/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: '@react-native', +}; diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 00000000..935904a8 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,70 @@ +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +ios/.xcode.env.local + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml +*.hprof +.cxx/ +*.keystore +!debug.keystore + +# node.js +# +node_modules/ +npm-debug.log +yarn-error.log + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/ + +**/fastlane/report.xml +**/fastlane/Preview.html +**/fastlane/screenshots +**/fastlane/test_output + +# Bundle artifact +*.jsbundle + +# Ruby / CocoaPods +/ios/Pods/ +/vendor/bundle/ + +# Temporary files created by Metro to check the health of the file watcher +.metro-health-check* + +# testing +/coverage + +.env + +.expo/ diff --git a/app/.prettierrc.js b/app/.prettierrc.js new file mode 100644 index 00000000..2b540746 --- /dev/null +++ b/app/.prettierrc.js @@ -0,0 +1,7 @@ +module.exports = { + arrowParens: 'avoid', + bracketSameLine: true, + bracketSpacing: false, + singleQuote: true, + trailingComma: 'all', +}; diff --git a/app/App.tsx b/app/App.tsx new file mode 100644 index 00000000..0183e7ad --- /dev/null +++ b/app/App.tsx @@ -0,0 +1,652 @@ +import React, {useEffect, useState} from 'react'; +import { + SafeAreaView, + ScrollView, + StatusBar, + StyleSheet, + useColorScheme, + NativeModules, + DeviceEventEmitter, + TextInput, +} from 'react-native'; + +import { + Colors, + DebugInstructions, + Header, + LearnMoreLinks, + ReloadInstructions, +} from 'react-native/Libraries/NewAppScreen'; +import { + Text, + GluestackUIProvider, + Checkbox, + CheckboxIndicator, + CheckboxIcon, + CheckIcon, + CheckboxLabel, + Input, + InputField, + ButtonText, + ButtonIcon, + Button, + Spinner, + View, + ButtonSpinner, +} from "@gluestack-ui/themed" +import { config } from "@gluestack-ui/config" // Optional if you want to use default theme +import Toast, { BaseToast, ErrorToast, SuccessToast, ToastProps } from 'react-native-toast-message'; + +// @ts-ignore +import PassportReader from 'react-native-passport-reader'; +import {getFirstName, formatDuration, checkInputs } from './utils/utils'; +import { + DEFAULT_PNUMBER, + DEFAULT_DOB, + DEFAULT_DOE, + DEFAULT_ADDRESS, +} from '@env'; +import {DataHash, PassportData} from '../common/src/utils/types'; +import {AWS_ENDPOINT} from '../common/src/constants/constants'; +import { + hash, + toUnsignedByte, + bytesToBigDecimal, + dataHashesObjToArray, + formatAndConcatenateDataHashes, + formatMrz, + splitToWords +} from '../common/src/utils/utils'; +import { samplePassportData } from '../common/src/utils/passportDataStatic'; + +import "@ethersproject/shims" +import { ethers } from "ethers"; +import axios from 'axios'; +import groth16ExportSolidityCallData from './utils/snarkjs'; +import contractAddresses from "./deployments/addresses.json" +import proofOfPassportArtefact from "./deployments/ProofOfPassport.json"; + +console.log('DEFAULT_PNUMBER', DEFAULT_PNUMBER); + +const SKIP_SCAN = false; + +const attributeToPosition = { + issuing_state: [2, 5], + name: [5, 44], + passport_number: [44, 52], + nationality: [54, 57], + date_of_birth: [57, 63], + gender: [64, 65], + expiry_date: [65, 71], +} + +function App(): JSX.Element { + const isDarkMode = useColorScheme() === 'dark'; + const [passportNumber, setPassportNumber] = useState(DEFAULT_PNUMBER ?? ''); + const [dateOfBirth, setDateOfBirth] = useState(DEFAULT_DOB ?? ''); + const [dateOfExpiry, setDateOfExpiry] = useState(DEFAULT_DOE ?? ''); + const [address, setAddress] = useState(DEFAULT_ADDRESS ?? ''); + const [passportData, setPassportData] = useState(null); + const [step, setStep] = useState('enterDetails'); + const [testResult, setTestResult] = useState(null); + const [error, setError] = useState(null); + + const [generatingProof, setGeneratingProof] = useState(false); + + const [proofTime, setProofTime] = useState(0); + const [totalTime, setTotalTime] = useState(0); + const [proof, setProof] = useState<{proof: string, inputs: string} | null>(null); + const [minting, setMinting] = useState(false); + const [mintText, setMintText] = useState(null); + + const [disclosure, setDisclosure] = useState({ + issuing_state: false, + name: false, + passport_number: false, + nationality: false, + date_of_birth: false, + gender: false, + expiry_date: false, + }); + + const handleDisclosureChange = (field: keyof typeof disclosure) => { + setDisclosure( + {...disclosure, + [field]: !disclosure[field] + }); + }; + + const backgroundStyle = { + backgroundColor: isDarkMode ? Colors.darker : Colors.lighter, + }; + + useEffect(() => { + const logEventListener = DeviceEventEmitter.addListener('LOG_EVENT', e => { + console.log(e); + }); + + return () => { + logEventListener.remove(); + }; + }, []); + + useEffect(() => { + if (SKIP_SCAN && passportData === null) { + setPassportData(samplePassportData as PassportData); + setStep('scanCompleted'); + } + }, []); + + async function handleResponse(response: any) { + const { + mrz, + signatureAlgorithm, + modulus, + curveName, + publicKeyQ, + dataGroupHashes, + eContent, + encryptedDigest, + } = response; + + const passportData: PassportData = { + mrz: mrz.replace(/\n/g, ''), + signatureAlgorithm: signatureAlgorithm, + pubKey: { + modulus: modulus, + curveName: curveName, + publicKeyQ: publicKeyQ, + }, + dataGroupHashes: dataHashesObjToArray(JSON.parse(dataGroupHashes)), + eContent: JSON.parse(eContent), + encryptedDigest: JSON.parse(encryptedDigest), + }; + + console.log('mrz', passportData.mrz); + console.log('signatureAlgorithm', passportData.signatureAlgorithm); + console.log('pubKey', passportData.pubKey); + console.log('dataGroupHashes', passportData.dataGroupHashes); + console.log('eContent', passportData.eContent); + console.log('encryptedDigest', passportData.encryptedDigest); + + setPassportData(passportData); + setStep('scanCompleted'); + } + + async function scan() { + const check = checkInputs(passportNumber, dateOfBirth, dateOfExpiry) + if (!check.success) { + Toast.show({ + type: 'error', + text1: check.message, + }) + return + } + // 1. start a scan + // 2. press the back of your android phone against the passport + // 3. wait for the scan(...) Promise to get resolved/rejected + console.log('scanning...'); + setStep('scanning'); + try { + const response = await PassportReader.scan({ + documentNumber: passportNumber, + dateOfBirth: dateOfBirth, + dateOfExpiry: dateOfExpiry, + }); + console.log('response', response); + console.log('scanned'); + handleResponse(response); + } catch (e: any) { + console.log('error during scan :', e); + Toast.show({ + type: 'error', + text1: e.message, + }) + } + } + + const handleProve = async () => { + if (passportData === null) { + console.log('passport data is null'); + return; + } + + setGeneratingProof(true) + await new Promise(resolve => setTimeout(resolve, 10)); + + // 1. TODO check signature to make sure the proof will work + + // 2. Format all the data as inputs for the circuit + const formattedMrz = formatMrz(passportData.mrz); + const mrzHash = hash(formatMrz(passportData.mrz)); + const concatenatedDataHashes = formatAndConcatenateDataHashes( + mrzHash, + passportData.dataGroupHashes as DataHash[], + ); + + + const reveal_bitmap = Array.from({ length: 88 }, (_) => '0'); + + for(const attribute in disclosure) { + if (disclosure[attribute as keyof typeof disclosure]) { + const [start, end] = attributeToPosition[attribute as keyof typeof attributeToPosition]; + for(let i = start; i <= end; i++) { + reveal_bitmap[i] = '1'; + } + } + } + + if (passportData.signatureAlgorithm !== "SHA256withRSA") { + console.log(`${passportData.signatureAlgorithm} not supported for proof right now.`); + setError(`${passportData.signatureAlgorithm} not supported for proof right now.`); + return; + } + + const inputs = { + mrz: Array.from(formattedMrz).map(byte => String(byte)), + reveal_bitmap: reveal_bitmap.map(byte => String(byte)), + dataHashes: Array.from(concatenatedDataHashes.map(toUnsignedByte)).map(byte => String(byte)), + eContentBytes: Array.from(passportData.eContent.map(toUnsignedByte)).map(byte => String(byte)), + signature: splitToWords( + BigInt(bytesToBigDecimal(passportData.encryptedDigest)), + BigInt(64), + BigInt(32) + ), + pubkey: splitToWords( + BigInt(passportData.pubKey.modulus as string), + BigInt(64), + BigInt(32) + ), + address, + } + + // 3. Generate a proof of passport + const start = Date.now(); + NativeModules.RNPassportReader.provePassport(inputs, (err: any, res: any) => { + const end = Date.now(); + + if (err) { + console.error(err); + setError( + "err: " + err.toString(), + ); + return + } + console.log("res", res); + const parsedResponse = JSON.parse(res); + console.log('parsedResponse', parsedResponse); + console.log('parsedResponse.duration', parsedResponse.duration); + + const deserializedProof = JSON.parse(parsedResponse.serialized_proof); + console.log('deserializedProof', deserializedProof); + + const deserializedInputs = JSON.parse(parsedResponse.serialized_inputs); + console.log('deserializedInputs', deserializedInputs); + + setProofTime(parsedResponse.duration); + setTotalTime(end - start); + + setProof({ + proof: JSON.stringify(deserializedProof), + inputs: JSON.stringify(deserializedInputs), + }); + setGeneratingProof(false) + setStep('proofGenerated'); + }); + }; + + const handleMint = async () => { + setMinting(true) + if (!proof?.proof || !proof?.inputs) { + console.log('proof or inputs is null'); + return; + } + if (!contractAddresses.ProofOfPassport || !proofOfPassportArtefact.abi) { + console.log('contracts addresses or abi not found'); + return; + } + + // Format the proof and publicInputs as calldata for the verifier contract + const p = JSON.parse(proof.proof); + const i = JSON.parse(proof.inputs); + // const p = {"a": ["16502577771187684977980616374304236605057905196561863637384296592370445017998", "3901861368174142739149849352179287633574688417834634300291202761562972709023"], "b": [["14543689684654938043989715590415160645004827219804187355799512446208262437248", "2758656853017552407340621959452084149765188239766723663849017782705599048610"], ["11277365272183899064677884160333958573750879878546952615484891009952508146334", "6233152645613613236466445508816847016425532566954931368157994995587995754446"]], "c": ["6117026818273543012196632774531089444191538074414171872462281003025766583671", "10261526153619394223629018490329697233150978685332753612996629076672112420472"]} + // const i = ["0", "0", "0", "146183216590389235917737925524385821154", "43653084046336027166990", "21085389953176386480267", "56519161086598100699293", "15779090386165698845937", "23690430366843652392111", "22932463418406768540896", "51019038683800409078189", "50360649287615093470666", "47789371969706091489401", "15311247864741754764238", "20579290199534174842880", "1318168358802144844680228651107716082931624381008"] + console.log('p', p); + console.log('i', i); + const cd = groth16ExportSolidityCallData(p, i); + const callData = JSON.parse(`[${cd}]`); + console.log('callData', callData); + + // format transaction + // for now, we do it all on mumbai + try { + const provider = new ethers.JsonRpcProvider('https://polygon-mumbai-bor.publicnode.com'); + const proofOfPassportOnMumbai = new ethers.Contract(contractAddresses.ProofOfPassport, proofOfPassportArtefact.abi, provider); + + const transactionRequest = await proofOfPassportOnMumbai + .mint.populateTransaction(...callData); + console.log('transactionRequest', transactionRequest); + + const response = await axios.post(AWS_ENDPOINT, { + chain: "mumbai", + tx_data: transactionRequest + }); + console.log('response status', response.status) + console.log('response data', response.data) + setMintText(`Network: Mumbai. Transaction hash: ${response.data.hash}`) + const receipt = await provider.waitForTransaction(response.data.hash); + console.log('receipt', receipt) + if (receipt?.status === 1) { + Toast.show({ + type: 'success', + text1: 'Proof of passport minted', + }) + setMintText(`SBT minted. Network: Mumbai. Transaction hash: ${response.data.hash}`) + } else { + Toast.show({ + type: 'error', + text1: 'Proof of passport minting failed', + }) + setMintText(`Error minting SBT. Network: Mumbai. Transaction hash: ${response.data.hash}`) + } + } catch (err) { + console.log('err', err); + } + }; + + return ( + + + + + + {step === 'enterDetails' ? ( + + Welcome to Proof of Passport + Enter Your Passport Details + Passport Number + + + + Date of Birth + + + + Date of Expiry + + + + + + + ) : null} + {step === 'scanning' ? ( + + Put your phone on your passport + + + ) : null} + {step === 'scanCompleted' && passportData ? ( + + + Hi {getFirstName(passportData.mrz)} + + + + Signature algorithm: {passportData.signatureAlgorithm} + + + What do you want to disclose ? + + {Object.keys(disclosure).map((key) => { + const keyy = key as keyof typeof disclosure; + const indexes = attributeToPosition[keyy]; + const keyFormatted = keyy.replace(/_/g, ' ').split(' ').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(' '); + const mrzAttribute = passportData.mrz.slice(indexes[0], indexes[1]) + const mrzAttributeFormatted = mrzAttribute.replace(/ + + + {keyFormatted}:{" "} + + + {mrzAttributeFormatted} + + + handleDisclosureChange(keyy)} + size="lg" + aria-label={key} + > + + + + + + ) + })} + + Enter your address or ens + + + + + {generatingProof ? + + : + } + + ) : null} + {step === 'proofGenerated' ? ( + + Zero-knowledge proof generated + + + Proof: + + + {JSON.stringify(proof)} + + + + Proof Duration: {formatDuration(proofTime)} + + + Total Duration: {formatDuration(totalTime)} + + + + {mintText && + {mintText} + } + + ) : null} + + + Test functions + + + {testResult && {testResult}} + + + + + + + ); +} + +const styles = StyleSheet.create({ + sectionContainer: { + marginTop: 32, + paddingHorizontal: 24, + }, + sectionTitle: { + fontSize: 24, + fontWeight: '600', + }, + sectionDescription: { + marginTop: 8, + fontSize: 18, + fontWeight: '400', + }, + highlight: { + fontWeight: '700', + }, + header: { + fontSize: 22, + fontWeight: 'bold', + textAlign: 'center', + marginTop: 20, + }, + testSection: { + backgroundColor: '#f2f2f2', // different background color + padding: 10, + borderTopWidth: 1, + borderTopColor: '#dcdcdc', // adding a border top with a light color + marginTop: 15, + }, +}); + +export default App; + + +export const toastConfig = { + info: (props: ToastProps) => ( + + ), + error: (props: ToastProps) => ( + + ), + success: (props: ToastProps) => ( + + ), +}; diff --git a/app/Gemfile b/app/Gemfile new file mode 100644 index 00000000..1fa2c2e1 --- /dev/null +++ b/app/Gemfile @@ -0,0 +1,6 @@ +source 'https://rubygems.org' + +# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version +ruby ">= 2.6.10" + +gem 'cocoapods', '~> 1.12' diff --git a/app/Gemfile.lock b/app/Gemfile.lock new file mode 100644 index 00000000..44b8ca7c --- /dev/null +++ b/app/Gemfile.lock @@ -0,0 +1,100 @@ +GEM + remote: https://rubygems.org/ + specs: + CFPropertyList (3.0.6) + rexml + activesupport (6.1.7.4) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 1.6, < 2) + minitest (>= 5.1) + tzinfo (~> 2.0) + zeitwerk (~> 2.3) + addressable (2.8.4) + public_suffix (>= 2.0.2, < 6.0) + algoliasearch (1.27.5) + httpclient (~> 2.8, >= 2.8.3) + json (>= 1.5.1) + atomos (0.1.3) + claide (1.1.0) + cocoapods (1.12.1) + addressable (~> 2.8) + claide (>= 1.0.2, < 2.0) + cocoapods-core (= 1.12.1) + cocoapods-deintegrate (>= 1.0.3, < 2.0) + cocoapods-downloader (>= 1.6.0, < 2.0) + cocoapods-plugins (>= 1.0.0, < 2.0) + cocoapods-search (>= 1.0.0, < 2.0) + cocoapods-trunk (>= 1.6.0, < 2.0) + cocoapods-try (>= 1.1.0, < 2.0) + colored2 (~> 3.1) + escape (~> 0.0.4) + fourflusher (>= 2.3.0, < 3.0) + gh_inspector (~> 1.0) + molinillo (~> 0.8.0) + nap (~> 1.0) + ruby-macho (>= 2.3.0, < 3.0) + xcodeproj (>= 1.21.0, < 2.0) + cocoapods-core (1.12.1) + activesupport (>= 5.0, < 8) + addressable (~> 2.8) + algoliasearch (~> 1.0) + concurrent-ruby (~> 1.1) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + netrc (~> 0.11) + public_suffix (~> 4.0) + typhoeus (~> 1.0) + cocoapods-deintegrate (1.0.5) + cocoapods-downloader (1.6.3) + cocoapods-plugins (1.0.0) + nap + cocoapods-search (1.0.1) + cocoapods-trunk (1.6.0) + nap (>= 0.8, < 2.0) + netrc (~> 0.11) + cocoapods-try (1.2.0) + colored2 (3.1.2) + concurrent-ruby (1.2.2) + escape (0.0.4) + ethon (0.16.0) + ffi (>= 1.15.0) + ffi (1.15.5) + fourflusher (2.3.1) + fuzzy_match (2.0.4) + gh_inspector (1.1.3) + httpclient (2.8.3) + i18n (1.14.1) + concurrent-ruby (~> 1.0) + json (2.6.3) + minitest (5.18.1) + molinillo (0.8.0) + nanaimo (0.3.0) + nap (1.1.0) + netrc (0.11.0) + public_suffix (4.0.7) + rexml (3.2.5) + ruby-macho (2.5.1) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + xcodeproj (1.22.0) + CFPropertyList (>= 2.3.3, < 4.0) + atomos (~> 0.1.3) + claide (>= 1.0.2, < 2.0) + colored2 (~> 3.1) + nanaimo (~> 0.3.0) + rexml (~> 3.2.4) + zeitwerk (2.6.8) + +PLATFORMS + ruby + +DEPENDENCIES + cocoapods (~> 1.12) + +RUBY VERSION + ruby 2.6.10p210 + +BUNDLED WITH + 1.17.2 diff --git a/app/README.md b/app/README.md new file mode 100644 index 00000000..291b7020 --- /dev/null +++ b/app/README.md @@ -0,0 +1,54 @@ +# Proof of Passport App + +Only Android right now, under heavy development + +#### Requirements + +Install `nodejs v18` + +#### Installation + +```bash +yarn +``` + +In `/common`, also run: +```bash +yarn +``` + +#### Add circuit build + +Go to the `circuit` folder of the monorepo and build the circuit. + +#### Build native lib + +In `/script`, run: +``` +./build_rust.sh +``` +This will build the `libhalo2_circom_passport.so` lib and copy it to the desired place to be used by the app. +The config used is in `android/react-native-passport-reader/android/build.gradle`. +You can go there to change the profile (`debug` or `release`) + +You might need to set the rust-toolchain rust version as global default. Example: +``` +rustup default 1.67.0 +``` +And install the targets like this: +``` +rustup target add aarch64-linux-android +``` + +To run the server, first connect your phone to your computer, allow access, then: +``` +yarn start +``` +Then press `a` for android or `i` for iOS + +To export an apk: +``` +cd android +./gradlew assembleRelease +``` +The built apk it located at `android/app/build/outputs/apk/release/app-release.apk` diff --git a/app/__tests__/App.test.tsx b/app/__tests__/App.test.tsx new file mode 100644 index 00000000..3413ac1c --- /dev/null +++ b/app/__tests__/App.test.tsx @@ -0,0 +1,17 @@ +/** + * @format + */ + +import 'react-native'; +import React from 'react'; +import App from '../App'; + +// Note: import explicitly to use the types shiped with jest. +import {it} from '@jest/globals'; + +// Note: test renderer must be required after react-native. +import renderer from 'react-test-renderer'; + +it('renders correctly', () => { + renderer.create(); +}); diff --git a/app/android/app/build.gradle b/app/android/app/build.gradle new file mode 100644 index 00000000..7db147e8 --- /dev/null +++ b/app/android/app/build.gradle @@ -0,0 +1,131 @@ +apply plugin: "com.android.application" +apply plugin: "com.facebook.react" + +/** + * This is the configuration block to customize your React Native Android app. + * By default you don't need to apply any configuration, just uncomment the lines you need. + */ +react { + /* Folders */ + // The root of your project, i.e. where "package.json" lives. Default is '..' + // root = file("../") + // The folder where the react-native NPM package is. Default is ../node_modules/react-native + // reactNativeDir = file("../node_modules/react-native") + // The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen + // codegenDir = file("../node_modules/@react-native/codegen") + // The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js + // cliFile = file("../node_modules/react-native/cli.js") + + /* Variants */ + // The list of variants to that are debuggable. For those we're going to + // skip the bundling of the JS bundle and the assets. By default is just 'debug'. + // If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants. + // debuggableVariants = ["liteDebug", "prodDebug"] + + /* Bundling */ + // A list containing the node command and its flags. Default is just 'node'. + // nodeExecutableAndArgs = ["node"] + // + // The command to run when bundling. By default is 'bundle' + // bundleCommand = "ram-bundle" + // + // The path to the CLI configuration file. Default is empty. + // bundleConfig = file(../rn-cli.config.js) + // + // The name of the generated asset file containing your JS bundle + // bundleAssetName = "MyApplication.android.bundle" + // + // The entry file for bundle generation. Default is 'index.android.js' or 'index.js' + // entryFile = file("../js/MyApplication.android.js") + // + // A list of extra flags to pass to the 'bundle' commands. + // See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle + // extraPackagerArgs = [] + + /* Hermes Commands */ + // The hermes compiler command to run. By default it is 'hermesc' + // hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc" + // + // The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map" + // hermesFlags = ["-O", "-output-source-map"] +} + +/** + * Set this to true to Run Proguard on Release builds to minify the Java bytecode. + */ +def enableProguardInReleaseBuilds = false + +/** + * The preferred build flavor of JavaScriptCore (JSC) + * + * For example, to use the international variant, you can use: + * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` + * + * The international variant includes ICU i18n library and necessary data + * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that + * give correct results when using with locales other than en-US. Note that + * this variant is about 6MiB larger per architecture than default. + */ +def jscFlavor = 'org.webkit:android-jsc:+' + +android { + ndkVersion rootProject.ext.ndkVersion + + compileSdkVersion rootProject.ext.compileSdkVersion + + namespace "com.proofofpassport" + defaultConfig { + applicationId "com.proofofpassport" + minSdkVersion rootProject.ext.minSdkVersion + targetSdkVersion rootProject.ext.targetSdkVersion + versionCode 1 + versionName "1.0" + } + signingConfigs { + debug { + storeFile file('debug.keystore') + storePassword 'android' + keyAlias 'androiddebugkey' + keyPassword 'android' + } + } + buildTypes { + debug { + signingConfig signingConfigs.debug + } + release { + // Caution! In production, you need to generate your own keystore file. + // see https://reactnative.dev/docs/signed-apk-android. + signingConfig signingConfigs.debug + minifyEnabled enableProguardInReleaseBuilds + proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" + } + } + + packagingOptions { + exclude 'META-INF/LICENSE' + exclude 'META-INF/NOTICE' + } +} + +dependencies { + // The version of react-native is set by the React Native Gradle Plugin + implementation("com.facebook.react:react-android") + implementation project(':react-native-passport-reader') + // implementation files('libs/jmrtd-0.5.5.jar') + + + debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") + debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { + exclude group:'com.squareup.okhttp3', module:'okhttp' + } + + debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") + if (hermesEnabled.toBoolean()) { + implementation("com.facebook.react:hermes-android") + } else { + implementation jscFlavor + } +} + +apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) diff --git a/app/android/app/debug.keystore b/app/android/app/debug.keystore new file mode 100644 index 0000000000000000000000000000000000000000..364e105ed39fbfd62001429a68140672b06ec0de GIT binary patch literal 2257 zcmchYXEfYt8;7T1^dLH$VOTZ%2NOdOH5j5LYLtZ0q7x-V8_6gU5)#7dkq{HTmsfNq zB3ZqcAxeY^G10@?efK?Q&)M(qInVv!xjx+IKEL}p*K@LYvIzo#AZG>st5|P)KF1_Z;y){W{<7K{nl!CPuE z_^(!C(Ol0n8 zK13*rzAtW>(wULKPRYLd7G18F8#1P`V*9`(Poj26eOXYyBVZPno~Cvvhx7vPjAuZo zF?VD!zB~QG(!zbw#qsxT8%BSpqMZ4f70ZPn-3y$L8{EVbbN9$H`B&Z1quk9tgp5FM zuxp3pJ0b8u|3+#5bkJ4SRnCF2l7#DyLYXYY8*?OuAwK4E6J{0N=O3QNVzQ$L#FKkR zi-c@&!nDvezOV$i$Lr}iF$XEcwnybQ6WZrMKuw8gCL^U#D;q3t&HpTbqyD%vG=TeDlzCT~MXUPC|Leb-Uk+ z=vnMd(|>ld?Fh>V8poP;q;;nc@en$|rnP0ytzD&fFkCeUE^kG9Kx4wUh!!rpjwKDP zyw_e|a^x_w3E zP}}@$g>*LLJ4i0`Gx)qltL}@;mDv}D*xR^oeWcWdPkW@Uu)B^X&4W1$p6}ze!zudJ zyiLg@uggoMIArBr*27EZV7djDg@W1MaL+rcZ-lrANJQ%%>u8)ZMWU@R2qtnmG(acP z0d_^!t>}5W zpT`*2NR+0+SpTHb+6Js4b;%LJB;B_-ChhnU5py}iJtku*hm5F0!iql8Hrpcy1aYbT z1*dKC5ua6pMX@@iONI?Hpr%h;&YaXp9n!ND7-=a%BD7v&g zOO41M6EbE24mJ#S$Ui0-brR5ML%@|ndz^)YLMMV1atna{Fw<;TF@>d&F|!Z>8eg>>hkFrV)W+uv=`^F9^e zzzM2*oOjT9%gLoub%(R57p-`TXFe#oh1_{&N-YN z<}artH|m=d8TQuKSWE)Z%puU|g|^^NFwC#N=@dPhasyYjoy(fdEVfKR@cXKHZV-`06HsP`|Ftx;8(YD$fFXumLWbGnu$GMqRncXYY9mwz9$ap zQtfZB^_BeNYITh^hA7+(XNFox5WMeG_LtJ%*Q}$8VKDI_p8^pqX)}NMb`0e|wgF7D zuQACY_Ua<1ri{;Jwt@_1sW9zzdgnyh_O#8y+C;LcZq6=4e^cs6KvmK@$vVpKFGbQ= z$)Eux5C|Fx;Gtmv9^#Y-g@7Rt7*eLp5n!gJmn7&B_L$G?NCN`AP>cXQEz}%F%K;vUs{+l4Q{}eWW;ATe2 zqvXzxoIDy(u;F2q1JH7Sf;{jy_j})F+cKlIOmNfjBGHoG^CN zM|Ho&&X|L-36f}Q-obEACz`sI%2f&k>z5c$2TyTSj~vmO)BW~+N^kt`Jt@R|s!){H ze1_eCrlNaPkJQhL$WG&iRvF*YG=gXd1IyYQ9ew|iYn7r~g!wOnw;@n42>enAxBv*A zEmV*N#sxdicyNM=A4|yaOC5MByts}s_Hpfj|y<6G=o=!3S@eIFKDdpR7|FY>L&Wat&oW&cm&X~ z5Bt>Fcq(fgnvlvLSYg&o6>&fY`ODg4`V^lWWD=%oJ#Kbad2u~! zLECFS*??>|vDsNR&pH=Ze0Eo`sC_G`OjoEKVHY|wmwlX&(XBE<@sx3Hd^gtd-fNwUHsylg06p`U2y_={u}Bc + + + + + + + + + + + diff --git a/app/android/app/src/debug/java/com/awesomeproject/ReactNativeFlipper.java b/app/android/app/src/debug/java/com/awesomeproject/ReactNativeFlipper.java new file mode 100644 index 00000000..f139f9ad --- /dev/null +++ b/app/android/app/src/debug/java/com/awesomeproject/ReactNativeFlipper.java @@ -0,0 +1,75 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + *

This source code is licensed under the MIT license found in the LICENSE file in the root + * directory of this source tree. + */ +package com.proofofpassport; + +import android.content.Context; +import com.facebook.flipper.android.AndroidFlipperClient; +import com.facebook.flipper.android.utils.FlipperUtils; +import com.facebook.flipper.core.FlipperClient; +import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; +import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; +import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; +import com.facebook.flipper.plugins.inspector.DescriptorMapping; +import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; +import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; +import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; +import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; +import com.facebook.react.ReactInstanceEventListener; +import com.facebook.react.ReactInstanceManager; +import com.facebook.react.bridge.ReactContext; +import com.facebook.react.modules.network.NetworkingModule; +import okhttp3.OkHttpClient; + +/** + * Class responsible of loading Flipper inside your React Native application. This is the debug + * flavor of it. Here you can add your own plugins and customize the Flipper setup. + */ +public class ReactNativeFlipper { + public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { + if (FlipperUtils.shouldEnableFlipper(context)) { + final FlipperClient client = AndroidFlipperClient.getInstance(context); + + client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); + client.addPlugin(new DatabasesFlipperPlugin(context)); + client.addPlugin(new SharedPreferencesFlipperPlugin(context)); + client.addPlugin(CrashReporterPlugin.getInstance()); + + NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); + NetworkingModule.setCustomClientBuilder( + new NetworkingModule.CustomClientBuilder() { + @Override + public void apply(OkHttpClient.Builder builder) { + builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); + } + }); + client.addPlugin(networkFlipperPlugin); + client.start(); + + // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized + // Hence we run if after all native modules have been initialized + ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); + if (reactContext == null) { + reactInstanceManager.addReactInstanceEventListener( + new ReactInstanceEventListener() { + @Override + public void onReactContextInitialized(ReactContext reactContext) { + reactInstanceManager.removeReactInstanceEventListener(this); + reactContext.runOnNativeModulesQueueThread( + new Runnable() { + @Override + public void run() { + client.addPlugin(new FrescoFlipperPlugin()); + } + }); + } + }); + } else { + client.addPlugin(new FrescoFlipperPlugin()); + } + } + } +} diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..5fc0cbac --- /dev/null +++ b/app/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/android/app/src/main/assets/masterList b/app/android/app/src/main/assets/masterList new file mode 100644 index 0000000000000000000000000000000000000000..0f7e93153e43201686dcb5b357952f9c703abcaf GIT binary patch literal 710780 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

  • 01%U-f1 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®@#AtqvhoLUvHU54DDwtgeL)5@i4GX;yA`~t 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�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

    3*`P3@O=dOtx$vV_ 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

    fF%Q^%~{oB0=rjgwRJ5v$^_# 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

    %uHC^}Wn#`p&e5GpsHm^q*x|COYQ41`C2a>2 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

    =T9jhn>^FyBX)AZs(K~ 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

    ^*0vdSE& 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 z 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 getPackages() { + @SuppressWarnings("UnnecessaryLocalVariable") + List packages = new PackageList(this).getPackages(); + // Packages that cannot be autolinked yet can be added manually here, for example: + // packages.add(new RNPassportReaderPackage()); + return packages; + } + + @Override + protected String getJSMainModuleName() { + return "index"; + } + + @Override + protected boolean isNewArchEnabled() { + return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; + } + + @Override + protected Boolean isHermesEnabled() { + return BuildConfig.IS_HERMES_ENABLED; + } + }; + + @Override + public ReactNativeHost getReactNativeHost() { + return mReactNativeHost; + } + + @Override + public void onCreate() { + super.onCreate(); + SoLoader.init(this, /* native exopackage */false); + if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { + // If you opted-in for the New Architecture, we load the native entry point for this app. + DefaultNewArchitectureEntryPoint.load(); + } + ReactNativeFlipper.initializeFlipper( + this, + getReactNativeHost().getReactInstanceManager() + ); + } +} diff --git a/app/android/app/src/main/res/drawable/rn_edit_text_material.xml b/app/android/app/src/main/res/drawable/rn_edit_text_material.xml new file mode 100644 index 00000000..73b37e4d --- /dev/null +++ b/app/android/app/src/main/res/drawable/rn_edit_text_material.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + diff --git a/app/android/app/src/main/res/mipmap-hdpi/passport_logo.png b/app/android/app/src/main/res/mipmap-hdpi/passport_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bdf67e247e2fce17125786aa4cb3eb63a4f572c4 GIT binary patch literal 7079 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 Yq?P_RM1M5?-;WM}=^E+0({_CPKV5OBN&o-= literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-xhdpi/passport_logo.png b/app/android/app/src/main/res/mipmap-xhdpi/passport_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..df2a7426ad6ed41690a138cbf7e94977f168424f GIT binary patch literal 11746 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 Z;pY0^Npc`AeE%_koRl)6O2Rbge*wM>3p)S+ literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-xxhdpi/passport_logo.png b/app/android/app/src/main/res/mipmap-xxhdpi/passport_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7357a9678488d53987ffad59f17b256b3a8c88e7 GIT binary patch literal 24805 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 HV;=fH3X@2i literal 0 HcmV?d00001 diff --git a/app/android/app/src/main/res/mipmap-xxxhdpi/passport_logo.png b/app/android/app/src/main/res/mipmap-xxxhdpi/passport_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..67b0749121e18de1a21cdfc5cf6b82a8f81a9908 GIT binary patch literal 43194 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 w{~i!X7rFfkQ2)OPjutj14vq$2)S>@5gya7X$> + Proof of Passport + diff --git a/app/android/app/src/main/res/values/styles.xml b/app/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..7ba83a2a --- /dev/null +++ b/app/android/app/src/main/res/values/styles.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/android/app/src/main/res/xml/nfc_tech_filter.xml b/app/android/app/src/main/res/xml/nfc_tech_filter.xml new file mode 100644 index 00000000..822b49ca --- /dev/null +++ b/app/android/app/src/main/res/xml/nfc_tech_filter.xml @@ -0,0 +1,5 @@ + + + android.nfc.tech.IsoDep + + \ No newline at end of file diff --git a/app/android/app/src/release/java/com/awesomeproject/ReactNativeFlipper.java b/app/android/app/src/release/java/com/awesomeproject/ReactNativeFlipper.java new file mode 100644 index 00000000..8aa8fd07 --- /dev/null +++ b/app/android/app/src/release/java/com/awesomeproject/ReactNativeFlipper.java @@ -0,0 +1,20 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + *

    This source code is licensed under the MIT license found in the LICENSE file in the root + * directory of this source tree. + */ +package com.proofofpassport; + +import android.content.Context; +import com.facebook.react.ReactInstanceManager; + +/** + * Class responsible of loading Flipper inside your React Native application. This is the release + * flavor of it so it's empty as we don't want to load Flipper. + */ +public class ReactNativeFlipper { + public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { + // Do nothing as we don't want to initialize Flipper on Release. + } +} diff --git a/app/android/build.gradle b/app/android/build.gradle new file mode 100644 index 00000000..b695ae0f --- /dev/null +++ b/app/android/build.gradle @@ -0,0 +1,38 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext { + buildToolsVersion = "33.0.0" + minSdkVersion = 21 + compileSdkVersion = 33 + targetSdkVersion = 33 + + kotlin_version = '1.7.20' + // We use NDK 23 which has both M1 support and is the side-by-side NDK version from AGP. + ndkVersion = "23.1.7779620" + + } + repositories { + google() + mavenCentral() + maven { + url "https://plugins.gradle.org/m2/" + } + } + dependencies { + // classpath("com.android.tools.build:gradle") + classpath("com.facebook.react:react-native-gradle-plugin") + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath 'com.android.tools.build:gradle:7.3.1' + classpath 'com.google.gms:google-services:4.3.14' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2' + classpath 'org.mozilla.rust-android-gradle:plugin:0.9.3' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} \ No newline at end of file diff --git a/app/android/gradle.properties b/app/android/gradle.properties new file mode 100644 index 00000000..a3b2fa12 --- /dev/null +++ b/app/android/gradle.properties @@ -0,0 +1,44 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m +org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true + +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app's APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true + +# Version of flipper SDK to use with React Native +FLIPPER_VERSION=0.182.0 + +# Use this property to specify which architecture you want to build. +# You can also override it from the CLI using +# ./gradlew -PreactNativeArchitectures=x86_64 +reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64 + +# Use this property to enable support to the new architecture. +# This will allow you to use TurboModules and the Fabric render in +# your application. You should enable this flag either if you want +# to write custom TurboModules/Fabric components OR use libraries that +# are providing them. +newArchEnabled=false + +# Use this property to enable or disable the Hermes JS engine. +# If set to false, you will be using JSC instead. +hermesEnabled=true diff --git a/app/android/gradle/wrapper/gradle-wrapper.jar b/app/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..943f0cbfa754578e88a3dae77fce6e3dea56edbf GIT binary patch literal 61574 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 ScNgau(U?ep-K_E5zy1%ZQTdPn literal 0 HcmV?d00001 diff --git a/app/android/gradle/wrapper/gradle-wrapper.properties b/app/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..6ec1567a --- /dev/null +++ b/app/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/app/android/gradlew b/app/android/gradlew new file mode 100755 index 00000000..65dcd68d --- /dev/null +++ b/app/android/gradlew @@ -0,0 +1,244 @@ +#!/bin/sh + +# +# Copyright Β© 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions Β«$varΒ», Β«${var}Β», Β«${var:-default}Β», Β«${var+SET}Β», +# Β«${var#prefix}Β», Β«${var%suffix}Β», and Β«$( cmd )Β»; +# * compound commands having a testable exit status, especially Β«caseΒ»; +# * various built-in commands including Β«commandΒ», Β«setΒ», and Β«ulimitΒ». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/app/android/gradlew.bat b/app/android/gradlew.bat new file mode 100644 index 00000000..6689b85b --- /dev/null +++ b/app/android/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/app/android/react-native-passport-reader/.gitignore b/app/android/react-native-passport-reader/.gitignore new file mode 100644 index 00000000..17b952b2 --- /dev/null +++ b/app/android/react-native-passport-reader/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +android/src/main/jniLibs/arm64/libark_circom_passport.so \ No newline at end of file diff --git a/app/android/react-native-passport-reader/ORIGINAL_LICENSE.md b/app/android/react-native-passport-reader/ORIGINAL_LICENSE.md new file mode 100644 index 00000000..bda7f7fb --- /dev/null +++ b/app/android/react-native-passport-reader/ORIGINAL_LICENSE.md @@ -0,0 +1,15 @@ +## License + +Apache License, Version 2.0 + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/app/android/react-native-passport-reader/README.md b/app/android/react-native-passport-reader/README.md new file mode 100644 index 00000000..cad1c0f1 --- /dev/null +++ b/app/android/react-native-passport-reader/README.md @@ -0,0 +1,61 @@ + +# react-native-passport-reader + +Adapted from [passport-reader](https://github.com/tananaev/passport-reader). Individual modifications are too many to enumerate, but essentially: the workflow code was adapted to the needs of a React Native module, and the scanning code was largely left as is. + +## Getting started + +```sh +$ npm install react-native-passport-reader --save +$ react-native link react-native-passport-reader +``` + +In your `android/app/build.gradle` add `packagingOptions`: + +``` +android { + ... + packagingOptions { + exclude 'META-INF/LICENSE' + exclude 'META-INF/NOTICE' + } +} +``` + +In `AndroidManifest.xml` add: + +```xml + + +``` + +If your app will not function without nfc capabilities, set `android:required` above to `true` + +## Usage +```js +import PassportReader from 'react-native-passport-reader' +// { scan, cancel, isSupported } + +async function scan () { + // 1. start a scan + // 2. press the back of your android phone against the passport + // 3. wait for the scan(...) Promise to get resolved/rejected + + const { + firstName, + lastName, + gender, + issuer, + nationality, + photo + } = await PassportReader.scan({ + // yes, you need to know a bunch of data up front + // this is data you can get from reading the MRZ zone of the passport + documentNumber: 'ofDocumentBeingScanned', + dateOfBirth: 'yyMMdd', + dateOfExpiry: 'yyMMdd' + }) + + const { base64, width, height } = photo +} +``` diff --git a/app/android/react-native-passport-reader/android/build.gradle b/app/android/react-native-passport-reader/android/build.gradle new file mode 100644 index 00000000..0a297a1d --- /dev/null +++ b/app/android/react-native-passport-reader/android/build.gradle @@ -0,0 +1,63 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +android { + compileSdkVersion 33 + defaultConfig { + targetSdkVersion 33 + versionCode 1 + versionName "1.0" + multiDexEnabled = true + ndkVersion = "23.1.7779620" + + } + packagingOptions { + exclude 'META-INF/LICENSE' + exclude 'META-INF/NOTICE' + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt') + } + } + lintOptions { + warning 'InvalidPackage' + } +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation 'com.google.code.gson:gson:2.8.9' // Check for the latest version + implementation 'androidx.multidex:multidex:2.0.1' + implementation 'com.google.android.material:material:1.7.0' + implementation 'androidx.core:core-ktx:1.9.0' + implementation 'com.wdullaer:materialdatetimepicker:3.5.2' + implementation 'org.jmrtd:jmrtd:0.7.18' // getting different errors whether it's 18 or 40 // 23 <== this works + // implementation files('../../../../../jmrtd-0.7.18-sources/target/jmrtd-0.7.18.jar') + // implementation files('../../app/libs/jmrtd-0.7.18.jar') + implementation 'net.sf.scuba:scuba-sc-android:0.0.18' + implementation 'com.madgag.spongycastle:prov:1.54.0.0' + implementation 'com.gemalto.jp2:jp2-android:1.0.3' + implementation 'com.github.mhshams:jnbis:1.1.0' + // implementation 'org.bouncycastle:bcpkix-jdk15on:1.65' // do not update + implementation 'commons-io:commons-io:2.8.0' + implementation 'com.squareup.okhttp3:okhttp:4.9.0' + implementation 'com.android.support:appcompat-v7:25.1.0' + implementation 'edu.ucar:jj2000:5.2' + implementation 'com.facebook.react:react-native:+' +} + + +apply plugin: 'org.mozilla.rust-android-gradle.rust-android' + +cargo { + module = "../../../ark-circom-passport" // this works + // module = "/Users/turboblitz/code/my-code/passport-sbt/app/halo2-passport" + libname = "ark_circom_passport" // Or whatever matches Cargo.toml's [package] name. + // targets = ["arm", "x86"] // failing + // targets = ["arm64", "darwin-aarch64"] // add this one for apple later + targets = ["arm64"] // Those work + apiLevel = 29 + profile = 'release' +} \ No newline at end of file diff --git a/app/android/react-native-passport-reader/android/src/main/AndroidManifest.xml b/app/android/react-native-passport-reader/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..cdb04b54 --- /dev/null +++ b/app/android/react-native-passport-reader/android/src/main/AndroidManifest.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/android/react-native-passport-reader/android/src/main/assets/masterList b/app/android/react-native-passport-reader/android/src/main/assets/masterList new file mode 100644 index 0000000000000000000000000000000000000000..0f7e93153e43201686dcb5b357952f9c703abcaf GIT binary patch literal 710780 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

  • 01%U-f1 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®@#AtqvhoLUvHU54DDwtgeL)5@i4GX;yA`~t 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�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

    3*`P3@O=dOtx$vV_ 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

    fF%Q^%~{oB0=rjgwRJ5v$^_# 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

    %uHC^}Wn#`p&e5GpsHm^q*x|COYQ41`C2a>2 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

    =T9jhn>^FyBX)AZs(K~ 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

    ^*0vdSE& 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 z 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 it.optJSONObject(i) } } // returns an array of JSONObject + ?.map { Foo(it.toString()) } // transforms each JSONObject of the array into Foo +} + +class Foo(json: String) : JSONObject(json) { + val id = this.optInt("id") + val title: String? = this.optString("title") +} + +class RNPassportReaderModule(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), LifecycleEventListener { + // private var passportNumberFromIntent = false + // private var encodePhotoToBase64 = false + private var scanPromise: Promise? = null + private var opts: ReadableMap? = null + + data class Data(val id: String, val digest: String, val signature: String, val publicKey: String) + + data class PassportData( + val dg1File: DG1File, + val dg2File: DG2File, + val sodFile: SODFile + ) + + interface DataCallback { + fun onDataReceived(data: String) + } + + init { + instance = this + reactContext.addLifecycleEventListener(this) + } + + override fun onCatalystInstanceDestroy() { + reactContext.removeLifecycleEventListener(this) + } + + override fun getName(): String { + return "RNPassportReader" + } + + fun sendDataToJS(passportData: PassportData) { + val gson = Gson() + + val dataMap = Arguments.createMap() + dataMap.putString("passportData", gson.toJson(passportData)) + // Add all the other fields of the YourDataClass object to the map + + reactApplicationContext + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) + .emit("ReadDataTaskCompleted", dataMap) + } + + @ReactMethod + fun scan(opts: ReadableMap, promise: Promise) { + val mNfcAdapter = NfcAdapter.getDefaultAdapter(reactApplicationContext) + // val mNfcAdapter = NfcAdapter.getDefaultAdapter(this.reactContext) + if (mNfcAdapter == null) { + promise.reject("E_NOT_SUPPORTED", "NFC chip reading not supported") + return + } + + if (!mNfcAdapter.isEnabled) { + promise.reject("E_NOT_ENABLED", "NFC chip reading not enabled") + return + } + + if (scanPromise != null) { + promise.reject("E_ONE_REQ_AT_A_TIME", "Already running a scan") + return + } + + this.opts = opts + this.scanPromise = promise + Log.d("RNPassportReaderModule", "opts set to: " + opts.toString()) + } + + private fun resetState() { + scanPromise = null + opts = null + } + + override fun onHostDestroy() { + resetState() + } + + override fun onHostResume() { + val mNfcAdapter = NfcAdapter.getDefaultAdapter(this.reactContext) + mNfcAdapter?.let { + val activity = currentActivity + activity?.let { + val intent = Intent(it.applicationContext, it.javaClass) + intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP + val pendingIntent = PendingIntent.getActivity(it, 0, intent, PendingIntent.FLAG_MUTABLE) // PendingIntent.FLAG_UPDATE_CURRENT + val filter = arrayOf(arrayOf(IsoDep::class.java.name)) + mNfcAdapter.enableForegroundDispatch(it, pendingIntent, null, filter) + } + } + } + + override fun onHostPause() { + val mNfcAdapter = NfcAdapter.getDefaultAdapter(this.reactContext) + mNfcAdapter?.disableForegroundDispatch(currentActivity) + } + + fun receiveIntent(intent: Intent) { + Log.d("RNPassportReaderModule", "receiveIntent: " + intent.action) + if (scanPromise == null) return + if (NfcAdapter.ACTION_TECH_DISCOVERED == intent.action) { + val tag: Tag? = intent.extras?.getParcelable(NfcAdapter.EXTRA_TAG) + if (tag?.techList?.contains("android.nfc.tech.IsoDep") == true) { + val passportNumber = opts?.getString(PARAM_DOC_NUM) + val expirationDate = opts?.getString(PARAM_DOE) + val birthDate = opts?.getString(PARAM_DOB) + if (!passportNumber.isNullOrEmpty() && !expirationDate.isNullOrEmpty() && !birthDate.isNullOrEmpty()) { + val bacKey: BACKeySpec = BACKey(passportNumber, birthDate, expirationDate) + ReadTask(IsoDep.get(tag), bacKey).execute() + } + } + } + } + + + private fun toBase64(bitmap: Bitmap, quality: Int): String { + val byteArrayOutputStream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, byteArrayOutputStream) + val byteArray = byteArrayOutputStream.toByteArray() + return JPEG_DATA_URI_PREFIX + Base64.encodeToString(byteArray, Base64.NO_WRAP) + } + + @SuppressLint("StaticFieldLeak") + private inner class ReadTask(private val isoDep: IsoDep, private val bacKey: BACKeySpec) : AsyncTask() { + + private lateinit var dg1File: DG1File + private lateinit var dg2File: DG2File + private lateinit var dg14File: DG14File + private lateinit var sodFile: SODFile + private var imageBase64: String? = null + private var bitmap: Bitmap? = null + private var chipAuthSucceeded = false + private var passiveAuthSuccess = false + private lateinit var dg14Encoded: ByteArray + + override fun doInBackground(vararg params: Void?): Exception? { + try { + isoDep.timeout = 10000 + Log.e("MY_LOGS", "This should obvsly log") + val cardService = CardService.getInstance(isoDep) + Log.e("MY_LOGS", "cardService gotten") + cardService.open() + Log.e("MY_LOGS", "cardService opened") + val service = PassportService( + cardService, + PassportService.NORMAL_MAX_TRANCEIVE_LENGTH, + PassportService.DEFAULT_MAX_BLOCKSIZE, + false, + false, + ) + Log.e("MY_LOGS", "service gotten") + service.open() + Log.e("MY_LOGS", "service opened") + var paceSucceeded = false + try { + Log.e("MY_LOGS", "trying to get cardAccessFile...") + val cardAccessFile = CardAccessFile(service.getInputStream(PassportService.EF_CARD_ACCESS)) + Log.e("MY_LOGS", "cardAccessFile: ${cardAccessFile}") + + val securityInfoCollection = cardAccessFile.securityInfos + for (securityInfo: SecurityInfo in securityInfoCollection) { + if (securityInfo is PACEInfo) { + Log.e("MY_LOGS", "trying PACE...") + service.doPACE( + bacKey, + securityInfo.objectIdentifier, + PACEInfo.toParameterSpec(securityInfo.parameterId), + null, + ) + Log.e("MY_LOGS", "PACE succeeded") + paceSucceeded = true + } + } + } catch (e: Exception) { + Log.w("MY_LOGS", e) + } + Log.e("MY_LOGS", "Sending select applet command with paceSucceeded: ${paceSucceeded}") // this is false so PACE doesn't succeed + service.sendSelectApplet(paceSucceeded) + if (!paceSucceeded) { + try { + Log.e("MY_LOGS", "trying to get EF_COM...") + service.getInputStream(PassportService.EF_COM).read() + } catch (e: Exception) { + Log.e("MY_LOGS", "doing BAC") + service.doBAC(bacKey) // <======================== error happens here + Log.e("MY_LOGS", "BAC done") + } + } + + + val dg1In = service.getInputStream(PassportService.EF_DG1) + dg1File = DG1File(dg1In) + val dg2In = service.getInputStream(PassportService.EF_DG2) + dg2File = DG2File(dg2In) + val sodIn = service.getInputStream(PassportService.EF_SOD) + sodFile = SODFile(sodIn) + + // val gson = Gson() + // Log.d(TAG, "============FIRST CONSOLE LOG=============") + // Log.d(TAG, "dg1File: " + gson.toJson(dg1File)) + // Log.d(TAG, "dg2File: " + gson.toJson(dg2File)) + // Log.d(TAG, "sodFile.docSigningCertificate: ${sodFile.docSigningCertificate}") + // Log.d(TAG, "publicKey: ${sodFile.docSigningCertificate.publicKey}") + // Log.d(TAG, "publicKey: ${sodFile.docSigningCertificate.publicKey.toString()}") + // Log.d(TAG, "publicKey: ${sodFile.docSigningCertificate.publicKey.format}") + // Log.d(TAG, "publicKey: ${Base64.encodeToString(sodFile.docSigningCertificate.publicKey.encoded, Base64.DEFAULT)}") + // Log.d(TAG, "sodFile.docSigningCertificate: ${gson.toJson(sodFile.docSigningCertificate)}") + // Log.d(TAG, "sodFile.dataGroupHashes: ${sodFile.dataGroupHashes}") + // Log.d(TAG, "sodFile.dataGroupHashes: ${gson.toJson(sodFile.dataGroupHashes)}") + // Log.d(TAG, "concatenated: $concatenated") + // Log.d(TAG, "concatenated: ${gson.toJson(concatenated)}") + // Log.d(TAG, "concatenated: ${gson.toJson(concatenated.joinToString("") { "%02x".format(it) })}") + // Log.d(TAG, "sodFile.eContent: ${sodFile.eContent}") + // Log.d(TAG, "sodFile.eContent: ${gson.toJson(sodFile.eContent)}") + // Log.d(TAG, "sodFile.eContent: ${gson.toJson(sodFile.eContent.joinToString("") { "%02x".format(it) })}") + // Log.d(TAG, "sodFile.encryptedDigest: ${sodFile.encryptedDigest}") + // Log.d(TAG, "sodFile.encryptedDigest: ${gson.toJson(sodFile.encryptedDigest)}") + // Log.d(TAG, "sodFile.encryptedDigest: ${gson.toJson(sodFile.encryptedDigest.joinToString("") { "%02x".format(it) })}") + // var id = passportNumberView.text.toString() + // try { + // postData(id, sodFile.eContent.joinToString("") { "%02x".format(it) }, sodFile.encryptedDigest.joinToString("") { "%02x".format(it) }, sodFile.docSigningCertificate.publicKey.toString()) + // } catch (e: IOException) { + // e.printStackTrace() + // } + // Log.d(TAG, "============LET'S VERIFY THE SIGNATURE=============") + + doChipAuth(service) + doPassiveAuth() + + // Log.d(TAG, "============SIGNATURE VERIFIED=============") + // sendDataToJS(PassportData(dg1File, dg2File, sodFile)) + // Log.d(TAG, "============DATA SENT TO JS=============") + + val allFaceImageInfo: MutableList = ArrayList() + dg2File.faceInfos.forEach { + allFaceImageInfo.addAll(it.faceImageInfos) + } + if (allFaceImageInfo.isNotEmpty()) { + val faceImageInfo = allFaceImageInfo.first() + val imageLength = faceImageInfo.imageLength + val dataInputStream = DataInputStream(faceImageInfo.imageInputStream) + val buffer = ByteArray(imageLength) + dataInputStream.readFully(buffer, 0, imageLength) + val inputStream: InputStream = ByteArrayInputStream(buffer, 0, imageLength) + bitmap = decodeImage(reactContext, faceImageInfo.mimeType, inputStream) + imageBase64 = Base64.encodeToString(buffer, Base64.DEFAULT) + } + } catch (e: Exception) { + return e + } + return null + } + + private fun doChipAuth(service: PassportService) { + try { + val dg14In = service.getInputStream(PassportService.EF_DG14) + dg14Encoded = IOUtils.toByteArray(dg14In) + val dg14InByte = ByteArrayInputStream(dg14Encoded) + dg14File = DG14File(dg14InByte) + val dg14FileSecurityInfo = dg14File.securityInfos + for (securityInfo: SecurityInfo in dg14FileSecurityInfo) { + if (securityInfo is ChipAuthenticationPublicKeyInfo) { + service.doEACCA( + securityInfo.keyId, + ChipAuthenticationPublicKeyInfo.ID_CA_ECDH_AES_CBC_CMAC_256, + securityInfo.objectIdentifier, + securityInfo.subjectPublicKey, + ) + chipAuthSucceeded = true + } + } + } catch (e: Exception) { + Log.w(TAG, e) + } + } + + private fun doPassiveAuth() { + try { + Log.d(TAG, "Starting passive authentication...") + val digest = MessageDigest.getInstance(sodFile.digestAlgorithm) + Log.d(TAG, "Using digest algorithm: ${sodFile.digestAlgorithm}") + + + val dataHashes = sodFile.dataGroupHashes + + val dg14Hash = if (chipAuthSucceeded) digest.digest(dg14Encoded) else ByteArray(0) + val dg1Hash = digest.digest(dg1File.encoded) + val dg2Hash = digest.digest(dg2File.encoded) + + // val gson = Gson() + // Log.d(TAG, "dataHashes " + gson.toJson(dataHashes)) + // val hexMap = sodFile.dataGroupHashes.mapValues { (_, value) -> + // value.joinToString("") { "%02x".format(it) } + // } + // Log.d(TAG, "hexMap: ${gson.toJson(hexMap)}") + // Log.d(TAG, "concatenated: $concatenated") + // Log.d(TAG, "concatenated: ${gson.toJson(concatenated)}") + // Log.d(TAG, "concatenated: ${gson.toJson(concatenated.joinToString("") { "%02x".format(it) })}") + // Log.d(TAG, "dg1File.encoded " + gson.toJson(dg1File.encoded)) + // Log.d(TAG, "dg1File.encoded.joinToString " + gson.toJson(dg1File.encoded.joinToString("") { "%02x".format(it) })) + // Log.d(TAG, "dg1Hash " + gson.toJson(dg1Hash)) + // Log.d(TAG, "dg1Hash.joinToString " + gson.toJson(dg1Hash.joinToString("") { "%02x".format(it) })) + // Log.d(TAG, "dg2File.encoded " + gson.toJson(dg2File.encoded)) + // Log.d(TAG, "dg2File.encoded.joinToString " + gson.toJson(dg2File.encoded.joinToString("") { "%02x".format(it) })) + // Log.d(TAG, "dg2Hash " + gson.toJson(dg2Hash)) + // Log.d(TAG, "dg2HashjoinToString " + gson.toJson(dg2Hash.joinToString("") { "%02x".format(it) })) + + Log.d(TAG, "Comparing data group hashes...") + + if (Arrays.equals(dg1Hash, dataHashes[1]) && Arrays.equals(dg2Hash, dataHashes[2]) + && (!chipAuthSucceeded || Arrays.equals(dg14Hash, dataHashes[14]))) { + + Log.d(TAG, "Data group hashes match.") + + val asn1InputStream = ASN1InputStream(getReactApplicationContext().assets.open("masterList")) + val keystore = KeyStore.getInstance(KeyStore.getDefaultType()) + keystore.load(null, null) + val cf = CertificateFactory.getInstance("X.509") + + var p: ASN1Primitive? + var obj = asn1InputStream.readObject() + + while (obj != null) { + p = obj + val asn1 = ASN1Sequence.getInstance(p) + if (asn1 == null || asn1.size() == 0) { + throw IllegalArgumentException("Null or empty sequence passed.") + } + + if (asn1.size() != 2) { + throw IllegalArgumentException("Incorrect sequence size: " + asn1.size()) + } + val certSet = ASN1Set.getInstance(asn1.getObjectAt(1)) + for (i in 0 until certSet.size()) { + val certificate = Certificate.getInstance(certSet.getObjectAt(i)) + val pemCertificate = certificate.encoded + val javaCertificate = cf.generateCertificate(ByteArrayInputStream(pemCertificate)) + keystore.setCertificateEntry(i.toString(), javaCertificate) + } + obj = asn1InputStream.readObject() + + } + + val docSigningCertificates = sodFile.docSigningCertificates + Log.d(TAG, "Checking document signing certificates for validity...") + for (docSigningCertificate: X509Certificate in docSigningCertificates) { + docSigningCertificate.checkValidity() + Log.d(TAG, "Certificate: ${docSigningCertificate.subjectDN} is valid.") + } + + val cp = cf.generateCertPath(docSigningCertificates) + val pkixParameters = PKIXParameters(keystore) + pkixParameters.isRevocationEnabled = false + val cpv = CertPathValidator.getInstance(CertPathValidator.getDefaultType()) + Log.d(TAG, "Validating certificate path...") + cpv.validate(cp, pkixParameters) + var sodDigestEncryptionAlgorithm = sodFile.docSigningCertificate.sigAlgName + var isSSA = false + if ((sodDigestEncryptionAlgorithm == "SSAwithRSA/PSS")) { + sodDigestEncryptionAlgorithm = "SHA256withRSA/PSS" + isSSA = true + + } + val sign = Signature.getInstance(sodDigestEncryptionAlgorithm) + if (isSSA) { + sign.setParameter(PSSParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, 32, 1)) + } + sign.initVerify(sodFile.docSigningCertificate) + sign.update(sodFile.eContent) + + passiveAuthSuccess = sign.verify(sodFile.encryptedDigest) + Log.d(TAG, "Passive authentication success: $passiveAuthSuccess") + } + } catch (e: Exception) { + Log.w(TAG, "Exception in passive authentication", e) + } + } + + override fun onPostExecute(result: Exception?) { + if (scanPromise == null) return + + if (result != null) { + // Log.w(TAG, exceptionStack(result)) + if (result is IOException) { + scanPromise?.reject("E_SCAN_FAILED_DISCONNECT", "Lost connection to chip on card") + } else { + scanPromise?.reject("E_SCAN_FAILED", result) + } + + resetState() + return + } + + val mrzInfo = dg1File.mrzInfo + + // var quality = 100 + // if (opts?.hasKey("quality") == true) { + // quality = (opts?.getDouble("quality") ?: 1.0 * 100).toInt() + // } + val gson = Gson() + + val signedDataField = SODFile::class.java.getDeclaredField("signedData") + signedDataField.isAccessible = true + + // val signedData = signedDataField.get(sodFile) as SignedData + + val eContentAsn1InputStream = ASN1InputStream(sodFile.eContent.inputStream()) + // val eContentDecomposed: ASN1Primitive = eContentAsn1InputStream.readObject() + + val passport = Arguments.createMap() + passport.putString("mrz", mrzInfo.toString()) + passport.putString("signatureAlgorithm", sodFile.docSigningCertificate.sigAlgName) // this one is new + + val publicKey = sodFile.docSigningCertificate.publicKey + if (publicKey is RSAPublicKey) { + passport.putString("modulus", publicKey.modulus.toString()) + } else if (publicKey is ECPublicKey) { + // Handle the elliptic curve public key case + + // val w = publicKey.getW() + // passport.putString("publicKeyW", w.toString()) + + // val ecParams = publicKey.getParams() + // passport.putInt("cofactor", ecParams.getCofactor()) + // passport.putString("curve", ecParams.getCurve().toString()) + // passport.putString("generator", ecParams.getGenerator().toString()) + // passport.putString("order", ecParams.getOrder().toString()) + // if (ecParams is ECNamedCurveSpec) { + // passport.putString("curveName", ecParams.getName()) + // } + + // Old one, probably wrong: + // passport.putString("curveName", (publicKey.parameters as ECNamedCurveSpec).name) + // passport.putString("curveName", (publicKey.parameters.algorithm)) or maybe this + passport.putString("publicKeyQ", publicKey.q.toString()) + } + + passport.putString("dataGroupHashes", gson.toJson(sodFile.dataGroupHashes)) + passport.putString("eContent", gson.toJson(sodFile.eContent)) + passport.putString("encryptedDigest", gson.toJson(sodFile.encryptedDigest)) + + + // Another way to get signing time is to get into signedData.signerInfos, then search for the ICO identifier 1.2.840.113549.1.9.5 + // passport.putString("signerInfos", gson.toJson(signedData.signerInfos)) + + // Log.d(TAG, "signedData.digestAlgorithms: ${gson.toJson(signedData.digestAlgorithms)}") + // Log.d(TAG, "signedData.signerInfos: ${gson.toJson(signedData.signerInfos)}") + // Log.d(TAG, "signedData.certificates: ${gson.toJson(signedData.certificates)}") + + // val base64 = bitmap?.let { toBase64(it, quality) } + // val photo = Arguments.createMap() + // photo.putString("base64", base64 ?: "") + // photo.putInt("width", bitmap?.width ?: 0) + // photo.putInt("height", bitmap?.height ?: 0) + // passport.putMap("photo", photo) + // passport.putString("dg2File", gson.toJson(dg2File)) + + scanPromise?.resolve(passport) + resetState() + } + } + + private fun convertDate(input: String?): String? { + if (input == null) { + return null + } + return try { + SimpleDateFormat("yyMMdd", Locale.US).format(SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(input)!!) + } catch (e: ParseException) { + // Log.w(RNPassportReaderModule::class.java.simpleName, e) + null + } + } + + //-------------functions related to calling rust lib----------------// + + // Declare native method + external fun callRustCode(): String + + @ReactMethod + fun callRustLib(callback: Callback) { + // Call the Rust function + val resultFromRust = callRustCode() + + // Return the result to JavaScript through the callback + callback.invoke(null, resultFromRust) + } + + external fun provePassport( + mrz: List, + reveal_bitmap: List, + dataHashes: List, + eContentBytes: List, + signature: List, + pubkey: List, + address: String + ): String + + @ReactMethod + fun provePassport(inputs: ReadableMap, callback: Callback) { + Log.d(TAG, "inputsaaa: " + inputs.toString()) + + val mrz = inputs.getArray("mrz")?.toArrayList()?.map { it as String } ?: listOf() + val reveal_bitmap = inputs.getArray("reveal_bitmap")?.toArrayList()?.map { it as String } ?: listOf() + val data_hashes = inputs.getArray("dataHashes")?.toArrayList()?.map { it as String } ?: listOf() + val e_content_bytes = inputs.getArray("eContentBytes")?.toArrayList()?.map { it as String } ?: listOf() + val signature = inputs.getArray("signature")?.toArrayList()?.map { it as String } ?: listOf() + val pubkey = inputs.getArray("pubkey")?.toArrayList()?.map { it as String } ?: listOf() + val address = inputs.getString("address") ?: "" + + val resultFromProof = provePassport(mrz, reveal_bitmap, data_hashes, e_content_bytes, signature, pubkey, address) + + Log.d(TAG, "resultFromProof: " + resultFromProof.toString()) + + // Return the result to JavaScript through the callback + callback.invoke(null, resultFromProof) + } + + companion object { + private val TAG = RNPassportReaderModule::class.java.simpleName + private const val PARAM_DOC_NUM = "documentNumber"; + private const val PARAM_DOB = "dateOfBirth"; + private const val PARAM_DOE = "dateOfExpiry"; + const val JPEG_DATA_URI_PREFIX = "data:image/jpeg;base64," + private const val KEY_IS_SUPPORTED = "isSupported" + var instance: RNPassportReaderModule? = null + init { + System.loadLibrary("ark_circom_passport") + } + } +} \ No newline at end of file diff --git a/app/android/react-native-passport-reader/android/src/main/java/io/tradle/nfc/RNPassportReaderPackage.kt b/app/android/react-native-passport-reader/android/src/main/java/io/tradle/nfc/RNPassportReaderPackage.kt new file mode 100644 index 00000000..9de402c5 --- /dev/null +++ b/app/android/react-native-passport-reader/android/src/main/java/io/tradle/nfc/RNPassportReaderPackage.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2016 Anton Tananaev (anton.tananaev@gmail.com) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.tradle.nfc +import io.tradle.nfc.RNPassportReaderModule + +import com.facebook.react.ReactPackage +import com.facebook.react.bridge.NativeModule +import com.facebook.react.bridge.ReactApplicationContext +import com.facebook.react.uimanager.ViewManager + +class RNPassportReaderPackage : ReactPackage { + override fun createNativeModules(reactContext: ReactApplicationContext): List { + return listOf(RNPassportReaderModule(reactContext)) + } + + // No need to override createJSModules method as it's removed in newer versions of React Native + + override fun createViewManagers(reactContext: ReactApplicationContext): List> { + return emptyList() + } +} \ No newline at end of file diff --git a/app/android/react-native-passport-reader/index.android.js b/app/android/react-native-passport-reader/index.android.js new file mode 100644 index 00000000..ed6e0f9f --- /dev/null +++ b/app/android/react-native-passport-reader/index.android.js @@ -0,0 +1,28 @@ + +import { NativeModules } from 'react-native' + +const { RNPassportReader } = NativeModules +const DATE_REGEX = /^\d{6}$/ + +module.exports = { + ...RNPassportReader, + scan +} + +function scan({ documentNumber, dateOfBirth, dateOfExpiry, quality=1 }) { + assert(typeof documentNumber === 'string', 'expected string "documentNumber"') + assert(isDate(dateOfBirth), 'expected string "dateOfBirth" in format "yyMMdd"') + assert(isDate(dateOfExpiry), 'expected string "dateOfExpiry" in format "yyMMdd"') + return RNPassportReader.scan({ documentNumber, dateOfBirth, dateOfExpiry, quality }) +} + + +function assert (statement, err) { + if (!statement) { + throw new Error(err || 'Assertion failed') + } +} + +function isDate (str) { + return typeof str === 'string' && DATE_REGEX.test(str) +} \ No newline at end of file diff --git a/app/android/react-native-passport-reader/package.json b/app/android/react-native-passport-reader/package.json new file mode 100644 index 00000000..75059fbd --- /dev/null +++ b/app/android/react-native-passport-reader/package.json @@ -0,0 +1,15 @@ +{ + "name": "react-native-passport-reader", + "version": "1.0.3", + "description": "read the NFC chip in a passport", + "main": "index.android.js", + "keywords": [ + "react-native", + "react-component", + "nfc", + "android", + "scanner" + ], + "author": "Mark Vayngrib (http://github.com/mvayngrib)", + "license": "APLv2" +} diff --git a/app/android/settings.gradle b/app/android/settings.gradle new file mode 100644 index 00000000..ccf1ff76 --- /dev/null +++ b/app/android/settings.gradle @@ -0,0 +1,6 @@ +rootProject.name = 'Proof of Passport' +apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) +include ':app' +includeBuild('../node_modules/@react-native/gradle-plugin') +include ':react-native-passport-reader' +project(':react-native-passport-reader').projectDir = new File(rootProject.projectDir, './react-native-passport-reader/android') \ No newline at end of file diff --git a/app/app.json b/app/app.json new file mode 100644 index 00000000..ce93916b --- /dev/null +++ b/app/app.json @@ -0,0 +1,4 @@ +{ + "name": "Proof of Passport", + "displayName": "Proof of Passport" +} diff --git a/app/ark-circom-passport/.gitignore b/app/ark-circom-passport/.gitignore new file mode 100644 index 00000000..65bee789 --- /dev/null +++ b/app/ark-circom-passport/.gitignore @@ -0,0 +1,3 @@ +/target +rsa +passport \ No newline at end of file diff --git a/app/ark-circom-passport/Cargo.lock b/app/ark-circom-passport/Cargo.lock new file mode 100644 index 00000000..eeac0966 --- /dev/null +++ b/app/ark-circom-passport/Cargo.lock @@ -0,0 +1,4958 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli 0.28.0", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aes" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5d730647d4fadd988536d06fecce94b7b4f2a7efdae548f1cf4b63205518ab" +dependencies = [ + "memchr", +] + +[[package]] +name = "android_log-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8052e2d8aabbb8d556d6abbcce2a22b9590996c5f849b9c7ce4544a2e3b984e" + +[[package]] +name = "android_logger" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cbd542dd180566fad88fd2729a53a62a734843c626638006a9d63ec0688484e" +dependencies = [ + "android_log-sys", + "env_logger", + "lazy_static", + "log", +] + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-circom" +version = "0.1.0" +source = "git+https://github.com/0xturboblitz/circom-compat.git#5c6210c261cb6ca3ade0b096b3d85cd31fb360e2" +dependencies = [ + "ark-bn254", + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-groth16", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-std", + "byteorder", + "cfg-if", + "color-eyre", + "criterion", + "ethers-core", + "fnv", + "hex", + "num", + "num-bigint", + "num-traits", + "thiserror", + "wasmer", +] + +[[package]] +name = "ark-crypto-primitives" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3a13b34da09176a8baba701233fdffbaa7c1b1192ce031a3da4e55ce1f1a56" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-snark", + "ark-std", + "blake2", + "derivative", + "digest", + "rayon", + "sha2", +] + +[[package]] +name = "ark-ec" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c60370a92f8e1a5f053cad73a862e1b99bc642333cd676fa11c0c39f80f4ac2" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "rayon", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2d42532524bee1da5a4f6f733eb4907301baa480829557adcff5dfaeee1d9a" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rayon", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-groth16" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ceafa83848c3e390f1cbf124bc3193b3e639b3f02009e0e290809a501b95fc" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-std", + "rayon", +] + +[[package]] +name = "ark-poly" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6ec811462cabe265cfe1b102fcfe3df79d7d2929c2425673648ee9abfd0272" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "rayon", +] + +[[package]] +name = "ark-relations" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00796b6efc05a3f48225e59cb6a2cda78881e7c390872d5786aaf112f31fb4f0" +dependencies = [ + "ark-ff", + "ark-std", + "tracing", + "tracing-subscriber 0.2.25", +] + +[[package]] +name = "ark-serialize" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7e735959bc173ea4baf13327b19c22d452b8e9e8e8f7b7fc34e6bf0e316c33e" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-snark" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d3cc6833a335bb8a600241889ead68ee89a3cf8448081fb7694c0fe503da63" +dependencies = [ + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-std", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand", + "rayon", +] + +[[package]] +name = "ark_circom_passport" +version = "0.1.0" +dependencies = [ + "android_logger", + "ark-bn254", + "ark-circom", + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-groth16", + "ark-relations", + "ark-serialize", + "ark-std", + "byteorder", + "color-eyre", + "ethers", + "hex", + "jni", + "log", + "num-bigint", + "num-traits", + "once_cell", + "serde", + "serde_derive", + "serde_json", + "tokio", + "wasmer", +] + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" +dependencies = [ + "term", +] + +[[package]] +name = "async-trait" +version = "0.1.76" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "531b97fb4cd3dfdce92c35dedbfdc1f0b9d8091c8ca943d6dae340ef5012d514" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "async_io_stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi", +] + +[[package]] +name = "auto_impl" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object 0.32.1", + "rustc-demangle", +] + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bs58" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +dependencies = [ + "sha2", + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "bytecheck" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +dependencies = [ + "serde", +] + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "camino" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cast" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "num-traits", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "bitflags 1.3.2", + "textwrap", + "unicode-width", +] + +[[package]] +name = "coins-bip32" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" +dependencies = [ + "bs58", + "coins-core", + "digest", + "hmac", + "k256", + "serde", + "sha2", + "thiserror", +] + +[[package]] +name = "coins-bip39" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" +dependencies = [ + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2 0.12.2", + "rand", + "sha2", + "thiserror", +] + +[[package]] +name = "coins-core" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" +dependencies = [ + "base64 0.21.5", + "bech32", + "bs58", + "digest", + "generic-array", + "hex", + "ripemd", + "serde", + "serde_derive", + "sha2", + "sha3", + "thiserror", +] + +[[package]] +name = "color-eyre" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "const-oid" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "corosensei" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80128832c58ea9cbd041d2a759ec449224487b2c1e400453d99d244eead87a8e" +dependencies = [ + "autocfg", + "cfg-if", + "libc", + "scopeguard", + "windows-sys 0.33.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +dependencies = [ + "libc", +] + +[[package]] +name = "cranelift-bforest" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38faa2a16616c8e78a18d37b4726b98bfd2de192f2fdc8a39ddf568a408a0f75" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26f192472a3ba23860afd07d2b0217dc628f21fcc72617aa1336d98e1671f33b" +dependencies = [ + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-entity", + "gimli 0.26.2", + "log", + "regalloc", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32ddb89e9b89d3d9b36a5b7d7ea3261c98235a76ac95ba46826b8ec40b1a24" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01fd0d9f288cc1b42d9333b7a776b17e278fc888c28e6a0f09b5573d45a150bc" + +[[package]] +name = "cranelift-entity" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3bfe172b83167604601faf9dc60453e0d0a93415b57a9c4d1a7ae6849185cf" + +[[package]] +name = "cranelift-frontend" +version = "0.82.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a006e3e32d80ce0e4ba7f1f9ddf66066d052a8c884a110b91d05404d6ce26dce" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "criterion" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" +dependencies = [ + "atty", + "cast", + "clap", + "criterion-plot", + "csv", + "itertools", + "lazy_static", + "num-traits", + "oorandom", + "plotters", + "rayon", + "regex", + "serde", + "serde_cbor", + "serde_derive", + "serde_json", + "tinytemplate", + "walkdir", +] + +[[package]] +name = "criterion-plot" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" +dependencies = [ + "cast", + "itertools", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset 0.9.0", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-bigint" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740fe28e594155f10cfc383984cbefd529d7396050557148f79cb0f621204124" +dependencies = [ + "generic-array", + "rand_core", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "csv" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "626ae34994d3d8d668f4269922248239db4ae42d538b14c398b74a52208e8086" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "data-encoding" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" + +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "diff" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "ecdsa" +version = "0.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4b1e0c257a9e9f25f90ff76d7a68360ed497ee519c8e428d1825ef0000799d4" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "elliptic-curve" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "968405c8fdc9b3bf4df0a6638858cc0b52462836ab6b1c87377785dd09cf1c0b" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ena" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1" +dependencies = [ + "log", +] + +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf56acd72bb22d2824e66ae8e9e5ada4d0de17a69c7fd35569dde2ada8ec9116" +dependencies = [ + "base64 0.13.1", + "bytes", + "hex", + "k256", + "log", + "rand", + "rlp", + "serde", + "sha3", + "zeroize", +] + +[[package]] +name = "enum-iterator" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "enumset" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "env_logger" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "eth-keystore" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" +dependencies = [ + "aes", + "ctr", + "digest", + "hex", + "hmac", + "pbkdf2 0.11.0", + "rand", + "scrypt", + "serde", + "serde_json", + "sha2", + "sha3", + "thiserror", + "uuid 0.8.2", +] + +[[package]] +name = "ethabi" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" +dependencies = [ + "ethereum-types", + "hex", + "once_cell", + "regex", + "serde", + "serde_json", + "sha3", + "thiserror", + "uint", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types", + "scale-info", + "uint", +] + +[[package]] +name = "ethers" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a58ce802c65cf3d0756dee5a61094a92cde53c1583b246e9ee5b37226c7fc15" +dependencies = [ + "ethers-addressbook", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-middleware", + "ethers-providers", + "ethers-signers", + "ethers-solc", +] + +[[package]] +name = "ethers-addressbook" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b856b7b8ff5c961093cb8efe151fbcce724b451941ce20781de11a531ccd578" +dependencies = [ + "ethers-core", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "ethers-contract" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e066a0d9cfc70c454672bf16bb433b0243427420076dc5b2f49c448fb5a10628" +dependencies = [ + "ethers-contract-abigen", + "ethers-contract-derive", + "ethers-core", + "ethers-providers", + "futures-util", + "hex", + "once_cell", + "pin-project", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "ethers-contract-abigen" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c113e3e86b6bc16d98484b2c3bb2d01d6fed9f489fe2e592e5cc87c3024d616b" +dependencies = [ + "Inflector", + "dunce", + "ethers-core", + "ethers-etherscan", + "eyre", + "hex", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "reqwest", + "serde", + "serde_json", + "syn 2.0.37", + "toml", + "walkdir", +] + +[[package]] +name = "ethers-contract-derive" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3fb5adee25701c79ec58fcf2c63594cd8829bc9ad6037ff862d5a111101ed2" +dependencies = [ + "Inflector", + "ethers-contract-abigen", + "ethers-core", + "hex", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.37", +] + +[[package]] +name = "ethers-core" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6da5fa198af0d3be20c19192df2bd9590b92ce09a8421e793bec8851270f1b05" +dependencies = [ + "arrayvec", + "bytes", + "cargo_metadata", + "chrono", + "elliptic-curve", + "ethabi", + "generic-array", + "hex", + "k256", + "num_enum", + "once_cell", + "open-fastrlp", + "rand", + "rlp", + "serde", + "serde_json", + "strum", + "syn 2.0.37", + "tempfile", + "thiserror", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "ethers-etherscan" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84ebb401ba97c6f5af278c2c9936c4546cad75dec464b439ae6df249906f4caa" +dependencies = [ + "ethers-core", + "reqwest", + "semver", + "serde", + "serde_json", + "thiserror", + "tracing", +] + +[[package]] +name = "ethers-middleware" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740f4a773c19dd6d6a68c8c2e0996c096488d38997d524e21dc612c55da3bd24" +dependencies = [ + "async-trait", + "auto_impl", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-providers", + "ethers-signers", + "futures-channel", + "futures-locks", + "futures-util", + "instant", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tracing", + "tracing-futures", + "url", +] + +[[package]] +name = "ethers-providers" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56b498fd2a6c019d023e43e83488cd1fb0721f299055975aa6bac8dbf1e95f2c" +dependencies = [ + "async-trait", + "auto_impl", + "base64 0.21.5", + "bytes", + "enr", + "ethers-core", + "futures-core", + "futures-timer", + "futures-util", + "hashers", + "hex", + "http", + "instant", + "once_cell", + "pin-project", + "reqwest", + "serde", + "serde_json", + "thiserror", + "tokio", + "tokio-tungstenite", + "tracing", + "tracing-futures", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "ws_stream_wasm", +] + +[[package]] +name = "ethers-signers" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02c4b7e15f212fa7cc2e1251868320221d4ff77a3d48068e69f47ce1c491df2d" +dependencies = [ + "async-trait", + "coins-bip32", + "coins-bip39", + "elliptic-curve", + "eth-keystore", + "ethers-core", + "hex", + "rand", + "sha2", + "thiserror", + "tracing", +] + +[[package]] +name = "ethers-solc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a81c89f121595cf8959e746045bb8b25a6a38d72588561e1a3b7992fc213f674" +dependencies = [ + "cfg-if", + "dunce", + "ethers-core", + "glob", + "hex", + "home", + "md-5", + "num_cpus", + "once_cell", + "path-slash", + "rayon", + "regex", + "semver", + "serde", + "serde_json", + "solang-parser", + "svm-rs", + "thiserror", + "tiny-keccak", + "tokio", + "tracing", + "walkdir", + "yansi", +] + +[[package]] +name = "eyre" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fastrand" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "rand_core", + "subtle", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-locks" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" +dependencies = [ + "futures-channel", + "futures-task", +] + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-timer" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +dependencies = [ + "gloo-timers", + "send_wrapper 0.4.0", +] + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +dependencies = [ + "fallible-iterator", + "indexmap 1.9.3", + "stable_deref_trait", +] + +[[package]] +name = "gimli" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.0.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", +] + +[[package]] +name = "hashbrown" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" + +[[package]] +name = "hashers" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +dependencies = [ + "fxhash", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "http" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +dependencies = [ + "equivalent", + "hashbrown 0.14.0", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "is-terminal" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" +dependencies = [ + "hermit-abi 0.3.3", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "jni" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24967112a1e4301ca5342ea339763613a37592b8a6ce6cf2e4494537c7a42faf" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "k256" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cadb76004ed8e97623117f3df85b17aaa6626ab0b0831e6573f104df16cd1bcc" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lalrpop" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a1cbf952127589f2851ab2046af368fd20645491bb4b376f04b7f94d7a9837b" +dependencies = [ + "ascii-canvas", + "bit-set", + "diff", + "ena", + "is-terminal", + "itertools", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax 0.6.29", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "lalrpop-util" +version = "0.19.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3c48237b9604c5a4702de6b824e02006c3214327564636aef27c1028a8fa0ed" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "leb128" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "libc" +version = "0.2.148" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.0", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "loupe" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d" +dependencies = [ + "indexmap 1.9.3", + "loupe-derive", + "rustversion", +] + +[[package]] +name = "loupe-derive" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "mach" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" +dependencies = [ + "libc", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "more-asserts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "num" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43db66d1170d347f9a065114077f7dccb00c1b9478c89384490a3425279a4606" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", + "rand", +] + +[[package]] +name = "num-complex" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.3", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "object" +version = "0.28.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" +dependencies = [ + "crc32fast", + "hashbrown 0.11.2", + "indexmap 1.9.3", + "memchr", +] + +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "oorandom" +version = "11.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" + +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "ethereum-types", + "open-fastrlp-derive", +] + +[[package]] +name = "open-fastrlp-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +dependencies = [ + "bytes", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + +[[package]] +name = "parity-scale-codec" +version = "3.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", + "hmac", + "password-hash", + "sha2", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap 2.0.0", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" + +[[package]] +name = "plotters" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-svg", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" + +[[package]] +name = "plotters-svg" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +dependencies = [ + "plotters-backend", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +dependencies = [ + "proc-macro2", + "syn 2.0.37", +] + +[[package]] +name = "primitive-types" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d433d9f1a3e8c1263d9456598b16fec66f4acc9a74dacffd35c7bb09b3a1328" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +dependencies = [ + "getrandom", + "libredox", + "thiserror", +] + +[[package]] +name = "regalloc" +version = "0.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62446b1d3ebf980bdc68837700af1d77b37bc430e524bf95319c6eada2a4cc02" +dependencies = [ + "log", + "rustc-hash", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-automata" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.7.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + +[[package]] +name = "region" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e" +dependencies = [ + "bitflags 1.3.2", + "libc", + "mach", + "winapi", +] + +[[package]] +name = "rend" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "reqwest" +version = "0.11.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" +dependencies = [ + "base64 0.21.5", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "system-configuration", + "tokio", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.25.3", + "winreg", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +dependencies = [ + "cc", + "getrandom", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.48.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest", +] + +[[package]] +name = "rkyv" +version = "0.7.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" +dependencies = [ + "bitvec", + "bytecheck", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid 1.4.1", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rlp-derive", + "rustc-hex", +] + +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "747c788e9ce8e92b12cd485c49ddf90723550b654b32508f979b71a7b1ecda4f" +dependencies = [ + "bitflags 2.4.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustls" +version = "0.21.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" +dependencies = [ + "log", + "ring 0.17.7", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.5", +] + +[[package]] +name = "rustls-webpki" +version = "0.100.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6a5fc258f1c1276dfe3016516945546e2d5383911efc0fc4f1cdc5df3a4ae3" +dependencies = [ + "ring 0.16.20", + "untrusted 0.7.1", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.7", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scale-info" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0a159d0c45c12b20c5a844feb1fe4bea86e28f17b92a5f0c42193634d3782" +dependencies = [ + "cfg-if", + "derive_more", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "912e55f6d20e0e80d63733872b40e1227c0bce1e1ab81ba67d696339bfd7fd29" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scrypt" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" +dependencies = [ + "hmac", + "pbkdf2 0.11.0", + "salsa20", + "sha2", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.7", + "untrusted 0.9.0", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +dependencies = [ + "serde", +] + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_cbor" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" +dependencies = [ + "half", + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "serde_json" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +dependencies = [ + "digest", + "rand_core", +] + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" + +[[package]] +name = "socket2" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "solang-parser" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a94494913728908efa7a25a2dd2e4f037e714897985c24273c40596638ed909" +dependencies = [ + "itertools", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", +] + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "svm-rs" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a04fc4f5cd35c700153b233f5575ccb3237e0f941fa5049d9e98254d10bf2fe" +dependencies = [ + "fs2", + "hex", + "home", + "once_cell", + "reqwest", + "semver", + "serde", + "serde_json", + "sha2", + "thiserror", + "url", + "zip", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7303ef2c05cd654186cb250d29049a24840ca25d2747c25c0381c8d9e2f582e8" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a" + +[[package]] +name = "tempfile" +version = "3.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thiserror" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ab016db510546d856297882807df8da66a16fb8c4101cb8b30054b0d5b2d9c" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +dependencies = [ + "deranged", + "powerfmt", + "serde", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec509ac96e9a0c43427c74f003127d953a265737636129424288d27cb5c4b12c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots 0.23.1", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.0.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "tracing-core" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing", + "tracing-subscriber 0.3.17", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15fba1a6d6bb030745759a9a2a588bfe8490fc8b4751a277db3a0be1c9ebbf67" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand", + "rustls", + "sha1", + "thiserror", + "url", + "utf-8", + "webpki", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom", + "serde", +] + +[[package]] +name = "uuid" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.37", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02dbc21516f9f1f04f187958890d7e6026df8d16540b7ad9492bc34a67cea03" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" + +[[package]] +name = "wasm-encoder" +version = "0.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39de0723a53d3c8f54bed106cfbc0d06b3e4d945c5c5022115a61e3b29183ae" +dependencies = [ + "leb128", +] + +[[package]] +name = "wasmer" +version = "2.3.0" +source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3aa949c990ad4972d0bcbd022c" +dependencies = [ + "cfg-if", + "indexmap 1.9.3", + "js-sys", + "loupe", + "more-asserts", + "target-lexicon", + "thiserror", + "wasm-bindgen", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-compiler-cranelift", + "wasmer-derive", + "wasmer-engine", + "wasmer-engine-dylib", + "wasmer-engine-universal", + "wasmer-types", + "wasmer-vm", + "wat", + "winapi", +] + +[[package]] +name = "wasmer-artifact" +version = "2.3.0" +source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3aa949c990ad4972d0bcbd022c" +dependencies = [ + "enumset", + "loupe", + "thiserror", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-compiler" +version = "2.3.0" +source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3aa949c990ad4972d0bcbd022c" +dependencies = [ + "enumset", + "loupe", + "rkyv", + "serde", + "serde_bytes", + "smallvec", + "target-lexicon", + "thiserror", + "wasmer-types", + "wasmparser", +] + +[[package]] +name = "wasmer-compiler-cranelift" +version = "2.3.0" +source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3aa949c990ad4972d0bcbd022c" +dependencies = [ + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "gimli 0.26.2", + "loupe", + "more-asserts", + "rayon", + "smallvec", + "target-lexicon", + "tracing", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-derive" +version = "2.3.0" +source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3aa949c990ad4972d0bcbd022c" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "wasmer-engine" +version = "2.3.0" +source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3aa949c990ad4972d0bcbd022c" +dependencies = [ + "backtrace", + "enumset", + "lazy_static", + "loupe", + "memmap2", + "more-asserts", + "rustc-demangle", + "serde", + "serde_bytes", + "target-lexicon", + "thiserror", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-types", + "wasmer-vm", +] + +[[package]] +name = "wasmer-engine-dylib" +version = "2.3.0" +source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3aa949c990ad4972d0bcbd022c" +dependencies = [ + "cfg-if", + "enum-iterator", + "enumset", + "leb128", + "libloading", + "loupe", + "object 0.28.4", + "rkyv", + "serde", + "tempfile", + "tracing", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-engine", + "wasmer-object", + "wasmer-types", + "wasmer-vm", + "which", +] + +[[package]] +name = "wasmer-engine-universal" +version = "2.3.0" +source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3aa949c990ad4972d0bcbd022c" +dependencies = [ + "cfg-if", + "enumset", + "leb128", + "loupe", + "region", + "rkyv", + "wasmer-compiler", + "wasmer-engine", + "wasmer-engine-universal-artifact", + "wasmer-types", + "wasmer-vm", + "winapi", +] + +[[package]] +name = "wasmer-engine-universal-artifact" +version = "2.3.0" +source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3aa949c990ad4972d0bcbd022c" +dependencies = [ + "enum-iterator", + "enumset", + "loupe", + "rkyv", + "thiserror", + "wasmer-artifact", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-object" +version = "2.3.0" +source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3aa949c990ad4972d0bcbd022c" +dependencies = [ + "object 0.28.4", + "thiserror", + "wasmer-compiler", + "wasmer-types", +] + +[[package]] +name = "wasmer-types" +version = "2.3.0" +source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3aa949c990ad4972d0bcbd022c" +dependencies = [ + "backtrace", + "enum-iterator", + "indexmap 1.9.3", + "loupe", + "more-asserts", + "rkyv", + "serde", + "thiserror", +] + +[[package]] +name = "wasmer-vm" +version = "2.3.0" +source = "git+https://github.com/oskarth/wasmer.git?rev=09c7070#09c7070d8f0baf3aa949c990ad4972d0bcbd022c" +dependencies = [ + "backtrace", + "cc", + "cfg-if", + "corosensei", + "enum-iterator", + "indexmap 1.9.3", + "lazy_static", + "libc", + "loupe", + "mach", + "memoffset 0.6.5", + "more-asserts", + "region", + "rkyv", + "scopeguard", + "serde", + "thiserror", + "wasmer-artifact", + "wasmer-types", + "winapi", +] + +[[package]] +name = "wasmparser" +version = "0.83.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a" + +[[package]] +name = "wast" +version = "65.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd8c1cbadf94a0b0d1071c581d3cfea1b7ed5192c79808dd15406e508dd0afb" +dependencies = [ + "leb128", + "memchr", + "unicode-width", + "wasm-encoder", +] + +[[package]] +name = "wat" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3209e35eeaf483714f4c6be93f4a03e69aad5f304e3fa66afa7cb90fe1c8051f" +dependencies = [ + "wast", +] + +[[package]] +name = "web-sys" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" +dependencies = [ + "ring 0.17.7", + "untrusted 0.9.0", +] + +[[package]] +name = "webpki-roots" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b03058f88386e5ff5310d9111d53f48b17d732b401aeb83a8d5190f2ac459338" +dependencies = [ + "rustls-webpki 0.100.3", +] + +[[package]] +name = "webpki-roots" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" +dependencies = [ + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "winnow" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version", + "send_wrapper 0.6.0", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.37", +] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.9+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/app/ark-circom-passport/Cargo.toml b/app/ark-circom-passport/Cargo.toml new file mode 100644 index 00000000..b9fb888b --- /dev/null +++ b/app/ark-circom-passport/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "ark_circom_passport" +version = "0.1.0" +edition = "2021" + +[lib] +name = "ark_circom_passport" +path = "src/passport.rs" +crate-type = ["cdylib"] + +# [profile.dev] +# opt-level = 3 + +[patch.crates-io] +# NOTE: Forked wasmer to work around memory limits +# See https://github.com/wasmerio/wasmer/commit/09c7070 +wasmer = { git = "https://github.com/oskarth/wasmer.git", rev = "09c7070" } + + +[dependencies] +ark-circom = { git = "https://github.com/0xturboblitz/circom-compat.git" } +ark-bn254 = { version = "=0.4.0" } +ark-groth16 = { version = "=0.4.0", default-features = false, features = ["parallel"] } +ark-std = { version = "=0.4.0", default-features = false, features = ["parallel"] } +ark-crypto-primitives = { version = "=0.4.0" } +ark-ec = { version = "=0.4.1" } +ark-ff = { version = "=0.4.1", default-features = false, features = ["parallel", "asm"] } +ark-relations = { version = "=0.4.0", default-features = false } +ark-serialize = { version = "=0.4.1", default-features = false } +color-eyre = "=0.6.2" +ethers = "=2.0.7" +tokio = { version = "1", features = ["full"] } +jni = "0.18" +log = "0.4" +android_logger = "0.8" +serde = "1.0" +serde_json = "1.0" +serde_derive = "1.0" +byteorder = "=1.4.3" +num-traits = { version = "=0.2.15", default-features = false } +hex = "0.4" +num-bigint = { version = "=0.4.3", default-features = false, features = [ + "rand", +] } +wasmer = { git = "https://github.com/oskarth/wasmer.git", rev = "09c7070" } +once_cell = "1.8" diff --git a/app/ark-circom-passport/README.md b/app/ark-circom-passport/README.md new file mode 100644 index 00000000..fc587528 --- /dev/null +++ b/app/ark-circom-passport/README.md @@ -0,0 +1,6 @@ +# ark circom proof and verification of passport circuit + +To run tests and see logs: +``` +cargo test -- --nocapture +``` \ No newline at end of file diff --git a/app/ark-circom-passport/artifacts/verifier_artifact.json b/app/ark-circom-passport/artifacts/verifier_artifact.json new file mode 100644 index 00000000..1a2b8cb6 --- /dev/null +++ b/app/ark-circom-passport/artifacts/verifier_artifact.json @@ -0,0 +1 @@ +{"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[]","name":"input","type":"uint256[]"},{"components":[{"components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}],"internalType":"struct Pairing.G1Point","name":"A","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"X","type":"uint256[2]"},{"internalType":"uint256[2]","name":"Y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"B","type":"tuple"},{"components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}],"internalType":"struct Pairing.G1Point","name":"C","type":"tuple"}],"internalType":"struct Verifier.Proof","name":"proof","type":"tuple"},{"components":[{"components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}],"internalType":"struct Pairing.G1Point","name":"alfa1","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"X","type":"uint256[2]"},{"internalType":"uint256[2]","name":"Y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"beta2","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"X","type":"uint256[2]"},{"internalType":"uint256[2]","name":"Y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"gamma2","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"X","type":"uint256[2]"},{"internalType":"uint256[2]","name":"Y","type":"uint256[2]"}],"internalType":"struct Pairing.G2Point","name":"delta2","type":"tuple"},{"components":[{"internalType":"uint256","name":"X","type":"uint256"},{"internalType":"uint256","name":"Y","type":"uint256"}],"internalType":"struct Pairing.G1Point[]","name":"IC","type":"tuple[]"}],"internalType":"struct Verifier.VerifyingKey","name":"vk","type":"tuple"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}],"bytecode":{"object":"0x608060405234801561001057600080fd5b50610c99806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80639416c1ee14610030575b600080fd5b61004361003e366004610a2f565b610059565b6040516100509190610afc565b60405180910390f35b600080610067858585610085565b90508061007857600191505061007e565b60009150505b9392505050565b60808101515183516000917f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000191600101146100db5760405162461bcd60e51b81526004016100d290610b07565b60405180910390fd5b604080518082019091526000808252602082018190525b8651811015610177578287828151811061010857fe5b60200260200101511061012d5760405162461bcd60e51b81526004016100d290610b5f565b61016d826101688760800151846001018151811061014757fe5b60200260200101518a858151811061015b57fe5b60200260200101516101eb565b610256565b91506001016100f2565b5061019a81856080015160008151811061018d57fe5b6020026020010151610256565b90506101d06101ac86600001516102bd565b8660200151866000015187602001518589604001518b604001518b60600151610349565b6101df5760019250505061007e565b50600095945050505050565b6101f36106dc565b6101fb6106f6565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa905080801561022e57610230565bfe5b508061024e5760405162461bcd60e51b81526004016100d290610b33565b505092915050565b61025e6106dc565b610266610714565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa905080801561022e57508061024e5760405162461bcd60e51b81526004016100d290610bc6565b6102c56106dc565b81517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47901580156102f857506020830151155b156103185750506040805180820190915260008082526020820152610344565b6040518060400160405280846000015181526020018285602001518161033a57fe5b0683038152509150505b919050565b60408051600480825260a08201909252600091829190816020015b61036c6106dc565b81526020019060019003908161036457505060408051600480825260a0820190925291925060009190602082015b6103a2610732565b81526020019060019003908161039a5790505090508a826000815181106103c557fe5b602002602001018190525088826001815181106103de57fe5b602002602001018190525086826002815181106103f757fe5b6020026020010181905250848260038151811061041057fe5b6020026020010181905250898160008151811061042957fe5b6020026020010181905250878160018151811061044257fe5b6020026020010181905250858160028151811061045b57fe5b6020026020010181905250838160038151811061047457fe5b60200260200101819052506104898282610498565b9b9a5050505050505050505050565b600081518351146104bb5760405162461bcd60e51b81526004016100d290610b96565b82516006810260008167ffffffffffffffff811180156104da57600080fd5b50604051908082528060200260200182016040528015610504578160200160208202803683370190505b50905060005b838110156106895786818151811061051e57fe5b60200260200101516000015182826006026000018151811061053c57fe5b60200260200101818152505086818151811061055457fe5b60200260200101516020015182826006026001018151811061057257fe5b60200260200101818152505085818151811061058a57fe5b6020908102919091010151515182518390600260068502019081106105ab57fe5b6020026020010181815250508581815181106105c357fe5b602090810291909101015151600160200201518282600602600301815181106105e857fe5b60200260200101818152505085818151811061060057fe5b60200260200101516020015160006002811061061857fe5b602002015182826006026004018151811061062f57fe5b60200260200101818152505085818151811061064757fe5b60200260200101516020015160016002811061065f57fe5b602002015182826006026005018151811061067657fe5b602090810291909101015260010161050a565b50610692610757565b6000602082602086026020860160086107d05a03fa905080801561022e5750806106ce5760405162461bcd60e51b81526004016100d290610bf2565b505115159695505050505050565b604051806040016040528060008152602001600081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280610745610775565b8152602001610752610775565b905290565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b600082601f8301126107a3578081fd5b813560206107b86107b383610c45565b610c21565b828152818101908583016040808602880185018910156107d6578687fd5b865b868110156107fc576107ea8a84610879565b855293850193918101916001016107d8565b509198975050505050505050565b600082601f83011261081a578081fd5b6040516040810181811067ffffffffffffffff8211171561083757fe5b806040525080838560408601111561084d578384fd5b835b600281101561086e57813583526020928301929091019060010161084f565b509195945050505050565b60006040828403121561088a578081fd5b6040516040810181811067ffffffffffffffff821117156108a757fe5b604052823581526020928301359281019290925250919050565b6000608082840312156108d2578081fd5b6040516040810181811067ffffffffffffffff821117156108ef57fe5b6040529050806108ff848461080a565b815261090e846040850161080a565b60208201525092915050565b6000610100828403121561092c578081fd5b6040516060810181811067ffffffffffffffff8211171561094957fe5b6040529050806109598484610879565b815261096884604085016108c1565b602082015261097a8460c08501610879565b60408201525092915050565b60006101e08284031215610998578081fd5b60405160a0810167ffffffffffffffff82821081831117156109b657fe5b816040528293506109c78686610879565b83526109d686604087016108c1565b60208401526109e88660c087016108c1565b60408401526109fb8661014087016108c1565b60608401526101c0850135915080821115610a1557600080fd5b50610a2285828601610793565b6080830152505092915050565b60008060006101408486031215610a44578283fd5b833567ffffffffffffffff80821115610a5b578485fd5b818601915086601f830112610a6e578485fd5b81356020610a7e6107b383610c45565b82815281810190858301838502870184018c1015610a9a57898afd5b8996505b84871015610abc578035835260019690960195918301918301610a9e565b509750610acd90508989830161091a565b95505050610120860135915080821115610ae5578283fd5b50610af286828701610986565b9150509250925092565b901515815260200190565b6020808252601290820152711d995c9a599a595c8b5898590b5a5b9c1d5d60721b604082015260600190565b6020808252601290820152711c185a5c9a5b99cb5b5d5b0b59985a5b195960721b604082015260600190565b6020808252601f908201527f76657269666965722d6774652d736e61726b2d7363616c61722d6669656c6400604082015260600190565b6020808252601690820152751c185a5c9a5b99cb5b195b99dd1a1ccb59985a5b195960521b604082015260600190565b6020808252601290820152711c185a5c9a5b99cb5859190b59985a5b195960721b604082015260600190565b6020808252601590820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b604082015260600190565b60405181810167ffffffffffffffff81118282101715610c3d57fe5b604052919050565b600067ffffffffffffffff821115610c5957fe5b506020908102019056fea26469706673582212209a2c6205a848844df554808272357e43d3f44aca27cb62f8160a5bf34625abc264736f6c63430007060033","sourceMap":"1307:423:0:-:0;;;1334:16;;;;;;;;;;1307:423;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80639416c1ee14610030575b600080fd5b61004361003e366004610a2f565b610059565b6040516100509190610afc565b60405180910390f35b600080610067858585610085565b90508061007857600191505061007e565b60009150505b9392505050565b60808101515183516000917f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000191600101146100db5760405162461bcd60e51b81526004016100d290610b07565b60405180910390fd5b604080518082019091526000808252602082018190525b8651811015610177578287828151811061010857fe5b60200260200101511061012d5760405162461bcd60e51b81526004016100d290610b5f565b61016d826101688760800151846001018151811061014757fe5b60200260200101518a858151811061015b57fe5b60200260200101516101eb565b610256565b91506001016100f2565b5061019a81856080015160008151811061018d57fe5b6020026020010151610256565b90506101d06101ac86600001516102bd565b8660200151866000015187602001518589604001518b604001518b60600151610349565b6101df5760019250505061007e565b50600095945050505050565b6101f36106dc565b6101fb6106f6565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa905080801561022e57610230565bfe5b508061024e5760405162461bcd60e51b81526004016100d290610b33565b505092915050565b61025e6106dc565b610266610714565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa905080801561022e57508061024e5760405162461bcd60e51b81526004016100d290610bc6565b6102c56106dc565b81517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47901580156102f857506020830151155b156103185750506040805180820190915260008082526020820152610344565b6040518060400160405280846000015181526020018285602001518161033a57fe5b0683038152509150505b919050565b60408051600480825260a08201909252600091829190816020015b61036c6106dc565b81526020019060019003908161036457505060408051600480825260a0820190925291925060009190602082015b6103a2610732565b81526020019060019003908161039a5790505090508a826000815181106103c557fe5b602002602001018190525088826001815181106103de57fe5b602002602001018190525086826002815181106103f757fe5b6020026020010181905250848260038151811061041057fe5b6020026020010181905250898160008151811061042957fe5b6020026020010181905250878160018151811061044257fe5b6020026020010181905250858160028151811061045b57fe5b6020026020010181905250838160038151811061047457fe5b60200260200101819052506104898282610498565b9b9a5050505050505050505050565b600081518351146104bb5760405162461bcd60e51b81526004016100d290610b96565b82516006810260008167ffffffffffffffff811180156104da57600080fd5b50604051908082528060200260200182016040528015610504578160200160208202803683370190505b50905060005b838110156106895786818151811061051e57fe5b60200260200101516000015182826006026000018151811061053c57fe5b60200260200101818152505086818151811061055457fe5b60200260200101516020015182826006026001018151811061057257fe5b60200260200101818152505085818151811061058a57fe5b6020908102919091010151515182518390600260068502019081106105ab57fe5b6020026020010181815250508581815181106105c357fe5b602090810291909101015151600160200201518282600602600301815181106105e857fe5b60200260200101818152505085818151811061060057fe5b60200260200101516020015160006002811061061857fe5b602002015182826006026004018151811061062f57fe5b60200260200101818152505085818151811061064757fe5b60200260200101516020015160016002811061065f57fe5b602002015182826006026005018151811061067657fe5b602090810291909101015260010161050a565b50610692610757565b6000602082602086026020860160086107d05a03fa905080801561022e5750806106ce5760405162461bcd60e51b81526004016100d290610bf2565b505115159695505050505050565b604051806040016040528060008152602001600081525090565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b6040518060400160405280610745610775565b8152602001610752610775565b905290565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b600082601f8301126107a3578081fd5b813560206107b86107b383610c45565b610c21565b828152818101908583016040808602880185018910156107d6578687fd5b865b868110156107fc576107ea8a84610879565b855293850193918101916001016107d8565b509198975050505050505050565b600082601f83011261081a578081fd5b6040516040810181811067ffffffffffffffff8211171561083757fe5b806040525080838560408601111561084d578384fd5b835b600281101561086e57813583526020928301929091019060010161084f565b509195945050505050565b60006040828403121561088a578081fd5b6040516040810181811067ffffffffffffffff821117156108a757fe5b604052823581526020928301359281019290925250919050565b6000608082840312156108d2578081fd5b6040516040810181811067ffffffffffffffff821117156108ef57fe5b6040529050806108ff848461080a565b815261090e846040850161080a565b60208201525092915050565b6000610100828403121561092c578081fd5b6040516060810181811067ffffffffffffffff8211171561094957fe5b6040529050806109598484610879565b815261096884604085016108c1565b602082015261097a8460c08501610879565b60408201525092915050565b60006101e08284031215610998578081fd5b60405160a0810167ffffffffffffffff82821081831117156109b657fe5b816040528293506109c78686610879565b83526109d686604087016108c1565b60208401526109e88660c087016108c1565b60408401526109fb8661014087016108c1565b60608401526101c0850135915080821115610a1557600080fd5b50610a2285828601610793565b6080830152505092915050565b60008060006101408486031215610a44578283fd5b833567ffffffffffffffff80821115610a5b578485fd5b818601915086601f830112610a6e578485fd5b81356020610a7e6107b383610c45565b82815281810190858301838502870184018c1015610a9a57898afd5b8996505b84871015610abc578035835260019690960195918301918301610a9e565b509750610acd90508989830161091a565b95505050610120860135915080821115610ae5578283fd5b50610af286828701610986565b9150509250925092565b901515815260200190565b6020808252601290820152711d995c9a599a595c8b5898590b5a5b9c1d5d60721b604082015260600190565b6020808252601290820152711c185a5c9a5b99cb5b5d5b0b59985a5b195960721b604082015260600190565b6020808252601f908201527f76657269666965722d6774652d736e61726b2d7363616c61722d6669656c6400604082015260600190565b6020808252601690820152751c185a5c9a5b99cb5b195b99dd1a1ccb59985a5b195960521b604082015260600190565b6020808252601290820152711c185a5c9a5b99cb5859190b59985a5b195960721b604082015260600190565b6020808252601590820152741c185a5c9a5b99cb5bdc18dbd9194b59985a5b1959605a1b604082015260600190565b60405181810167ffffffffffffffff81118282101715610c3d57fe5b604052919050565b600067ffffffffffffffff821115610c5957fe5b506020908102019056fea26469706673582212209a2c6205a848844df554808272357e43d3f44aca27cb62f8160a5bf34625abc264736f6c63430007060033","sourceMap":"1307:423:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1356:372;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;1509:4;1525:11;1539:79;1568:5;1587;1606:2;1539:15;:79::i;:::-;1525:93;-1:-1:-1;1633:8:0;1629:93;;1664:4;1657:11;;;;;1629:93;1706:5;1699:12;;;1356:372;;;;;;:::o;2075:1054::-;2375:5;;;;:12;2355;;2212:7;;2260:77;;2370:1;2355:16;:32;2347:63;;;;-1:-1:-1;;;2347:63:0;;;;;;;:::i;:::-;;;;;;;;;2497:21;;;;;;;;;2467:27;2497:21;;;;;;;;;2528:228;2552:5;:12;2548:1;:16;2528:228;;;2604:18;2593:5;2599:1;2593:8;;;;;;;;;;;;;;:29;2585:73;;;;-1:-1:-1;;;2585:73:0;;;;;;;:::i;:::-;2679:66;2696:4;2702:42;2721:2;:5;;;2727:1;2731;2727:5;2721:12;;;;;;;;;;;;;;2735:5;2741:1;2735:8;;;;;;;;;;;;;;2702:18;:42::i;:::-;2679:16;:66::i;:::-;2672:73;-1:-1:-1;2566:3:0;;2528:228;;;;2772:32;2789:4;2795:2;:5;;;2801:1;2795:8;;;;;;;;;;;;;;2772:16;:32::i;:::-;2765:39;;2832:253;2870:23;2885:5;:7;;;2870:14;:23::i;:::-;2911:5;:7;;;2936:2;:8;;;2962:2;:8;;;2988:4;3010:2;:9;;;3037:5;:7;;;3062:2;:9;;;2832:20;:253::i;:::-;2814:290;;3103:1;3096:8;;;;;;2814:290;-1:-1:-1;3121:1:0;;2075:1054;-1:-1:-1;;;;;2075:1054:0:o;6418:625::-;6514:16;;:::i;:::-;6546:23;;:::i;:::-;6590:3;;6579:14;;:8;6614:3;;;;6603:8;;;:14;6627:8;;;:12;;;-1:-1:-1;6817:4:0;6814:1;6808:4;6579:14;6798:1;6791:4;6784:5;6780:16;6769:53;6758:64;-1:-1:-1;6758:64:0;6923:56;;;;6892:87;;6923:56;6952:9;6892:87;;7006:7;6998:38;;;;-1:-1:-1;;;6998:38:0;;;;;;;:::i;:::-;6418:625;;;;;;:::o;5600:662::-;5703:16;;:::i;:::-;5735:23;;:::i;:::-;5779:4;;5768:15;;:8;5804:4;;;;5793:8;;;:15;5829:4;;5818:8;;;:15;5854:4;;;5843:8;;;;:15;;;;-1:-1:-1;;6033:1:0;6027:4;5768:15;6017:1;6010:4;6003:5;5999:16;5988:53;5977:64;-1:-1:-1;5977:64:0;6142:56;;;;6111:87;6225:7;6217:38;;;;-1:-1:-1;;;6217:38:0;;;;;;;:::i;5202:346::-;5259:16;;:::i;:::-;5455:3;;5364:77;;5455:8;:20;;;;-1:-1:-1;5467:3:0;;;;:8;5455:20;5451:46;;;-1:-1:-1;;5484:13:0;;;;;;;;;-1:-1:-1;5484:13:0;;;;;;;5477:20;;5451:46;5514:27;;;;;;;;5522:1;:3;;;5514:27;;;;5538:1;5532;:3;;;:7;;;;;;5527:1;:13;5514:27;;;5507:34;;;5202:346;;;;:::o;9554:568::-;9859:16;;;9873:1;9859:16;;;;;;;;;9821:4;;;;9859:16;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;9907:16:0;;;9921:1;9907:16;;;;;;;;;9837:38;;-1:-1:-1;9885:19:0;;9907:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;9885:38;;9941:2;9933;9936:1;9933:5;;;;;;;;;;;;;:10;;;;9961:2;9953;9956:1;9953:5;;;;;;;;;;;;;:10;;;;9981:2;9973;9976:1;9973:5;;;;;;;;;;;;;:10;;;;10001:2;9993;9996:1;9993:5;;;;;;;;;;;;;:10;;;;10021:2;10013;10016:1;10013:5;;;;;;;;;;;;;:10;;;;10041:2;10033;10036:1;10033:5;;;;;;;;;;;;;:10;;;;10061:2;10053;10056:1;10053:5;;;;;;;;;;;;;:10;;;;10081:2;10073;10076:1;10073:5;;;;;;;;;;;;;:10;;;;10100:15;10108:2;10112;10100:7;:15::i;:::-;10093:22;9554:568;-1:-1:-1;;;;;;;;;;;9554:568:0:o;7255:1238::-;7361:4;7402:2;:9;7389:2;:9;:22;7381:57;;;;-1:-1:-1;;;7381:57:0;;;;;;;:::i;:::-;7467:9;;7517:1;7506:12;;7448:16;7506:12;7553:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7553:24:0;;7528:49;;7592:9;7587:302;7611:8;7607:1;:12;7587:302;;;7659:2;7662:1;7659:5;;;;;;;;;;;;;;:7;;;7640:5;7646:1;7650;7646:5;7654:1;7646:9;7640:16;;;;;;;;;;;;;:26;;;;;7699:2;7702:1;7699:5;;;;;;;;;;;;;;:7;;;7680:5;7686:1;7690;7686:5;7694:1;7686:9;7680:16;;;;;;;;;;;;;:26;;;;;7739:2;7742:1;7739:5;;;;;;;;;;;;;;;;;;:7;:10;7720:16;;:5;;7734:1;7730;7726:5;;:9;;7720:16;;;;;;;;;;;:29;;;;;7782:2;7785:1;7782:5;;;;;;;;;;;;;;;;;;:7;7790:1;7782:10;;;;7763:5;7769:1;7773;7769:5;7777:1;7769:9;7763:16;;;;;;;;;;;;;:29;;;;;7825:2;7828:1;7825:5;;;;;;;;;;;;;;:7;;;7833:1;7825:10;;;;;;;;;;;7806:5;7812:1;7816;7812:5;7820:1;7812:9;7806:16;;;;;;;;;;;;;:29;;;;;7868:2;7871:1;7868:5;;;;;;;;;;;;;;:7;;;7876:1;7868:10;;;;;;;;;;;7849:5;7855:1;7859;7855:5;7863:1;7855:9;7849:16;;;;;;;;;;;;;;;;;:29;7621:3;;7587:302;;;;7898:21;;:::i;:::-;7929:12;8223:4;8202:3;8179:4;8168:9;8164:20;8141:4;8134:5;8130:16;8111:1;8088:4;8081:5;8077:16;8049:192;8038:203;-1:-1:-1;8038:203:0;8342:56;;;;8311:87;8425:7;8417:41;;;;-1:-1:-1;;;8417:41:0;;;;;;;:::i;:::-;-1:-1:-1;8475:6:0;:11;;;;-1:-1:-1;;;;;;7255:1238:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:765:1:-;;135:3;128:4;120:6;116:17;112:27;102:2;;157:5;150;143:20;102:2;197:6;184:20;223:4;247:73;262:57;316:2;262:57;:::i;:::-;247:73;:::i;:::-;354:15;;;385:12;;;;417:15;;;451:4;486:11;;;474:24;;470:33;;467:42;-1:-1:-1;464:2:1;;;526:5;519;512:20;464:2;552:5;566:184;580:2;577:1;574:9;566:184;;;637:38;671:3;666;637:38;:::i;:::-;625:51;;696:12;;;;728;;;;598:1;591:9;566:184;;;-1:-1:-1;768:5:1;;92:687;-1:-1:-1;;;;;;;;92:687:1:o;784:698::-;;892:3;885:4;877:6;873:17;869:27;859:2;;914:5;907;900:20;859:2;951;945:9;993:2;985:6;981:15;1062:6;1050:10;1047:22;1026:18;1014:10;1011:34;1008:62;1005:2;;;1073:9;1005:2;1104:10;1100:2;1093:22;;1135:6;1161;1199:3;1194:2;1186:6;1182:15;1179:24;1176:2;;;1220:5;1213;1206:20;1176:2;1246:5;1260:192;1274:4;1271:1;1268:11;1260:192;;;1333:17;;1321:30;;1374:4;1398:12;;;;1430;;;;1294:1;1287:9;1260:192;;;-1:-1:-1;1470:6:1;;849:633;-1:-1:-1;;;;;849:633:1:o;1487:478::-;;1592:4;1580:9;1575:3;1571:19;1567:30;1564:2;;;1614:5;1607;1600:20;1564:2;1651:4;1645:11;1695:4;1687:6;1683:17;1766:6;1754:10;1751:22;1730:18;1718:10;1715:34;1712:62;1709:2;;;1777:9;1709:2;1804:4;1797:24;1869:23;;1854:39;;1954:2;1939:18;;;1926:32;1909:15;;;1902:57;;;;-1:-1:-1;1839:6:1;1554:411;-1:-1:-1;1554:411:1:o;1970:526::-;;2075:4;2063:9;2058:3;2054:19;2050:30;2047:2;;;2097:5;2090;2083:20;2047:2;2134:4;2128:11;2178:4;2170:6;2166:17;2249:6;2237:10;2234:22;2213:18;2201:10;2198:34;2195:62;2192:2;;;2260:9;2192:2;2287:4;2280:24;2322:6;-1:-1:-1;2322:6:1;2352:45;2393:3;2382:9;2352:45;:::i;:::-;2344:6;2337:61;2433:56;2485:3;2478:4;2467:9;2463:20;2433:56;:::i;:::-;2426:4;2418:6;2414:17;2407:83;;2037:459;;;;:::o;2501:606::-;;2604:6;2592:9;2587:3;2583:19;2579:32;2576:2;;;2628:5;2621;2614:20;2576:2;2665;2659:9;2707:4;2699:6;2695:17;2778:6;2766:10;2763:22;2742:18;2730:10;2727:34;2724:62;2721:2;;;2789:9;2721:2;2816;2809:22;2849:6;-1:-1:-1;2849:6:1;2879:44;2919:3;2908:9;2879:44;:::i;:::-;2871:6;2864:60;2959:53;3008:3;3003:2;2992:9;2988:18;2959:53;:::i;:::-;2952:4;2944:6;2940:17;2933:80;3046:54;3096:3;3090;3079:9;3075:19;3046:54;:::i;:::-;3041:2;3033:6;3029:15;3022:79;;2566:541;;;;:::o;3112:930::-;;3222:6;3210:9;3205:3;3201:19;3197:32;3194:2;;;3246:5;3239;3232:20;3194:2;3283;3277:9;3325:4;3317:6;3313:17;3349:18;3417:6;3405:10;3402:22;3397:2;3385:10;3382:18;3379:46;3376:2;;;3428:9;3376:2;3459:10;3455:2;3448:22;3488:6;3479:15;;3518:44;3558:3;3547:9;3518:44;:::i;:::-;3510:6;3503:60;3598:53;3647:3;3642:2;3631:9;3627:18;3598:53;:::i;:::-;3591:4;3583:6;3579:17;3572:80;3685:54;3735:3;3729;3718:9;3714:19;3685:54;:::i;:::-;3680:2;3672:6;3668:15;3661:79;3775:54;3825:3;3819;3808:9;3804:19;3775:54;:::i;:::-;3768:4;3760:6;3756:17;3749:81;3881:3;3870:9;3866:19;3853:33;3839:47;;3909:2;3901:6;3898:14;3895:2;;;3925:1;3922;3915:12;3895:2;;3964:71;4031:3;4022:6;4011:9;4007:22;3964:71;:::i;:::-;3957:4;3949:6;3945:17;3938:98;;;3184:858;;;;:::o;4047:1342::-;;;;4267:3;4255:9;4246:7;4242:23;4238:33;4235:2;;;4289:6;4281;4274:22;4235:2;4334:9;4321:23;4363:18;4404:2;4396:6;4393:14;4390:2;;;4425:6;4417;4410:22;4390:2;4468:6;4457:9;4453:22;4443:32;;4513:7;4506:4;4502:2;4498:13;4494:27;4484:2;;4540:6;4532;4525:22;4484:2;4581;4568:16;4603:4;4627:73;4642:57;4696:2;4642:57;:::i;4627:73::-;4734:15;;;4765:12;;;;4797:11;;;4835;;;4827:20;;4823:29;;4820:42;-1:-1:-1;4817:2:1;;;4880:6;4872;4865:22;4817:2;4907:6;4898:15;;4922:163;4936:2;4933:1;4930:9;4922:163;;;4993:17;;4981:30;;4954:1;4947:9;;;;;5031:12;;;;5063;;4922:163;;;-1:-1:-1;5104:5:1;-1:-1:-1;5128:55:1;;-1:-1:-1;5175:7:1;5155:18;;;5128:55;:::i;:::-;5118:65;;;;5236:3;5225:9;5221:19;5208:33;5192:49;;5266:2;5256:8;5253:16;5250:2;;;5287:6;5279;5272:22;5250:2;;5315:68;5375:7;5364:8;5353:9;5349:24;5315:68;:::i;:::-;5305:78;;;4225:1164;;;;;:::o;5394:187::-;5559:14;;5552:22;5534:41;;5522:2;5507:18;;5489:92::o;5586:342::-;5788:2;5770:21;;;5827:2;5807:18;;;5800:30;-1:-1:-1;;;5861:2:1;5846:18;;5839:48;5919:2;5904:18;;5760:168::o;5933:342::-;6135:2;6117:21;;;6174:2;6154:18;;;6147:30;-1:-1:-1;;;6208:2:1;6193:18;;6186:48;6266:2;6251:18;;6107:168::o;6280:355::-;6482:2;6464:21;;;6521:2;6501:18;;;6494:30;6560:33;6555:2;6540:18;;6533:61;6626:2;6611:18;;6454:181::o;6640:346::-;6842:2;6824:21;;;6881:2;6861:18;;;6854:30;-1:-1:-1;;;6915:2:1;6900:18;;6893:52;6977:2;6962:18;;6814:172::o;6991:342::-;7193:2;7175:21;;;7232:2;7212:18;;;7205:30;-1:-1:-1;;;7266:2:1;7251:18;;7244:48;7324:2;7309:18;;7165:168::o;7338:345::-;7540:2;7522:21;;;7579:2;7559:18;;;7552:30;-1:-1:-1;;;7613:2:1;7598:18;;7591:51;7674:2;7659:18;;7512:171::o;7688:242::-;7758:2;7752:9;7788:17;;;7835:18;7820:34;;7856:22;;;7817:62;7814:2;;;7882:9;7814:2;7909;7902:22;7732:198;;-1:-1:-1;7732:198:1:o;7935:191::-;;8042:18;8034:6;8031:30;8028:2;;;8064:9;8028:2;-1:-1:-1;8115:4:1;8096:17;;;8092:28;;8018:108::o","linkReferences":{}},"methodIdentifiers":{"verify(uint256[],((uint256,uint256),(uint256[2],uint256[2]),(uint256,uint256)),((uint256,uint256),(uint256[2],uint256[2]),(uint256[2],uint256[2]),(uint256[2],uint256[2]),(uint256,uint256)[]))":"9416c1ee"},"ast":{"absolutePath":"src\/verifier.sol","id":869,"exportedSymbols":{"Pairing":[868],"TestVerifier":[39],"Verifier":[279]},"nodeType":"SourceUnit","src":"1262:8864:0","nodes":[{"id":1,"nodeType":"PragmaDirective","src":"1262:23:0","literals":["solidity","^","0.7",".6"]},{"id":2,"nodeType":"PragmaDirective","src":"1286:19:0","literals":["abicoder","v2"]},{"id":39,"nodeType":"ContractDefinition","src":"1307:423:0","nodes":[{"id":6,"nodeType":"FunctionDefinition","src":"1334:16:0","body":{"id":5,"nodeType":"Block","src":"1348:2:0","statements":[]},"implemented":true,"kind":"constructor","modifiers":[],"name":"","parameters":{"id":3,"nodeType":"ParameterList","parameters":[],"src":"1345:2:0"},"returnParameters":{"id":4,"nodeType":"ParameterList","parameters":[],"src":"1348:0:0"},"scope":39,"stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"id":38,"nodeType":"FunctionDefinition","src":"1356:372:0","body":{"id":37,"nodeType":"Block","src":"1515:213:0","statements":[{"assignments":[19],"declarations":[{"constant":false,"id":19,"mutability":"mutable","name":"err","nodeType":"VariableDeclaration","scope":37,"src":"1525:11:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":18,"name":"uint256","nodeType":"ElementaryTypeName","src":"1525:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":26,"initialValue":{"arguments":[{"id":22,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9,"src":"1568:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"id":23,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":11,"src":"1587:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof memory"}},{"id":24,"name":"vk","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":13,"src":"1606:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"},{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof memory"},{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey memory"}],"expression":{"id":20,"name":"Verifier","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":279,"src":"1539:8:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Verifier_$279_$","typeString":"type(library Verifier)"}},"id":21,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"verify","nodeType":"MemberAccess","referencedDeclaration":178,"src":"1539:15:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_array$_t_uint256_$dyn_memory_ptr_$_t_struct$_Proof_$60_memory_ptr_$_t_struct$_VerifyingKey_$53_memory_ptr_$returns$_t_uint256_$","typeString":"function (uint256[] memory,struct Verifier.Proof memory,struct Verifier.VerifyingKey memory) view returns (uint256)"}},"id":25,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1539:79:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"1525:93:0"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":29,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":27,"name":"err","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":19,"src":"1633:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":28,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"1640:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"1633:8:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":35,"nodeType":"Block","src":"1685:37:0","statements":[{"expression":{"hexValue":"66616c7365","id":33,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1706:5:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":17,"id":34,"nodeType":"Return","src":"1699:12:0"}]},"id":36,"nodeType":"IfStatement","src":"1629:93:0","trueBody":{"id":32,"nodeType":"Block","src":"1643:36:0","statements":[{"expression":{"hexValue":"74727565","id":30,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"1664:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":17,"id":31,"nodeType":"Return","src":"1657:11:0"}]}}]},"functionSelector":"9416c1ee","implemented":true,"kind":"function","modifiers":[],"name":"verify","parameters":{"id":14,"nodeType":"ParameterList","parameters":[{"constant":false,"id":9,"mutability":"mutable","name":"input","nodeType":"VariableDeclaration","scope":38,"src":"1381:22:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":7,"name":"uint256","nodeType":"ElementaryTypeName","src":"1381:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":8,"nodeType":"ArrayTypeName","src":"1381:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":11,"mutability":"mutable","name":"proof","nodeType":"VariableDeclaration","scope":38,"src":"1413:27:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof"},"typeName":{"id":10,"name":"Verifier.Proof","nodeType":"UserDefinedTypeName","referencedDeclaration":60,"src":"1413:14:0","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_storage_ptr","typeString":"struct Verifier.Proof"}},"visibility":"internal"},{"constant":false,"id":13,"mutability":"mutable","name":"vk","nodeType":"VariableDeclaration","scope":38,"src":"1450:31:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey"},"typeName":{"id":12,"name":"Verifier.VerifyingKey","nodeType":"UserDefinedTypeName","referencedDeclaration":53,"src":"1450:21:0","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_storage_ptr","typeString":"struct Verifier.VerifyingKey"}},"visibility":"internal"}],"src":"1371:116:0"},"returnParameters":{"id":17,"nodeType":"ParameterList","parameters":[{"constant":false,"id":16,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":38,"src":"1509:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":15,"name":"bool","nodeType":"ElementaryTypeName","src":"1509:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"1508:6:0"},"scope":39,"stateMutability":"view","virtual":false,"visibility":"public"}],"abstract":false,"baseContracts":[],"contractDependencies":[],"contractKind":"contract","fullyImplemented":true,"linearizedBaseContracts":[39],"name":"TestVerifier","scope":869},{"id":279,"nodeType":"ContractDefinition","src":"1732:1942:0","nodes":[{"id":41,"nodeType":"UsingForDirective","src":"1755:20:0","libraryName":{"id":40,"name":"Pairing","nodeType":"UserDefinedTypeName","referencedDeclaration":868,"src":"1761:7:0","typeDescriptions":{"typeIdentifier":"t_contract$_Pairing_$868","typeString":"library Pairing"}}},{"id":53,"nodeType":"StructDefinition","src":"1780:183:0","canonicalName":"Verifier.VerifyingKey","members":[{"constant":false,"id":43,"mutability":"mutable","name":"alfa1","nodeType":"VariableDeclaration","scope":53,"src":"1810:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":42,"name":"Pairing.G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"1810:15:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":45,"mutability":"mutable","name":"beta2","nodeType":"VariableDeclaration","scope":53,"src":"1841:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":44,"name":"Pairing.G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"1841:15:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"},{"constant":false,"id":47,"mutability":"mutable","name":"gamma2","nodeType":"VariableDeclaration","scope":53,"src":"1872:22:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":46,"name":"Pairing.G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"1872:15:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"},{"constant":false,"id":49,"mutability":"mutable","name":"delta2","nodeType":"VariableDeclaration","scope":53,"src":"1904:22:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":48,"name":"Pairing.G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"1904:15:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"},{"constant":false,"id":52,"mutability":"mutable","name":"IC","nodeType":"VariableDeclaration","scope":53,"src":"1936:20:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_storage_$dyn_storage_ptr","typeString":"struct Pairing.G1Point[]"},"typeName":{"baseType":{"id":50,"name":"Pairing.G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"1936:15:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"id":51,"nodeType":"ArrayTypeName","src":"1936:17:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_storage_$dyn_storage_ptr","typeString":"struct Pairing.G1Point[]"}},"visibility":"internal"}],"name":"VerifyingKey","scope":279,"visibility":"public"},{"id":60,"nodeType":"StructDefinition","src":"1968:101:0","canonicalName":"Verifier.Proof","members":[{"constant":false,"id":55,"mutability":"mutable","name":"A","nodeType":"VariableDeclaration","scope":60,"src":"1991:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":54,"name":"Pairing.G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"1991:15:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":57,"mutability":"mutable","name":"B","nodeType":"VariableDeclaration","scope":60,"src":"2018:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":56,"name":"Pairing.G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"2018:15:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"},{"constant":false,"id":59,"mutability":"mutable","name":"C","nodeType":"VariableDeclaration","scope":60,"src":"2045:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":58,"name":"Pairing.G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"2045:15:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"}],"name":"Proof","scope":279,"visibility":"public"},{"id":178,"nodeType":"FunctionDefinition","src":"2075:1054:0","body":{"id":177,"nodeType":"Block","src":"2221:908:0","statements":[{"assignments":[73],"declarations":[{"constant":false,"id":73,"mutability":"mutable","name":"snark_scalar_field","nodeType":"VariableDeclaration","scope":177,"src":"2231:26:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":72,"name":"uint256","nodeType":"ElementaryTypeName","src":"2231:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":75,"initialValue":{"hexValue":"3231383838323432383731383339323735323232323436343035373435323537323735303838353438333634343030343136303334333433363938323034313836353735383038343935363137","id":74,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2260:77:0","typeDescriptions":{"typeIdentifier":"t_rational_21888242871839275222246405745257275088548364400416034343698204186575808495617_by_1","typeString":"int_const 2188...(69 digits omitted)...5617"},"value":"21888242871839275222246405745257275088548364400416034343698204186575808495617"},"nodeType":"VariableDeclarationStatement","src":"2231:106:0"},{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":84,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":80,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":77,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":63,"src":"2355:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":78,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"2355:12:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":79,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2370:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"2355:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"expression":{"id":81,"name":"vk","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":67,"src":"2375:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey memory"}},"id":82,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"IC","nodeType":"MemberAccess","referencedDeclaration":52,"src":"2375:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":83,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"2375:12:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2355:32:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"76657269666965722d6261642d696e707574","id":85,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2389:20:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_62f18c0da782e23b7e947e83d22170e983c1918040b5b1bd1c1e3ee5a50cc57a","typeString":"literal_string \"verifier-bad-input\""},"value":"verifier-bad-input"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_62f18c0da782e23b7e947e83d22170e983c1918040b5b1bd1c1e3ee5a50cc57a","typeString":"literal_string \"verifier-bad-input\""}],"id":76,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2347:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":86,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2347:63:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":87,"nodeType":"ExpressionStatement","src":"2347:63:0"},{"assignments":[91],"declarations":[{"constant":false,"id":91,"mutability":"mutable","name":"vk_x","nodeType":"VariableDeclaration","scope":177,"src":"2467:27:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":90,"name":"Pairing.G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"2467:15:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"}],"id":97,"initialValue":{"arguments":[{"hexValue":"30","id":94,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2513:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":95,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2516:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"expression":{"id":92,"name":"Pairing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":868,"src":"2497:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Pairing_$868_$","typeString":"type(library Pairing)"}},"id":93,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"G1Point","nodeType":"MemberAccess","referencedDeclaration":284,"src":"2497:15:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_G1Point_$284_storage_ptr_$","typeString":"type(struct Pairing.G1Point storage pointer)"}},"id":96,"isConstant":false,"isLValue":false,"isPure":true,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2497:21:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"VariableDeclarationStatement","src":"2467:51:0"},{"body":{"id":137,"nodeType":"Block","src":"2571:185:0","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":114,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":110,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":63,"src":"2593:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":112,"indexExpression":{"id":111,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99,"src":"2599:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2593:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":113,"name":"snark_scalar_field","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":73,"src":"2604:18:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2593:29:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"76657269666965722d6774652d736e61726b2d7363616c61722d6669656c64","id":115,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2624:33:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_8cb5a586d84bd3fa5140c79c44fd5cd5a5b0e7e59a1ddee2846426486e57f847","typeString":"literal_string \"verifier-gte-snark-scalar-field\""},"value":"verifier-gte-snark-scalar-field"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_8cb5a586d84bd3fa5140c79c44fd5cd5a5b0e7e59a1ddee2846426486e57f847","typeString":"literal_string \"verifier-gte-snark-scalar-field\""}],"id":109,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2585:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":116,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2585:73:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":117,"nodeType":"ExpressionStatement","src":"2585:73:0"},{"expression":{"id":135,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":118,"name":"vk_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91,"src":"2672:4:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":121,"name":"vk_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91,"src":"2696:4:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},{"arguments":[{"baseExpression":{"expression":{"id":124,"name":"vk","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":67,"src":"2721:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey memory"}},"id":125,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"IC","nodeType":"MemberAccess","referencedDeclaration":52,"src":"2721:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":129,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":128,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":126,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99,"src":"2727:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":127,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2731:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"2727:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2721:12:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},{"baseExpression":{"id":130,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":63,"src":"2735:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":132,"indexExpression":{"id":131,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99,"src":"2741:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2735:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":122,"name":"Pairing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":868,"src":"2702:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Pairing_$868_$","typeString":"type(library Pairing)"}},"id":123,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"scalar_mul","nodeType":"MemberAccess","referencedDeclaration":463,"src":"2702:18:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_G1Point_$284_memory_ptr_$_t_uint256_$returns$_t_struct$_G1Point_$284_memory_ptr_$","typeString":"function (struct Pairing.G1Point memory,uint256) view returns (struct Pairing.G1Point memory)"}},"id":133,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2702:42:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"},{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}],"expression":{"id":119,"name":"Pairing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":868,"src":"2679:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Pairing_$868_$","typeString":"type(library Pairing)"}},"id":120,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"addition","nodeType":"MemberAccess","referencedDeclaration":416,"src":"2679:16:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_G1Point_$284_memory_ptr_$_t_struct$_G1Point_$284_memory_ptr_$returns$_t_struct$_G1Point_$284_memory_ptr_$","typeString":"function (struct Pairing.G1Point memory,struct Pairing.G1Point memory) view returns (struct Pairing.G1Point memory)"}},"id":134,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2679:66:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"2672:73:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":136,"nodeType":"ExpressionStatement","src":"2672:73:0"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":105,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":102,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99,"src":"2548:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"expression":{"id":103,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":63,"src":"2552:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":104,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"2552:12:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"2548:16:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":138,"initializationExpression":{"assignments":[99],"declarations":[{"constant":false,"id":99,"mutability":"mutable","name":"i","nodeType":"VariableDeclaration","scope":138,"src":"2533:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":98,"name":"uint256","nodeType":"ElementaryTypeName","src":"2533:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":101,"initialValue":{"hexValue":"30","id":100,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2545:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"2533:13:0"},"loopExpression":{"expression":{"id":107,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"2566:3:0","subExpression":{"id":106,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":99,"src":"2566:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":108,"nodeType":"ExpressionStatement","src":"2566:3:0"},"nodeType":"ForStatement","src":"2528:228:0"},{"expression":{"id":148,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":139,"name":"vk_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91,"src":"2765:4:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":142,"name":"vk_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91,"src":"2789:4:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},{"baseExpression":{"expression":{"id":143,"name":"vk","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":67,"src":"2795:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey memory"}},"id":144,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"IC","nodeType":"MemberAccess","referencedDeclaration":52,"src":"2795:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":146,"indexExpression":{"hexValue":"30","id":145,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"2801:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"2795:8:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"},{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}],"expression":{"id":140,"name":"Pairing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":868,"src":"2772:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Pairing_$868_$","typeString":"type(library Pairing)"}},"id":141,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"addition","nodeType":"MemberAccess","referencedDeclaration":416,"src":"2772:16:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_G1Point_$284_memory_ptr_$_t_struct$_G1Point_$284_memory_ptr_$returns$_t_struct$_G1Point_$284_memory_ptr_$","typeString":"function (struct Pairing.G1Point memory,struct Pairing.G1Point memory) view returns (struct Pairing.G1Point memory)"}},"id":147,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2772:32:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"2765:39:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":149,"nodeType":"ExpressionStatement","src":"2765:39:0"},{"condition":{"id":171,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"!","prefix":true,"src":"2831:254:0","subExpression":{"arguments":[{"arguments":[{"expression":{"id":154,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65,"src":"2885:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof memory"}},"id":155,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"A","nodeType":"MemberAccess","referencedDeclaration":55,"src":"2885:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}],"expression":{"id":152,"name":"Pairing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":868,"src":"2870:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Pairing_$868_$","typeString":"type(library Pairing)"}},"id":153,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"negate","nodeType":"MemberAccess","referencedDeclaration":361,"src":"2870:14:0","typeDescriptions":{"typeIdentifier":"t_function_internal_pure$_t_struct$_G1Point_$284_memory_ptr_$returns$_t_struct$_G1Point_$284_memory_ptr_$","typeString":"function (struct Pairing.G1Point memory) pure returns (struct Pairing.G1Point memory)"}},"id":156,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2870:23:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},{"expression":{"id":157,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65,"src":"2911:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof memory"}},"id":158,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"B","nodeType":"MemberAccess","referencedDeclaration":57,"src":"2911:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},{"expression":{"id":159,"name":"vk","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":67,"src":"2936:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey memory"}},"id":160,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"alfa1","nodeType":"MemberAccess","referencedDeclaration":43,"src":"2936:8:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},{"expression":{"id":161,"name":"vk","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":67,"src":"2962:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey memory"}},"id":162,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"beta2","nodeType":"MemberAccess","referencedDeclaration":45,"src":"2962:8:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},{"id":163,"name":"vk_x","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":91,"src":"2988:4:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},{"expression":{"id":164,"name":"vk","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":67,"src":"3010:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey memory"}},"id":165,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"gamma2","nodeType":"MemberAccess","referencedDeclaration":47,"src":"3010:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},{"expression":{"id":166,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":65,"src":"3037:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof memory"}},"id":167,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"C","nodeType":"MemberAccess","referencedDeclaration":59,"src":"3037:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},{"expression":{"id":168,"name":"vk","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":67,"src":"3062:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey memory"}},"id":169,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"delta2","nodeType":"MemberAccess","referencedDeclaration":49,"src":"3062:9:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"},{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"},{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"},{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"},{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"},{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"},{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"},{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}],"expression":{"id":150,"name":"Pairing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":868,"src":"2832:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Pairing_$868_$","typeString":"type(library Pairing)"}},"id":151,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"pairingProd4","nodeType":"MemberAccess","referencedDeclaration":867,"src":"2832:20:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_struct$_G1Point_$284_memory_ptr_$_t_struct$_G2Point_$293_memory_ptr_$_t_struct$_G1Point_$284_memory_ptr_$_t_struct$_G2Point_$293_memory_ptr_$_t_struct$_G1Point_$284_memory_ptr_$_t_struct$_G2Point_$293_memory_ptr_$_t_struct$_G1Point_$284_memory_ptr_$_t_struct$_G2Point_$293_memory_ptr_$returns$_t_bool_$","typeString":"function (struct Pairing.G1Point memory,struct Pairing.G2Point memory,struct Pairing.G1Point memory,struct Pairing.G2Point memory,struct Pairing.G1Point memory,struct Pairing.G2Point memory,struct Pairing.G1Point memory,struct Pairing.G2Point memory) view returns (bool)"}},"id":170,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2832:253:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":174,"nodeType":"IfStatement","src":"2814:290:0","trueBody":{"expression":{"hexValue":"31","id":172,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3103:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"functionReturnParameters":71,"id":173,"nodeType":"Return","src":"3096:8:0"}},{"expression":{"hexValue":"30","id":175,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3121:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"functionReturnParameters":71,"id":176,"nodeType":"Return","src":"3114:8:0"}]},"implemented":true,"kind":"function","modifiers":[],"name":"verify","parameters":{"id":68,"nodeType":"ParameterList","parameters":[{"constant":false,"id":63,"mutability":"mutable","name":"input","nodeType":"VariableDeclaration","scope":178,"src":"2100:22:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":61,"name":"uint256","nodeType":"ElementaryTypeName","src":"2100:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":62,"nodeType":"ArrayTypeName","src":"2100:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":65,"mutability":"mutable","name":"proof","nodeType":"VariableDeclaration","scope":178,"src":"2132:18:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof"},"typeName":{"id":64,"name":"Proof","nodeType":"UserDefinedTypeName","referencedDeclaration":60,"src":"2132:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_storage_ptr","typeString":"struct Verifier.Proof"}},"visibility":"internal"},{"constant":false,"id":67,"mutability":"mutable","name":"vk","nodeType":"VariableDeclaration","scope":178,"src":"2160:22:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey"},"typeName":{"id":66,"name":"VerifyingKey","nodeType":"UserDefinedTypeName","referencedDeclaration":53,"src":"2160:12:0","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_storage_ptr","typeString":"struct Verifier.VerifyingKey"}},"visibility":"internal"}],"src":"2090:98:0"},"returnParameters":{"id":71,"nodeType":"ParameterList","parameters":[{"constant":false,"id":70,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":178,"src":"2212:7:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":69,"name":"uint256","nodeType":"ElementaryTypeName","src":"2212:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"2211:9:0"},"scope":279,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":278,"nodeType":"FunctionDefinition","src":"3135:537:0","body":{"id":277,"nodeType":"Block","src":"3345:327:0","statements":[{"assignments":[203],"declarations":[{"constant":false,"id":203,"mutability":"mutable","name":"proof","nodeType":"VariableDeclaration","scope":277,"src":"3355:18:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof"},"typeName":{"id":202,"name":"Proof","nodeType":"UserDefinedTypeName","referencedDeclaration":60,"src":"3355:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_storage_ptr","typeString":"struct Verifier.Proof"}},"visibility":"internal"}],"id":204,"nodeType":"VariableDeclarationStatement","src":"3355:18:0"},{"expression":{"id":217,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":205,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":203,"src":"3383:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof memory"}},"id":207,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"A","nodeType":"MemberAccess","referencedDeclaration":55,"src":"3383:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":210,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":182,"src":"3409:1:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":212,"indexExpression":{"hexValue":"30","id":211,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3411:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3409:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":213,"name":"a","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":182,"src":"3415:1:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":215,"indexExpression":{"hexValue":"31","id":214,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3417:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3415:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":208,"name":"Pairing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":868,"src":"3393:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Pairing_$868_$","typeString":"type(library Pairing)"}},"id":209,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"G1Point","nodeType":"MemberAccess","referencedDeclaration":284,"src":"3393:15:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_G1Point_$284_storage_ptr_$","typeString":"type(struct Pairing.G1Point storage pointer)"}},"id":216,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3393:27:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"3383:37:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":218,"nodeType":"ExpressionStatement","src":"3383:37:0"},{"expression":{"id":247,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":219,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":203,"src":"3430:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof memory"}},"id":221,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"B","nodeType":"MemberAccess","referencedDeclaration":57,"src":"3430:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"components":[{"baseExpression":{"baseExpression":{"id":224,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":188,"src":"3457:1:0","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$2_memory_ptr","typeString":"uint256[2] memory[2] memory"}},"id":226,"indexExpression":{"hexValue":"30","id":225,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3459:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3457:4:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":228,"indexExpression":{"hexValue":"30","id":227,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3462:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3457:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"baseExpression":{"id":229,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":188,"src":"3466:1:0","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$2_memory_ptr","typeString":"uint256[2] memory[2] memory"}},"id":231,"indexExpression":{"hexValue":"30","id":230,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3468:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3466:4:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":233,"indexExpression":{"hexValue":"31","id":232,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3471:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3466:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":234,"isConstant":false,"isInlineArray":true,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3456:18:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},{"components":[{"baseExpression":{"baseExpression":{"id":235,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":188,"src":"3477:1:0","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$2_memory_ptr","typeString":"uint256[2] memory[2] memory"}},"id":237,"indexExpression":{"hexValue":"31","id":236,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3479:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3477:4:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":239,"indexExpression":{"hexValue":"30","id":238,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3482:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3477:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"baseExpression":{"id":240,"name":"b","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":188,"src":"3486:1:0","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$2_memory_ptr","typeString":"uint256[2] memory[2] memory"}},"id":242,"indexExpression":{"hexValue":"31","id":241,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3488:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3486:4:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":244,"indexExpression":{"hexValue":"31","id":243,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3491:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3486:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":245,"isConstant":false,"isInlineArray":true,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"3476:18:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"},{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}],"expression":{"id":222,"name":"Pairing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":868,"src":"3440:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Pairing_$868_$","typeString":"type(library Pairing)"}},"id":223,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"G2Point","nodeType":"MemberAccess","referencedDeclaration":293,"src":"3440:15:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_G2Point_$293_storage_ptr_$","typeString":"type(struct Pairing.G2Point storage pointer)"}},"id":246,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3440:55:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"src":"3430:65:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":248,"nodeType":"ExpressionStatement","src":"3430:65:0"},{"expression":{"id":261,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"expression":{"id":249,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":203,"src":"3505:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof memory"}},"id":251,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"memberName":"C","nodeType":"MemberAccess","referencedDeclaration":59,"src":"3505:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"baseExpression":{"id":254,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3531:1:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":256,"indexExpression":{"hexValue":"30","id":255,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3533:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3531:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"baseExpression":{"id":257,"name":"c","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":192,"src":"3537:1:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":259,"indexExpression":{"hexValue":"31","id":258,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3539:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"3537:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"expression":{"id":252,"name":"Pairing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":868,"src":"3515:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_Pairing_$868_$","typeString":"type(library Pairing)"}},"id":253,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"G1Point","nodeType":"MemberAccess","referencedDeclaration":284,"src":"3515:15:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_G1Point_$284_storage_ptr_$","typeString":"type(struct Pairing.G1Point storage pointer)"}},"id":260,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3515:27:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"3505:37:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":262,"nodeType":"ExpressionStatement","src":"3505:37:0"},{"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":269,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":264,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":195,"src":"3563:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},{"id":265,"name":"proof","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":203,"src":"3570:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof memory"}},{"id":266,"name":"vk","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":197,"src":"3577:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"},{"typeIdentifier":"t_struct$_Proof_$60_memory_ptr","typeString":"struct Verifier.Proof memory"},{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey memory"}],"id":263,"name":"verify","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":178,"src":"3556:6:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_array$_t_uint256_$dyn_memory_ptr_$_t_struct$_Proof_$60_memory_ptr_$_t_struct$_VerifyingKey_$53_memory_ptr_$returns$_t_uint256_$","typeString":"function (uint256[] memory,struct Verifier.Proof memory,struct Verifier.VerifyingKey memory) view returns (uint256)"}},"id":267,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3556:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":268,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3584:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"3556:29:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"falseBody":{"id":275,"nodeType":"Block","src":"3629:37:0","statements":[{"expression":{"hexValue":"66616c7365","id":273,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3650:5:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"false"},"functionReturnParameters":201,"id":274,"nodeType":"Return","src":"3643:12:0"}]},"id":276,"nodeType":"IfStatement","src":"3552:114:0","trueBody":{"id":272,"nodeType":"Block","src":"3587:36:0","statements":[{"expression":{"hexValue":"74727565","id":270,"isConstant":false,"isLValue":false,"isPure":true,"kind":"bool","lValueRequested":false,"nodeType":"Literal","src":"3608:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"value":"true"},"functionReturnParameters":201,"id":271,"nodeType":"Return","src":"3601:11:0"}]}}]},"implemented":true,"kind":"function","modifiers":[],"name":"verifyProof","parameters":{"id":198,"nodeType":"ParameterList","parameters":[{"constant":false,"id":182,"mutability":"mutable","name":"a","nodeType":"VariableDeclaration","scope":278,"src":"3165:19:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":179,"name":"uint256","nodeType":"ElementaryTypeName","src":"3165:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":181,"length":{"hexValue":"32","id":180,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3173:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"3165:10:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"},{"constant":false,"id":188,"mutability":"mutable","name":"b","nodeType":"VariableDeclaration","scope":278,"src":"3194:22:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_memory_ptr_$2_memory_ptr","typeString":"uint256[2][2]"},"typeName":{"baseType":{"baseTyp":{"id":183,"name":"uint256","nodeType":"ElementaryTypeName","src":"3194:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":185,"length":{"hexValue":"32","id":184,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3202:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"3194:10:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"id":187,"length":{"hexValue":"32","id":186,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3205:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"3194:13:0","typeDescriptions":{"typeIdentifier":"t_array$_t_array$_t_uint256_$2_storage_$2_storage_ptr","typeString":"uint256[2][2]"}},"visibility":"internal"},{"constant":false,"id":192,"mutability":"mutable","name":"c","nodeType":"VariableDeclaration","scope":278,"src":"3226:19:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":189,"name":"uint256","nodeType":"ElementaryTypeName","src":"3226:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":191,"length":{"hexValue":"32","id":190,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3234:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"3226:10:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"},{"constant":false,"id":195,"mutability":"mutable","name":"input","nodeType":"VariableDeclaration","scope":278,"src":"3255:22:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":193,"name":"uint256","nodeType":"ElementaryTypeName","src":"3255:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":194,"nodeType":"ArrayTypeName","src":"3255:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"},{"constant":false,"id":197,"mutability":"mutable","name":"vk","nodeType":"VariableDeclaration","scope":278,"src":"3287:22:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_memory_ptr","typeString":"struct Verifier.VerifyingKey"},"typeName":{"id":196,"name":"VerifyingKey","nodeType":"UserDefinedTypeName","referencedDeclaration":53,"src":"3287:12:0","typeDescriptions":{"typeIdentifier":"t_struct$_VerifyingKey_$53_storage_ptr","typeString":"struct Verifier.VerifyingKey"}},"visibility":"internal"}],"src":"3155:160:0"},"returnParameters":{"id":201,"nodeType":"ParameterList","parameters":[{"constant":false,"id":200,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":278,"src":"3339:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":199,"name":"bool","nodeType":"ElementaryTypeName","src":"3339:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"3338:6:0"},"scope":279,"stateMutability":"view","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[],"contractDependencies":[],"contractKind":"library","fullyImplemented":true,"linearizedBaseContracts":[279],"name":"Verifier","scope":869},{"id":868,"nodeType":"ContractDefinition","src":"3676:6448:0","nodes":[{"id":284,"nodeType":"StructDefinition","src":"3698:60:0","canonicalName":"Pairing.G1Point","members":[{"constant":false,"id":281,"mutability":"mutable","name":"X","nodeType":"VariableDeclaration","scope":284,"src":"3723:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":280,"name":"uint256","nodeType":"ElementaryTypeName","src":"3723:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":283,"mutability":"mutable","name":"Y","nodeType":"VariableDeclaration","scope":284,"src":"3742:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":282,"name":"uint256","nodeType":"ElementaryTypeName","src":"3742:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"name":"G1Point","scope":868,"visibility":"public"},{"id":293,"nodeType":"StructDefinition","src":"3817:66:0","canonicalName":"Pairing.G2Point","members":[{"constant":false,"id":288,"mutability":"mutable","name":"X","nodeType":"VariableDeclaration","scope":293,"src":"3842:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":285,"name":"uint256","nodeType":"ElementaryTypeName","src":"3842:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":287,"length":{"hexValue":"32","id":286,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3850:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"3842:10:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"},{"constant":false,"id":292,"mutability":"mutable","name":"Y","nodeType":"VariableDeclaration","scope":293,"src":"3864:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"},"typeName":{"baseType":{"id":289,"name":"uint256","nodeType":"ElementaryTypeName","src":"3864:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":291,"length":{"hexValue":"32","id":290,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"3872:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"nodeType":"ArrayTypeName","src":"3864:10:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_storage_ptr","typeString":"uint256[2]"}},"visibility":"internal"}],"name":"G2Point","scope":868,"visibility":"public"},{"id":305,"nodeType":"FunctionDefinition","src":"3925:90:0","body":{"id":304,"nodeType":"Block","src":"3978:37:0","statements":[{"expression":{"arguments":[{"hexValue":"31","id":300,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4003:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},{"hexValue":"32","id":301,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4006:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"}],"id":299,"name":"G1Point","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":284,"src":"3995:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_G1Point_$284_storage_ptr_$","typeString":"type(struct Pairing.G1Point storage pointer)"}},"id":302,"isConstant":false,"isLValue":false,"isPure":true,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3995:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"functionReturnParameters":298,"id":303,"nodeType":"Return","src":"3988:20:0"}]},"documentation":{"id":294,"nodeType":"StructuredDocumentation","src":"3889:31:0","text":"@return the generator of G1"},"implemented":true,"kind":"function","modifiers":[],"name":"P1","parameters":{"id":295,"nodeType":"ParameterList","parameters":[],"src":"3936:2:0"},"returnParameters":{"id":298,"nodeType":"ParameterList","parameters":[{"constant":false,"id":297,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":305,"src":"3962:14:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":296,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"3962:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"}],"src":"3961:16:0"},"scope":868,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":321,"nodeType":"FunctionDefinition","src":"4057:1058:0","body":{"id":320,"nodeType":"Block","src":"4110:1005:0","statements":[{"expression":{"arguments":[{"components":[{"hexValue":"3131353539373332303332393836333837313037393931303034303231333932323835373833393235383132383631383231313932353330393137343033313531343532333931383035363334","id":312,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4217:77:0","typeDescriptions":{"typeIdentifier":"t_rational_11559732032986387107991004021392285783925812861821192530917403151452391805634_by_1","typeString":"int_const 1155...(69 digits omitted)...5634"},"value":"11559732032986387107991004021392285783925812861821192530917403151452391805634"},{"hexValue":"3130383537303436393939303233303537313335393434353730373632323332383239343831333730373536333539353738353138303836393930353139393933323835363535383532373831","id":313,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4316:77:0","typeDescriptions":{"typeIdentifier":"t_rational_10857046999023057135944570762232829481370756359578518086990519993285655852781_by_1","typeString":"int_const 1085...(69 digits omitted)...2781"},"value":"10857046999023057135944570762232829481370756359578518086990519993285655852781"}],"id":314,"isConstant":false,"isInlineArray":true,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4195:216:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},{"components":[{"hexValue":"34303832333637383735383633343333363831333332323033343033313435343335353638333136383531333237353933343031323038313035373431303736323134313230303933353331","id":315,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4451:76:0","typeDescriptions":{"typeIdentifier":"t_rational_4082367875863433681332203403145435568316851327593401208105741076214120093531_by_1","typeString":"int_const 4082...(68 digits omitted)...3531"},"value":"4082367875863433681332203403145435568316851327593401208105741076214120093531"},{"hexValue":"38343935363533393233313233343331343137363034393733323437343839323732343338343138313930353837323633363030313438373730323830363439333036393538313031393330","id":316,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4549:76:0","typeDescriptions":{"typeIdentifier":"t_rational_8495653923123431417604973247489272438418190587263600148770280649306958101930_by_1","typeString":"int_const 8495...(68 digits omitted)...1930"},"value":"8495653923123431417604973247489272438418190587263600148770280649306958101930"}],"id":317,"isConstant":false,"isInlineArray":true,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"TupleExpression","src":"4429:214:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"},{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}],"id":311,"name":"G2Point","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":293,"src":"4170:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_G2Point_$293_storage_ptr_$","typeString":"type(struct Pairing.G2Point storage pointer)"}},"id":318,"isConstant":false,"isLValue":false,"isPure":true,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4170:487:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"functionReturnParameters":310,"id":319,"nodeType":"Return","src":"4151:506:0"}]},"documentation":{"id":306,"nodeType":"StructuredDocumentation","src":"4021:31:0","text":"@return the generator of G2"},"implemented":true,"kind":"function","modifiers":[],"name":"P2","parameters":{"id":307,"nodeType":"ParameterList","parameters":[],"src":"4068:2:0"},"returnParameters":{"id":310,"nodeType":"ParameterList","parameters":[{"constant":false,"id":309,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":321,"src":"4094:14:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":308,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"4094:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"}],"src":"4093:16:0"},"scope":868,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":361,"nodeType":"FunctionDefinition","src":"5202:346:0","body":{"id":360,"nodeType":"Block","src":"5277:271:0","statements":[{"assignments":[330],"declarations":[{"constant":false,"id":330,"mutability":"mutable","name":"q","nodeType":"VariableDeclaration","scope":360,"src":"5343:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":329,"name":"uint256","nodeType":"ElementaryTypeName","src":"5343:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":332,"initialValue":{"hexValue":"3231383838323432383731383339323735323232323436343035373435323537323735303838363936333131313537323937383233363632363839303337383934363435323236323038353833","id":331,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5364:77:0","typeDescriptions":{"typeIdentifier":"t_rational_21888242871839275222246405745257275088696311157297823662689037894645226208583_by_1","typeString":"int_const 2188...(69 digits omitted)...8583"},"value":"21888242871839275222246405745257275088696311157297823662689037894645226208583"},"nodeType":"VariableDeclarationStatement","src":"5343:98:0"},{"condition":{"commonType":{"typeIdentifier":"t_bool","typeString":"bool"},"id":341,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":336,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":333,"name":"p","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":324,"src":"5455:1:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":334,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"X","nodeType":"MemberAccess","referencedDeclaration":281,"src":"5455:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":335,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5462:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5455:8:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"nodeType":"BinaryOperation","operator":"&&","rightExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":340,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":337,"name":"p","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":324,"src":"5467:1:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":338,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"Y","nodeType":"MemberAccess","referencedDeclaration":283,"src":"5467:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"hexValue":"30","id":339,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5474:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"5467:8:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"src":"5455:20:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":347,"nodeType":"IfStatement","src":"5451:46:0","trueBody":{"expression":{"arguments":[{"hexValue":"30","id":343,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5492:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},{"hexValue":"30","id":344,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5495:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"}],"id":342,"name":"G1Point","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":284,"src":"5484:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_G1Point_$284_storage_ptr_$","typeString":"type(struct Pairing.G1Point storage pointer)"}},"id":345,"isConstant":false,"isLValue":false,"isPure":true,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5484:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"functionReturnParameters":328,"id":346,"nodeType":"Return","src":"5477:20:0"}},{"expression":{"arguments":[{"expression":{"id":349,"name":"p","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":324,"src":"5522:1:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":350,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"X","nodeType":"MemberAccess","referencedDeclaration":281,"src":"5522:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":357,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":351,"name":"q","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":330,"src":"5527:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"-","rightExpression":{"components":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":355,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":352,"name":"p","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":324,"src":"5532:1:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":353,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"Y","nodeType":"MemberAccess","referencedDeclaration":283,"src":"5532:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"%","rightExpression":{"id":354,"name":"q","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":330,"src":"5538:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5532:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"id":356,"isConstant":false,"isInlineArray":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"TupleExpression","src":"5531:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5527:13:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"},{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":348,"name":"G1Point","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":284,"src":"5514:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_struct$_G1Point_$284_storage_ptr_$","typeString":"type(struct Pairing.G1Point storage pointer)"}},"id":358,"isConstant":false,"isLValue":false,"isPure":false,"kind":"structConstructorCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"5514:27:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"functionReturnParameters":328,"id":359,"nodeType":"Return","src":"5507:34:0"}]},"documentation":{"id":322,"nodeType":"StructuredDocumentation","src":"5121:76:0","text":"@return r the negation of p, i.e. p.addition(p.negate()) should be zero."},"implemented":true,"kind":"function","modifiers":[],"name":"negate","parameters":{"id":325,"nodeType":"ParameterList","parameters":[{"constant":false,"id":324,"mutability":"mutable","name":"p","nodeType":"VariableDeclaration","scope":361,"src":"5218:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":323,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"5218:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"}],"src":"5217:18:0"},"returnParameters":{"id":328,"nodeType":"ParameterList","parameters":[{"constant":false,"id":327,"mutability":"mutable","name":"r","nodeType":"VariableDeclaration","scope":361,"src":"5259:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":326,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"5259:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"}],"src":"5258:18:0"},"scope":868,"stateMutability":"pure","virtual":false,"visibility":"internal"},{"id":416,"nodeType":"FunctionDefinition","src":"5600:662:0","body":{"id":415,"nodeType":"Block","src":"5725:537:0","statements":[{"assignments":[376],"declarations":[{"constant":false,"id":376,"mutability":"mutable","name":"input","nodeType":"VariableDeclaration","scope":415,"src":"5735:23:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4]"},"typeName":{"baseType":{"id":374,"name":"uint256","nodeType":"ElementaryTypeName","src":"5735:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":375,"length":{"hexValue":"34","id":373,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5743:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"nodeType":"ArrayTypeName","src":"5735:10:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_storage_ptr","typeString":"uint256[4]"}},"visibility":"internal"}],"id":377,"nodeType":"VariableDeclarationStatement","src":"5735:23:0"},{"expression":{"id":383,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":378,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":376,"src":"5768:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":380,"indexExpression":{"hexValue":"30","id":379,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5774:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5768:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":381,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":364,"src":"5779:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":382,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"X","nodeType":"MemberAccess","referencedDeclaration":281,"src":"5779:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5768:15:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":384,"nodeType":"ExpressionStatement","src":"5768:15:0"},{"expression":{"id":390,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":385,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":376,"src":"5793:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":387,"indexExpression":{"hexValue":"31","id":386,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5799:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5793:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":388,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":364,"src":"5804:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":389,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"Y","nodeType":"MemberAccess","referencedDeclaration":283,"src":"5804:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5793:15:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":391,"nodeType":"ExpressionStatement","src":"5793:15:0"},{"expression":{"id":397,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":392,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":376,"src":"5818:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":394,"indexExpression":{"hexValue":"32","id":393,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5824:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5818:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":395,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":366,"src":"5829:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":396,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"X","nodeType":"MemberAccess","referencedDeclaration":281,"src":"5829:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5818:15:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":398,"nodeType":"ExpressionStatement","src":"5818:15:0"},{"expression":{"id":404,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":399,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":376,"src":"5843:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$4_memory_ptr","typeString":"uint256[4] memory"}},"id":401,"indexExpression":{"hexValue":"33","id":400,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"5849:1:0","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"5843:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":402,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":366,"src":"5854:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":403,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"Y","nodeType":"MemberAccess","referencedDeclaration":283,"src":"5854:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"5843:15:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":405,"nodeType":"ExpressionStatement","src":"5843:15:0"},{"assignments":[407],"declarations":[{"constant":false,"id":407,"mutability":"mutable","name":"success","nodeType":"VariableDeclaration","scope":415,"src":"5868:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":406,"name":"bool","nodeType":"ElementaryTypeName","src":"5868:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":408,"nodeType":"VariableDeclarationStatement","src":"5868:12:0"},{"AST":{"nodeType":"YulBlock","src":"5963:245:0","statements":[{"nodeType":"YulAssignment","src":"5977:64:0","value":{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"6003:3:0"},"nodeType":"YulFunctionCall","src":"6003:5:0"},{"kind":"number","nodeType":"YulLiteral","src":"6010:4:0","type":"","value":"2000"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"5999:3:0"},"nodeType":"YulFunctionCall","src":"5999:16:0"},{"kind":"number","nodeType":"YulLiteral","src":"6017:1:0","type":"","value":"6"},{"name":"input","nodeType":"YulIdentifier","src":"6020:5:0"},{"kind":"number","nodeType":"YulLiteral","src":"6027:4:0","type":"","value":"0xc0"},{"name":"r","nodeType":"YulIdentifier","src":"6033:1:0"},{"kind":"number","nodeType":"YulLiteral","src":"6036:4:0","type":"","value":"0x60"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"5988:10:0"},"nodeType":"YulFunctionCall","src":"5988:53:0"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"5977:7:0"}]},{"cases":[{"body":{"nodeType":"YulBlock","src":"6149:49:0","statements":[{"expression":{"arguments":[],"functionName":{"name":"invalid","nodeType":"YulIdentifier","src":"6171:7:0"},"nodeType":"YulFunctionCall","src":"6171:9:0"},"nodeType":"YulExpressionStatement","src":"6171:9:0"}]},"nodeType":"YulCase","src":"6142:56:0","value":{"kind":"number","nodeType":"YulLiteral","src":"6147:1:0","type":"","value":"0"}}],"expression":{"name":"success","nodeType":"YulIdentifier","src":"6118:7:0"},"nodeType":"YulSwitch","src":"6111:87:0"}]},"evmVersion":"istanbul","externalReferences":[{"declaration":376,"isOffset":false,"isSlot":false,"src":"6020:5:0","valueSize":1},{"declaration":369,"isOffset":false,"isSlot":false,"src":"6033:1:0","valueSize":1},{"declaration":407,"isOffset":false,"isSlot":false,"src":"5977:7:0","valueSize":1},{"declaration":407,"isOffset":false,"isSlot":false,"src":"6118:7:0","valueSize":1}],"id":409,"nodeType":"InlineAssembly","src":"5954:254:0"},{"expression":{"arguments":[{"id":411,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":407,"src":"6225:7:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"70616972696e672d6164642d6661696c6564","id":412,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"6234:20:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_e428a53e578d13ee2fc3b8849114332d6a94afed893fa747a37e281039728688","typeString":"literal_string \"pairing-add-failed\""},"value":"pairing-add-failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_e428a53e578d13ee2fc3b8849114332d6a94afed893fa747a37e281039728688","typeString":"literal_string \"pairing-add-failed\""}],"id":410,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6217:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":413,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6217:38:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":414,"nodeType":"ExpressionStatement","src":"6217:38:0"}]},"documentation":{"id":362,"nodeType":"StructuredDocumentation","src":"5554:41:0","text":"@return r the sum of two points of G1"},"implemented":true,"kind":"function","modifiers":[],"name":"addition","parameters":{"id":367,"nodeType":"ParameterList","parameters":[{"constant":false,"id":364,"mutability":"mutable","name":"p1","nodeType":"VariableDeclaration","scope":416,"src":"5618:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":363,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"5618:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":366,"mutability":"mutable","name":"p2","nodeType":"VariableDeclaration","scope":416,"src":"5637:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":365,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"5637:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"}],"src":"5617:38:0"},"returnParameters":{"id":370,"nodeType":"ParameterList","parameters":[{"constant":false,"id":369,"mutability":"mutable","name":"r","nodeType":"VariableDeclaration","scope":416,"src":"5703:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":368,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"5703:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"}],"src":"5702:18:0"},"scope":868,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":463,"nodeType":"FunctionDefinition","src":"6418:625:0","body":{"id":462,"nodeType":"Block","src":"6536:507:0","statements":[{"assignments":[431],"declarations":[{"constant":false,"id":431,"mutability":"mutable","name":"input","nodeType":"VariableDeclaration","scope":462,"src":"6546:23:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$3_memory_ptr","typeString":"uint256[3]"},"typeName":{"baseType":{"id":429,"name":"uint256","nodeType":"ElementaryTypeName","src":"6546:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":430,"length":{"hexValue":"33","id":428,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6554:1:0","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"nodeType":"ArrayTypeName","src":"6546:10:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$3_storage_ptr","typeString":"uint256[3]"}},"visibility":"internal"}],"id":432,"nodeType":"VariableDeclarationStatement","src":"6546:23:0"},{"expression":{"id":438,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":433,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":431,"src":"6579:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$3_memory_ptr","typeString":"uint256[3] memory"}},"id":435,"indexExpression":{"hexValue":"30","id":434,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6585:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6579:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":436,"name":"p","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":419,"src":"6590:1:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":437,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"X","nodeType":"MemberAccess","referencedDeclaration":281,"src":"6590:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6579:14:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":439,"nodeType":"ExpressionStatement","src":"6579:14:0"},{"expression":{"id":445,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":440,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":431,"src":"6603:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$3_memory_ptr","typeString":"uint256[3] memory"}},"id":442,"indexExpression":{"hexValue":"31","id":441,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6609:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6603:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"id":443,"name":"p","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":419,"src":"6614:1:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":444,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"Y","nodeType":"MemberAccess","referencedDeclaration":283,"src":"6614:3:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6603:14:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":446,"nodeType":"ExpressionStatement","src":"6603:14:0"},{"expression":{"id":451,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":447,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":431,"src":"6627:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$3_memory_ptr","typeString":"uint256[3] memory"}},"id":449,"indexExpression":{"hexValue":"32","id":448,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"6633:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"6627:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":450,"name":"s","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":421,"src":"6638:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"6627:12:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":452,"nodeType":"ExpressionStatement","src":"6627:12:0"},{"assignments":[454],"declarations":[{"constant":false,"id":454,"mutability":"mutable","name":"success","nodeType":"VariableDeclaration","scope":462,"src":"6649:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":453,"name":"bool","nodeType":"ElementaryTypeName","src":"6649:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":455,"nodeType":"VariableDeclarationStatement","src":"6649:12:0"},{"AST":{"nodeType":"YulBlock","src":"6744:245:0","statements":[{"nodeType":"YulAssignment","src":"6758:64:0","value":{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"6784:3:0"},"nodeType":"YulFunctionCall","src":"6784:5:0"},{"kind":"number","nodeType":"YulLiteral","src":"6791:4:0","type":"","value":"2000"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"6780:3:0"},"nodeType":"YulFunctionCall","src":"6780:16:0"},{"kind":"number","nodeType":"YulLiteral","src":"6798:1:0","type":"","value":"7"},{"name":"input","nodeType":"YulIdentifier","src":"6801:5:0"},{"kind":"number","nodeType":"YulLiteral","src":"6808:4:0","type":"","value":"0x80"},{"name":"r","nodeType":"YulIdentifier","src":"6814:1:0"},{"kind":"number","nodeType":"YulLiteral","src":"6817:4:0","type":"","value":"0x60"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"6769:10:0"},"nodeType":"YulFunctionCall","src":"6769:53:0"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"6758:7:0"}]},{"cases":[{"body":{"nodeType":"YulBlock","src":"6930:49:0","statements":[{"expression":{"arguments":[],"functionName":{"name":"invalid","nodeType":"YulIdentifier","src":"6952:7:0"},"nodeType":"YulFunctionCall","src":"6952:9:0"},"nodeType":"YulExpressionStatement","src":"6952:9:0"}]},"nodeType":"YulCase","src":"6923:56:0","value":{"kind":"number","nodeType":"YulLiteral","src":"6928:1:0","type":"","value":"0"}}],"expression":{"name":"success","nodeType":"YulIdentifier","src":"6899:7:0"},"nodeType":"YulSwitch","src":"6892:87:0"}]},"evmVersion":"istanbul","externalReferences":[{"declaration":431,"isOffset":false,"isSlot":false,"src":"6801:5:0","valueSize":1},{"declaration":424,"isOffset":false,"isSlot":false,"src":"6814:1:0","valueSize":1},{"declaration":454,"isOffset":false,"isSlot":false,"src":"6758:7:0","valueSize":1},{"declaration":454,"isOffset":false,"isSlot":false,"src":"6899:7:0","valueSize":1}],"id":456,"nodeType":"InlineAssembly","src":"6735:254:0"},{"expression":{"arguments":[{"id":458,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":454,"src":"7006:7:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"70616972696e672d6d756c2d6661696c6564","id":459,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7015:20:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_63b4943691e0891cf5adcfe6e3eb490783b718accceadc0166bc4e56cf1df5de","typeString":"literal_string \"pairing-mul-failed\""},"value":"pairing-mul-failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_63b4943691e0891cf5adcfe6e3eb490783b718accceadc0166bc4e56cf1df5de","typeString":"literal_string \"pairing-mul-failed\""}],"id":457,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"6998:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":460,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"6998:38:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":461,"nodeType":"ExpressionStatement","src":"6998:38:0"}]},"documentation":{"id":417,"nodeType":"StructuredDocumentation","src":"6268:145:0","text":"@return r the product of a point on G1 and a scalar, i.e.\n p == p.scalar_mul(1) and p.addition(p) == p.scalar_mul(2) for all points p."},"implemented":true,"kind":"function","modifiers":[],"name":"scalar_mul","parameters":{"id":422,"nodeType":"ParameterList","parameters":[{"constant":false,"id":419,"mutability":"mutable","name":"p","nodeType":"VariableDeclaration","scope":463,"src":"6438:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":418,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"6438:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":421,"mutability":"mutable","name":"s","nodeType":"VariableDeclaration","scope":463,"src":"6456:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":420,"name":"uint256","nodeType":"ElementaryTypeName","src":"6456:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"src":"6437:29:0"},"returnParameters":{"id":425,"nodeType":"ParameterList","parameters":[{"constant":false,"id":424,"mutability":"mutable","name":"r","nodeType":"VariableDeclaration","scope":463,"src":"6514:16:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":423,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"6514:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"}],"src":"6513:18:0"},"scope":868,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":627,"nodeType":"FunctionDefinition","src":"7255:1238:0","body":{"id":626,"nodeType":"Block","src":"7371:1122:0","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":480,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"expression":{"id":476,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":467,"src":"7389:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":477,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"7389:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"==","rightExpression":{"expression":{"id":478,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":470,"src":"7402:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":479,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"7402:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7389:22:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"70616972696e672d6c656e677468732d6661696c6564","id":481,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"7413:24:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_d4c505601ed3bad1341fbb75434dd6541f91bae974d0b2bc28d5491a5c4a21cc","typeString":"literal_string \"pairing-lengths-failed\""},"value":"pairing-lengths-failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_d4c505601ed3bad1341fbb75434dd6541f91bae974d0b2bc28d5491a5c4a21cc","typeString":"literal_string \"pairing-lengths-failed\""}],"id":475,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"7381:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":482,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7381:57:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":483,"nodeType":"ExpressionStatement","src":"7381:57:0"},{"assignments":[485],"declarations":[{"constant":false,"id":485,"mutability":"mutable","name":"elements","nodeType":"VariableDeclaration","scope":626,"src":"7448:16:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":484,"name":"uint256","nodeType":"ElementaryTypeName","src":"7448:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":488,"initialValue":{"expression":{"id":486,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":467,"src":"7467:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":487,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"length","nodeType":"MemberAccess","src":"7467:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7448:28:0"},{"assignments":[490],"declarations":[{"constant":false,"id":490,"mutability":"mutable","name":"inputSize","nodeType":"VariableDeclaration","scope":626,"src":"7486:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":489,"name":"uint256","nodeType":"ElementaryTypeName","src":"7486:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":494,"initialValue":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":493,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":491,"name":"elements","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":485,"src":"7506:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":492,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7517:1:0","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"7506:12:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"VariableDeclarationStatement","src":"7486:32:0"},{"assignments":[499],"declarations":[{"constant":false,"id":499,"mutability":"mutable","name":"input","nodeType":"VariableDeclaration","scope":626,"src":"7528:22:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[]"},"typeName":{"baseType":{"id":497,"name":"uint256","nodeType":"ElementaryTypeName","src":"7528:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":498,"nodeType":"ArrayTypeName","src":"7528:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}},"visibility":"internal"}],"id":505,"initialValue":{"arguments":[{"id":503,"name":"inputSize","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":490,"src":"7567:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_uint256","typeString":"uint256"}],"id":502,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"7553:13:0","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_uint256_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (uint256[] memory)"},"typeName":{"baseType":{"id":500,"name":"uint256","nodeType":"ElementaryTypeName","src":"7557:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":501,"nodeType":"ArrayTypeName","src":"7557:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_storage_ptr","typeString":"uint256[]"}}},"id":504,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"7553:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"nodeType":"VariableDeclarationStatement","src":"7528:49:0"},{"body":{"id":602,"nodeType":"Block","src":"7626:263:0","statements":[{"expression":{"id":527,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":516,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":499,"src":"7640:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":522,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":521,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":519,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":517,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7646:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":518,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7650:1:0","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"7646:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"30","id":520,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7654:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"7646:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7640:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"baseExpression":{"id":523,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":467,"src":"7659:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":525,"indexExpression":{"id":524,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7662:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7659:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":526,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"X","nodeType":"MemberAccess","referencedDeclaration":281,"src":"7659:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7640:26:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":528,"nodeType":"ExpressionStatement","src":"7640:26:0"},{"expression":{"id":540,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":529,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":499,"src":"7680:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":535,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":534,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":532,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":530,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7686:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":531,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7690:1:0","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"7686:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"31","id":533,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7694:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"src":"7686:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7680:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"expression":{"baseExpression":{"id":536,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":467,"src":"7699:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":538,"indexExpression":{"id":537,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7702:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7699:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":539,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"Y","nodeType":"MemberAccess","referencedDeclaration":283,"src":"7699:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7680:26:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":541,"nodeType":"ExpressionStatement","src":"7680:26:0"},{"expression":{"id":555,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":542,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":499,"src":"7720:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":548,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":547,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":545,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":543,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7726:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":544,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7730:1:0","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"7726:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"32","id":546,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7734:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"src":"7726:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7720:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"expression":{"baseExpression":{"id":549,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":470,"src":"7739:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":551,"indexExpression":{"id":550,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7742:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7739:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":552,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"X","nodeType":"MemberAccess","referencedDeclaration":288,"src":"7739:7:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":554,"indexExpression":{"hexValue":"30","id":553,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7747:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7739:10:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7720:29:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":556,"nodeType":"ExpressionStatement","src":"7720:29:0"},{"expression":{"id":570,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":557,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":499,"src":"7763:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":563,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":562,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":560,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":558,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7769:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":559,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7773:1:0","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"7769:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"33","id":561,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7777:1:0","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"src":"7769:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7763:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"expression":{"baseExpression":{"id":564,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":470,"src":"7782:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":566,"indexExpression":{"id":565,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7785:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7782:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":567,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"X","nodeType":"MemberAccess","referencedDeclaration":288,"src":"7782:7:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":569,"indexExpression":{"hexValue":"31","id":568,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7790:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7782:10:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7763:29:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":571,"nodeType":"ExpressionStatement","src":"7763:29:0"},{"expression":{"id":585,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":572,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":499,"src":"7806:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":578,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":577,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":575,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":573,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7812:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":574,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7816:1:0","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"7812:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"34","id":576,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7820:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"},"src":"7812:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7806:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"expression":{"baseExpression":{"id":579,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":470,"src":"7825:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":581,"indexExpression":{"id":580,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7828:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7825:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":582,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"Y","nodeType":"MemberAccess","referencedDeclaration":292,"src":"7825:7:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":584,"indexExpression":{"hexValue":"30","id":583,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7833:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7825:10:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7806:29:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":586,"nodeType":"ExpressionStatement","src":"7806:29:0"},{"expression":{"id":600,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":587,"name":"input","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":499,"src":"7849:5:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$dyn_memory_ptr","typeString":"uint256[] memory"}},"id":593,"indexExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":592,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":590,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":588,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7855:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"*","rightExpression":{"hexValue":"36","id":589,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7859:1:0","typeDescriptions":{"typeIdentifier":"t_rational_6_by_1","typeString":"int_const 6"},"value":"6"},"src":"7855:5:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"+","rightExpression":{"hexValue":"35","id":591,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7863:1:0","typeDescriptions":{"typeIdentifier":"t_rational_5_by_1","typeString":"int_const 5"},"value":"5"},"src":"7855:9:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"7849:16:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"baseExpression":{"expression":{"baseExpression":{"id":594,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":470,"src":"7868:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":596,"indexExpression":{"id":595,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7871:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7868:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":597,"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"memberName":"Y","nodeType":"MemberAccess","referencedDeclaration":292,"src":"7868:7:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$2_memory_ptr","typeString":"uint256[2] memory"}},"id":599,"indexExpression":{"hexValue":"31","id":598,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7876:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"7868:10:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7849:29:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":601,"nodeType":"ExpressionStatement","src":"7849:29:0"}]},"condition":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":512,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":510,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7607:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"<","rightExpression":{"id":511,"name":"elements","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":485,"src":"7611:8:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"src":"7607:12:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"id":603,"initializationExpression":{"assignments":[507],"declarations":[{"constant":false,"id":507,"mutability":"mutable","name":"i","nodeType":"VariableDeclaration","scope":603,"src":"7592:9:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":506,"name":"uint256","nodeType":"ElementaryTypeName","src":"7592:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":509,"initialValue":{"hexValue":"30","id":508,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7604:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"nodeType":"VariableDeclarationStatement","src":"7592:13:0"},"loopExpression":{"expression":{"id":514,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"nodeType":"UnaryOperation","operator":"++","prefix":false,"src":"7621:3:0","subExpression":{"id":513,"name":"i","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":507,"src":"7621:1:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":515,"nodeType":"ExpressionStatement","src":"7621:3:0"},"nodeType":"ForStatement","src":"7587:302:0"},{"assignments":[609],"declarations":[{"constant":false,"id":609,"mutability":"mutable","name":"out","nodeType":"VariableDeclaration","scope":626,"src":"7898:21:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_memory_ptr","typeString":"uint256[1]"},"typeName":{"baseType":{"id":607,"name":"uint256","nodeType":"ElementaryTypeName","src":"7898:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"id":608,"length":{"hexValue":"31","id":606,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"7906:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"nodeType":"ArrayTypeName","src":"7898:10:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_storage_ptr","typeString":"uint256[1]"}},"visibility":"internal"}],"id":610,"nodeType":"VariableDeclarationStatement","src":"7898:21:0"},{"assignments":[612],"declarations":[{"constant":false,"id":612,"mutability":"mutable","name":"success","nodeType":"VariableDeclaration","scope":626,"src":"7929:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":611,"name":"bool","nodeType":"ElementaryTypeName","src":"7929:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"id":613,"nodeType":"VariableDeclarationStatement","src":"7929:12:0"},{"AST":{"nodeType":"YulBlock","src":"8024:384:0","statements":[{"nodeType":"YulAssignment","src":"8038:203:0","value":{"arguments":[{"arguments":[{"arguments":[],"functionName":{"name":"gas","nodeType":"YulIdentifier","src":"8081:3:0"},"nodeType":"YulFunctionCall","src":"8081:5:0"},{"kind":"number","nodeType":"YulLiteral","src":"8088:4:0","type":"","value":"2000"}],"functionName":{"name":"sub","nodeType":"YulIdentifier","src":"8077:3:0"},"nodeType":"YulFunctionCall","src":"8077:16:0"},{"kind":"number","nodeType":"YulLiteral","src":"8111:1:0","type":"","value":"8"},{"arguments":[{"name":"input","nodeType":"YulIdentifier","src":"8134:5:0"},{"kind":"number","nodeType":"YulLiteral","src":"8141:4:0","type":"","value":"0x20"}],"functionName":{"name":"add","nodeType":"YulIdentifier","src":"8130:3:0"},"nodeType":"YulFunctionCall","src":"8130:16:0"},{"arguments":[{"name":"inputSize","nodeType":"YulIdentifier","src":"8168:9:0"},{"kind":"number","nodeType":"YulLiteral","src":"8179:4:0","type":"","value":"0x20"}],"functionName":{"name":"mul","nodeType":"YulIdentifier","src":"8164:3:0"},"nodeType":"YulFunctionCall","src":"8164:20:0"},{"name":"out","nodeType":"YulIdentifier","src":"8202:3:0"},{"kind":"number","nodeType":"YulLiteral","src":"8223:4:0","type":"","value":"0x20"}],"functionName":{"name":"staticcall","nodeType":"YulIdentifier","src":"8049:10:0"},"nodeType":"YulFunctionCall","src":"8049:192:0"},"variableNames":[{"name":"success","nodeType":"YulIdentifier","src":"8038:7:0"}]},{"cases":[{"body":{"nodeType":"YulBlock","src":"8349:49:0","statements":[{"expression":{"arguments":[],"functionName":{"name":"invalid","nodeType":"YulIdentifier","src":"8371:7:0"},"nodeType":"YulFunctionCall","src":"8371:9:0"},"nodeType":"YulExpressionStatement","src":"8371:9:0"}]},"nodeType":"YulCase","src":"8342:56:0","value":{"kind":"number","nodeType":"YulLiteral","src":"8347:1:0","type":"","value":"0"}}],"expression":{"name":"success","nodeType":"YulIdentifier","src":"8318:7:0"},"nodeType":"YulSwitch","src":"8311:87:0"}]},"evmVersion":"istanbul","externalReferences":[{"declaration":499,"isOffset":false,"isSlot":false,"src":"8134:5:0","valueSize":1},{"declaration":490,"isOffset":false,"isSlot":false,"src":"8168:9:0","valueSize":1},{"declaration":609,"isOffset":false,"isSlot":false,"src":"8202:3:0","valueSize":1},{"declaration":612,"isOffset":false,"isSlot":false,"src":"8038:7:0","valueSize":1},{"declaration":612,"isOffset":false,"isSlot":false,"src":"8318:7:0","valueSize":1}],"id":614,"nodeType":"InlineAssembly","src":"8015:393:0"},{"expression":{"arguments":[{"id":616,"name":"success","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":612,"src":"8425:7:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"70616972696e672d6f70636f64652d6661696c6564","id":617,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"8434:23:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_f3220b3ef654fc0d9a13e2b6d8c956cb8fb22df61a3a050ded181d8902069fe5","typeString":"literal_string \"pairing-opcode-failed\""},"value":"pairing-opcode-failed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_f3220b3ef654fc0d9a13e2b6d8c956cb8fb22df61a3a050ded181d8902069fe5","typeString":"literal_string \"pairing-opcode-failed\""}],"id":615,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"8417:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":618,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8417:41:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":619,"nodeType":"ExpressionStatement","src":"8417:41:0"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":624,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"baseExpression":{"id":620,"name":"out","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":609,"src":"8475:3:0","typeDescriptions":{"typeIdentifier":"t_array$_t_uint256_$1_memory_ptr","typeString":"uint256[1] memory"}},"id":622,"indexExpression":{"hexValue":"30","id":621,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8479:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":false,"nodeType":"IndexAccess","src":"8475:6:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"hexValue":"30","id":623,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8485:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"8475:11:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":474,"id":625,"nodeType":"Return","src":"8468:18:0"}]},"documentation":{"id":464,"nodeType":"StructuredDocumentation","src":"7049:201:0","text":"@return the result of computing the pairing check\n e(p1[0], p2[0]) * .... * e(p1[n], p2[n]) == 1\n For example pairing([P1(), P1().negate()], [P2(), P2()]) should\n return true."},"implemented":true,"kind":"function","modifiers":[],"name":"pairing","parameters":{"id":471,"nodeType":"ParameterList","parameters":[{"constant":false,"id":467,"mutability":"mutable","name":"p1","nodeType":"VariableDeclaration","scope":627,"src":"7272:19:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point[]"},"typeName":{"baseType":{"id":465,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"7272:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"id":466,"nodeType":"ArrayTypeName","src":"7272:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_storage_$dyn_storage_ptr","typeString":"struct Pairing.G1Point[]"}},"visibility":"internal"},{"constant":false,"id":470,"mutability":"mutable","name":"p2","nodeType":"VariableDeclaration","scope":627,"src":"7293:19:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point[]"},"typeName":{"baseType":{"id":468,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"7293:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"id":469,"nodeType":"ArrayTypeName","src":"7293:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_storage_$dyn_storage_ptr","typeString":"struct Pairing.G2Point[]"}},"visibility":"internal"}],"src":"7271:42:0"},"returnParameters":{"id":474,"nodeType":"ParameterList","parameters":[{"constant":false,"id":473,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":627,"src":"7361:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":472,"name":"bool","nodeType":"ElementaryTypeName","src":"7361:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"7360:6:0"},"scope":868,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":691,"nodeType":"FunctionDefinition","src":"8561:380:0","body":{"id":690,"nodeType":"Block","src":"8726:215:0","statements":[{"assignments":[644],"declarations":[{"constant":false,"id":644,"mutability":"mutable","name":"p1","nodeType":"VariableDeclaration","scope":690,"src":"8736:19:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point[]"},"typeName":{"baseType":{"id":642,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"8736:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"id":643,"nodeType":"ArrayTypeName","src":"8736:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_storage_$dyn_storage_ptr","typeString":"struct Pairing.G1Point[]"}},"visibility":"internal"}],"id":650,"initialValue":{"arguments":[{"hexValue":"32","id":648,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8772:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"}],"id":647,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"8758:13:0","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct Pairing.G1Point memory[] memory)"},"typeName":{"baseType":{"id":645,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"8762:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"id":646,"nodeType":"ArrayTypeName","src":"8762:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_storage_$dyn_storage_ptr","typeString":"struct Pairing.G1Point[]"}}},"id":649,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8758:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"8736:38:0"},{"assignments":[654],"declarations":[{"constant":false,"id":654,"mutability":"mutable","name":"p2","nodeType":"VariableDeclaration","scope":690,"src":"8784:19:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point[]"},"typeName":{"baseType":{"id":652,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"8784:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"id":653,"nodeType":"ArrayTypeName","src":"8784:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_storage_$dyn_storage_ptr","typeString":"struct Pairing.G2Point[]"}},"visibility":"internal"}],"id":660,"initialValue":{"arguments":[{"hexValue":"32","id":658,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8820:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"}],"id":657,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"8806:13:0","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct Pairing.G2Point memory[] memory)"},"typeName":{"baseType":{"id":655,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"8810:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"id":656,"nodeType":"ArrayTypeName","src":"8810:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_storage_$dyn_storage_ptr","typeString":"struct Pairing.G2Point[]"}}},"id":659,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8806:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"8784:38:0"},{"expression":{"id":665,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":661,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":644,"src":"8832:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":663,"indexExpression":{"hexValue":"30","id":662,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8835:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8832:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":664,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":630,"src":"8840:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"8832:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":666,"nodeType":"ExpressionStatement","src":"8832:10:0"},{"expression":{"id":671,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":667,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":644,"src":"8852:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":669,"indexExpression":{"hexValue":"31","id":668,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8855:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8852:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":670,"name":"b1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":634,"src":"8860:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"8852:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":672,"nodeType":"ExpressionStatement","src":"8852:10:0"},{"expression":{"id":677,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":673,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":654,"src":"8872:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":675,"indexExpression":{"hexValue":"30","id":674,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8875:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8872:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":676,"name":"a2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":632,"src":"8880:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"src":"8872:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":678,"nodeType":"ExpressionStatement","src":"8872:10:0"},{"expression":{"id":683,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":679,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":654,"src":"8892:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":681,"indexExpression":{"hexValue":"31","id":680,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"8895:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"8892:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":682,"name":"b2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":636,"src":"8900:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"src":"8892:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":684,"nodeType":"ExpressionStatement","src":"8892:10:0"},{"expression":{"arguments":[{"id":686,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":644,"src":"8927:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},{"id":687,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":654,"src":"8931:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"},{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}],"id":685,"name":"pairing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":627,"src":"8919:7:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr_$_t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr_$returns$_t_bool_$","typeString":"function (struct Pairing.G1Point memory[] memory,struct Pairing.G2Point memory[] memory) view returns (bool)"}},"id":688,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"8919:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":640,"id":689,"nodeType":"Return","src":"8912:22:0"}]},"documentation":{"id":628,"nodeType":"StructuredDocumentation","src":"8499:57:0","text":"Convenience method for a pairing check for two pairs."},"implemented":true,"kind":"function","modifiers":[],"name":"pairingProd2","parameters":{"id":637,"nodeType":"ParameterList","parameters":[{"constant":false,"id":630,"mutability":"mutable","name":"a1","nodeType":"VariableDeclaration","scope":691,"src":"8592:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":629,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"8592:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":632,"mutability":"mutable","name":"a2","nodeType":"VariableDeclaration","scope":691,"src":"8619:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":631,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"8619:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"},{"constant":false,"id":634,"mutability":"mutable","name":"b1","nodeType":"VariableDeclaration","scope":691,"src":"8646:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":633,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"8646:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":636,"mutability":"mutable","name":"b2","nodeType":"VariableDeclaration","scope":691,"src":"8673:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":635,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"8673:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"}],"src":"8582:114:0"},"returnParameters":{"id":640,"nodeType":"ParameterList","parameters":[{"constant":false,"id":639,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":691,"src":"8720:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":638,"name":"bool","nodeType":"ElementaryTypeName","src":"8720:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"8719:6:0"},"scope":868,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":771,"nodeType":"FunctionDefinition","src":"9011:474:0","body":{"id":770,"nodeType":"Block","src":"9230:255:0","statements":[{"assignments":[712],"declarations":[{"constant":false,"id":712,"mutability":"mutable","name":"p1","nodeType":"VariableDeclaration","scope":770,"src":"9240:19:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point[]"},"typeName":{"baseType":{"id":710,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"9240:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"id":711,"nodeType":"ArrayTypeName","src":"9240:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_storage_$dyn_storage_ptr","typeString":"struct Pairing.G1Point[]"}},"visibility":"internal"}],"id":718,"initialValue":{"arguments":[{"hexValue":"33","id":716,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9276:1:0","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"}],"id":715,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"9262:13:0","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct Pairing.G1Point memory[] memory)"},"typeName":{"baseType":{"id":713,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"9266:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"id":714,"nodeType":"ArrayTypeName","src":"9266:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_storage_$dyn_storage_ptr","typeString":"struct Pairing.G1Point[]"}}},"id":717,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9262:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"9240:38:0"},{"assignments":[722],"declarations":[{"constant":false,"id":722,"mutability":"mutable","name":"p2","nodeType":"VariableDeclaration","scope":770,"src":"9288:19:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point[]"},"typeName":{"baseType":{"id":720,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"9288:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"id":721,"nodeType":"ArrayTypeName","src":"9288:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_storage_$dyn_storage_ptr","typeString":"struct Pairing.G2Point[]"}},"visibility":"internal"}],"id":728,"initialValue":{"arguments":[{"hexValue":"33","id":726,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9324:1:0","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"}],"id":725,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"9310:13:0","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct Pairing.G2Point memory[] memory)"},"typeName":{"baseType":{"id":723,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"9314:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"id":724,"nodeType":"ArrayTypeName","src":"9314:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_storage_$dyn_storage_ptr","typeString":"struct Pairing.G2Point[]"}}},"id":727,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9310:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"9288:38:0"},{"expression":{"id":733,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":729,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":712,"src":"9336:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":731,"indexExpression":{"hexValue":"30","id":730,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9339:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9336:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":732,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":694,"src":"9344:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"9336:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":734,"nodeType":"ExpressionStatement","src":"9336:10:0"},{"expression":{"id":739,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":735,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":712,"src":"9356:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":737,"indexExpression":{"hexValue":"31","id":736,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9359:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9356:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":738,"name":"b1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":698,"src":"9364:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"9356:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":740,"nodeType":"ExpressionStatement","src":"9356:10:0"},{"expression":{"id":745,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":741,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":712,"src":"9376:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":743,"indexExpression":{"hexValue":"32","id":742,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9379:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9376:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":744,"name":"c1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":702,"src":"9384:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"9376:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":746,"nodeType":"ExpressionStatement","src":"9376:10:0"},{"expression":{"id":751,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":747,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":722,"src":"9396:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":749,"indexExpression":{"hexValue":"30","id":748,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9399:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9396:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":750,"name":"a2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":696,"src":"9404:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"src":"9396:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":752,"nodeType":"ExpressionStatement","src":"9396:10:0"},{"expression":{"id":757,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":753,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":722,"src":"9416:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":755,"indexExpression":{"hexValue":"31","id":754,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9419:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9416:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":756,"name":"b2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":700,"src":"9424:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"src":"9416:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":758,"nodeType":"ExpressionStatement","src":"9416:10:0"},{"expression":{"id":763,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":759,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":722,"src":"9436:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":761,"indexExpression":{"hexValue":"32","id":760,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9439:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9436:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":762,"name":"c2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":704,"src":"9444:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"src":"9436:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":764,"nodeType":"ExpressionStatement","src":"9436:10:0"},{"expression":{"arguments":[{"id":766,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":712,"src":"9471:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},{"id":767,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":722,"src":"9475:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"},{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}],"id":765,"name":"pairing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":627,"src":"9463:7:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr_$_t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr_$returns$_t_bool_$","typeString":"function (struct Pairing.G1Point memory[] memory,struct Pairing.G2Point memory[] memory) view returns (bool)"}},"id":768,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9463:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":708,"id":769,"nodeType":"Return","src":"9456:22:0"}]},"documentation":{"id":692,"nodeType":"StructuredDocumentation","src":"8947:59:0","text":"Convenience method for a pairing check for three pairs."},"implemented":true,"kind":"function","modifiers":[],"name":"pairingProd3","parameters":{"id":705,"nodeType":"ParameterList","parameters":[{"constant":false,"id":694,"mutability":"mutable","name":"a1","nodeType":"VariableDeclaration","scope":771,"src":"9042:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":693,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"9042:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":696,"mutability":"mutable","name":"a2","nodeType":"VariableDeclaration","scope":771,"src":"9069:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":695,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"9069:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"},{"constant":false,"id":698,"mutability":"mutable","name":"b1","nodeType":"VariableDeclaration","scope":771,"src":"9096:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":697,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"9096:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":700,"mutability":"mutable","name":"b2","nodeType":"VariableDeclaration","scope":771,"src":"9123:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":699,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"9123:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"},{"constant":false,"id":702,"mutability":"mutable","name":"c1","nodeType":"VariableDeclaration","scope":771,"src":"9150:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":701,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"9150:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":704,"mutability":"mutable","name":"c2","nodeType":"VariableDeclaration","scope":771,"src":"9177:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":703,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"9177:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"}],"src":"9032:168:0"},"returnParameters":{"id":708,"nodeType":"ParameterList","parameters":[{"constant":false,"id":707,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":771,"src":"9224:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":706,"name":"bool","nodeType":"ElementaryTypeName","src":"9224:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"9223:6:0"},"scope":868,"stateMutability":"view","virtual":false,"visibility":"internal"},{"id":867,"nodeType":"FunctionDefinition","src":"9554:568:0","body":{"id":866,"nodeType":"Block","src":"9827:295:0","statements":[{"assignments":[796],"declarations":[{"constant":false,"id":796,"mutability":"mutable","name":"p1","nodeType":"VariableDeclaration","scope":866,"src":"9837:19:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point[]"},"typeName":{"baseType":{"id":794,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"9837:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"id":795,"nodeType":"ArrayTypeName","src":"9837:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_storage_$dyn_storage_ptr","typeString":"struct Pairing.G1Point[]"}},"visibility":"internal"}],"id":802,"initialValue":{"arguments":[{"hexValue":"34","id":800,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9873:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"}],"id":799,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"9859:13:0","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct Pairing.G1Point memory[] memory)"},"typeName":{"baseType":{"id":797,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"9863:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"id":798,"nodeType":"ArrayTypeName","src":"9863:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_storage_$dyn_storage_ptr","typeString":"struct Pairing.G1Point[]"}}},"id":801,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9859:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"9837:38:0"},{"assignments":[806],"declarations":[{"constant":false,"id":806,"mutability":"mutable","name":"p2","nodeType":"VariableDeclaration","scope":866,"src":"9885:19:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point[]"},"typeName":{"baseType":{"id":804,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"9885:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"id":805,"nodeType":"ArrayTypeName","src":"9885:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_storage_$dyn_storage_ptr","typeString":"struct Pairing.G2Point[]"}},"visibility":"internal"}],"id":812,"initialValue":{"arguments":[{"hexValue":"34","id":810,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9921:1:0","typeDescriptions":{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"},"value":"4"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_rational_4_by_1","typeString":"int_const 4"}],"id":809,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"NewExpression","src":"9907:13:0","typeDescriptions":{"typeIdentifier":"t_function_objectcreation_pure$_t_uint256_$returns$_t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr_$","typeString":"function (uint256) pure returns (struct Pairing.G2Point memory[] memory)"},"typeName":{"baseType":{"id":807,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"9911:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"id":808,"nodeType":"ArrayTypeName","src":"9911:9:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_storage_$dyn_storage_ptr","typeString":"struct Pairing.G2Point[]"}}},"id":811,"isConstant":false,"isLValue":false,"isPure":true,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"9907:16:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"nodeType":"VariableDeclarationStatement","src":"9885:38:0"},{"expression":{"id":817,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":813,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":796,"src":"9933:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":815,"indexExpression":{"hexValue":"30","id":814,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9936:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9933:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":816,"name":"a1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":774,"src":"9941:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"9933:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":818,"nodeType":"ExpressionStatement","src":"9933:10:0"},{"expression":{"id":823,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":819,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":796,"src":"9953:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":821,"indexExpression":{"hexValue":"31","id":820,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9956:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9953:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":822,"name":"b1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":778,"src":"9961:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"9953:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":824,"nodeType":"ExpressionStatement","src":"9953:10:0"},{"expression":{"id":829,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":825,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":796,"src":"9973:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":827,"indexExpression":{"hexValue":"32","id":826,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9976:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9973:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":828,"name":"c1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":782,"src":"9981:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"9973:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":830,"nodeType":"ExpressionStatement","src":"9973:10:0"},{"expression":{"id":835,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":831,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":796,"src":"9993:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},"id":833,"indexExpression":{"hexValue":"33","id":832,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"9996:1:0","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"9993:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":834,"name":"d1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":786,"src":"10001:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"src":"9993:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point memory"}},"id":836,"nodeType":"ExpressionStatement","src":"9993:10:0"},{"expression":{"id":841,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":837,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":806,"src":"10013:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":839,"indexExpression":{"hexValue":"30","id":838,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10016:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"10013:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":840,"name":"a2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":776,"src":"10021:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"src":"10013:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":842,"nodeType":"ExpressionStatement","src":"10013:10:0"},{"expression":{"id":847,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":843,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":806,"src":"10033:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":845,"indexExpression":{"hexValue":"31","id":844,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10036:1:0","typeDescriptions":{"typeIdentifier":"t_rational_1_by_1","typeString":"int_const 1"},"value":"1"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"10033:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":846,"name":"b2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":780,"src":"10041:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"src":"10033:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":848,"nodeType":"ExpressionStatement","src":"10033:10:0"},{"expression":{"id":853,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":849,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":806,"src":"10053:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":851,"indexExpression":{"hexValue":"32","id":850,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10056:1:0","typeDescriptions":{"typeIdentifier":"t_rational_2_by_1","typeString":"int_const 2"},"value":"2"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"10053:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":852,"name":"c2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":784,"src":"10061:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"src":"10053:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":854,"nodeType":"ExpressionStatement","src":"10053:10:0"},{"expression":{"id":859,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"baseExpression":{"id":855,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":806,"src":"10073:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}},"id":857,"indexExpression":{"hexValue":"33","id":856,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"10076:1:0","typeDescriptions":{"typeIdentifier":"t_rational_3_by_1","typeString":"int_const 3"},"value":"3"},"isConstant":false,"isLValue":true,"isPure":false,"lValueRequested":true,"nodeType":"IndexAccess","src":"10073:5:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":858,"name":"d2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":788,"src":"10081:2:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"src":"10073:10:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point memory"}},"id":860,"nodeType":"ExpressionStatement","src":"10073:10:0"},{"expression":{"arguments":[{"id":862,"name":"p1","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":796,"src":"10108:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"}},{"id":863,"name":"p2","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":806,"src":"10112:2:0","typeDescriptions":{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G1Point memory[] memory"},{"typeIdentifier":"t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr","typeString":"struct Pairing.G2Point memory[] memory"}],"id":861,"name":"pairing","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":627,"src":"10100:7:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_array$_t_struct$_G1Point_$284_memory_ptr_$dyn_memory_ptr_$_t_array$_t_struct$_G2Point_$293_memory_ptr_$dyn_memory_ptr_$returns$_t_bool_$","typeString":"function (struct Pairing.G1Point memory[] memory,struct Pairing.G2Point memory[] memory) view returns (bool)"}},"id":864,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"10100:15:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":792,"id":865,"nodeType":"Return","src":"10093:22:0"}]},"documentation":{"id":772,"nodeType":"StructuredDocumentation","src":"9491:58:0","text":"Convenience method for a pairing check for four pairs."},"implemented":true,"kind":"function","modifiers":[],"name":"pairingProd4","parameters":{"id":789,"nodeType":"ParameterList","parameters":[{"constant":false,"id":774,"mutability":"mutable","name":"a1","nodeType":"VariableDeclaration","scope":867,"src":"9585:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":773,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"9585:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":776,"mutability":"mutable","name":"a2","nodeType":"VariableDeclaration","scope":867,"src":"9612:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":775,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"9612:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"},{"constant":false,"id":778,"mutability":"mutable","name":"b1","nodeType":"VariableDeclaration","scope":867,"src":"9639:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":777,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"9639:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":780,"mutability":"mutable","name":"b2","nodeType":"VariableDeclaration","scope":867,"src":"9666:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":779,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"9666:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"},{"constant":false,"id":782,"mutability":"mutable","name":"c1","nodeType":"VariableDeclaration","scope":867,"src":"9693:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":781,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"9693:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":784,"mutability":"mutable","name":"c2","nodeType":"VariableDeclaration","scope":867,"src":"9720:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":783,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"9720:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"},{"constant":false,"id":786,"mutability":"mutable","name":"d1","nodeType":"VariableDeclaration","scope":867,"src":"9747:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_memory_ptr","typeString":"struct Pairing.G1Point"},"typeName":{"id":785,"name":"G1Point","nodeType":"UserDefinedTypeName","referencedDeclaration":284,"src":"9747:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G1Point_$284_storage_ptr","typeString":"struct Pairing.G1Point"}},"visibility":"internal"},{"constant":false,"id":788,"mutability":"mutable","name":"d2","nodeType":"VariableDeclaration","scope":867,"src":"9774:17:0","stateVariable":false,"storageLocation":"memory","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_memory_ptr","typeString":"struct Pairing.G2Point"},"typeName":{"id":787,"name":"G2Point","nodeType":"UserDefinedTypeName","referencedDeclaration":293,"src":"9774:7:0","typeDescriptions":{"typeIdentifier":"t_struct$_G2Point_$293_storage_ptr","typeString":"struct Pairing.G2Point"}},"visibility":"internal"}],"src":"9575:222:0"},"returnParameters":{"id":792,"nodeType":"ParameterList","parameters":[{"constant":false,"id":791,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":867,"src":"9821:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":790,"name":"bool","nodeType":"ElementaryTypeName","src":"9821:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"9820:6:0"},"scope":868,"stateMutability":"view","virtual":false,"visibility":"internal"}],"abstract":false,"baseContracts":[],"contractDependencies":[],"contractKind":"library","fullyImplemented":true,"linearizedBaseContracts":[868],"name":"Pairing","scope":869}]},"id":0} diff --git a/app/ark-circom-passport/rust-toolchain.toml b/app/ark-circom-passport/rust-toolchain.toml new file mode 100644 index 00000000..74cb24ad --- /dev/null +++ b/app/ark-circom-passport/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel = "stable" +version = "1.67.0" \ No newline at end of file diff --git a/app/ark-circom-passport/src/passport.rs b/app/ark-circom-passport/src/passport.rs new file mode 100644 index 00000000..a8bbddd6 --- /dev/null +++ b/app/ark-circom-passport/src/passport.rs @@ -0,0 +1,460 @@ +use ark_circom::{ethereum, CircomBuilder, CircomConfig, circom::CircomReduction, WitnessCalculator}; +use ark_std::rand::thread_rng; +use color_eyre::Result; +use std::os::raw::c_int; + +use ark_bn254::Bn254; +use ark_crypto_primitives::snark::SNARK; +use ark_groth16::{Groth16, Proof}; +use ark_ec::AffineRepr; + +use num_bigint::{BigInt, Sign, ToBigInt}; +extern crate hex; +use hex::decode; + +type GrothBn = Groth16; + +extern crate jni; +use jni::objects::{JClass, JObject, JValue, JString}; +use jni::JNIEnv; +use jni::sys::jstring; + +use log::Level; +use android_logger::Config; + +extern crate serde; +extern crate serde_json; +use serde_json::json; +#[macro_use] +extern crate serde_derive; + +use std::{ + collections::HashMap, + time::Instant, + convert::TryInto, + sync::Mutex +}; + +use wasmer::{Module, Store}; +use once_cell::sync::{Lazy, OnceCell}; + +mod zkey; +pub use zkey::{read_zkey, read_zkey_from_include_bytes}; + + +#[no_mangle] +pub extern "C" fn Java_io_tradle_nfc_RNPassportReaderModule_callRustCode( + env: JNIEnv, + _: JClass, +) -> jstring { + android_logger::init_once(Config::default().with_min_level(Level::Trace)); + log::error!("PROOF OF PASSPORT ---- log before imports"); + + let my_int: c_int = -1; + let my_str: String = "no_proof".to_string(); + + let combined = json!({ + "my_int": my_int, + "my_str": my_str + }); + + let combined_str = combined.to_string(); + let output = env.new_string(combined_str).expect("Couldn't create java string!"); + + output.into_inner() +} + +#[no_mangle] +pub extern "C" fn Java_io_tradle_nfc_RNPassportReaderModule_provePassport( + env: JNIEnv, + _: JClass, + mrz: JObject, + reveal_bitmap: JObject, + data_hashes: JObject, + e_content_bytes: JObject, + signature: JObject, + pubkey: JObject, + address: JString, +) -> jstring { + + log::error!("PROOF OF PASSPORT ---- formatting inputsaaaa..."); + fn run_proof( + mrz: JObject, + reveal_bitmap: JObject, + data_hashes: JObject, + e_content_bytes: JObject, + signature: JObject, + pubkey: JObject, + address: JString, + env: JNIEnv + ) -> Result> { + android_logger::init_once(Config::default().with_min_level(Level::Trace)); + + + log::error!("PROOF OF PASSPORT ---- loading zkey..."); + let start = Instant::now(); + let now = Instant::now(); + let file_bytes: &'static [u8] = include_bytes!("../passport/proof_of_passport_final.zkey"); + log::error!("PROOF OF PASSPORT ---- zkey size: {}", file_bytes.len()); + let (params, matrices) = read_zkey_from_include_bytes(file_bytes).unwrap(); + log::error!("PROOF OF PASSPORT ---- zkey loaded. Took: {:?}", now.elapsed()); + let now = Instant::now(); + + println!("loading circuit..."); + const MAIN_WASM: &'static [u8] = include_bytes!("../passport/proof_of_passport.wasm"); + const MAIN_R1CS: &'static [u8] = include_bytes!("../passport/proof_of_passport.r1cs"); + log::error!("PROOF OF PASSPORT ---- WASM and R1CS loaded. Took: {:?}", now.elapsed()); + let now = Instant::now(); + let cfg = CircomConfig::::from_bytes(MAIN_WASM, MAIN_R1CS)?; + log::error!("PROOF OF PASSPORT ---- Circuit config: {:?}", now.elapsed()); + let now = Instant::now(); + + log::error!("PROOF OF PASSPORT ---- formatting inputs..."); + log::error!("PROOF OF PASSPORT ---- mrz_veccccccc"); + + let mut builder = CircomBuilder::new(cfg,); + let mrz_vec: Vec = java_arraylist_to_rust_vec(&env, mrz)?; + let reveal_bitmap_vec: Vec = java_arraylist_to_rust_vec(&env, reveal_bitmap)?; + let data_hashes_vec: Vec = java_arraylist_to_rust_vec(&env, data_hashes)?; + let e_content_bytes_vec: Vec = java_arraylist_to_rust_vec(&env, e_content_bytes)?; + let signature_vec: Vec = java_arraylist_to_rust_vec(&env, signature)?; + let pubkey_vec: Vec = java_arraylist_to_rust_vec(&env, pubkey)?; + let address_str: String = env.get_string(address)?.into(); + + log::error!("PROOF OF PASSPORT ---- mrz_vec {:?}", mrz_vec); + log::error!("PROOF OF PASSPORT ---- reveal_bitmap_vec {:?}", reveal_bitmap_vec); + log::error!("PROOF OF PASSPORT ---- data_hashes_vec {:?}", data_hashes_vec); + log::error!("PROOF OF PASSPORT ---- e_content_bytes_vec {:?}", e_content_bytes_vec); + log::error!("PROOF OF PASSPORT ---- signature_vec {:?}", signature_vec); + log::error!("PROOF OF PASSPORT ---- pubkey_vec {:?}", pubkey_vec); + log::error!("PROOF OF PASSPORT ---- address_str {:?}", address_str); + + mrz_vec.iter() + .filter_map(|s| s.parse::().ok()) + .for_each(|n| builder.push_input("mrz", n)); + reveal_bitmap_vec.iter() + .filter_map(|s| s.parse::().ok()) + .for_each(|n| builder.push_input("reveal_bitmap", n)); + data_hashes_vec.iter() + .filter_map(|s| s.parse::().ok()) + .for_each(|n| builder.push_input("dataHashes", n)); + e_content_bytes_vec.iter() + .filter_map(|s| s.parse::().ok()) + .for_each(|n| builder.push_input("eContentBytes", n)); + signature_vec.iter() + .filter_map(|s| s.parse::().ok()) + .for_each(|n| builder.push_input("signature", n)); + pubkey_vec.iter() + .filter_map(|s| s.parse::().ok()) + .for_each(|n| builder.push_input("pubkey", n)); + + + let address_bigint = BigInt::from_bytes_be(Sign::Plus, &decode(&address_str[2..])?); + builder.push_input("address", address_bigint); + + let circom = builder.build().unwrap(); // this here calculates the witness + log::error!("PROOF OF PASSPORT ---- witness calculated. Took: {:?}", now.elapsed()); + let now = Instant::now(); + let inputs = circom.get_public_inputs().unwrap(); + + let mut rng = thread_rng(); + let proof = Groth16::::prove(¶ms, circom, &mut rng).unwrap(); + log::error!("PROOF OF PASSPORT ---- proof: {:?}", proof); + log::error!("PROOF OF PASSPORT ---- proof done. Took: {:?}", now.elapsed()); + let now = Instant::now(); + + let pvk = Groth16::::process_vk(¶ms.vk).unwrap(); + let verified = Groth16::::verify_with_processed_vk(&pvk, &inputs, &proof).unwrap(); + assert!(verified); + + log::error!("PROOF OF PASSPORT ---- proof verified. Took: {:?}", now.elapsed()); + + log::error!("PROOF OF PASSPORT ---- inputs: {:?}", inputs); + + let converted_inputs: ethereum::Inputs = inputs.as_slice().into(); + let inputs_str: Vec = converted_inputs.0.iter().map(|value| format!("{}", value)).collect(); + let serialized_inputs = serde_json::to_string(&inputs_str).unwrap(); + log::error!("PROOF OF PASSPORT ---- Serialized inputs: {:?}", serialized_inputs); + + let proof_str = proof_to_proof_str(&proof); + let serialized_proof = serde_json::to_string(&proof_str).unwrap(); + + log::error!("PROOF OF PASSPORT ---- Serialized proof: {:?}", serialized_proof); + + let combined = json!({ + "duration": start.elapsed().as_millis(), + "serialized_proof": serialized_proof, + "serialized_inputs": serialized_inputs + }); + + let combined_str = combined.to_string(); + let output = env.new_string(combined_str).expect("Couldn't create java string!"); + + Ok(output.into_inner()) + } + + match run_proof( + mrz, + reveal_bitmap, + data_hashes, + e_content_bytes, + signature, + pubkey, + address, + env + ) { + Ok(output) => output, + Err(_) => env.new_string("error").expect("Couldn't create java string!").into_inner(), + } +} + +fn java_arraylist_to_rust_vec(env: &JNIEnv, java_list: JObject) -> Result, jni::errors::Error> { + let size = env.call_method(java_list, "size", "()I", &[])?.i()? as i32; + let mut vec = Vec::with_capacity(size.try_into().unwrap()); + + for i in 0..size { + let java_string = env.call_method(java_list, "get", "(I)Ljava/lang/Object;", &[JValue::from(i)])?.l()?; + let rust_string: String = env.get_string(java_string.into())?.into(); + vec.push(rust_string); + } + + Ok(vec) +} + +#[derive(Debug)] +#[derive(Serialize)] +struct ProofStr { + a: (String, String), + b: ((String, String), (String, String)), + c: (String, String), +} + +fn proof_to_proof_str(proof: &Proof) -> ProofStr { + let a_xy = proof.a.xy().unwrap(); + let b_xy = proof.b.xy().unwrap(); + let c_xy = proof.c.xy().unwrap(); + + let b_c0_c0 = b_xy.0.c0.to_string(); + let b_c0_c1 = b_xy.0.c1.to_string(); + let b_c1_c0 = b_xy.1.c0.to_string(); + let b_c1_c1 = b_xy.1.c1.to_string(); + + ProofStr { + a: (a_xy.0.to_string(), a_xy.1.to_string()), + b: ((b_c0_c0, b_c0_c1), (b_c1_c0, b_c1_c1)), + c: (c_xy.0.to_string(), c_xy.1.to_string()), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use ethers::{ + contract::ContractError, + prelude::abigen, + providers::{Http, Middleware, Provider}, + utils::Anvil, + }; + use std::{ + error::Error, + fs::File, + sync::Arc, + collections::HashMap + }; + use ark_circom::{ + circom::CircomReduction, + WitnessCalculator + }; + use num_bigint::ToBigInt; + + + // We need to implement the conversion from the Ark-Circom's internal Ethereum types to + // the ones expected by the abigen'd types. Could we maybe provide a convenience + // macro for these, given that there's room for implementation error? + abigen!(Groth16Verifier, "./artifacts/verifier_artifact.json"); + use groth_16_verifier::{G1Point, G2Point, Proof as EthProof, VerifyingKey as Groth16VerifyingKey}; + + impl From for G1Point { + fn from(src: ethereum::G1) -> Self { + Self { x: src.x, y: src.y } + } + } + + impl From for G2Point { + fn from(src: ethereum::G2) -> Self { + // We should use the `.as_tuple()` method which handles converting + // the G2 elements to have the second limb first + let src = src.as_tuple(); + Self { x: src.0, y: src.1 } + } + } + impl From for EthProof { + fn from(src: ethereum::Proof) -> Self { + Self { + a: src.a.into(), + b: src.b.into(), + c: src.c.into(), + } + } + } + impl From for Groth16VerifyingKey { + fn from(src: ethereum::VerifyingKey) -> Self { + Self { + alfa_1: src.alpha1.into(), + beta_2: src.beta2.into(), + gamma_2: src.gamma2.into(), + delta_2: src.delta2.into(), + ic: src.ic.into_iter().map(|i| i.into()).collect(), + } + } + } + + impl Groth16Verifier { + async fn check_proof< + I: Into, + P: Into, + VK: Into, + >( + &self, + proof: P, + vk: VK, + inputs: I, + ) -> Result> { + // convert into the expected format by the contract + let proof = proof.into().into(); + let vk = vk.into().into(); + let inputs = inputs.into().0; + println!("inputs in gorth16 verifier: {:?}", &inputs); + + // query the contract + let res = self.verify(inputs, proof, vk).call().await?; + + Ok(res) + } + } + + #[tokio::test] + async fn test_proof() -> Result<(), Box> { + let now = Instant::now(); + + println!("loading zkey..."); + let path = "./passport/proof_of_passport_final.zkey"; + let mut file = File::open(path).unwrap(); + let (params, matrices) = read_zkey(&mut file).unwrap(); + + println!("Circuit loaded. Took: {:?}", now.elapsed()); + let now = Instant::now(); + + let mrz_vec: Vec = vec!["97", "91", "95", "31", "88", "80", "60", "70", "82", "65", "84", "65", "86", "69", "82", "78", "73", "69", "82", "60", "60", "70", "76", "79", "82", "69", "78", "84", "60", "72", "85", "71", "85", "69", "83", "60", "74", "69", "65", "78", "60", "60", "60", "60", "60", "60", "60", "60", "60", "49", "57", "72", "65", "51", "52", "56", "50", "56", "52", "70", "82", "65", "48", "48", "48", "55", "49", "57", "49", "77", "50", "57", "49", "50", "48", "57", "53", "60", "60", "60", "60", "60", "60", "60", "60", "60", "60", "60", "60", "60", "60", "48", "50"].iter().map(|&s| s.to_string()).collect(); + let reveal_bitmap_vec: Vec = vec!["0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "1", "1", "1", "1", "1", "1", "1", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0"].iter().map(|&s| s.to_string()).collect(); + let data_hashes_vec: Vec = vec!["48", "130", "1", "37", "2", "1", "0", "48", "11", "6", "9", "96", "134", "72", "1", "101", "3", "4", "2", "1", "48", "130", "1", "17", "48", "37", "2", "1", "1", "4", "32", "99", "19", "179", "205", "55", "104", "45", "214", "133", "101", "233", "177", "130", "1", "37", "89", "125", "229", "139", "34", "132", "146", "28", "116", "248", "186", "63", "195", "96", "151", "26", "215", "48", "37", "2", "1", "2", "4", "32", "63", "234", "106", "78", "31", "16", "114", "137", "237", "17", "92", "71", "134", "47", "62", "78", "189", "233", "201", "213", "53", "4", "47", "189", "201", "133", "6", "121", "34", "131", "64", "142", "48", "37", "2", "1", "3", "4", "32", "136", "155", "87", "144", "121", "15", "152", "127", "85", "25", "154", "80", "20", "58", "51", "75", "193", "116", "234", "0", "60", "30", "29", "30", "183", "141", "72", "247", "255", "203", "100", "124", "48", "37", "2", "1", "11", "4", "32", "0", "194", "104", "108", "237", "246", "97", "230", "116", "198", "69", "110", "26", "87", "17", "89", "110", "199", "108", "250", "36", "21", "39", "87", "110", "102", "250", "213", "174", "131", "171", "174", "48", "37", "2", "1", "12", "4", "32", "190", "82", "180", "235", "222", "33", "79", "50", "152", "136", "142", "35", "116", "224", "6", "242", "156", "141", "128", "247", "10", "61", "98", "86", "248", "45", "207", "210", "90", "232", "175", "38", "48", "37", "2", "1", "13", "4", "32", "91", "222", "210", "193", "63", "222", "104", "82", "36", "41", "138", "253", "70", "15", "148", "208", "156", "45", "105", "171", "241", "195", "185", "43", "217", "162", "146", "201", "222", "89", "238", "38", "48", "37", "2", "1", "14", "4", "32", "76", "123", "216", "13", "52", "227", "72", "245", "59", "193", "238", "166", "103", "49", "24", "164", "171", "188", "194", "197", "156", "187", "249", "28", "198", "95", "69", "15", "182", "56", "54", "38"].iter().map(|&s| s.to_string()).collect(); + let e_content_bytes_vec: Vec = vec!["49", "102", "48", "21", "6", "9", "42", "134", "72", "134", "247", "13", "1", "9", "3", "49", "8", "6", "6", "103", "129", "8", "1", "1", "1", "48", "28", "6", "9", "42", "134", "72", "134", "247", "13", "1", "9", "5", "49", "15", "23", "13", "49", "57", "49", "50", "49", "54", "49", "55", "50", "50", "51", "56", "90", "48", "47", "6", "9", "42", "134", "72", "134", "247", "13", "1", "9", "4", "49", "34", "4", "32", "176", "96", "59", "213", "131", "82", "89", "248", "105", "125", "37", "177", "158", "162", "137", "43", "13", "39", "115", "6", "59", "229", "81", "110", "49", "75", "255", "184", "155", "73", "116", "86"].iter().map(|&s| s.to_string()).collect(); + let signature_vec: Vec = vec!["1004979219314799894", "6361443755252600907", "6439012883494616023", "9400879716815088139", "17551897985575934811", "11779273958797828281", "2536315921873401485", "3748173260178203981", "12475215309213288577", "6281117468118442715", "1336292932993922350", "14238156234566069988", "11985045093510507012", "3585865343992378960", "16170829868787473084", "17039645001628184779", "486540501180074772", "5061439412388381188", "12478821212163933993", "7430448406248319432", "746345521572597865", "5002454658692185142", "3715069341922830389", "11010599232161942094", "1577500614971981868", "13656226284809645063", "3918261659477120323", "5578832687955645075", "3416933977282345392", "15829829506526117610", "17465616637242519010", "6519177967447716150"].iter().map(|&s| s.to_string()).collect(); + let pubkey_vec: Vec = vec!["9539992759301679521", "1652651398804391575", "7756096264856639170", "15028348881266521487", "13451582891670014060", "11697656644529425980", "14590137142310897374", "1172377360308996086", "6389592621616098288", "6767780215543232436", "11347756978427069433", "2593119277386338350", "18385617576997885505", "14960211320702750252", "8706817324429498800", "15168543370367053559", "8708916123725550363", "18006178692029805686", "6398208271038376723", "15000821494077560096", "17674982305626887153", "2867958270953137726", "9287774520059158342", "9813100051910281130", "13494313215150203208", "7792741716144106392", "6553490305289731807", "32268224696386820", "15737886769048580611", "669518601007982974", "11424760966478363403", "16073833083611347461"].iter().map(|&s| s.to_string()).collect(); + let address_str: String = "0xEde0fA5A7b196F512204f286666E5eC03E1005D2".to_string(); + + fn parse_and_insert(hash_map: &mut HashMap>, key: &str, data: Vec<&str>) { + let parsed_data: Vec = data.into_iter() + .filter_map(|s| s.parse::().ok().and_then(|num| num.to_bigint())) + .collect(); + hash_map.insert(key.to_string(), parsed_data); + } + + let mut inputs: HashMap> = HashMap::new(); + parse_and_insert(&mut inputs, "mrz", mrz_vec.iter().map(AsRef::as_ref).collect()); + parse_and_insert(&mut inputs, "reveal_bitmap", reveal_bitmap_vec.iter().map(AsRef::as_ref).collect()); + parse_and_insert(&mut inputs, "dataHashes", data_hashes_vec.iter().map(AsRef::as_ref).collect()); + parse_and_insert(&mut inputs, "eContentBytes", e_content_bytes_vec.iter().map(AsRef::as_ref).collect()); + parse_and_insert(&mut inputs, "signature", signature_vec.iter().map(AsRef::as_ref).collect()); + parse_and_insert(&mut inputs, "pubkey", pubkey_vec.iter().map(AsRef::as_ref).collect()); + let address_bigint = BigInt::from_bytes_be(Sign::Plus, &decode(&address_str[2..])?); + inputs.insert("address".to_string(), vec![address_bigint]); + + let mut rng = thread_rng(); + use ark_std::UniformRand; + let num_inputs = matrices.num_instance_variables; + let num_constraints = matrices.num_constraints; + let rng = &mut rng; + + let r = ark_bn254::Fr::rand(rng); + let s = ark_bn254::Fr::rand(rng); + + let mut wtns = WitnessCalculator::new("./passport/proof_of_passport.wasm").unwrap(); + let full_assignment = wtns + .calculate_witness_element::(inputs, false) + .unwrap(); + println!("witness calculated. Took: {:?}", now.elapsed()); + let now = Instant::now(); + + let proof = Groth16::::create_proof_with_reduction_and_matrices( + ¶ms, + r, + s, + &matrices, + num_inputs, + num_constraints, + full_assignment.as_slice(), + ) + .unwrap(); + println!("proof done. Took: {:?}", now.elapsed()); + let now = Instant::now(); + + let pvk = Groth16::::process_vk(¶ms.vk).unwrap(); + let inputs = &full_assignment[1..num_inputs]; + let verified = Groth16::::verify_with_processed_vk(&pvk, inputs, &proof).unwrap(); + println!("proof verified. Took: {:?}", now.elapsed()); + + assert!(verified); + + println!("inputs: {:?}", inputs); + + let converted_inputs: ethereum::Inputs = inputs.into(); + let inputs_str: Vec = converted_inputs.0.iter().map(|value| format!("{}", value)).collect(); + let serialized_inputs = serde_json::to_string(&inputs_str).unwrap(); + println!("Serialized inputs: {:?}", serialized_inputs); + + let proof_str = proof_to_proof_str(&proof); + let serialized_proof = serde_json::to_string(&proof_str).unwrap(); + + println!("Serialized proof: {:?}", serialized_proof); + + let combined = json!({ + "duration": now.elapsed().as_millis(), + "serialized_proof": serialized_proof, + "serialized_inputs": serialized_inputs + }); + + let combined_str = combined.to_string(); + println!("proof and inputs: {:?}", combined_str); + + + // // launch the network & compile the verifier + // println!("launching network"); + + // let anvil = Anvil::new().spawn(); + // let acc = anvil.addresses()[0]; + // let provider = Provider::::try_from(anvil.endpoint())?; + // let provider = provider.with_sender(acc); + // let provider = Arc::new(provider); + + // // deploy the verifier + // let contract = Groth16Verifier::deploy(provider.clone(), ())? + // .send() + // .await?; + + // println!("verifier deployed"); + // println!("contract {:?}", contract); + // // check the proof on chain + // let onchain_verified = contract + // .check_proof(proof, params.vk, inputs.as_slice()) + // .await?; + + // println!("proof verified on chain"); + // println!("onchain_verified {:?}", onchain_verified); + + // assert!(onchain_verified); + + Ok(()) + } +} diff --git a/app/ark-circom-passport/src/zkey.rs b/app/ark-circom-passport/src/zkey.rs new file mode 100644 index 00000000..e22b1157 --- /dev/null +++ b/app/ark-circom-passport/src/zkey.rs @@ -0,0 +1,379 @@ +//! ZKey Parsing +//! +//! Each ZKey file is broken into sections: +//! Header(1) +//! Prover Type 1 Groth +//! HeaderGroth(2) +//! n8q +//! q +//! n8r +//! r +//! NVars +//! NPub +//! DomainSize (multiple of 2 +//! alpha1 +//! beta1 +//! delta1 +//! beta2 +//! gamma2 +//! delta2 +//! IC(3) +//! Coefs(4) +//! PointsA(5) +//! PointsB1(6) +//! PointsB2(7) +//! PointsC(8) +//! PointsH(9) +//! Contributions(10) +use ark_ff::{BigInteger256, PrimeField}; +use ark_relations::r1cs::ConstraintMatrices; +use ark_serialize::{CanonicalDeserialize, SerializationError}; +use ark_std::log2; +use byteorder::{LittleEndian, ReadBytesExt}; + +use std::{ + collections::HashMap, + io::{Read, Seek, SeekFrom}, +}; + +use ark_bn254::{Bn254, Fq, Fq2, Fr, G1Affine, G2Affine}; +use ark_groth16::{ProvingKey, VerifyingKey}; +use num_traits::Zero; +use std::io::Cursor; + +type IoResult = Result; + +#[derive(Clone, Debug)] +struct Section { + position: u64, + #[allow(dead_code)] + size: usize, +} + +/// Reads a SnarkJS ZKey file into an Arkworks ProvingKey. +pub fn read_zkey( + reader: &mut R, +) -> IoResult<(ProvingKey, ConstraintMatrices)> { + let mut binfile = BinFile::new(reader)?; + let proving_key = binfile.proving_key()?; + let matrices = binfile.matrices()?; + Ok((proving_key, matrices)) +} + +pub fn read_zkey_from_include_bytes( + data: &[u8], +) -> IoResult<(ProvingKey, ConstraintMatrices)> { + let mut cursor = Cursor::new(data); + let mut binfile = BinFile::new(&mut cursor)?; + let proving_key = binfile.proving_key()?; + let matrices = binfile.matrices()?; + Ok((proving_key, matrices)) +} + +#[derive(Debug)] +struct BinFile<'a, R> { + #[allow(dead_code)] + ftype: String, + #[allow(dead_code)] + version: u32, + sections: HashMap>, + reader: &'a mut R, +} + +impl<'a, R: Read + Seek> BinFile<'a, R> { + fn new(reader: &'a mut R) -> IoResult { + let mut magic = [0u8; 4]; + reader.read_exact(&mut magic)?; + + let version = reader.read_u32::()?; + + let num_sections = reader.read_u32::()?; + + let mut sections = HashMap::new(); + for _ in 0..num_sections { + let section_id = reader.read_u32::()?; + let section_length = reader.read_u64::()?; + + let section = sections.entry(section_id).or_insert_with(Vec::new); + section.push(Section { + position: reader.stream_position()?, + size: section_length as usize, + }); + + reader.seek(SeekFrom::Current(section_length as i64))?; + } + + Ok(Self { + ftype: std::str::from_utf8(&magic[..]).unwrap().to_string(), + version, + sections, + reader, + }) + } + + fn proving_key(&mut self) -> IoResult> { + let header = self.groth_header()?; + let ic = self.ic(header.n_public)?; + + let a_query = self.a_query(header.n_vars)?; + let b_g1_query = self.b_g1_query(header.n_vars)?; + let b_g2_query = self.b_g2_query(header.n_vars)?; + let l_query = self.l_query(header.n_vars - header.n_public - 1)?; + let h_query = self.h_query(header.domain_size as usize)?; + + let vk = VerifyingKey:: { + alpha_g1: header.verifying_key.alpha_g1, + beta_g2: header.verifying_key.beta_g2, + gamma_g2: header.verifying_key.gamma_g2, + delta_g2: header.verifying_key.delta_g2, + gamma_abc_g1: ic, + }; + + let pk = ProvingKey:: { + vk, + beta_g1: header.verifying_key.beta_g1, + delta_g1: header.verifying_key.delta_g1, + a_query, + b_g1_query, + b_g2_query, + h_query, + l_query, + }; + + Ok(pk) + } + + fn get_section(&self, id: u32) -> Section { + self.sections.get(&id).unwrap()[0].clone() + } + + fn groth_header(&mut self) -> IoResult { + let section = self.get_section(2); + let header = HeaderGroth::new(&mut self.reader, §ion)?; + Ok(header) + } + + fn ic(&mut self, n_public: usize) -> IoResult> { + // the range is non-inclusive so we do +1 to get all inputs + self.g1_section(n_public + 1, 3) + } + + /// Returns the [`ConstraintMatrices`] corresponding to the zkey + pub fn matrices(&mut self) -> IoResult> { + let header = self.groth_header()?; + + let section = self.get_section(4); + self.reader.seek(SeekFrom::Start(section.position))?; + let num_coeffs: u32 = self.reader.read_u32::()?; + + // insantiate AB + let mut matrices = vec![vec![vec![]; header.domain_size as usize]; 2]; + let mut max_constraint_index = 0; + for _ in 0..num_coeffs { + let matrix: u32 = self.reader.read_u32::()?; + let constraint: u32 = self.reader.read_u32::()?; + let signal: u32 = self.reader.read_u32::()?; + + let value: Fr = deserialize_field_fr(&mut self.reader)?; + max_constraint_index = std::cmp::max(max_constraint_index, constraint); + matrices[matrix as usize][constraint as usize].push((value, signal as usize)); + } + + let num_constraints = max_constraint_index as usize - header.n_public; + // Remove the public input constraints, Arkworks adds them later + matrices.iter_mut().for_each(|m| { + m.truncate(num_constraints); + }); + // This is taken from Arkworks' to_matrices() function + let a = matrices[0].clone(); + let b = matrices[1].clone(); + let a_num_non_zero: usize = a.iter().map(|lc| lc.len()).sum(); + let b_num_non_zero: usize = b.iter().map(|lc| lc.len()).sum(); + let matrices = ConstraintMatrices { + num_instance_variables: header.n_public + 1, + num_witness_variables: header.n_vars - header.n_public, + num_constraints, + + a_num_non_zero, + b_num_non_zero, + c_num_non_zero: 0, + + a, + b, + c: vec![], + }; + + Ok(matrices) + } + + fn a_query(&mut self, n_vars: usize) -> IoResult> { + self.g1_section(n_vars, 5) + } + + fn b_g1_query(&mut self, n_vars: usize) -> IoResult> { + self.g1_section(n_vars, 6) + } + + fn b_g2_query(&mut self, n_vars: usize) -> IoResult> { + self.g2_section(n_vars, 7) + } + + fn l_query(&mut self, n_vars: usize) -> IoResult> { + self.g1_section(n_vars, 8) + } + + fn h_query(&mut self, n_vars: usize) -> IoResult> { + self.g1_section(n_vars, 9) + } + + fn g1_section(&mut self, num: usize, section_id: usize) -> IoResult> { + let section = self.get_section(section_id as u32); + self.reader.seek(SeekFrom::Start(section.position))?; + deserialize_g1_vec(self.reader, num as u32) + } + + fn g2_section(&mut self, num: usize, section_id: usize) -> IoResult> { + let section = self.get_section(section_id as u32); + self.reader.seek(SeekFrom::Start(section.position))?; + deserialize_g2_vec(self.reader, num as u32) + } +} + +#[derive(Default, Clone, Debug, CanonicalDeserialize)] +pub struct ZVerifyingKey { + alpha_g1: G1Affine, + beta_g1: G1Affine, + beta_g2: G2Affine, + gamma_g2: G2Affine, + delta_g1: G1Affine, + delta_g2: G2Affine, +} + +impl ZVerifyingKey { + fn new(reader: &mut R) -> IoResult { + let alpha_g1 = deserialize_g1(reader)?; + let beta_g1 = deserialize_g1(reader)?; + let beta_g2 = deserialize_g2(reader)?; + let gamma_g2 = deserialize_g2(reader)?; + let delta_g1 = deserialize_g1(reader)?; + let delta_g2 = deserialize_g2(reader)?; + + Ok(Self { + alpha_g1, + beta_g1, + beta_g2, + gamma_g2, + delta_g1, + delta_g2, + }) + } +} + +#[derive(Clone, Debug)] +struct HeaderGroth { + #[allow(dead_code)] + n8q: u32, + #[allow(dead_code)] + q: BigInteger256, + #[allow(dead_code)] + n8r: u32, + #[allow(dead_code)] + r: BigInteger256, + + n_vars: usize, + n_public: usize, + + domain_size: u32, + #[allow(dead_code)] + power: u32, + + verifying_key: ZVerifyingKey, +} + +impl HeaderGroth { + fn new(reader: &mut R, section: &Section) -> IoResult { + reader.seek(SeekFrom::Start(section.position))?; + Self::read(reader) + } + + fn read(mut reader: &mut R) -> IoResult { + // TODO: Impl From in Arkworks + let n8q: u32 = u32::deserialize_uncompressed(&mut reader)?; + // group order r of Bn254 + let q = BigInteger256::deserialize_uncompressed(&mut reader)?; + + let n8r: u32 = u32::deserialize_uncompressed(&mut reader)?; + // Prime field modulus + let r = BigInteger256::deserialize_uncompressed(&mut reader)?; + + let n_vars = u32::deserialize_uncompressed(&mut reader)? as usize; + let n_public = u32::deserialize_uncompressed(&mut reader)? as usize; + + let domain_size: u32 = u32::deserialize_uncompressed(&mut reader)?; + let power = log2(domain_size as usize); + + let verifying_key = ZVerifyingKey::new(&mut reader)?; + + Ok(Self { + n8q, + q, + n8r, + r, + n_vars, + n_public, + domain_size, + power, + verifying_key, + }) + } +} + +// need to divide by R, since snarkjs outputs the zkey with coefficients +// multiplieid by R^2 +fn deserialize_field_fr(reader: &mut R) -> IoResult { + let bigint = BigInteger256::deserialize_uncompressed(reader)?; + Ok(Fr::new_unchecked(Fr::new_unchecked(bigint).into_bigint())) +} + +// skips the multiplication by R because Circom points are already in Montgomery form +fn deserialize_field(reader: &mut R) -> IoResult { + let bigint = BigInteger256::deserialize_uncompressed(reader)?; + // if you use Fq::new it multiplies by R + Ok(Fq::new_unchecked(bigint)) +} + +pub fn deserialize_field2(reader: &mut R) -> IoResult { + let c0 = deserialize_field(reader)?; + let c1 = deserialize_field(reader)?; + Ok(Fq2::new(c0, c1)) +} + +fn deserialize_g1(reader: &mut R) -> IoResult { + let x = deserialize_field(reader)?; + let y = deserialize_field(reader)?; + let infinity = x.is_zero() && y.is_zero(); + if infinity { + Ok(G1Affine::identity()) + } else { + Ok(G1Affine::new_unchecked(x, y)) + } +} + +fn deserialize_g2(reader: &mut R) -> IoResult { + let f1 = deserialize_field2(reader)?; + let f2 = deserialize_field2(reader)?; + let infinity = f1.is_zero() && f2.is_zero(); + if infinity { + Ok(G2Affine::identity()) + } else { + Ok(G2Affine::new_unchecked(f1, f2)) + } +} + +fn deserialize_g1_vec(reader: &mut R, n_vars: u32) -> IoResult> { + (0..n_vars).map(|_| deserialize_g1(reader)).collect() +} + +fn deserialize_g2_vec(reader: &mut R, n_vars: u32) -> IoResult> { + (0..n_vars).map(|_| deserialize_g2(reader)).collect() +} \ No newline at end of file diff --git a/app/babel.config.js b/app/babel.config.js new file mode 100644 index 00000000..6d2f1f34 --- /dev/null +++ b/app/babel.config.js @@ -0,0 +1,6 @@ +module.exports = { + presets: ['module:metro-react-native-babel-preset'], + plugins: [ + ["@babel/plugin-transform-private-methods", { "loose": true }], + ], +}; diff --git a/app/countries.md b/app/countries.md new file mode 100644 index 00000000..40b2aae5 --- /dev/null +++ b/app/countries.md @@ -0,0 +1,30 @@ +Working: +- France +- Guy from ETH Global Paris (Moldavia ? Bulgaria ?) +- Malaysia + +Crashing: +- Thailand +- Britain + + + E FATAL EXCEPTION: main + Process: com.proofofpassport, PID: 14479 + java.lang.ClassCastException: org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey cannot be cast to java.security.interfaces.RSAPublicKey + at io.tradle.nfc.RNPassportReaderModule$ReadTask.onPostExecute(RNPassportReaderModule.kt:510) + at io.tradle.nfc.RNPassportReaderModule$ReadTask.onPostExecute(RNPassportReaderModule.kt:238) + at android.os.AsyncTask.finish(AsyncTask.java:771) + at android.os.AsyncTask.access$900(AsyncTask.java:199) + at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:788) + at android.os.Handler.dispatchMessage(Handler.java:106) + at android.os.Looper.loopOnce(Looper.java:226) + at android.os.Looper.loop(Looper.java:313) + at android.app.ActivityThread.main(ActivityThread.java:8751) + at java.lang.reflect.Method.invoke(Native Method) + at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) + at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135) +2023-10-31 16:41:37.052 625-625 SurfaceFlinger pid-625 E Attempt to update InputPolicyFlags without permission ACCESS_SURFACE_FLINGER +2023-10-31 16:41:37.069 625-625 SurfaceFlinger pid-625 E Attempt to update InputPolicyFlags without permission ACCESS_SURFACE_FLINGER +2023-10-31 16:41:37.088 625-625 SurfaceFlinger pid-625 E Attempt to update InputPolicyFlags without permission ACCESS_SURFACE_FLINGER +2023-10-31 16:41:37.102 625-625 SurfaceFlinger pid-625 E Attempt to update InputPolicyFlags without permission ACCESS_SURFACE_FLINGER +2023-10-31 16:41:37.108 1377-2420 TaskStackL...erAbstract pid-1377 E onTaskSnapshotChanged calle \ No newline at end of file diff --git a/app/declarations.d.ts b/app/declarations.d.ts new file mode 100644 index 00000000..cfe3d4fd --- /dev/null +++ b/app/declarations.d.ts @@ -0,0 +1 @@ +declare module '@env'; diff --git a/app/deployments/Groth16Verifier.json b/app/deployments/Groth16Verifier.json new file mode 100644 index 00000000..fc729dd6 --- /dev/null +++ b/app/deployments/Groth16Verifier.json @@ -0,0 +1,45 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Groth16Verifier", + "sourceName": "contracts/Verifier.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256[2]", + "name": "_pA", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "_pB", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "_pC", + "type": "uint256[2]" + }, + { + "internalType": "uint256[16]", + "name": "_pubSignals", + "type": "uint256[16]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50610b91806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c82febf514610030575b600080fd5b61004a60048036038101906100459190610abc565b610060565b6040516100579190610b40565b60405180910390f35b6000610944565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610098576000805260206000f35b50565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816100ce576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150816100fe576000805260206000f35b505050505050565b600060808601600087017f0ad4104ba0cab26e17a390c2297e5930790fe2138c4965fa33a92c6efb1ce61181527f2f25144c009fda8ee383ef224c934e7f6df65425132809ae464ff31ac891734760208201526101a960008801357f22afda344f3fa9caa050472eedf614641a3dc81bffaacd4fbe374447e8713c527f0785808d31f021c38a389a35384e87a0c483cc6665f1fb11fd8cb6220ab68a6c8461009b565b6101f960208801357f11885e413266172e3aee33cfdd2bfa186b52178bcf1cefaea78062c05722107d7f26756d1fcadd13849941c067839540f95b0ee5614c0ea6436a0b1371c61918028461009b565b61024960408801357f14034f89a294ea4bcb70f8a05f38319d25b7876baeeb2a1cf1d953be05023c4f7f014b60dec736fc8ef91c82345c2872f10e4f9e1e2a45419a91dfc6f3bf48a5008461009b565b61029960608801357f15b66475b701246e5afeb0fef2c8b1766992b6c862af6343ff7695defcb466b97f0f7f42f9ce4d9e86b9cde0c0a508655c8c79bc0a684a3fc7e31736926bd3164e8461009b565b6102e860808801357e9f8254f248559f4f9347784214ede9a9aa8f08c8ed859b42c55941f6ebac4d7f1f7aa8bbe543dc53d9efab5d487a2f462881d366f25ddf0d5e38747333195eca8461009b565b61033860a08801357f224f0eea46b164e5fd8793f81110dd606a17a916695f431dd9a82930337be6467f05b94074736f283d880c3adc6ca902dd9509466e817281f32b70103f5b5c426c8461009b565b61038860c08801357f121cf7452967876d6eb025f7713bf8392f39e7d8f82e653fbd7b3a4286f04d8e7f2648cf8ce91f5074123ea29d363f00ff58345fa0cf8854cee6b3cdb9cd06f2518461009b565b6103d860e08801357f207375b930a98fe9cbbeb3eb1fe8cff0ec58733416b0385826b0c5203addb82a7f106036e1ef36d5bcc9419747eb69833e04a8835d8eda804a0ce30273e6511d928461009b565b6104296101008801357f2773127f6766e3dfee9d345806c72cd2892e2b3a7c5f0c9c80a894b8e718dde47f1fab68875dd34949d9531c866809371111b147f288eb3fb0e0c516ae9c4d763e8461009b565b61047a6101208801357f18e0b48b621d672b8afb675eeba9ee68d33a71ac5b84e839b1350ff832e2731d7f10ab6d5e5bbf2815c7b436af60a20c885d0aded20f41b5aff518343aa32fe8e28461009b565b6104cb6101408801357f08534d6feb186a62091134bc726c2a6d0ba479bee663ad9702ef4c5931d454897f1d67bf83c43954992a44732500ee24ca44c594d914e6dd0dd722428250170b668461009b565b61051c6101608801357f18cff185263b89e2d1f0a745c7edcae4a6126402cad1205d90aea5ab53f1da167f147e05d126df37c08cf603b77b624feb87a8d33c333dff3f3e1b886aac27fb778461009b565b61056d6101808801357f01acfec350b849fd019997e649774c9795fff3f4af624586841f42181f252eb87f05be1ef6bbed0f7942c562bd8ceb15491221a5176d4709c58f156f65c51018268461009b565b6105be6101a08801357f0723950b7af06aebfcdab4bf96923795f95ea0fa86454831287358be15bf4a397f23b332764411bcec1aad32817dda66a3bfb502a4a0c92494736137c3f9aa010a8461009b565b61060f6101c08801357f26a47a8df4e6edda06f707b27f3b150bf90cb49d52fa68fbb1f57efc30d642777f18ee382f9056082dd010bb84da6fcdcae6fd0b0a86d9922cba113b823b7b0d118461009b565b6106606101e08801357f1d9ed1b6b90a7f3fd9724dd10b98ccfbde0404ad4dd751ff54949274461fe6ff7f10a9f28b202c0acbeb9b877b5ebe348312df9e093190df0eee947f50ffd5c5288461009b565b833582527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208501357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020830152843560408301526020850135606083015260408501356080830152606085013560a08301527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08301527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08301527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008301527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208301527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408301527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160830152600088015161018083015260206000018801516101a08301527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220830152853561024083015260208601356102608301527f0b67b25fb7a77948fa56298f85351f81ea556bf7bebea58cfaf22a41c2add0b16102808301527f125210f527bd6baed1fc4723673927cfcb8bf3c1e6da90e570ffa3926d946e586102a08301527f20286cd5cfcf365bf654135508c3873fb0241ad595b0ba879fb5dd5aaedcccff6102c08301527f200e3e8bf7c87c79b2f15e5b56e823f0798b09832c5b4e73f73b482862c826ea6102e08301526020826103008460086107d05a03fa82518116935050505095945050505050565b604051610380810160405261095c6000840135610067565b6109696020840135610067565b6109766040840135610067565b6109836060840135610067565b6109906080840135610067565b61099d60a0840135610067565b6109aa60c0840135610067565b6109b760e0840135610067565b6109c5610100840135610067565b6109d3610120840135610067565b6109e1610140840135610067565b6109ef610160840135610067565b6109fd610180840135610067565b610a0b6101a0840135610067565b610a196101c0840135610067565b610a276101e0840135610067565b610a35610200840135610067565b610a42818486888a610106565b8060005260206000f35b600080fd5b600080fd5b600081905082602060020282011115610a7257610a71610a51565b5b92915050565b600081905082604060020282011115610a9457610a93610a51565b5b92915050565b600081905082602060100282011115610ab657610ab5610a51565b5b92915050565b6000806000806103008587031215610ad757610ad6610a4c565b5b6000610ae587828801610a56565b9450506040610af687828801610a78565b93505060c0610b0787828801610a56565b925050610100610b1987828801610a9a565b91505092959194509250565b60008115159050919050565b610b3a81610b25565b82525050565b6000602082019050610b556000830184610b31565b9291505056fea2646970667358221220ca8705bfa93a78cf62acae4455e632f0ba4658ce4427955bfbebcd1edea5b56464736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063c82febf514610030575b600080fd5b61004a60048036038101906100459190610abc565b610060565b6040516100579190610b40565b60405180910390f35b6000610944565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd478110610098576000805260206000f35b50565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816100ce576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa9150816100fe576000805260206000f35b505050505050565b600060808601600087017f0ad4104ba0cab26e17a390c2297e5930790fe2138c4965fa33a92c6efb1ce61181527f2f25144c009fda8ee383ef224c934e7f6df65425132809ae464ff31ac891734760208201526101a960008801357f22afda344f3fa9caa050472eedf614641a3dc81bffaacd4fbe374447e8713c527f0785808d31f021c38a389a35384e87a0c483cc6665f1fb11fd8cb6220ab68a6c8461009b565b6101f960208801357f11885e413266172e3aee33cfdd2bfa186b52178bcf1cefaea78062c05722107d7f26756d1fcadd13849941c067839540f95b0ee5614c0ea6436a0b1371c61918028461009b565b61024960408801357f14034f89a294ea4bcb70f8a05f38319d25b7876baeeb2a1cf1d953be05023c4f7f014b60dec736fc8ef91c82345c2872f10e4f9e1e2a45419a91dfc6f3bf48a5008461009b565b61029960608801357f15b66475b701246e5afeb0fef2c8b1766992b6c862af6343ff7695defcb466b97f0f7f42f9ce4d9e86b9cde0c0a508655c8c79bc0a684a3fc7e31736926bd3164e8461009b565b6102e860808801357e9f8254f248559f4f9347784214ede9a9aa8f08c8ed859b42c55941f6ebac4d7f1f7aa8bbe543dc53d9efab5d487a2f462881d366f25ddf0d5e38747333195eca8461009b565b61033860a08801357f224f0eea46b164e5fd8793f81110dd606a17a916695f431dd9a82930337be6467f05b94074736f283d880c3adc6ca902dd9509466e817281f32b70103f5b5c426c8461009b565b61038860c08801357f121cf7452967876d6eb025f7713bf8392f39e7d8f82e653fbd7b3a4286f04d8e7f2648cf8ce91f5074123ea29d363f00ff58345fa0cf8854cee6b3cdb9cd06f2518461009b565b6103d860e08801357f207375b930a98fe9cbbeb3eb1fe8cff0ec58733416b0385826b0c5203addb82a7f106036e1ef36d5bcc9419747eb69833e04a8835d8eda804a0ce30273e6511d928461009b565b6104296101008801357f2773127f6766e3dfee9d345806c72cd2892e2b3a7c5f0c9c80a894b8e718dde47f1fab68875dd34949d9531c866809371111b147f288eb3fb0e0c516ae9c4d763e8461009b565b61047a6101208801357f18e0b48b621d672b8afb675eeba9ee68d33a71ac5b84e839b1350ff832e2731d7f10ab6d5e5bbf2815c7b436af60a20c885d0aded20f41b5aff518343aa32fe8e28461009b565b6104cb6101408801357f08534d6feb186a62091134bc726c2a6d0ba479bee663ad9702ef4c5931d454897f1d67bf83c43954992a44732500ee24ca44c594d914e6dd0dd722428250170b668461009b565b61051c6101608801357f18cff185263b89e2d1f0a745c7edcae4a6126402cad1205d90aea5ab53f1da167f147e05d126df37c08cf603b77b624feb87a8d33c333dff3f3e1b886aac27fb778461009b565b61056d6101808801357f01acfec350b849fd019997e649774c9795fff3f4af624586841f42181f252eb87f05be1ef6bbed0f7942c562bd8ceb15491221a5176d4709c58f156f65c51018268461009b565b6105be6101a08801357f0723950b7af06aebfcdab4bf96923795f95ea0fa86454831287358be15bf4a397f23b332764411bcec1aad32817dda66a3bfb502a4a0c92494736137c3f9aa010a8461009b565b61060f6101c08801357f26a47a8df4e6edda06f707b27f3b150bf90cb49d52fa68fbb1f57efc30d642777f18ee382f9056082dd010bb84da6fcdcae6fd0b0a86d9922cba113b823b7b0d118461009b565b6106606101e08801357f1d9ed1b6b90a7f3fd9724dd10b98ccfbde0404ad4dd751ff54949274461fe6ff7f10a9f28b202c0acbeb9b877b5ebe348312df9e093190df0eee947f50ffd5c5288461009b565b833582527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208501357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020830152843560408301526020850135606083015260408501356080830152606085013560a08301527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08301527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08301527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008301527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208301527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408301527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160830152600088015161018083015260206000018801516101a08301527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08301527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08301527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008301527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220830152853561024083015260208601356102608301527f0b67b25fb7a77948fa56298f85351f81ea556bf7bebea58cfaf22a41c2add0b16102808301527f125210f527bd6baed1fc4723673927cfcb8bf3c1e6da90e570ffa3926d946e586102a08301527f20286cd5cfcf365bf654135508c3873fb0241ad595b0ba879fb5dd5aaedcccff6102c08301527f200e3e8bf7c87c79b2f15e5b56e823f0798b09832c5b4e73f73b482862c826ea6102e08301526020826103008460086107d05a03fa82518116935050505095945050505050565b604051610380810160405261095c6000840135610067565b6109696020840135610067565b6109766040840135610067565b6109836060840135610067565b6109906080840135610067565b61099d60a0840135610067565b6109aa60c0840135610067565b6109b760e0840135610067565b6109c5610100840135610067565b6109d3610120840135610067565b6109e1610140840135610067565b6109ef610160840135610067565b6109fd610180840135610067565b610a0b6101a0840135610067565b610a196101c0840135610067565b610a276101e0840135610067565b610a35610200840135610067565b610a42818486888a610106565b8060005260206000f35b600080fd5b600080fd5b600081905082602060020282011115610a7257610a71610a51565b5b92915050565b600081905082604060020282011115610a9457610a93610a51565b5b92915050565b600081905082602060100282011115610ab657610ab5610a51565b5b92915050565b6000806000806103008587031215610ad757610ad6610a4c565b5b6000610ae587828801610a56565b9450506040610af687828801610a78565b93505060c0610b0787828801610a56565b925050610100610b1987828801610a9a565b91505092959194509250565b60008115159050919050565b610b3a81610b25565b82525050565b6000602082019050610b556000830184610b31565b9291505056fea2646970667358221220ca8705bfa93a78cf62acae4455e632f0ba4658ce4427955bfbebcd1edea5b56464736f6c63430008120033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/app/deployments/ProofOfPassport.json b/app/deployments/ProofOfPassport.json new file mode 100644 index 00000000..59c58c15 --- /dev/null +++ b/app/deployments/ProofOfPassport.json @@ -0,0 +1,655 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ProofOfPassport", + "sourceName": "contracts/ProofOfPassport.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "contract Groth16Verifier", + "name": "v", + "type": "address" + }, + { + "internalType": "contract Formatter", + "name": "f", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "attributePositions", + "outputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "start", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "end", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "cscaPubkey", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[3]", + "name": "publicSignals", + "type": "uint256[3]" + } + ], + "name": "fieldElementsToBytes", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "formatter", + "outputs": [ + { + "internalType": "contract Formatter", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "name": "isExpired", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + }, + { + "internalType": "uint256[16]", + "name": "inputs", + "type": "uint256[16]" + } + ], + "name": "mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "nullifiers", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_CSCApubKey", + "type": "address" + } + ], + "name": "setCSCApubKey", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[16]", + "name": "input", + "type": "uint256[16]" + } + ], + "name": "sliceFirstThree", + "outputs": [ + { + "internalType": "uint256[3]", + "name": "", + "type": "uint256[3]" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "tokenOfOwnerByIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "verifier", + "outputs": [ + { + "internalType": "contract Groth16Verifier", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040526000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005357600080fd5b5060405162006ad838038062006ad88339818101604052810190620000799190620009d1565b6040518060400160405280600f81526020017f50726f6f664f6650617373706f727400000000000000000000000000000000008152506040518060400160405280600f81526020017f50726f6f664f6650617373706f727400000000000000000000000000000000008152508160009081620000f6919062000c92565b50806001908162000108919062000c92565b5050506200012b6200011f620001c960201b60201c565b620001d160201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001b06200029760201b60201c565b620001c133620007bd60201b60201c565b505062000e94565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600e60405180608001604052806040518060400160405280600d81526020017f69737375696e675f7374617465000000000000000000000000000000000000008152508152602001600281526020016004815260200160008152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001908162000332919062000c92565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600481526020017f6e616d6500000000000000000000000000000000000000000000000000000000815250815260200160058152602001602b8152602001600181525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019081620003ee919062000c92565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600f81526020017f70617373706f72745f6e756d62657200000000000000000000000000000000008152508152602001602c815260200160348152602001600281525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019081620004aa919062000c92565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600b81526020017f6e6174696f6e616c6974790000000000000000000000000000000000000000008152508152602001603681526020016038815260200160038152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001908162000566919062000c92565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600d81526020017f646174655f6f665f626972746800000000000000000000000000000000000000815250815260200160398152602001603e815260200160048152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001908162000622919062000c92565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600681526020017f67656e646572000000000000000000000000000000000000000000000000000081525081526020016040815260200160408152602001600581525090806001815401808255809150506001900390600052602060002090600402016000909190919091506000820151816000019081620006de919062000c92565b506020820151816001015560408201518160020155606082015181600301555050600e60405180608001604052806040518060400160405280600b81526020017f6578706972795f64617465000000000000000000000000000000000000000000815250815260200160418152602001604681526020016006815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000190816200079a919062000c92565b506020820151816001015560408201518160020155606082015181600301555050565b620007cd6200085360201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200083f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008369062000e00565b60405180910390fd5b6200085081620001d160201b60201c565b50565b62000863620001c960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000889620008e460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620008e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008d99062000e72565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009408262000913565b9050919050565b6000620009548262000933565b9050919050565b620009668162000947565b81146200097257600080fd5b50565b60008151905062000986816200095b565b92915050565b6000620009998262000933565b9050919050565b620009ab816200098c565b8114620009b757600080fd5b50565b600081519050620009cb81620009a0565b92915050565b60008060408385031215620009eb57620009ea6200090e565b5b6000620009fb8582860162000975565b925050602062000a0e85828601620009ba565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a9a57607f821691505b60208210810362000ab05762000aaf62000a52565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000b1a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000adb565b62000b26868362000adb565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000b7362000b6d62000b678462000b3e565b62000b48565b62000b3e565b9050919050565b6000819050919050565b62000b8f8362000b52565b62000ba762000b9e8262000b7a565b84845462000ae8565b825550505050565b600090565b62000bbe62000baf565b62000bcb81848462000b84565b505050565b5b8181101562000bf35762000be760008262000bb4565b60018101905062000bd1565b5050565b601f82111562000c425762000c0c8162000ab6565b62000c178462000acb565b8101602085101562000c27578190505b62000c3f62000c368562000acb565b83018262000bd0565b50505b505050565b600082821c905092915050565b600062000c676000198460080262000c47565b1980831691505092915050565b600062000c82838362000c54565b9150826002028217905092915050565b62000c9d8262000a18565b67ffffffffffffffff81111562000cb95762000cb862000a23565b5b62000cc5825462000a81565b62000cd282828562000bf7565b600060209050601f83116001811462000d0a576000841562000cf5578287015190505b62000d01858262000c74565b86555062000d71565b601f19841662000d1a8662000ab6565b60005b8281101562000d445784890151825560018201915060208501945060208101905062000d1d565b8683101562000d64578489015162000d60601f89168262000c54565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062000de860268362000d79565b915062000df58262000d8a565b604082019050919050565b6000602082019050818103600083015262000e1b8162000dd9565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062000e5a60208362000d79565b915062000e678262000e22565b602082019050919050565b6000602082019050818103600083015262000e8d8162000e4b565b9050919050565b608051615c2162000eb7600039600081816108db01526114ee0152615c216000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063c87b56dd116100a2578063dc54daf011610071578063dc54daf014610569578063e985e9c514610599578063eba11e05146105c9578063f2fde38b146105e7576101cf565b8063c87b56dd146104bd578063d21e82ab146104ed578063d4d9c00f1461051d578063d9548e5314610539576101cf565b806395d89b41116100de57806395d89b4114610434578063a22cb46514610452578063b04e3a3b1461046e578063b88d4fde146104a1576101cf565b8063715018a6146103dc57806376e6a447146103e65780638da5cb5b14610416576101cf565b80632f745c59116101715780634f6ccce71161014b5780634f6ccce71461033057806354f96d52146103605780636352211e1461037c57806370a08231146103ac576101cf565b80632f745c59146102c65780633a41515f146102f657806342842e0e14610314576101cf565b8063095ea7b3116101ad578063095ea7b31461025257806318160ddd1461026e57806323b872dd1461028c5780632b7ac3f3146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e991906134d8565b610603565b6040516101fb9190613520565b60405180910390f35b61020c61067d565b60405161021991906135cb565b60405180910390f35b61023c60048036038101906102379190613623565b61070f565b6040516102499190613691565b60405180910390f35b61026c600480360381019061026791906136d8565b610755565b005b61027661086c565b6040516102839190613727565b60405180910390f35b6102a660048036038101906102a19190613742565b610879565b005b6102b06108d9565b6040516102bd91906137f4565b60405180910390f35b6102e060048036038101906102db91906136d8565b6108fd565b6040516102ed9190613727565b60405180910390f35b6102fe6109a2565b60405161030b9190613830565b60405180910390f35b61032e60048036038101906103299190613742565b6109c8565b005b61034a60048036038101906103459190613623565b6109e8565b6040516103579190613727565b60405180910390f35b61037a6004803603810190610375919061384b565b610a59565b005b61039660048036038101906103919190613623565b610aa5565b6040516103a39190613691565b60405180910390f35b6103c660048036038101906103c1919061384b565b610b2b565b6040516103d39190613727565b60405180910390f35b6103e4610be2565b005b61040060048036038101906103fb91906139ae565b610bf6565b60405161040d9190613a87565b60405180910390f35b61041e610c63565b60405161042b9190613691565b60405180910390f35b61043c610c8d565b60405161044991906135cb565b60405180910390f35b61046c60048036038101906104679190613ace565b610d1f565b005b61048860048036038101906104839190613623565b610d35565b6040516104989493929190613b0e565b60405180910390f35b6104bb60048036038101906104b69190613c0f565b610dfd565b005b6104d760048036038101906104d29190613623565b610e5f565b6040516104e491906135cb565b60405180910390f35b61050760048036038101906105029190613623565b6114cc565b6040516105149190613520565b60405180910390f35b61053760048036038101906105329190613df4565b6114ec565b005b610553600480360381019061054e9190613623565b611971565b6040516105609190613520565b60405180910390f35b610583600480360381019061057e9190613f0e565b611b23565b6040516105909190613f90565b60405180910390f35b6105b360048036038101906105ae9190613fb2565b611c83565b6040516105c09190613520565b60405180910390f35b6105d1611d17565b6040516105de9190613691565b60405180910390f35b61060160048036038101906105fc919061384b565b611d3d565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610676575061067582611dc0565b5b9050919050565b60606000805461068c90614021565b80601f01602080910402602001604051908101604052809291908181526020018280546106b890614021565b80156107055780601f106106da57610100808354040283529160200191610705565b820191906000526020600020905b8154815290600101906020018083116106e857829003601f168201915b5050505050905090565b600061071a82611ea2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076082610aa5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c7906140c4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ef611eed565b73ffffffffffffffffffffffffffffffffffffffff16148061081e575061081d81610818611eed565b611c83565b5b61085d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085490614156565b60405180910390fd5b6108678383611ef5565b505050565b6000600880549050905090565b61088a610884611eed565b82611fae565b6108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c0906141e8565b60405180910390fd5b6108d4838383612043565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061090883610b2b565b8210610949576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109409061427a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109e383838360405180602001604052806000815250610dfd565b505050565b60006109f261086c565b8210610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a9061430c565b60405180910390fd5b60088281548110610a4757610a4661432c565b5b90600052602060002001549050919050565b610a6161233c565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610ab1836123ba565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b19906143a7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9290614439565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bea61233c565b610bf460006123f7565b565b610bfe61344a565b610c0661344a565b60005b6003811015610c5957838160108110610c2557610c2461432c565b5b6020020151828260038110610c3d57610c3c61432c565b5b6020020181815250508080610c5190614488565b915050610c09565b5080915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c9c90614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc890614021565b8015610d155780601f10610cea57610100808354040283529160200191610d15565b820191906000526020600020905b815481529060010190602001808311610cf857829003601f168201915b5050505050905090565b610d31610d2a611eed565b83836124bd565b5050565b600e8181548110610d4557600080fd5b9060005260206000209060040201600091509050806000018054610d6890614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9490614021565b8015610de15780601f10610db657610100808354040283529160200191610de1565b820191906000526020600020905b815481529060010190602001808311610dc457829003601f168201915b5050505050908060010154908060020154908060030154905084565b610e0e610e08611eed565b83611fae565b610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e44906141e8565b60405180910390fd5b610e5984848484612629565b50505050565b6060610e6a82612685565b610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090614542565b60405180910390fd5b6000600f600084815260200190815260200160002060405180602001604052908160008201600780602002604051908101604052809291906000905b82821015610f88578382018054610efb90614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2790614021565b8015610f745780601f10610f4957610100808354040283529160200191610f74565b820191906000526020600020905b815481529060010190602001808311610f5757829003601f168201915b505050505081526020019060010190610ee5565b50505050815250509050610fed6040518060400160405280601981526020017f49737375696e6720737461746520696e20746f6b656e555249000000000000008152508260000151600060078110610fe357610fe261432c565b5b60200201516126c6565b606080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630903cd0284600001516001600781106110465761104561432c565b5b60200201516040518263ffffffff1660e01b815260040161106791906135cb565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614603565b80925081935050506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028143ed856000015160006007811061110d5761110c61432c565b5b60200201516040518263ffffffff1660e01b815260040161112e91906135cb565b600060405180830381865afa15801561114b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611174919061467b565b8383866000015160026007811061118e5761118d61432c565b5b6020020151600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028143ed89600001516003600781106111e9576111e861432c565b5b60200201516040518263ffffffff1660e01b815260040161120a91906135cb565b600060405180830381865afa158015611227573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611250919061467b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb0870ee8a600001516004600781106112a6576112a561432c565b5b60200201516040518263ffffffff1660e01b81526004016112c791906135cb565b600060405180830381865afa1580156112e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061130d919061467b565b89600001516005600781106113255761132461432c565b5b6020020151600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb0870ee8c600001516006600781106113805761137f61432c565b5b60200201516040518263ffffffff1660e01b81526004016113a191906135cb565b600060405180830381865afa1580156113be573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113e7919061467b565b6113f08e611971565b61142f576040518060400160405280600281526020017f4e6f000000000000000000000000000000000000000000000000000000000000815250611466565b6040518060400160405280600381526020017f59657300000000000000000000000000000000000000000000000000000000008152505b61146f8f612762565b6040516020016114889a99989796959493929190614d16565b60405160208183030381529060405290506114a281612830565b6040516020016114b29190614e88565b604051602081830303815290604052945050505050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c82febf5858585856040518563ffffffff1660e01b815260040161154b94939291906150b0565b602060405180830381865afa158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c919061510c565b6115cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c290615185565b60405180910390fd5b600081600160106115dc91906151a5565b601081106115ed576115ec61432c565b5b6020020151905060006115fe61086c565b905061160a82826129b4565b6001600d6000856003601081106116245761162361432c565b5b6020020151815260200190815260200160002060006101000a81548160ff021916908315150217905550600061165984610bf6565b9050600061166682611b23565b90506000600f6000858152602001908152602001600020905060005b600e80549050811015611965576000600e82815481106116a5576116a461432c565b5b90600052602060002090600402016040518060800160405290816000820180546116ce90614021565b80601f01602080910402602001604051908101604052809291908181526020018280546116fa90614021565b80156117475780601f1061171c57610100808354040283529160200191611747565b820191906000526020600020905b81548152906001019060200180831161172a57829003601f168201915b5050505050815260200160018201548152602001600282015481526020016003820154815250509050600060018260200151836040015161178891906151a5565b61179291906151d9565b67ffffffffffffffff8111156117ab576117aa61387d565b5b6040519080825280601f01601f1916602001820160405280156117dd5781602001600182028036833780820191505090505b5090506000826020015190505b82604001518111611877578581815181106118085761180761432c565b5b602001015160f81c60f81b8284602001518361182491906151a5565b815181106118355761183461432c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061186f90614488565b9150506117ea565b506000819050808560000185600781106118945761189361432c565b5b0190816118a191906153af565b5061194f83600001518660000186600781106118c0576118bf61432c565b5b0180546118cc90614021565b80601f01602080910402602001604051908101604052809291908181526020018280546118f890614021565b80156119455780601f1061191a57610100808354040283529160200191611945565b820191906000526020600020905b81548152906001019060200180831161192857829003601f168201915b50505050506126c6565b505050808061195d90614488565b915050611682565b50505050505050505050565b600080600f600084815260200190815260200160002060405180602001604052908160008201600780602002604051908101604052809291906000905b82821015611a515783820180546119c490614021565b80601f01602080910402602001604051908101604052809291908181526020018280546119f090614021565b8015611a3d5780601f10611a1257610100808354040283529160200191611a3d565b820191906000526020600020905b815481529060010190602001808311611a2057829003601f168201915b5050505050815260200190600101906119ae565b505050508152505090506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0bb5d48360000151600660078110611ab357611ab261432c565b5b60200201516040518263ffffffff1660e01b8152600401611ad491906135cb565b602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190615496565b905080421192505050919050565b606060006040518060600160405280601f60ff168152602001601f60ff168152602001601a60ff1681525090506000605867ffffffffffffffff811115611b6d57611b6c61387d565b5b6040519080825280601f01601f191660200182016040528015611b9f5781602001600182028036833780820191505090505b5090506000805b6003811015611c77576000868260038110611bc457611bc361432c565b5b6020020151905060005b858360038110611be157611be061432c565b5b602002015160ff168160ff161015611c625760ff821660f81b858580611c0690614488565b965081518110611c1957611c1861432c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600882901c91508080611c5a906154d0565b915050611bce565b50508080611c6f90614488565b915050611ba6565b50819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d4561233c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab9061556b565b60405180910390fd5b611dbd816123f7565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e8b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e9b5750611e9a82612bd1565b5b9050919050565b611eab81612685565b611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee1906143a7565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f6883610aa5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611fba83610aa5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ffc5750611ffb8185611c83565b5b8061203a57508373ffffffffffffffffffffffffffffffffffffffff166120228461070f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661206382610aa5565b73ffffffffffffffffffffffffffffffffffffffff16146120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b0906155fd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f9061568f565b60405180910390fd5b6121358383836001612c3b565b8273ffffffffffffffffffffffffffffffffffffffff1661215582610aa5565b73ffffffffffffffffffffffffffffffffffffffff16146121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a2906155fd565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123378383836001612cbc565b505050565b612344611eed565b73ffffffffffffffffffffffffffffffffffffffff16612362610c63565b73ffffffffffffffffffffffffffffffffffffffff16146123b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123af906156fb565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361252b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252290615767565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161261c9190613520565b60405180910390a3505050565b612634848484612043565b61264084848484612cc2565b61267f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612676906157f9565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166126a7836123ba565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61275e82826040516024016126dc929190615819565b6040516020818303038152906040527f4b5c4277000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e49565b5050565b60606000600161277184612e6a565b01905060008167ffffffffffffffff8111156127905761278f61387d565b5b6040519080825280601f01601f1916602001820160405280156127c25781602001600182028036833780820191505090505b509050600082602001820190505b600115612825578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161281957612818615850565b5b049450600085036127d0575b819350505050919050565b60606000825103612852576040518060200160405280600081525090506129af565b6000604051806060016040528060408152602001615bac604091399050600060036002855161288191906151d9565b61288b919061587f565b600461289791906158b0565b905060006020826128a891906151d9565b67ffffffffffffffff8111156128c1576128c061387d565b5b6040519080825280601f01601f1916602001820160405280156128f35781602001600182028036833780820191505090505b509050818152600183018586518101602084015b8183101561296e576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612907565b6003895106600181146129885760028114612998576129a3565b613d3d60f01b60028303526129a3565b603d60f81b60018303525b50505050508093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1a9061593e565b60405180910390fd5b612a2c81612685565b15612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a63906159aa565b60405180910390fd5b612a7a600083836001612c3b565b612a8381612685565b15612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba906159aa565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bcd600083836001612cbc565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c4784848484612fbd565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cad90615a3c565b60405180910390fd5b50505050565b50505050565b6000612ce38473ffffffffffffffffffffffffffffffffffffffff1661311b565b15612e3c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d0c611eed565b8786866040518563ffffffff1660e01b8152600401612d2e9493929190615a5c565b6020604051808303816000875af1925050508015612d6a57506040513d601f19601f82011682018060405250810190612d679190615abd565b60015b612dec573d8060008114612d9a576040519150601f19603f3d011682016040523d82523d6000602084013e612d9f565b606091505b506000815103612de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddb906157f9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e41565b600190505b949350505050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612ec8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612ebe57612ebd615850565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612f05576d04ee2d6d415b85acef81000000008381612efb57612efa615850565b5b0492506020810190505b662386f26fc100008310612f3457662386f26fc100008381612f2a57612f29615850565b5b0492506010810190505b6305f5e1008310612f5d576305f5e1008381612f5357612f52615850565b5b0492506008810190505b6127108310612f82576127108381612f7857612f77615850565b5b0492506004810190505b60648310612fa55760648381612f9b57612f9a615850565b5b0492506002810190505b600a8310612fb4576001810190505b80915050919050565b612fc98484848461313e565b600181111561300d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300490615b5c565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036130545761304f81613144565b613093565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461309257613091858261318d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036130d5576130d0816132fa565b613114565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131135761311284826133cb565b5b5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161319a84610b2b565b6131a491906151a5565b9050600060076000848152602001908152602001600020549050818114613289576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061330e91906151a5565b905060006009600084815260200190815260200160002054905060006008838154811061333e5761333d61432c565b5b9060005260206000200154905080600883815481106133605761335f61432c565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133af576133ae615b7c565b5b6001900381819060005260206000200160009055905550505050565b60006133d683610b2b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6040518060600160405280600390602082028036833780820191505090505090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134b581613480565b81146134c057600080fd5b50565b6000813590506134d2816134ac565b92915050565b6000602082840312156134ee576134ed613476565b5b60006134fc848285016134c3565b91505092915050565b60008115159050919050565b61351a81613505565b82525050565b60006020820190506135356000830184613511565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561357557808201518184015260208101905061355a565b60008484015250505050565b6000601f19601f8301169050919050565b600061359d8261353b565b6135a78185613546565b93506135b7818560208601613557565b6135c081613581565b840191505092915050565b600060208201905081810360008301526135e58184613592565b905092915050565b6000819050919050565b613600816135ed565b811461360b57600080fd5b50565b60008135905061361d816135f7565b92915050565b60006020828403121561363957613638613476565b5b60006136478482850161360e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061367b82613650565b9050919050565b61368b81613670565b82525050565b60006020820190506136a66000830184613682565b92915050565b6136b581613670565b81146136c057600080fd5b50565b6000813590506136d2816136ac565b92915050565b600080604083850312156136ef576136ee613476565b5b60006136fd858286016136c3565b925050602061370e8582860161360e565b9150509250929050565b613721816135ed565b82525050565b600060208201905061373c6000830184613718565b92915050565b60008060006060848603121561375b5761375a613476565b5b6000613769868287016136c3565b935050602061377a868287016136c3565b925050604061378b8682870161360e565b9150509250925092565b6000819050919050565b60006137ba6137b56137b084613650565b613795565b613650565b9050919050565b60006137cc8261379f565b9050919050565b60006137de826137c1565b9050919050565b6137ee816137d3565b82525050565b600060208201905061380960008301846137e5565b92915050565b600061381a826137c1565b9050919050565b61382a8161380f565b82525050565b60006020820190506138456000830184613821565b92915050565b60006020828403121561386157613860613476565b5b600061386f848285016136c3565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138b582613581565b810181811067ffffffffffffffff821117156138d4576138d361387d565b5b80604052505050565b60006138e761346c565b90506138f382826138ac565b919050565b600067ffffffffffffffff8211156139135761391261387d565b5b602082029050919050565b600080fd5b6000613936613931846138f8565b6138dd565b905080602084028301858111156139505761394f61391e565b5b835b818110156139795780613965888261360e565b845260208401935050602081019050613952565b5050509392505050565b600082601f83011261399857613997613878565b5b60106139a5848285613923565b91505092915050565b600061020082840312156139c5576139c4613476565b5b60006139d384828501613983565b91505092915050565b600060039050919050565b600081905092915050565b6000819050919050565b613a05816135ed565b82525050565b6000613a1783836139fc565b60208301905092915050565b6000602082019050919050565b613a39816139dc565b613a4381846139e7565b9250613a4e826139f2565b8060005b83811015613a7f578151613a668782613a0b565b9650613a7183613a23565b925050600181019050613a52565b505050505050565b6000606082019050613a9c6000830184613a30565b92915050565b613aab81613505565b8114613ab657600080fd5b50565b600081359050613ac881613aa2565b92915050565b60008060408385031215613ae557613ae4613476565b5b6000613af3858286016136c3565b9250506020613b0485828601613ab9565b9150509250929050565b60006080820190508181036000830152613b288187613592565b9050613b376020830186613718565b613b446040830185613718565b613b516060830184613718565b95945050505050565b600080fd5b600067ffffffffffffffff821115613b7a57613b7961387d565b5b613b8382613581565b9050602081019050919050565b82818337600083830152505050565b6000613bb2613bad84613b5f565b6138dd565b905082815260208101848484011115613bce57613bcd613b5a565b5b613bd9848285613b90565b509392505050565b600082601f830112613bf657613bf5613878565b5b8135613c06848260208601613b9f565b91505092915050565b60008060008060808587031215613c2957613c28613476565b5b6000613c37878288016136c3565b9450506020613c48878288016136c3565b9350506040613c598782880161360e565b925050606085013567ffffffffffffffff811115613c7a57613c7961347b565b5b613c8687828801613be1565b91505092959194509250565b600067ffffffffffffffff821115613cad57613cac61387d565b5b602082029050919050565b6000613ccb613cc684613c92565b6138dd565b90508060208402830185811115613ce557613ce461391e565b5b835b81811015613d0e5780613cfa888261360e565b845260208401935050602081019050613ce7565b5050509392505050565b600082601f830112613d2d57613d2c613878565b5b6002613d3a848285613cb8565b91505092915050565b600067ffffffffffffffff821115613d5e57613d5d61387d565b5b602082029050919050565b6000613d7c613d7784613d43565b6138dd565b90508060408402830185811115613d9657613d9561391e565b5b835b81811015613dbf5780613dab8882613d18565b845260208401935050604081019050613d98565b5050509392505050565b600082601f830112613dde57613ddd613878565b5b6002613deb848285613d69565b91505092915050565b6000806000806103008587031215613e0f57613e0e613476565b5b6000613e1d87828801613d18565b9450506040613e2e87828801613dc9565b93505060c0613e3f87828801613d18565b925050610100613e5187828801613983565b91505092959194509250565b600067ffffffffffffffff821115613e7857613e7761387d565b5b602082029050919050565b6000613e96613e9184613e5d565b6138dd565b90508060208402830185811115613eb057613eaf61391e565b5b835b81811015613ed95780613ec5888261360e565b845260208401935050602081019050613eb2565b5050509392505050565b600082601f830112613ef857613ef7613878565b5b6003613f05848285613e83565b91505092915050565b600060608284031215613f2457613f23613476565b5b6000613f3284828501613ee3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000613f6282613f3b565b613f6c8185613f46565b9350613f7c818560208601613557565b613f8581613581565b840191505092915050565b60006020820190508181036000830152613faa8184613f57565b905092915050565b60008060408385031215613fc957613fc8613476565b5b6000613fd7858286016136c3565b9250506020613fe8858286016136c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061403957607f821691505b60208210810361404c5761404b613ff2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006140ae602183613546565b91506140b982614052565b604082019050919050565b600060208201905081810360008301526140dd816140a1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614140603d83613546565b915061414b826140e4565b604082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006141d2602d83613546565b91506141dd82614176565b604082019050919050565b60006020820190508181036000830152614201816141c5565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614264602b83613546565b915061426f82614208565b604082019050919050565b6000602082019050818103600083015261429381614257565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006142f6602c83613546565b91506143018261429a565b604082019050919050565b60006020820190508181036000830152614325816142e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614391601883613546565b915061439c8261435b565b602082019050919050565b600060208201905081810360008301526143c081614384565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614423602983613546565b915061442e826143c7565b604082019050919050565b6000602082019050818103600083015261445281614416565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614493826135ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144c5576144c4614459565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061452c602f83613546565b9150614537826144d0565b604082019050919050565b6000602082019050818103600083015261455b8161451f565b9050919050565b600067ffffffffffffffff82111561457d5761457c61387d565b5b61458682613581565b9050602081019050919050565b60006145a66145a184614562565b6138dd565b9050828152602081018484840111156145c2576145c1613b5a565b5b6145cd848285613557565b509392505050565b600082601f8301126145ea576145e9613878565b5b81516145fa848260208601614593565b91505092915050565b6000806040838503121561461a57614619613476565b5b600083015167ffffffffffffffff8111156146385761463761347b565b5b614644858286016145d5565b925050602083015167ffffffffffffffff8111156146655761466461347b565b5b614671858286016145d5565b9150509250929050565b60006020828403121561469157614690613476565b5b600082015167ffffffffffffffff8111156146af576146ae61347b565b5b6146bb848285016145d5565b91505092915050565b600081905092915050565b7f7b202261747472696275746573223a205b000000000000000000000000000000600082015250565b60006147056011836146c4565b9150614710826146cf565b601182019050919050565b7f7b2274726169745f74797065223a202249737375696e67205374617465222c2060008201527f2276616c7565223a202200000000000000000000000000000000000000000000602082015250565b6000614777602a836146c4565b91506147828261471b565b602a82019050919050565b60006147988261353b565b6147a281856146c4565b93506147b2818560208601613557565b80840191505092915050565b7f227d2c7b2274726169745f74797065223a202246697273744e616d65222c202260008201527f76616c7565223a20220000000000000000000000000000000000000000000000602082015250565b600061481a6029836146c4565b9150614825826147be565b602982019050919050565b7f227d2c7b2274726169745f74797065223a20224c6173744e616d65222c20227660008201527f616c7565223a2022000000000000000000000000000000000000000000000000602082015250565b600061488c6028836146c4565b915061489782614830565b602882019050919050565b7f227d2c7b2274726169745f74797065223a202250617373706f7274204e756d6260008201527f6572222c202276616c7565223a20220000000000000000000000000000000000602082015250565b60006148fe602f836146c4565b9150614909826148a2565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a20224e6174696f6e616c697479222c60008201527f202276616c7565223a2022000000000000000000000000000000000000000000602082015250565b6000614970602b836146c4565b915061497b82614914565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202244617465206f6620626972746860008201527f222c202276616c7565223a202200000000000000000000000000000000000000602082015250565b60006149e2602d836146c4565b91506149ed82614986565b602d82019050919050565b7f227d2c7b2274726169745f74797065223a202247656e646572222c202276616c60008201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b6000614a546026836146c4565b9150614a5f826149f8565b602682019050919050565b7f227d2c7b2274726169745f74797065223a20224578706972792064617465222c60008201527f202276616c7565223a2022000000000000000000000000000000000000000000602082015250565b6000614ac6602b836146c4565b9150614ad182614a6a565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202245787069726564222c2022766160008201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b6000614b386027836146c4565b9150614b4382614adc565b602782019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b846002836146c4565b9150614b8f82614b4e565b600282019050919050565b7f5d2c000000000000000000000000000000000000000000000000000000000000600082015250565b6000614bd06002836146c4565b9150614bdb82614b9a565b600282019050919050565b7f226465736372697074696f6e223a202250726f6f66206f662050617373706f7260008201527f742067756172616e7465657320706f7373657373696f6e206f6620612076616c60208201527f69642070617373706f72742e222c2265787465726e616c5f75726c223a20226860408201527f747470733a2f2f6769746875622e636f6d2f7a6b2d70617373706f72742f707260608201527f6f6f662d6f662d70617373706f7274222c22696d616765223a2022687474707360808201527f3a2f2f692e696d6775722e636f6d2f396b766574696a2e706e67222c226e616d60a08201527f65223a202250726f6f66206f662050617373706f72742023000000000000000060c082015250565b6000614d0060d8836146c4565b9150614d0b82614be6565b60d882019050919050565b6000614d21826146f8565b9150614d2c8261476a565b9150614d38828d61478d565b9150614d438261480d565b9150614d4f828c61478d565b9150614d5a8261487f565b9150614d66828b61478d565b9150614d71826148f1565b9150614d7d828a61478d565b9150614d8882614963565b9150614d94828961478d565b9150614d9f826149d5565b9150614dab828861478d565b9150614db682614a47565b9150614dc2828761478d565b9150614dcd82614ab9565b9150614dd9828661478d565b9150614de482614b2b565b9150614df0828561478d565b9150614dfb82614b77565b9150614e0682614bc3565b9150614e1182614cf3565b9150614e1d828461478d565b9150614e2882614b77565b91508190509b9a5050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000614e72601d836146c4565b9150614e7d82614e3c565b601d82019050919050565b6000614e9382614e65565b9150614e9f828461478d565b915081905092915050565b600060029050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b614ee081614eaa565b614eea8184614eb5565b9250614ef582614ec0565b8060005b83811015614f26578151614f0d8782613a0b565b9650614f1883614eca565b925050600181019050614ef9565b505050505050565b600060029050919050565b600081905092915050565b6000819050919050565b600081905092915050565b614f6281614eaa565b614f6c8184614f4e565b9250614f7782614ec0565b8060005b83811015614fa8578151614f8f8782613a0b565b9650614f9a83614eca565b925050600181019050614f7b565b505050505050565b6000614fbc8383614f59565b60408301905092915050565b6000602082019050919050565b614fde81614f2e565b614fe88184614f39565b9250614ff382614f44565b8060005b8381101561502457815161500b8782614fb0565b965061501683614fc8565b925050600181019050614ff7565b505050505050565b600060109050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b6150628161502c565b61506c8184615037565b925061507782615042565b8060005b838110156150a857815161508f8782613a0b565b965061509a8361504c565b92505060018101905061507b565b505050505050565b6000610300820190506150c66000830187614ed7565b6150d36040830186614fd5565b6150e060c0830185614ed7565b6150ee610100830184615059565b95945050505050565b60008151905061510681613aa2565b92915050565b60006020828403121561512257615121613476565b5b6000615130848285016150f7565b91505092915050565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b600061516f600d83613546565b915061517a82615139565b602082019050919050565b6000602082019050818103600083015261519e81615162565b9050919050565b60006151b0826135ed565b91506151bb836135ed565b92508282039050818111156151d3576151d2614459565b5b92915050565b60006151e4826135ed565b91506151ef836135ed565b925082820190508082111561520757615206614459565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261526f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615232565b6152798683615232565b95508019841693508086168417925050509392505050565b60006152ac6152a76152a2846135ed565b613795565b6135ed565b9050919050565b6000819050919050565b6152c683615291565b6152da6152d2826152b3565b84845461523f565b825550505050565b600090565b6152ef6152e2565b6152fa8184846152bd565b505050565b5b8181101561531e576153136000826152e7565b600181019050615300565b5050565b601f821115615363576153348161520d565b61533d84615222565b8101602085101561534c578190505b61536061535885615222565b8301826152ff565b50505b505050565b600082821c905092915050565b600061538660001984600802615368565b1980831691505092915050565b600061539f8383615375565b9150826002028217905092915050565b6153b88261353b565b67ffffffffffffffff8111156153d1576153d061387d565b5b6153db8254614021565b6153e6828285615322565b600060209050601f8311600181146154195760008415615407578287015190505b6154118582615393565b865550615479565b601f1984166154278661520d565b60005b8281101561544f5784890151825560018201915060208501945060208101905061542a565b8683101561546c5784890151615468601f891682615375565b8355505b6001600288020188555050505b505050505050565b600081519050615490816135f7565b92915050565b6000602082840312156154ac576154ab613476565b5b60006154ba84828501615481565b91505092915050565b600060ff82169050919050565b60006154db826154c3565b915060ff82036154ee576154ed614459565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615555602683613546565b9150615560826154f9565b604082019050919050565b6000602082019050818103600083015261558481615548565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006155e7602583613546565b91506155f28261558b565b604082019050919050565b60006020820190508181036000830152615616816155da565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615679602483613546565b91506156848261561d565b604082019050919050565b600060208201905081810360008301526156a88161566c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006156e5602083613546565b91506156f0826156af565b602082019050919050565b60006020820190508181036000830152615714816156d8565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615751601983613546565b915061575c8261571b565b602082019050919050565b6000602082019050818103600083015261578081615744565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006157e3603283613546565b91506157ee82615787565b604082019050919050565b60006020820190508181036000830152615812816157d6565b9050919050565b600060408201905081810360008301526158338185613592565b905081810360208301526158478184613592565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061588a826135ed565b9150615895836135ed565b9250826158a5576158a4615850565b5b828204905092915050565b60006158bb826135ed565b91506158c6836135ed565b92508282026158d4816135ed565b915082820484148315176158eb576158ea614459565b5b5092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615928602083613546565b9150615933826158f2565b602082019050919050565b600060208201905081810360008301526159578161591b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615994601c83613546565b915061599f8261595e565b602082019050919050565b600060208201905081810360008301526159c381615987565b9050919050565b7f43616e6e6f74207472616e73666572202d2050726f6f66206f6620506173737060008201527f6f727420697320736f756c626f756e6400000000000000000000000000000000602082015250565b6000615a26603083613546565b9150615a31826159ca565b604082019050919050565b60006020820190508181036000830152615a5581615a19565b9050919050565b6000608082019050615a716000830187613682565b615a7e6020830186613682565b615a8b6040830185613718565b8181036060830152615a9d8184613f57565b905095945050505050565b600081519050615ab7816134ac565b92915050565b600060208284031215615ad357615ad2613476565b5b6000615ae184828501615aa8565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615b46603583613546565b9150615b5182615aea565b604082019050919050565b60006020820190508181036000830152615b7581615b39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220fc7b3e1065ff76ed9c3e55279cd3a205fc1183775e22ad1efea30ad39c94a3cc64736f6c63430008120033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063c87b56dd116100a2578063dc54daf011610071578063dc54daf014610569578063e985e9c514610599578063eba11e05146105c9578063f2fde38b146105e7576101cf565b8063c87b56dd146104bd578063d21e82ab146104ed578063d4d9c00f1461051d578063d9548e5314610539576101cf565b806395d89b41116100de57806395d89b4114610434578063a22cb46514610452578063b04e3a3b1461046e578063b88d4fde146104a1576101cf565b8063715018a6146103dc57806376e6a447146103e65780638da5cb5b14610416576101cf565b80632f745c59116101715780634f6ccce71161014b5780634f6ccce71461033057806354f96d52146103605780636352211e1461037c57806370a08231146103ac576101cf565b80632f745c59146102c65780633a41515f146102f657806342842e0e14610314576101cf565b8063095ea7b3116101ad578063095ea7b31461025257806318160ddd1461026e57806323b872dd1461028c5780632b7ac3f3146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e991906134d8565b610603565b6040516101fb9190613520565b60405180910390f35b61020c61067d565b60405161021991906135cb565b60405180910390f35b61023c60048036038101906102379190613623565b61070f565b6040516102499190613691565b60405180910390f35b61026c600480360381019061026791906136d8565b610755565b005b61027661086c565b6040516102839190613727565b60405180910390f35b6102a660048036038101906102a19190613742565b610879565b005b6102b06108d9565b6040516102bd91906137f4565b60405180910390f35b6102e060048036038101906102db91906136d8565b6108fd565b6040516102ed9190613727565b60405180910390f35b6102fe6109a2565b60405161030b9190613830565b60405180910390f35b61032e60048036038101906103299190613742565b6109c8565b005b61034a60048036038101906103459190613623565b6109e8565b6040516103579190613727565b60405180910390f35b61037a6004803603810190610375919061384b565b610a59565b005b61039660048036038101906103919190613623565b610aa5565b6040516103a39190613691565b60405180910390f35b6103c660048036038101906103c1919061384b565b610b2b565b6040516103d39190613727565b60405180910390f35b6103e4610be2565b005b61040060048036038101906103fb91906139ae565b610bf6565b60405161040d9190613a87565b60405180910390f35b61041e610c63565b60405161042b9190613691565b60405180910390f35b61043c610c8d565b60405161044991906135cb565b60405180910390f35b61046c60048036038101906104679190613ace565b610d1f565b005b61048860048036038101906104839190613623565b610d35565b6040516104989493929190613b0e565b60405180910390f35b6104bb60048036038101906104b69190613c0f565b610dfd565b005b6104d760048036038101906104d29190613623565b610e5f565b6040516104e491906135cb565b60405180910390f35b61050760048036038101906105029190613623565b6114cc565b6040516105149190613520565b60405180910390f35b61053760048036038101906105329190613df4565b6114ec565b005b610553600480360381019061054e9190613623565b611971565b6040516105609190613520565b60405180910390f35b610583600480360381019061057e9190613f0e565b611b23565b6040516105909190613f90565b60405180910390f35b6105b360048036038101906105ae9190613fb2565b611c83565b6040516105c09190613520565b60405180910390f35b6105d1611d17565b6040516105de9190613691565b60405180910390f35b61060160048036038101906105fc919061384b565b611d3d565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610676575061067582611dc0565b5b9050919050565b60606000805461068c90614021565b80601f01602080910402602001604051908101604052809291908181526020018280546106b890614021565b80156107055780601f106106da57610100808354040283529160200191610705565b820191906000526020600020905b8154815290600101906020018083116106e857829003601f168201915b5050505050905090565b600061071a82611ea2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061076082610aa5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c7906140c4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107ef611eed565b73ffffffffffffffffffffffffffffffffffffffff16148061081e575061081d81610818611eed565b611c83565b5b61085d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085490614156565b60405180910390fd5b6108678383611ef5565b505050565b6000600880549050905090565b61088a610884611eed565b82611fae565b6108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c0906141e8565b60405180910390fd5b6108d4838383612043565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600061090883610b2b565b8210610949576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109409061427a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109e383838360405180602001604052806000815250610dfd565b505050565b60006109f261086c565b8210610a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2a9061430c565b60405180910390fd5b60088281548110610a4757610a4661432c565b5b90600052602060002001549050919050565b610a6161233c565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610ab1836123ba565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b19906143a7565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9290614439565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bea61233c565b610bf460006123f7565b565b610bfe61344a565b610c0661344a565b60005b6003811015610c5957838160108110610c2557610c2461432c565b5b6020020151828260038110610c3d57610c3c61432c565b5b6020020181815250508080610c5190614488565b915050610c09565b5080915050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610c9c90614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610cc890614021565b8015610d155780601f10610cea57610100808354040283529160200191610d15565b820191906000526020600020905b815481529060010190602001808311610cf857829003601f168201915b5050505050905090565b610d31610d2a611eed565b83836124bd565b5050565b600e8181548110610d4557600080fd5b9060005260206000209060040201600091509050806000018054610d6890614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9490614021565b8015610de15780601f10610db657610100808354040283529160200191610de1565b820191906000526020600020905b815481529060010190602001808311610dc457829003601f168201915b5050505050908060010154908060020154908060030154905084565b610e0e610e08611eed565b83611fae565b610e4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e44906141e8565b60405180910390fd5b610e5984848484612629565b50505050565b6060610e6a82612685565b610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea090614542565b60405180910390fd5b6000600f600084815260200190815260200160002060405180602001604052908160008201600780602002604051908101604052809291906000905b82821015610f88578382018054610efb90614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2790614021565b8015610f745780601f10610f4957610100808354040283529160200191610f74565b820191906000526020600020905b815481529060010190602001808311610f5757829003601f168201915b505050505081526020019060010190610ee5565b50505050815250509050610fed6040518060400160405280601981526020017f49737375696e6720737461746520696e20746f6b656e555249000000000000008152508260000151600060078110610fe357610fe261432c565b5b60200201516126c6565b606080600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630903cd0284600001516001600781106110465761104561432c565b5b60200201516040518263ffffffff1660e01b815260040161106791906135cb565b600060405180830381865afa158015611084573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110ad9190614603565b80925081935050506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028143ed856000015160006007811061110d5761110c61432c565b5b60200201516040518263ffffffff1660e01b815260040161112e91906135cb565b600060405180830381865afa15801561114b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611174919061467b565b8383866000015160026007811061118e5761118d61432c565b5b6020020151600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663028143ed89600001516003600781106111e9576111e861432c565b5b60200201516040518263ffffffff1660e01b815260040161120a91906135cb565b600060405180830381865afa158015611227573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611250919061467b565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb0870ee8a600001516004600781106112a6576112a561432c565b5b60200201516040518263ffffffff1660e01b81526004016112c791906135cb565b600060405180830381865afa1580156112e4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061130d919061467b565b89600001516005600781106113255761132461432c565b5b6020020151600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bb0870ee8c600001516006600781106113805761137f61432c565b5b60200201516040518263ffffffff1660e01b81526004016113a191906135cb565b600060405180830381865afa1580156113be573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906113e7919061467b565b6113f08e611971565b61142f576040518060400160405280600281526020017f4e6f000000000000000000000000000000000000000000000000000000000000815250611466565b6040518060400160405280600381526020017f59657300000000000000000000000000000000000000000000000000000000008152505b61146f8f612762565b6040516020016114889a99989796959493929190614d16565b60405160208183030381529060405290506114a281612830565b6040516020016114b29190614e88565b604051602081830303815290604052945050505050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c82febf5858585856040518563ffffffff1660e01b815260040161154b94939291906150b0565b602060405180830381865afa158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c919061510c565b6115cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c290615185565b60405180910390fd5b600081600160106115dc91906151a5565b601081106115ed576115ec61432c565b5b6020020151905060006115fe61086c565b905061160a82826129b4565b6001600d6000856003601081106116245761162361432c565b5b6020020151815260200190815260200160002060006101000a81548160ff021916908315150217905550600061165984610bf6565b9050600061166682611b23565b90506000600f6000858152602001908152602001600020905060005b600e80549050811015611965576000600e82815481106116a5576116a461432c565b5b90600052602060002090600402016040518060800160405290816000820180546116ce90614021565b80601f01602080910402602001604051908101604052809291908181526020018280546116fa90614021565b80156117475780601f1061171c57610100808354040283529160200191611747565b820191906000526020600020905b81548152906001019060200180831161172a57829003601f168201915b5050505050815260200160018201548152602001600282015481526020016003820154815250509050600060018260200151836040015161178891906151a5565b61179291906151d9565b67ffffffffffffffff8111156117ab576117aa61387d565b5b6040519080825280601f01601f1916602001820160405280156117dd5781602001600182028036833780820191505090505b5090506000826020015190505b82604001518111611877578581815181106118085761180761432c565b5b602001015160f81c60f81b8284602001518361182491906151a5565b815181106118355761183461432c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808061186f90614488565b9150506117ea565b506000819050808560000185600781106118945761189361432c565b5b0190816118a191906153af565b5061194f83600001518660000186600781106118c0576118bf61432c565b5b0180546118cc90614021565b80601f01602080910402602001604051908101604052809291908181526020018280546118f890614021565b80156119455780601f1061191a57610100808354040283529160200191611945565b820191906000526020600020905b81548152906001019060200180831161192857829003601f168201915b50505050506126c6565b505050808061195d90614488565b915050611682565b50505050505050505050565b600080600f600084815260200190815260200160002060405180602001604052908160008201600780602002604051908101604052809291906000905b82821015611a515783820180546119c490614021565b80601f01602080910402602001604051908101604052809291908181526020018280546119f090614021565b8015611a3d5780601f10611a1257610100808354040283529160200191611a3d565b820191906000526020600020905b815481529060010190602001808311611a2057829003601f168201915b5050505050815260200190600101906119ae565b505050508152505090506000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0bb5d48360000151600660078110611ab357611ab261432c565b5b60200201516040518263ffffffff1660e01b8152600401611ad491906135cb565b602060405180830381865afa158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190615496565b905080421192505050919050565b606060006040518060600160405280601f60ff168152602001601f60ff168152602001601a60ff1681525090506000605867ffffffffffffffff811115611b6d57611b6c61387d565b5b6040519080825280601f01601f191660200182016040528015611b9f5781602001600182028036833780820191505090505b5090506000805b6003811015611c77576000868260038110611bc457611bc361432c565b5b6020020151905060005b858360038110611be157611be061432c565b5b602002015160ff168160ff161015611c625760ff821660f81b858580611c0690614488565b965081518110611c1957611c1861432c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600882901c91508080611c5a906154d0565b915050611bce565b50508080611c6f90614488565b915050611ba6565b50819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d4561233c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611db4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dab9061556b565b60405180910390fd5b611dbd816123f7565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e8b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611e9b5750611e9a82612bd1565b5b9050919050565b611eab81612685565b611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee1906143a7565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f6883610aa5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611fba83610aa5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ffc5750611ffb8185611c83565b5b8061203a57508373ffffffffffffffffffffffffffffffffffffffff166120228461070f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661206382610aa5565b73ffffffffffffffffffffffffffffffffffffffff16146120b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b0906155fd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211f9061568f565b60405180910390fd5b6121358383836001612c3b565b8273ffffffffffffffffffffffffffffffffffffffff1661215582610aa5565b73ffffffffffffffffffffffffffffffffffffffff16146121ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a2906155fd565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123378383836001612cbc565b505050565b612344611eed565b73ffffffffffffffffffffffffffffffffffffffff16612362610c63565b73ffffffffffffffffffffffffffffffffffffffff16146123b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123af906156fb565b60405180910390fd5b565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361252b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252290615767565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161261c9190613520565b60405180910390a3505050565b612634848484612043565b61264084848484612cc2565b61267f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612676906157f9565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166126a7836123ba565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b61275e82826040516024016126dc929190615819565b6040516020818303038152906040527f4b5c4277000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612e49565b5050565b60606000600161277184612e6a565b01905060008167ffffffffffffffff8111156127905761278f61387d565b5b6040519080825280601f01601f1916602001820160405280156127c25781602001600182028036833780820191505090505b509050600082602001820190505b600115612825578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161281957612818615850565b5b049450600085036127d0575b819350505050919050565b60606000825103612852576040518060200160405280600081525090506129af565b6000604051806060016040528060408152602001615bac604091399050600060036002855161288191906151d9565b61288b919061587f565b600461289791906158b0565b905060006020826128a891906151d9565b67ffffffffffffffff8111156128c1576128c061387d565b5b6040519080825280601f01601f1916602001820160405280156128f35781602001600182028036833780820191505090505b509050818152600183018586518101602084015b8183101561296e576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612907565b6003895106600181146129885760028114612998576129a3565b613d3d60f01b60028303526129a3565b603d60f81b60018303525b50505050508093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1a9061593e565b60405180910390fd5b612a2c81612685565b15612a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a63906159aa565b60405180910390fd5b612a7a600083836001612c3b565b612a8381612685565b15612ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aba906159aa565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bcd600083836001612cbc565b5050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c4784848484612fbd565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cad90615a3c565b60405180910390fd5b50505050565b50505050565b6000612ce38473ffffffffffffffffffffffffffffffffffffffff1661311b565b15612e3c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d0c611eed565b8786866040518563ffffffff1660e01b8152600401612d2e9493929190615a5c565b6020604051808303816000875af1925050508015612d6a57506040513d601f19601f82011682018060405250810190612d679190615abd565b60015b612dec573d8060008114612d9a576040519150601f19603f3d011682016040523d82523d6000602084013e612d9f565b606091505b506000815103612de4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddb906157f9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e41565b600190505b949350505050565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612ec8577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612ebe57612ebd615850565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612f05576d04ee2d6d415b85acef81000000008381612efb57612efa615850565b5b0492506020810190505b662386f26fc100008310612f3457662386f26fc100008381612f2a57612f29615850565b5b0492506010810190505b6305f5e1008310612f5d576305f5e1008381612f5357612f52615850565b5b0492506008810190505b6127108310612f82576127108381612f7857612f77615850565b5b0492506004810190505b60648310612fa55760648381612f9b57612f9a615850565b5b0492506002810190505b600a8310612fb4576001810190505b80915050919050565b612fc98484848461313e565b600181111561300d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300490615b5c565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036130545761304f81613144565b613093565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461309257613091858261318d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036130d5576130d0816132fa565b613114565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146131135761311284826133cb565b5b5b5050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161319a84610b2b565b6131a491906151a5565b9050600060076000848152602001908152602001600020549050818114613289576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061330e91906151a5565b905060006009600084815260200190815260200160002054905060006008838154811061333e5761333d61432c565b5b9060005260206000200154905080600883815481106133605761335f61432c565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133af576133ae615b7c565b5b6001900381819060005260206000200160009055905550505050565b60006133d683610b2b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6040518060600160405280600390602082028036833780820191505090505090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134b581613480565b81146134c057600080fd5b50565b6000813590506134d2816134ac565b92915050565b6000602082840312156134ee576134ed613476565b5b60006134fc848285016134c3565b91505092915050565b60008115159050919050565b61351a81613505565b82525050565b60006020820190506135356000830184613511565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561357557808201518184015260208101905061355a565b60008484015250505050565b6000601f19601f8301169050919050565b600061359d8261353b565b6135a78185613546565b93506135b7818560208601613557565b6135c081613581565b840191505092915050565b600060208201905081810360008301526135e58184613592565b905092915050565b6000819050919050565b613600816135ed565b811461360b57600080fd5b50565b60008135905061361d816135f7565b92915050565b60006020828403121561363957613638613476565b5b60006136478482850161360e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061367b82613650565b9050919050565b61368b81613670565b82525050565b60006020820190506136a66000830184613682565b92915050565b6136b581613670565b81146136c057600080fd5b50565b6000813590506136d2816136ac565b92915050565b600080604083850312156136ef576136ee613476565b5b60006136fd858286016136c3565b925050602061370e8582860161360e565b9150509250929050565b613721816135ed565b82525050565b600060208201905061373c6000830184613718565b92915050565b60008060006060848603121561375b5761375a613476565b5b6000613769868287016136c3565b935050602061377a868287016136c3565b925050604061378b8682870161360e565b9150509250925092565b6000819050919050565b60006137ba6137b56137b084613650565b613795565b613650565b9050919050565b60006137cc8261379f565b9050919050565b60006137de826137c1565b9050919050565b6137ee816137d3565b82525050565b600060208201905061380960008301846137e5565b92915050565b600061381a826137c1565b9050919050565b61382a8161380f565b82525050565b60006020820190506138456000830184613821565b92915050565b60006020828403121561386157613860613476565b5b600061386f848285016136c3565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6138b582613581565b810181811067ffffffffffffffff821117156138d4576138d361387d565b5b80604052505050565b60006138e761346c565b90506138f382826138ac565b919050565b600067ffffffffffffffff8211156139135761391261387d565b5b602082029050919050565b600080fd5b6000613936613931846138f8565b6138dd565b905080602084028301858111156139505761394f61391e565b5b835b818110156139795780613965888261360e565b845260208401935050602081019050613952565b5050509392505050565b600082601f83011261399857613997613878565b5b60106139a5848285613923565b91505092915050565b600061020082840312156139c5576139c4613476565b5b60006139d384828501613983565b91505092915050565b600060039050919050565b600081905092915050565b6000819050919050565b613a05816135ed565b82525050565b6000613a1783836139fc565b60208301905092915050565b6000602082019050919050565b613a39816139dc565b613a4381846139e7565b9250613a4e826139f2565b8060005b83811015613a7f578151613a668782613a0b565b9650613a7183613a23565b925050600181019050613a52565b505050505050565b6000606082019050613a9c6000830184613a30565b92915050565b613aab81613505565b8114613ab657600080fd5b50565b600081359050613ac881613aa2565b92915050565b60008060408385031215613ae557613ae4613476565b5b6000613af3858286016136c3565b9250506020613b0485828601613ab9565b9150509250929050565b60006080820190508181036000830152613b288187613592565b9050613b376020830186613718565b613b446040830185613718565b613b516060830184613718565b95945050505050565b600080fd5b600067ffffffffffffffff821115613b7a57613b7961387d565b5b613b8382613581565b9050602081019050919050565b82818337600083830152505050565b6000613bb2613bad84613b5f565b6138dd565b905082815260208101848484011115613bce57613bcd613b5a565b5b613bd9848285613b90565b509392505050565b600082601f830112613bf657613bf5613878565b5b8135613c06848260208601613b9f565b91505092915050565b60008060008060808587031215613c2957613c28613476565b5b6000613c37878288016136c3565b9450506020613c48878288016136c3565b9350506040613c598782880161360e565b925050606085013567ffffffffffffffff811115613c7a57613c7961347b565b5b613c8687828801613be1565b91505092959194509250565b600067ffffffffffffffff821115613cad57613cac61387d565b5b602082029050919050565b6000613ccb613cc684613c92565b6138dd565b90508060208402830185811115613ce557613ce461391e565b5b835b81811015613d0e5780613cfa888261360e565b845260208401935050602081019050613ce7565b5050509392505050565b600082601f830112613d2d57613d2c613878565b5b6002613d3a848285613cb8565b91505092915050565b600067ffffffffffffffff821115613d5e57613d5d61387d565b5b602082029050919050565b6000613d7c613d7784613d43565b6138dd565b90508060408402830185811115613d9657613d9561391e565b5b835b81811015613dbf5780613dab8882613d18565b845260208401935050604081019050613d98565b5050509392505050565b600082601f830112613dde57613ddd613878565b5b6002613deb848285613d69565b91505092915050565b6000806000806103008587031215613e0f57613e0e613476565b5b6000613e1d87828801613d18565b9450506040613e2e87828801613dc9565b93505060c0613e3f87828801613d18565b925050610100613e5187828801613983565b91505092959194509250565b600067ffffffffffffffff821115613e7857613e7761387d565b5b602082029050919050565b6000613e96613e9184613e5d565b6138dd565b90508060208402830185811115613eb057613eaf61391e565b5b835b81811015613ed95780613ec5888261360e565b845260208401935050602081019050613eb2565b5050509392505050565b600082601f830112613ef857613ef7613878565b5b6003613f05848285613e83565b91505092915050565b600060608284031215613f2457613f23613476565b5b6000613f3284828501613ee3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000613f6282613f3b565b613f6c8185613f46565b9350613f7c818560208601613557565b613f8581613581565b840191505092915050565b60006020820190508181036000830152613faa8184613f57565b905092915050565b60008060408385031215613fc957613fc8613476565b5b6000613fd7858286016136c3565b9250506020613fe8858286016136c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061403957607f821691505b60208210810361404c5761404b613ff2565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006140ae602183613546565b91506140b982614052565b604082019050919050565b600060208201905081810360008301526140dd816140a1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000614140603d83613546565b915061414b826140e4565b604082019050919050565b6000602082019050818103600083015261416f81614133565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006141d2602d83613546565b91506141dd82614176565b604082019050919050565b60006020820190508181036000830152614201816141c5565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614264602b83613546565b915061426f82614208565b604082019050919050565b6000602082019050818103600083015261429381614257565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006142f6602c83613546565b91506143018261429a565b604082019050919050565b60006020820190508181036000830152614325816142e9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000614391601883613546565b915061439c8261435b565b602082019050919050565b600060208201905081810360008301526143c081614384565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614423602983613546565b915061442e826143c7565b604082019050919050565b6000602082019050818103600083015261445281614416565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614493826135ed565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144c5576144c4614459565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061452c602f83613546565b9150614537826144d0565b604082019050919050565b6000602082019050818103600083015261455b8161451f565b9050919050565b600067ffffffffffffffff82111561457d5761457c61387d565b5b61458682613581565b9050602081019050919050565b60006145a66145a184614562565b6138dd565b9050828152602081018484840111156145c2576145c1613b5a565b5b6145cd848285613557565b509392505050565b600082601f8301126145ea576145e9613878565b5b81516145fa848260208601614593565b91505092915050565b6000806040838503121561461a57614619613476565b5b600083015167ffffffffffffffff8111156146385761463761347b565b5b614644858286016145d5565b925050602083015167ffffffffffffffff8111156146655761466461347b565b5b614671858286016145d5565b9150509250929050565b60006020828403121561469157614690613476565b5b600082015167ffffffffffffffff8111156146af576146ae61347b565b5b6146bb848285016145d5565b91505092915050565b600081905092915050565b7f7b202261747472696275746573223a205b000000000000000000000000000000600082015250565b60006147056011836146c4565b9150614710826146cf565b601182019050919050565b7f7b2274726169745f74797065223a202249737375696e67205374617465222c2060008201527f2276616c7565223a202200000000000000000000000000000000000000000000602082015250565b6000614777602a836146c4565b91506147828261471b565b602a82019050919050565b60006147988261353b565b6147a281856146c4565b93506147b2818560208601613557565b80840191505092915050565b7f227d2c7b2274726169745f74797065223a202246697273744e616d65222c202260008201527f76616c7565223a20220000000000000000000000000000000000000000000000602082015250565b600061481a6029836146c4565b9150614825826147be565b602982019050919050565b7f227d2c7b2274726169745f74797065223a20224c6173744e616d65222c20227660008201527f616c7565223a2022000000000000000000000000000000000000000000000000602082015250565b600061488c6028836146c4565b915061489782614830565b602882019050919050565b7f227d2c7b2274726169745f74797065223a202250617373706f7274204e756d6260008201527f6572222c202276616c7565223a20220000000000000000000000000000000000602082015250565b60006148fe602f836146c4565b9150614909826148a2565b602f82019050919050565b7f227d2c7b2274726169745f74797065223a20224e6174696f6e616c697479222c60008201527f202276616c7565223a2022000000000000000000000000000000000000000000602082015250565b6000614970602b836146c4565b915061497b82614914565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202244617465206f6620626972746860008201527f222c202276616c7565223a202200000000000000000000000000000000000000602082015250565b60006149e2602d836146c4565b91506149ed82614986565b602d82019050919050565b7f227d2c7b2274726169745f74797065223a202247656e646572222c202276616c60008201527f7565223a20220000000000000000000000000000000000000000000000000000602082015250565b6000614a546026836146c4565b9150614a5f826149f8565b602682019050919050565b7f227d2c7b2274726169745f74797065223a20224578706972792064617465222c60008201527f202276616c7565223a2022000000000000000000000000000000000000000000602082015250565b6000614ac6602b836146c4565b9150614ad182614a6a565b602b82019050919050565b7f227d2c7b2274726169745f74797065223a202245787069726564222c2022766160008201527f6c7565223a202200000000000000000000000000000000000000000000000000602082015250565b6000614b386027836146c4565b9150614b4382614adc565b602782019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b846002836146c4565b9150614b8f82614b4e565b600282019050919050565b7f5d2c000000000000000000000000000000000000000000000000000000000000600082015250565b6000614bd06002836146c4565b9150614bdb82614b9a565b600282019050919050565b7f226465736372697074696f6e223a202250726f6f66206f662050617373706f7260008201527f742067756172616e7465657320706f7373657373696f6e206f6620612076616c60208201527f69642070617373706f72742e222c2265787465726e616c5f75726c223a20226860408201527f747470733a2f2f6769746875622e636f6d2f7a6b2d70617373706f72742f707260608201527f6f6f662d6f662d70617373706f7274222c22696d616765223a2022687474707360808201527f3a2f2f692e696d6775722e636f6d2f396b766574696a2e706e67222c226e616d60a08201527f65223a202250726f6f66206f662050617373706f72742023000000000000000060c082015250565b6000614d0060d8836146c4565b9150614d0b82614be6565b60d882019050919050565b6000614d21826146f8565b9150614d2c8261476a565b9150614d38828d61478d565b9150614d438261480d565b9150614d4f828c61478d565b9150614d5a8261487f565b9150614d66828b61478d565b9150614d71826148f1565b9150614d7d828a61478d565b9150614d8882614963565b9150614d94828961478d565b9150614d9f826149d5565b9150614dab828861478d565b9150614db682614a47565b9150614dc2828761478d565b9150614dcd82614ab9565b9150614dd9828661478d565b9150614de482614b2b565b9150614df0828561478d565b9150614dfb82614b77565b9150614e0682614bc3565b9150614e1182614cf3565b9150614e1d828461478d565b9150614e2882614b77565b91508190509b9a5050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b6000614e72601d836146c4565b9150614e7d82614e3c565b601d82019050919050565b6000614e9382614e65565b9150614e9f828461478d565b915081905092915050565b600060029050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b614ee081614eaa565b614eea8184614eb5565b9250614ef582614ec0565b8060005b83811015614f26578151614f0d8782613a0b565b9650614f1883614eca565b925050600181019050614ef9565b505050505050565b600060029050919050565b600081905092915050565b6000819050919050565b600081905092915050565b614f6281614eaa565b614f6c8184614f4e565b9250614f7782614ec0565b8060005b83811015614fa8578151614f8f8782613a0b565b9650614f9a83614eca565b925050600181019050614f7b565b505050505050565b6000614fbc8383614f59565b60408301905092915050565b6000602082019050919050565b614fde81614f2e565b614fe88184614f39565b9250614ff382614f44565b8060005b8381101561502457815161500b8782614fb0565b965061501683614fc8565b925050600181019050614ff7565b505050505050565b600060109050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b6150628161502c565b61506c8184615037565b925061507782615042565b8060005b838110156150a857815161508f8782613a0b565b965061509a8361504c565b92505060018101905061507b565b505050505050565b6000610300820190506150c66000830187614ed7565b6150d36040830186614fd5565b6150e060c0830185614ed7565b6150ee610100830184615059565b95945050505050565b60008151905061510681613aa2565b92915050565b60006020828403121561512257615121613476565b5b6000615130848285016150f7565b91505092915050565b7f496e76616c69642050726f6f6600000000000000000000000000000000000000600082015250565b600061516f600d83613546565b915061517a82615139565b602082019050919050565b6000602082019050818103600083015261519e81615162565b9050919050565b60006151b0826135ed565b91506151bb836135ed565b92508282039050818111156151d3576151d2614459565b5b92915050565b60006151e4826135ed565b91506151ef836135ed565b925082820190508082111561520757615206614459565b5b92915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261526f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82615232565b6152798683615232565b95508019841693508086168417925050509392505050565b60006152ac6152a76152a2846135ed565b613795565b6135ed565b9050919050565b6000819050919050565b6152c683615291565b6152da6152d2826152b3565b84845461523f565b825550505050565b600090565b6152ef6152e2565b6152fa8184846152bd565b505050565b5b8181101561531e576153136000826152e7565b600181019050615300565b5050565b601f821115615363576153348161520d565b61533d84615222565b8101602085101561534c578190505b61536061535885615222565b8301826152ff565b50505b505050565b600082821c905092915050565b600061538660001984600802615368565b1980831691505092915050565b600061539f8383615375565b9150826002028217905092915050565b6153b88261353b565b67ffffffffffffffff8111156153d1576153d061387d565b5b6153db8254614021565b6153e6828285615322565b600060209050601f8311600181146154195760008415615407578287015190505b6154118582615393565b865550615479565b601f1984166154278661520d565b60005b8281101561544f5784890151825560018201915060208501945060208101905061542a565b8683101561546c5784890151615468601f891682615375565b8355505b6001600288020188555050505b505050505050565b600081519050615490816135f7565b92915050565b6000602082840312156154ac576154ab613476565b5b60006154ba84828501615481565b91505092915050565b600060ff82169050919050565b60006154db826154c3565b915060ff82036154ee576154ed614459565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000615555602683613546565b9150615560826154f9565b604082019050919050565b6000602082019050818103600083015261558481615548565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006155e7602583613546565b91506155f28261558b565b604082019050919050565b60006020820190508181036000830152615616816155da565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615679602483613546565b91506156848261561d565b604082019050919050565b600060208201905081810360008301526156a88161566c565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006156e5602083613546565b91506156f0826156af565b602082019050919050565b60006020820190508181036000830152615714816156d8565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615751601983613546565b915061575c8261571b565b602082019050919050565b6000602082019050818103600083015261578081615744565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006157e3603283613546565b91506157ee82615787565b604082019050919050565b60006020820190508181036000830152615812816157d6565b9050919050565b600060408201905081810360008301526158338185613592565b905081810360208301526158478184613592565b90509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061588a826135ed565b9150615895836135ed565b9250826158a5576158a4615850565b5b828204905092915050565b60006158bb826135ed565b91506158c6836135ed565b92508282026158d4816135ed565b915082820484148315176158eb576158ea614459565b5b5092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615928602083613546565b9150615933826158f2565b602082019050919050565b600060208201905081810360008301526159578161591b565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615994601c83613546565b915061599f8261595e565b602082019050919050565b600060208201905081810360008301526159c381615987565b9050919050565b7f43616e6e6f74207472616e73666572202d2050726f6f66206f6620506173737060008201527f6f727420697320736f756c626f756e6400000000000000000000000000000000602082015250565b6000615a26603083613546565b9150615a31826159ca565b604082019050919050565b60006020820190508181036000830152615a5581615a19565b9050919050565b6000608082019050615a716000830187613682565b615a7e6020830186613682565b615a8b6040830185613718565b8181036060830152615a9d8184613f57565b905095945050505050565b600081519050615ab7816134ac565b92915050565b600060208284031215615ad357615ad2613476565b5b6000615ae184828501615aa8565b91505092915050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000615b46603583613546565b9150615b5182615aea565b604082019050919050565b60006020820190508181036000830152615b7581615b39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220fc7b3e1065ff76ed9c3e55279cd3a205fc1183775e22ad1efea30ad39c94a3cc64736f6c63430008120033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/app/deployments/addresses.json b/app/deployments/addresses.json new file mode 100644 index 00000000..19b48a62 --- /dev/null +++ b/app/deployments/addresses.json @@ -0,0 +1 @@ +{"ProofOfPassport":"0x7D459347d092D35f043f73021f06c19f834f8c3E","Groth16Verifier":"0x72d8Fb7Dd33c264b53D313ff3BF25D993c0AD050"} \ No newline at end of file diff --git a/app/index.js b/app/index.js new file mode 100644 index 00000000..a850d031 --- /dev/null +++ b/app/index.js @@ -0,0 +1,9 @@ +/** + * @format + */ + +import {AppRegistry} from 'react-native'; +import App from './App'; +import {name as appName} from './app.json'; + +AppRegistry.registerComponent(appName, () => App); diff --git a/app/ios/.xcode.env b/app/ios/.xcode.env new file mode 100644 index 00000000..3d5782c7 --- /dev/null +++ b/app/ios/.xcode.env @@ -0,0 +1,11 @@ +# This `.xcode.env` file is versioned and is used to source the environment +# used when running script phases inside Xcode. +# To customize your local environment, you can create an `.xcode.env.local` +# file that is not versioned. + +# NODE_BINARY variable contains the PATH to the node executable. +# +# Customize the NODE_BINARY variable here. +# For example, to use nvm with brew, add the following line +# . "$(brew --prefix nvm)/nvm.sh" --no-use +export NODE_BINARY=$(command -v node) diff --git a/app/ios/AwesomeProject-Bridging-Header.h b/app/ios/AwesomeProject-Bridging-Header.h new file mode 100644 index 00000000..2299b247 --- /dev/null +++ b/app/ios/AwesomeProject-Bridging-Header.h @@ -0,0 +1,5 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + +#import "React/RCTBridgeModule.h" diff --git a/app/ios/AwesomeProject.xcodeproj/project.pbxproj b/app/ios/AwesomeProject.xcodeproj/project.pbxproj new file mode 100644 index 00000000..1db696f4 --- /dev/null +++ b/app/ios/AwesomeProject.xcodeproj/project.pbxproj @@ -0,0 +1,712 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 00E356F31AD99517003FC87E /* AwesomeProjectTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* AwesomeProjectTests.m */; }; + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; }; + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; + 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; + 1ADA5CBFFFB043C12B3C4011 /* Pods_AwesomeProject.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F81894AE401F61E2393104D /* Pods_AwesomeProject.framework */; }; + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; }; + 905B70052A72767900AFA232 /* PassportReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 905B70042A72767900AFA232 /* PassportReader.swift */; }; + 905B70072A72774000AFA232 /* PassportReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 905B70062A72774000AFA232 /* PassportReader.m */; }; + 905B700B2A72A5E900AFA232 /* masterList.pem in Resources */ = {isa = PBXBuildFile; fileRef = 905B700A2A72A5E900AFA232 /* masterList.pem */; }; + D5B4CD952178B51C14F77614 /* Pods_AwesomeProject_AwesomeProjectTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 455B3F561C1D3D833AB15B26 /* Pods_AwesomeProject_AwesomeProjectTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = AwesomeProject; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 00E356EE1AD99517003FC87E /* AwesomeProjectTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AwesomeProjectTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 00E356F21AD99517003FC87E /* AwesomeProjectTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AwesomeProjectTests.m; sourceTree = ""; }; + 0D05C085F8CBAC104F72E160 /* Pods-AwesomeProject-AwesomeProjectTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AwesomeProject-AwesomeProjectTests.release.xcconfig"; path = "Target Support Files/Pods-AwesomeProject-AwesomeProjectTests/Pods-AwesomeProject-AwesomeProjectTests.release.xcconfig"; sourceTree = ""; }; + 13B07F961A680F5B00A75B9A /* AwesomeProject.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AwesomeProject.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = AwesomeProject/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = AwesomeProject/AppDelegate.mm; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AwesomeProject/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = AwesomeProject/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = AwesomeProject/main.m; sourceTree = ""; }; + 26A432E0434B89485C7E3765 /* Pods-AwesomeProject.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AwesomeProject.debug.xcconfig"; path = "Target Support Files/Pods-AwesomeProject/Pods-AwesomeProject.debug.xcconfig"; sourceTree = ""; }; + 455B3F561C1D3D833AB15B26 /* Pods_AwesomeProject_AwesomeProjectTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AwesomeProject_AwesomeProjectTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = AwesomeProject/LaunchScreen.storyboard; sourceTree = ""; }; + 905B70032A72767800AFA232 /* AwesomeProject-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AwesomeProject-Bridging-Header.h"; sourceTree = ""; }; + 905B70042A72767900AFA232 /* PassportReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PassportReader.swift; sourceTree = ""; }; + 905B70062A72774000AFA232 /* PassportReader.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PassportReader.m; sourceTree = ""; }; + 905B70082A729CD400AFA232 /* AwesomeProject.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; name = AwesomeProject.entitlements; path = AwesomeProject/AwesomeProject.entitlements; sourceTree = ""; }; + 905B700A2A72A5E900AFA232 /* masterList.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = masterList.pem; path = AwesomeProject/masterList.pem; sourceTree = ""; }; + 9F81894AE401F61E2393104D /* Pods_AwesomeProject.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AwesomeProject.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + A1B7A34F7E4C3F2D19C5D973 /* Pods-AwesomeProject.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AwesomeProject.release.xcconfig"; path = "Target Support Files/Pods-AwesomeProject/Pods-AwesomeProject.release.xcconfig"; sourceTree = ""; }; + BCC787E0FDFB928F9DA23E3F /* Pods-AwesomeProject-AwesomeProjectTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AwesomeProject-AwesomeProjectTests.debug.xcconfig"; path = "Target Support Files/Pods-AwesomeProject-AwesomeProjectTests/Pods-AwesomeProject-AwesomeProjectTests.debug.xcconfig"; sourceTree = ""; }; + ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 00E356EB1AD99517003FC87E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + D5B4CD952178B51C14F77614 /* Pods_AwesomeProject_AwesomeProjectTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1ADA5CBFFFB043C12B3C4011 /* Pods_AwesomeProject.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 00E356EF1AD99517003FC87E /* AwesomeProjectTests */ = { + isa = PBXGroup; + children = ( + 00E356F21AD99517003FC87E /* AwesomeProjectTests.m */, + 00E356F01AD99517003FC87E /* Supporting Files */, + ); + path = AwesomeProjectTests; + sourceTree = ""; + }; + 00E356F01AD99517003FC87E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 00E356F11AD99517003FC87E /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 13B07FAE1A68108700A75B9A /* AwesomeProject */ = { + isa = PBXGroup; + children = ( + 905B700A2A72A5E900AFA232 /* masterList.pem */, + 905B70082A729CD400AFA232 /* AwesomeProject.entitlements */, + 13B07FAF1A68108700A75B9A /* AppDelegate.h */, + 13B07FB01A68108700A75B9A /* AppDelegate.mm */, + 13B07FB51A68108700A75B9A /* Images.xcassets */, + 13B07FB61A68108700A75B9A /* Info.plist */, + 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */, + 13B07FB71A68108700A75B9A /* main.m */, + 905B70042A72767900AFA232 /* PassportReader.swift */, + 905B70032A72767800AFA232 /* AwesomeProject-Bridging-Header.h */, + 905B70062A72774000AFA232 /* PassportReader.m */, + ); + name = AwesomeProject; + sourceTree = ""; + }; + 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { + isa = PBXGroup; + children = ( + ED297162215061F000B7C4FE /* JavaScriptCore.framework */, + 9F81894AE401F61E2393104D /* Pods_AwesomeProject.framework */, + 455B3F561C1D3D833AB15B26 /* Pods_AwesomeProject_AwesomeProjectTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 832341AE1AAA6A7D00B99B32 /* Libraries */ = { + isa = PBXGroup; + children = ( + ); + name = Libraries; + sourceTree = ""; + }; + 83CBB9F61A601CBA00E9B192 = { + isa = PBXGroup; + children = ( + 13B07FAE1A68108700A75B9A /* AwesomeProject */, + 832341AE1AAA6A7D00B99B32 /* Libraries */, + 00E356EF1AD99517003FC87E /* AwesomeProjectTests */, + 83CBBA001A601CBA00E9B192 /* Products */, + 2D16E6871FA4F8E400B85C8A /* Frameworks */, + BBD78D7AC51CEA395F1C20DB /* Pods */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 83CBBA001A601CBA00E9B192 /* Products */ = { + isa = PBXGroup; + children = ( + 13B07F961A680F5B00A75B9A /* AwesomeProject.app */, + 00E356EE1AD99517003FC87E /* AwesomeProjectTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + BBD78D7AC51CEA395F1C20DB /* Pods */ = { + isa = PBXGroup; + children = ( + 26A432E0434B89485C7E3765 /* Pods-AwesomeProject.debug.xcconfig */, + A1B7A34F7E4C3F2D19C5D973 /* Pods-AwesomeProject.release.xcconfig */, + BCC787E0FDFB928F9DA23E3F /* Pods-AwesomeProject-AwesomeProjectTests.debug.xcconfig */, + 0D05C085F8CBAC104F72E160 /* Pods-AwesomeProject-AwesomeProjectTests.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 00E356ED1AD99517003FC87E /* AwesomeProjectTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "AwesomeProjectTests" */; + buildPhases = ( + 2CEEDB4F696405D4E4B0CA04 /* [CP] Check Pods Manifest.lock */, + 00E356EA1AD99517003FC87E /* Sources */, + 00E356EB1AD99517003FC87E /* Frameworks */, + 00E356EC1AD99517003FC87E /* Resources */, + 4786C99960C198CBC0841652 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 00E356F51AD99517003FC87E /* PBXTargetDependency */, + ); + name = AwesomeProjectTests; + productName = AwesomeProjectTests; + productReference = 00E356EE1AD99517003FC87E /* AwesomeProjectTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 13B07F861A680F5B00A75B9A /* AwesomeProject */ = { + isa = PBXNativeTarget; + buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "AwesomeProject" */; + buildPhases = ( + 141C3B9CB8F4134662795CF4 /* [CP] Check Pods Manifest.lock */, + FD10A7F022414F080027D42C /* Start Packager */, + 13B07F871A680F5B00A75B9A /* Sources */, + 13B07F8C1A680F5B00A75B9A /* Frameworks */, + 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + FAF2988CBB80C1B370711DF7 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AwesomeProject; + productName = AwesomeProject; + productReference = 13B07F961A680F5B00A75B9A /* AwesomeProject.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 83CBB9F71A601CBA00E9B192 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1210; + TargetAttributes = { + 00E356ED1AD99517003FC87E = { + CreatedOnToolsVersion = 6.2; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; + 13B07F861A680F5B00A75B9A = { + LastSwiftMigration = 1430; + }; + }; + }; + buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "AwesomeProject" */; + compatibilityVersion = "Xcode 12.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 83CBB9F61A601CBA00E9B192; + productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 13B07F861A680F5B00A75B9A /* AwesomeProject */, + 00E356ED1AD99517003FC87E /* AwesomeProjectTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 00E356EC1AD99517003FC87E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F8E1A680F5B00A75B9A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 905B700B2A72A5E900AFA232 /* masterList.pem in Resources */, + 81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */, + 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/.xcode.env.local", + "$(SRCROOT)/.xcode.env", + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\n\nWITH_ENVIRONMENT=\"../node_modules/react-native/scripts/xcode/with-environment.sh\"\nREACT_NATIVE_XCODE=\"../node_modules/react-native/scripts/react-native-xcode.sh\"\n\n/bin/sh -c \"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\"\n"; + }; + 141C3B9CB8F4134662795CF4 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-AwesomeProject-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 2CEEDB4F696405D4E4B0CA04 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-AwesomeProject-AwesomeProjectTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 4786C99960C198CBC0841652 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AwesomeProject-AwesomeProjectTests/Pods-AwesomeProject-AwesomeProjectTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AwesomeProject-AwesomeProjectTests/Pods-AwesomeProject-AwesomeProjectTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AwesomeProject-AwesomeProjectTests/Pods-AwesomeProject-AwesomeProjectTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + FAF2988CBB80C1B370711DF7 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AwesomeProject/Pods-AwesomeProject-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-AwesomeProject/Pods-AwesomeProject-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AwesomeProject/Pods-AwesomeProject-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + FD10A7F022414F080027D42C /* Start Packager */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Start Packager"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 00E356EA1AD99517003FC87E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00E356F31AD99517003FC87E /* AwesomeProjectTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 13B07F871A680F5B00A75B9A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */, + 13B07FC11A68108700A75B9A /* main.m in Sources */, + 905B70072A72774000AFA232 /* PassportReader.m in Sources */, + 905B70052A72767900AFA232 /* PassportReader.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* AwesomeProject */; + targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 00E356F61AD99517003FC87E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BCC787E0FDFB928F9DA23E3F /* Pods-AwesomeProject-AwesomeProjectTests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = AwesomeProjectTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AwesomeProject.app/AwesomeProject"; + }; + name = Debug; + }; + 00E356F71AD99517003FC87E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0D05C085F8CBAC104F72E160 /* Pods-AwesomeProject-AwesomeProjectTests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + COPY_PHASE_STRIP = NO; + INFOPLIST_FILE = AwesomeProjectTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + OTHER_LDFLAGS = ( + "-ObjC", + "-lc++", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AwesomeProject.app/AwesomeProject"; + }; + name = Release; + }; + 13B07F941A680F5B00A75B9A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 26A432E0434B89485C7E3765 /* Pods-AwesomeProject.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = AwesomeProject/AwesomeProject.entitlements; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = G46U6J456T; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = AwesomeProject/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.warroom.nfcios; + PRODUCT_NAME = AwesomeProject; + SWIFT_OBJC_BRIDGING_HEADER = "AwesomeProject-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 13B07F951A680F5B00A75B9A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A1B7A34F7E4C3F2D19C5D973 /* Pods-AwesomeProject.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = AwesomeProject/AwesomeProject.entitlements; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = G46U6J456T; + INFOPLIST_FILE = AwesomeProject/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-lc++", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.warroom.nfcios; + PRODUCT_NAME = AwesomeProject; + SWIFT_OBJC_BRIDGING_HEADER = "AwesomeProject-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; + 83CBBA201A601CBA00E9B192 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", + ); + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = "$(inherited)"; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 83CBBA211A601CBA00E9B192 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_CXX_LANGUAGE_STANDARD = "c++17"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core", + "${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers/platform/ios", + "${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers", + "${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios", + ); + IPHONEOS_DEPLOYMENT_TARGET = 12.4; + LD_RUNPATH_SEARCH_PATHS = ( + /usr/lib/swift, + "$(inherited)", + ); + LIBRARY_SEARCH_PATHS = ( + "\"$(SDKROOT)/usr/lib/swift\"", + "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", + "\"$(inherited)\"", + ); + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_CFLAGS = "$(inherited)"; + OTHER_CPLUSPLUSFLAGS = ( + "$(OTHER_CFLAGS)", + "-DFOLLY_NO_CONFIG", + "-DFOLLY_MOBILE=1", + "-DFOLLY_USE_LIBCPP=1", + ); + REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "AwesomeProjectTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00E356F61AD99517003FC87E /* Debug */, + 00E356F71AD99517003FC87E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "AwesomeProject" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 13B07F941A680F5B00A75B9A /* Debug */, + 13B07F951A680F5B00A75B9A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "AwesomeProject" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 83CBBA201A601CBA00E9B192 /* Debug */, + 83CBBA211A601CBA00E9B192 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; +} diff --git a/app/ios/AwesomeProject.xcodeproj/xcshareddata/xcschemes/AwesomeProject.xcscheme b/app/ios/AwesomeProject.xcodeproj/xcshareddata/xcschemes/AwesomeProject.xcscheme new file mode 100644 index 00000000..20f13d11 --- /dev/null +++ b/app/ios/AwesomeProject.xcodeproj/xcshareddata/xcschemes/AwesomeProject.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/ios/AwesomeProject.xcworkspace/contents.xcworkspacedata b/app/ios/AwesomeProject.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..575b8628 --- /dev/null +++ b/app/ios/AwesomeProject.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/app/ios/AwesomeProject.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/app/ios/AwesomeProject.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/app/ios/AwesomeProject.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/app/ios/AwesomeProject/AES_3DES_DESEncryption.swift b/app/ios/AwesomeProject/AES_3DES_DESEncryption.swift new file mode 100644 index 00000000..ddd33109 --- /dev/null +++ b/app/ios/AwesomeProject/AES_3DES_DESEncryption.swift @@ -0,0 +1,368 @@ +import Foundation +import CommonCrypto + + +/// Encrypts a message using AES/CBC/NOPADDING with a specified key and initialisation vector +/// - Parameter key: Key use to encrypt +/// - Parameter message: Message to encrypt +/// - Parameter iv: Initialisation vector +@available(iOS 13, macOS 10.15, *) +public func AESEncrypt(key:[UInt8], message:[UInt8], iv:[UInt8]) -> [UInt8] { + + let dataLength = message.count + + let cryptLen = message.count + kCCBlockSizeAES128 + var cryptData = Data(count: cryptLen) + + let keyLength = size_t(key.count) + let operation: CCOperation = CCOperation(kCCEncrypt) + let algorithm: CCAlgorithm = CCAlgorithm(kCCAlgorithmAES) + let options: CCOptions = CCOptions(0) + + var numBytesEncrypted = 0 + + var cryptStatus: CCCryptorStatus = CCCryptorStatus(kCCSuccess) + key.withUnsafeBytes {keyBytes in + message.withUnsafeBytes{ dataBytes in + iv.withUnsafeBytes{ ivBytes in + cryptData.withUnsafeMutableBytes{ cryptBytes in + + cryptStatus = CCCrypt(operation, + algorithm, + options, + keyBytes.baseAddress, + keyLength, + ivBytes.baseAddress, + dataBytes.baseAddress, + dataLength, + cryptBytes.bindMemory(to: UInt8.self).baseAddress, + cryptLen, + &numBytesEncrypted) + + } + } + } + } + + if cryptStatus == kCCSuccess { + cryptData.count = Int(numBytesEncrypted) + + return [UInt8](cryptData) + } else { + Log.error("AES Encrypt Error: \(cryptStatus)") + } + return [] +} + +/// Decrypts a message using AES/CBC/NOPADDING with a specified key and initialisation vector +/// - Parameter key: Key use to decrypt +/// - Parameter message: Message to decrypt +/// - Parameter iv: Initialisation vector +@available(iOS 13, macOS 10.15, *) +public func AESDecrypt(key:[UInt8], message:[UInt8], iv:[UInt8]) -> [UInt8] { + var fixedKey = key + if key.count == 16 { + fixedKey += key[0..<8] + } + + let data = Data(message) + let dataLength = message.count + + let cryptLen = data.count + kCCBlockSizeAES128 + var cryptData = Data(count: cryptLen) + + let keyLength = size_t(key.count) + let operation: CCOperation = UInt32(kCCDecrypt) + let algorithm: CCAlgorithm = UInt32(kCCAlgorithmAES) + let options: CCOptions = UInt32(0) + + var numBytesEncrypted = 0 + + let cryptStatus = fixedKey.withUnsafeBytes {keyBytes in + message.withUnsafeBytes{ dataBytes in + cryptData.withUnsafeMutableBytes{ cryptBytes in + CCCrypt(operation, + algorithm, + options, + keyBytes.baseAddress, + keyLength, + iv, + dataBytes.baseAddress, + dataLength, + cryptBytes.bindMemory(to: UInt8.self).baseAddress, + cryptLen, + &numBytesEncrypted) + + } + } + } + + if cryptStatus == kCCSuccess { + cryptData.count = Int(numBytesEncrypted) + + return [UInt8](cryptData) + } else { + Log.error("AES Decrypt Error: \(cryptStatus)") + } + return [] +} + +/// Decrypts a message using AES/ECB/NOPADDING with a specified key and initialisation vector +/// - Parameter key: Key use to decrypt +/// - Parameter message: Message to decrypt +/// - Parameter iv: Initialisation vector +@available(iOS 13, macOS 10.15, *) +public func AESECBEncrypt(key:[UInt8], message:[UInt8]) -> [UInt8] { + + let dataLength = message.count + + let cryptLen = message.count + kCCBlockSizeAES128 + var cryptData = Data(count: cryptLen) + + let keyLength = size_t(key.count) + let operation: CCOperation = CCOperation(kCCEncrypt) + let algorithm: CCAlgorithm = CCAlgorithm(kCCAlgorithmAES) + let options: CCOptions = CCOptions(kCCOptionECBMode) + + var numBytesEncrypted = 0 + + let cryptStatus = key.withUnsafeBytes {keyBytes in + message.withUnsafeBytes{ dataBytes in + cryptData.withUnsafeMutableBytes{ cryptBytes in + + CCCrypt(operation, + algorithm, + options, + keyBytes.baseAddress, + keyLength, + nil, + dataBytes.baseAddress, + dataLength, + cryptBytes.bindMemory(to: UInt8.self).baseAddress, + cryptLen, + &numBytesEncrypted) + + } + } + } + + if cryptStatus == kCCSuccess { + cryptData.count = Int(numBytesEncrypted) + + return [UInt8](cryptData) + } else { + Log.error("AESECBEncrypt Error: \(cryptStatus)") + } + return [] +} + +/// Encrypts a message using DES3 with a specified key and initialisation vector +/// - Parameter key: Key use to encrypt +/// - Parameter message: Message to encrypt +/// - Parameter iv: Initialisation vector +@available(iOS 13, macOS 10.15, *) +public func tripleDESEncrypt(key:[UInt8], message:[UInt8], iv:[UInt8]) -> [UInt8] { + // Fix key data - if length is 16 then take the first 98 bytes and append them to the end to make 24 bytes + var fixedKey = key + if key.count == 16 { + fixedKey += key[0..<8] + } + + let dataLength = message.count + + let cryptLen = message.count + kCCBlockSize3DES + var cryptData = Data(count: cryptLen) + + let keyLength = size_t(kCCKeySize3DES) + let operation: CCOperation = UInt32(kCCEncrypt) + let algorithm: CCAlgorithm = UInt32(kCCAlgorithm3DES) + let options: CCOptions = UInt32(0) + + var numBytesEncrypted = 0 + + let cryptStatus = fixedKey.withUnsafeBytes {keyBytes in + message.withUnsafeBytes{ dataBytes in + iv.withUnsafeBytes{ ivBytes in + cryptData.withUnsafeMutableBytes{ cryptBytes in + CCCrypt(operation, + algorithm, + options, + keyBytes.baseAddress, + keyLength, + ivBytes.baseAddress, + dataBytes.baseAddress, + dataLength, + cryptBytes.bindMemory(to: UInt8.self).baseAddress, + cryptLen, + &numBytesEncrypted) + + } + } + } + } + + if cryptStatus == kCCSuccess { + cryptData.count = Int(numBytesEncrypted) + + return [UInt8](cryptData) + } else { + Log.error("Error: \(cryptStatus)") + } + return [] +} + +/// Decrypts a message using DES3 with a specified key and initialisation vector +/// - Parameter key: Key use to decrypt +/// - Parameter message: Message to decrypt +/// - Parameter iv: Initialisation vector +@available(iOS 13, macOS 10.15, *) +public func tripleDESDecrypt(key:[UInt8], message:[UInt8], iv:[UInt8]) -> [UInt8] { + var fixedKey = key + if key.count == 16 { + fixedKey += key[0..<8] + } + + let data = Data(message) + let dataLength = message.count + + let cryptLen = data.count + kCCBlockSize3DES + var cryptData = Data(count: cryptLen) + + let keyLength = size_t(kCCKeySize3DES) + let operation: CCOperation = UInt32(kCCDecrypt) + let algorithm: CCAlgorithm = UInt32(kCCAlgorithm3DES) + let options: CCOptions = UInt32(0) + + var numBytesEncrypted = 0 + + let cryptStatus = fixedKey.withUnsafeBytes {keyBytes in + message.withUnsafeBytes{ dataBytes in + cryptData.withUnsafeMutableBytes{ cryptBytes in + CCCrypt(operation, + algorithm, + options, + keyBytes.baseAddress, + keyLength, + iv, + dataBytes.baseAddress, + dataLength, + cryptBytes.bindMemory(to: UInt8.self).baseAddress, + cryptLen, + &numBytesEncrypted) + + } + } + } + + if cryptStatus == kCCSuccess { + cryptData.count = Int(numBytesEncrypted) + + return [UInt8](cryptData) + } else { + Log.error("Error: \(cryptStatus)") + } + return [] +} + + +/// Encrypts a message using DES with a specified key and initialisation vector +/// - Parameter key: Key use to encrypt +/// - Parameter message: Message to encrypt +/// - Parameter iv: Initialisation vector +/// - Parameter options: Encryption options to use +@available(iOS 13, macOS 10.15, *) +public func DESEncrypt(key:[UInt8], message:[UInt8], iv:[UInt8], options:UInt32 = 0) -> [UInt8] { + + let dataLength = message.count + + let cryptLen = message.count + kCCBlockSizeDES + var cryptData = Data(count: cryptLen) + + let keyLength = size_t(kCCKeySizeDES) + let operation: CCOperation = UInt32(kCCEncrypt) + let algorithm: CCAlgorithm = UInt32(kCCAlgorithmDES) + let options: CCOptions = options + + var numBytesEncrypted = 0 + + let cryptStatus = key.withUnsafeBytes {keyBytes in + message.withUnsafeBytes{ dataBytes in + iv.withUnsafeBytes{ ivBytes in + cryptData.withUnsafeMutableBytes{ cryptBytes in + CCCrypt(operation, + algorithm, + options, + keyBytes.baseAddress, + keyLength, + ivBytes.baseAddress, + dataBytes.baseAddress, + dataLength, + cryptBytes.bindMemory(to: UInt8.self).baseAddress, + cryptLen, + &numBytesEncrypted) + + } + } + } + } + + if cryptStatus == kCCSuccess { + cryptData.count = Int(numBytesEncrypted) + + return [UInt8](cryptData) + } else { + Log.error("Error: \(cryptStatus)") + } + return [] +} + +/// Decrypts a message using DES with a specified key and initialisation vector +/// - Parameter key: Key use to decrypt +/// - Parameter message: Message to decrypt +/// - Parameter iv: Initialisation vector +/// - Parameter options: Decryption options to use +@available(iOS 13, macOS 10.15, *) +public func DESDecrypt(key:[UInt8], message:[UInt8], iv:[UInt8], options:UInt32 = 0) -> [UInt8] { + + let dataLength = message.count + + let cryptLen = message.count + kCCBlockSizeDES + var cryptData = Data(count: cryptLen) + + let keyLength = size_t(kCCKeySizeDES) + let operation: CCOperation = UInt32(kCCDecrypt) + let algorithm: CCAlgorithm = UInt32(kCCAlgorithmDES) + let options: CCOptions = options + + var numBytesEncrypted = 0 + + let cryptStatus = key.withUnsafeBytes {keyBytes in + message.withUnsafeBytes{ dataBytes in + iv.withUnsafeBytes{ ivBytes in + cryptData.withUnsafeMutableBytes{ cryptBytes in + CCCrypt(operation, + algorithm, + options, + keyBytes.baseAddress, + keyLength, + nil, + dataBytes.baseAddress, + dataLength, + cryptBytes.bindMemory(to: UInt8.self).baseAddress, + cryptLen, + &numBytesEncrypted) + + } + } + } + } + + if cryptStatus == kCCSuccess { + cryptData.count = Int(numBytesEncrypted) + + return [UInt8](cryptData) + } else { + Log.error("Error: \(cryptStatus)") + } + return [] +} diff --git a/app/ios/AwesomeProject/AppDelegate.h b/app/ios/AwesomeProject/AppDelegate.h new file mode 100644 index 00000000..5d280825 --- /dev/null +++ b/app/ios/AwesomeProject/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : RCTAppDelegate + +@end diff --git a/app/ios/AwesomeProject/AppDelegate.mm b/app/ios/AwesomeProject/AppDelegate.mm new file mode 100644 index 00000000..2cacdcb6 --- /dev/null +++ b/app/ios/AwesomeProject/AppDelegate.mm @@ -0,0 +1,26 @@ +#import "AppDelegate.h" + +#import + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.moduleName = @"AwesomeProject"; + // You can add your custom initial props in the dictionary below. + // They will be passed down to the ViewController used by React Native. + self.initialProps = @{}; + + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ +#if DEBUG + return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; +#else + return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; +#endif +} + +@end diff --git a/app/ios/AwesomeProject/AwesomeProject.entitlements b/app/ios/AwesomeProject/AwesomeProject.entitlements new file mode 100644 index 00000000..2bb4dee1 --- /dev/null +++ b/app/ios/AwesomeProject/AwesomeProject.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.developer.nfc.readersession.formats + + TAG + + + diff --git a/app/ios/AwesomeProject/DataGroups/ActiveAuthenticationInfo.swift b/app/ios/AwesomeProject/DataGroups/ActiveAuthenticationInfo.swift new file mode 100644 index 00000000..df627f08 --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/ActiveAuthenticationInfo.swift @@ -0,0 +1,62 @@ +import Foundation + +@available(iOS 13, macOS 10.15, *) +public class ActiveAuthenticationInfo : SecurityInfo { + + var oid : String + var version : Int + var signatureAlgorithmOID : String? + + static func checkRequiredIdentifier(_ oid : String) -> Bool { + return ID_AA_OID == oid + } + + init(oid: String, version: Int, signatureAlgorithmOID: String? = nil) { + self.oid = oid + self.version = version + self.signatureAlgorithmOID = signatureAlgorithmOID + } + + public override func getObjectIdentifier() -> String { + return oid + } + + public override func getProtocolOIDString() -> String { + return ActiveAuthenticationInfo.toProtocolOIDString(oid:oid) + } + + public func getSignatureAlgorithmOIDString() -> String? { + return ActiveAuthenticationInfo.toSignatureAlgorithmOIDString(oid: signatureAlgorithmOID) + } + + private static func toProtocolOIDString(oid : String) -> String { + if ID_AA_OID == oid { + return "id-AA" + } + + return oid + } + + private static func toSignatureAlgorithmOIDString(oid: String?) -> String? { + if (ECDSA_PLAIN_SHA1_OID == oid) { + return "ecdsa-plain-SHA1"; + } + if (ECDSA_PLAIN_SHA224_OID == oid) { + return "ecdsa-plain-SHA224"; + } + if (ECDSA_PLAIN_SHA256_OID == oid) { + return "ecdsa-plain-SHA256"; + } + if (ECDSA_PLAIN_SHA384_OID == oid) { + return "ecdsa-plain-SHA384"; + } + if (ECDSA_PLAIN_SHA512_OID == oid) { + return "ecdsa-plain-SHA512"; + } + if (ECDSA_PLAIN_RIPEMD160_OID == oid) { + return "ecdsa-plain-RIPEMD160"; + } + + return nil + } +} diff --git a/app/ios/AwesomeProject/DataGroups/COM.swift b/app/ios/AwesomeProject/DataGroups/COM.swift new file mode 100644 index 00000000..d5cb5383 --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/COM.swift @@ -0,0 +1,59 @@ +import Foundation + +@available(iOS 13, macOS 10.15, *) +public class COM : DataGroup { + public private(set) var version : String = "Unknown" + public private(set) var unicodeVersion : String = "Unknown" + public private(set) var dataGroupsPresent : [String] = [] + + required init( _ data : [UInt8] ) throws { + try super.init(data) + datagroupType = .COM + } + + override func parse(_ data: [UInt8]) throws { + var tag = try getNextTag() + if tag != 0x5F01 { + throw NFCPassportReaderError.InvalidResponse + } + + // Version is 4 bytes (ascii) - AABB + // AA is major number, BB is minor number + // e.g. 48 49 48 55 -> 01 07 -> 1.7 + var versionBytes = try getNextValue() + if versionBytes.count == 4 { + let aa = Int( String(cString: Array(versionBytes[0..<2] + [0]) )) ?? -1 + let bb = Int( String(cString: Array(versionBytes[2...] + [0])) ) ?? -1 + if aa != -1 && bb != -1 { + version = "\(aa).\(bb)" + } + } + tag = try getNextTag() + if tag != 0x5F36 { + throw NFCPassportReaderError.InvalidResponse + } + + versionBytes = try getNextValue() + if versionBytes.count == 6 { + let aa = Int( String(cString: Array(versionBytes[0..<2] + [0])) ) ?? -1 + let bb = Int( String(cString: Array(versionBytes[2..<4] + [0])) ) ?? -1 + let cc = Int( String(cString: Array(versionBytes[4...]) + [0]) ) ?? -1 + if aa != -1 && bb != -1 && cc != -1 { + unicodeVersion = "\(aa).\(bb).\(cc)" + } + } + + tag = try getNextTag() + if tag != 0x5C { + throw NFCPassportReaderError.InvalidResponse + } + + let vals = try getNextValue() + for v in vals { + if let index = DataGroupParser.tags.firstIndex(of: v) { + dataGroupsPresent.append( DataGroupParser.dataGroupNames[index] ) + } + } + Log.debug( "DG Found - \(dataGroupsPresent)" ) + } +} diff --git a/app/ios/AwesomeProject/DataGroups/CardAccess.swift b/app/ios/AwesomeProject/DataGroups/CardAccess.swift new file mode 100644 index 00000000..f8759ea4 --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/CardAccess.swift @@ -0,0 +1,31 @@ +import Foundation + +// SecurityInfos ::= SET of SecurityInfo +// SecurityInfo ::= SEQUENCE { +// protocol OBJECT IDENTIFIER, +// requiredData ANY DEFINED BY protocol, +// optionalData ANY DEFINED BY protocol OPTIONAL +@available(iOS 13, macOS 10.15, *) +public class CardAccess { + private var asn1 : ASN1Item! + public private(set) var securityInfos : [SecurityInfo] = [SecurityInfo]() + + var paceInfo : PACEInfo? { + get { + return (securityInfos.filter { ($0 as? PACEInfo) != nil }).first as? PACEInfo + } + } + + required init( _ data : [UInt8] ) throws { + let p = SimpleASN1DumpParser() + asn1 = try p.parse(data: Data(data)) + + // Bit of a hack at the moment - passing in the body - if we had a decent ASN1 parser then this would be better! ;) + for i in 0 ..< asn1.getNumberOfChildren() { + if let child = asn1.getChild(i), + let secInfo = SecurityInfo.getInstance( object:child, body : data ) { + securityInfos.append(secInfo) + } + } + } +} diff --git a/app/ios/AwesomeProject/DataGroups/ChipAuthenticationInfo.swift b/app/ios/AwesomeProject/DataGroups/ChipAuthenticationInfo.swift new file mode 100644 index 00000000..7eda04a3 --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/ChipAuthenticationInfo.swift @@ -0,0 +1,128 @@ +import Foundation + +@available(iOS 13, macOS 10.15, *) +public class ChipAuthenticationInfo : SecurityInfo { + + var oid : String + var version : Int + var keyId : Int? + + static func checkRequiredIdentifier(_ oid : String) -> Bool { + return ID_CA_DH_3DES_CBC_CBC_OID == oid + || ID_CA_ECDH_3DES_CBC_CBC_OID == oid + || ID_CA_DH_AES_CBC_CMAC_128_OID == oid + || ID_CA_DH_AES_CBC_CMAC_192_OID == oid + || ID_CA_DH_AES_CBC_CMAC_256_OID == oid + || ID_CA_ECDH_AES_CBC_CMAC_128_OID == oid + || ID_CA_ECDH_AES_CBC_CMAC_192_OID == oid + || ID_CA_ECDH_AES_CBC_CMAC_256_OID == oid + } + + init(oid: String, version: Int, keyId: Int? = nil) { + self.oid = oid + self.version = version + self.keyId = keyId + } + + public override func getObjectIdentifier() -> String { + return oid + } + + public override func getProtocolOIDString() -> String { + return ChipAuthenticationInfo.toProtocolOIDString(oid:oid) + } + + // The keyid refers to a specific key if there are multiple otherwise if not set, only one key is present so set to 0 + public func getKeyId() -> Int { + return keyId ?? 0 + } + + /// Returns the key agreement algorithm - DH or ECDH for the given Chip Authentication oid + /// - Parameter oid: the object identifier + /// - Returns: key agreement algorithm + /// - Throws: InvalidDataPassed error if invalid oid specified + public static func toKeyAgreementAlgorithm( oid : String ) throws -> String { + if ID_CA_DH_3DES_CBC_CBC_OID == oid + || ID_CA_DH_AES_CBC_CMAC_128_OID == oid + || ID_CA_DH_AES_CBC_CMAC_192_OID == oid + || ID_CA_DH_AES_CBC_CMAC_256_OID == oid { + return "DH"; + } else if ID_CA_ECDH_3DES_CBC_CBC_OID == oid + || ID_CA_ECDH_AES_CBC_CMAC_128_OID == oid + || ID_CA_ECDH_AES_CBC_CMAC_192_OID == oid + || ID_CA_ECDH_AES_CBC_CMAC_256_OID == oid { + return "ECDH"; + } + + throw NFCPassportReaderError.InvalidDataPassed( "Unable to lookup key agreement algorithm - invalid oid" ) + } + + /// Returns the cipher algorithm - DESede or AES for the given Chip Authentication oid + /// - Parameter oid: the object identifier + /// - Returns: the cipher algorithm type + /// - Throws: InvalidDataPassed error if invalid oid specified + public static func toCipherAlgorithm( oid : String ) throws -> String { + if ID_CA_DH_3DES_CBC_CBC_OID == oid + || ID_CA_ECDH_3DES_CBC_CBC_OID == oid { + return "DESede"; + } else if ID_CA_DH_AES_CBC_CMAC_128_OID == oid + || ID_CA_DH_AES_CBC_CMAC_192_OID == oid + || ID_CA_DH_AES_CBC_CMAC_256_OID == oid + || ID_CA_ECDH_AES_CBC_CMAC_128_OID == oid + || ID_CA_ECDH_AES_CBC_CMAC_192_OID == oid + || ID_CA_ECDH_AES_CBC_CMAC_256_OID == oid { + return "AES"; + } + throw NFCPassportReaderError.InvalidDataPassed( "Unable to lookup cipher algorithm - invalid oid" ) + } + + /// Returns the key length in bits (128, 192, or 256) for the given Chip Authentication oid + /// - Parameter oid: the object identifier + /// - Returns: the key length in bits + /// - Throws: InvalidDataPassed error if invalid oid specified + public static func toKeyLength( oid : String ) throws -> Int { + if ID_CA_DH_3DES_CBC_CBC_OID == oid + || ID_CA_ECDH_3DES_CBC_CBC_OID == oid + || ID_CA_DH_AES_CBC_CMAC_128_OID == oid + || ID_CA_ECDH_AES_CBC_CMAC_128_OID == oid { + return 128; + } else if ID_CA_DH_AES_CBC_CMAC_192_OID == oid + || ID_CA_ECDH_AES_CBC_CMAC_192_OID == oid { + return 192; + } else if ID_CA_DH_AES_CBC_CMAC_256_OID == oid + || ID_CA_ECDH_AES_CBC_CMAC_256_OID == oid { + return 256; + } + + throw NFCPassportReaderError.InvalidDataPassed( "Unable to get key length - invalid oid" ) + } + + private static func toProtocolOIDString(oid : String) -> String { + if ID_CA_DH_3DES_CBC_CBC_OID == oid { + return "id-CA-DH-3DES-CBC-CBC" + } + if ID_CA_DH_AES_CBC_CMAC_128_OID == oid { + return "id-CA-DH-AES-CBC-CMAC-128" + } + if ID_CA_DH_AES_CBC_CMAC_192_OID == oid { + return "id-CA-DH-AES-CBC-CMAC-192" + } + if ID_CA_DH_AES_CBC_CMAC_256_OID == oid { + return "id-CA-DH-AES-CBC-CMAC-256" + } + if ID_CA_ECDH_3DES_CBC_CBC_OID == oid { + return "id-CA-ECDH-3DES-CBC-CBC" + } + if ID_CA_ECDH_AES_CBC_CMAC_128_OID == oid { + return "id-CA-ECDH-AES-CBC-CMAC-128" + } + if ID_CA_ECDH_AES_CBC_CMAC_192_OID == oid { + return "id-CA-ECDH-AES-CBC-CMAC-192" + } + if ID_CA_ECDH_AES_CBC_CMAC_256_OID == oid { + return "id-CA-ECDH-AES-CBC-CMAC-256" + } + + return oid + } +} diff --git a/app/ios/AwesomeProject/DataGroups/ChipAuthenticationPublicKeyInfo.swift b/app/ios/AwesomeProject/DataGroups/ChipAuthenticationPublicKeyInfo.swift new file mode 100644 index 00000000..7f989c5b --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/ChipAuthenticationPublicKeyInfo.swift @@ -0,0 +1,46 @@ +import Foundation + +@available(iOS 13, macOS 10.15, *) +public class ChipAuthenticationPublicKeyInfo : SecurityInfo { + var oid : String + var pubKey : OpaquePointer + var keyId : Int? + + + static func checkRequiredIdentifier(_ oid : String) -> Bool { + return ID_PK_DH_OID == oid + || ID_PK_ECDH_OID == oid + } + + init(oid:String, pubKey:OpaquePointer, keyId: Int? = nil) { + self.oid = oid + self.pubKey = pubKey + self.keyId = keyId + } + + public override func getObjectIdentifier() -> String { + return oid + } + + public override func getProtocolOIDString() -> String { + return ChipAuthenticationPublicKeyInfo.toProtocolOIDString(oid:oid) + } + + // The keyid refers to a specific key if there are multiple otherwise if not set, only one key is present so set to 0 + public func getKeyId() -> Int { + return keyId ?? 0 + } + + + private static func toProtocolOIDString(oid : String) -> String { + if ID_PK_DH_OID == oid { + return "id-PK-DH" + } + if ID_PK_ECDH_OID == oid { + return "id-PK-ECDH" + } + + return oid + } + +} diff --git a/app/ios/AwesomeProject/DataGroups/DataGroup.swift b/app/ios/AwesomeProject/DataGroups/DataGroup.swift new file mode 100644 index 00000000..3719fa8f --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/DataGroup.swift @@ -0,0 +1,78 @@ +import Foundation + +@available(iOS 13, macOS 10.15, *) +public class DataGroup { + public var datagroupType : DataGroupId = .Unknown + + /// Body contains the actual data + public private(set) var body : [UInt8] = [] + + /// Data contains the whole DataGroup data (as that is what the hash is calculated from + public private(set) var data : [UInt8] = [] + + var pos = 0 + + required init( _ data : [UInt8] ) throws { + self.data = data + + // Skip the first byte which is the header byte + pos = 1 + let _ = try getNextLength() + self.body = [UInt8](data[pos...]) + + try parse(data) + } + + func parse( _ data:[UInt8] ) throws { + } + + func getNextTag() throws -> Int { + var tag = 0 + + // Fix for some passports that may have invalid data - ensure that we do have data! + guard data.count > pos else { + throw NFCPassportReaderError.TagNotValid + } + + if binToHex(data[pos]) & 0x0F == 0x0F { + tag = Int(binToHex(data[pos.. Int { + let end = pos+4 < data.count ? pos+4 : data.count + let (len, lenOffset) = try asn1Length([UInt8](data[pos.. [UInt8] { + let length = try getNextLength() + let value = [UInt8](data[pos ..< pos+length]) + pos += length + return value + } + + public func hash( _ hashAlgorythm: String ) -> [UInt8] { + var ret : [UInt8] = [] + if hashAlgorythm == "SHA1" { + ret = calcSHA1Hash(self.data) + } else if hashAlgorythm == "SHA224" { + ret = calcSHA224Hash(self.data) + } else if hashAlgorythm == "SHA256" { + ret = calcSHA256Hash(self.data) + } else if hashAlgorythm == "SHA384" { + ret = calcSHA384Hash(self.data) + } else if hashAlgorythm == "SHA512" { + ret = calcSHA512Hash(self.data) + } + + return ret + } + +} diff --git a/app/ios/AwesomeProject/DataGroups/DataGroup1.swift b/app/ios/AwesomeProject/DataGroups/DataGroup1.swift new file mode 100644 index 00000000..a0cd8087 --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/DataGroup1.swift @@ -0,0 +1,108 @@ + +import Foundation + +@available(iOS 13, macOS 10.15, *) +public enum DocTypeEnum: String { + case TD1 + case TD2 + case OTHER + + var desc: String { + get { + return self.rawValue + } + } +} + +@available(iOS 13, macOS 10.15, *) +public class DataGroup1 : DataGroup { + + public private(set) var elements : [String:String] = [:] + + required init( _ data : [UInt8] ) throws { + try super.init(data) + datagroupType = .DG1 + } + + override func parse(_ data: [UInt8]) throws { + let tag = try getNextTag() + if tag != 0x5F1F { + throw NFCPassportReaderError.InvalidResponse + } + let body = try getNextValue() + let docType = getMRZType(length:body.count) + + switch docType { + case .TD1: + self.parseTd1(body) + case .TD2: + self.parseTd2(body) + default: + self.parseOther(body) + } + + // Store MRZ data + elements["5F1F"] = String(bytes: body, encoding:.utf8) + } + + func parseTd1(_ data : [UInt8]) { + elements["5F03"] = String(bytes: data[0..<2], encoding:.utf8) + elements["5F28"] = String( bytes:data[2..<5], encoding:.utf8) + elements["5A"] = String( bytes:data[5..<14], encoding:.utf8) + elements["5F04"] = String( bytes:data[14..<15], encoding:.utf8) + elements["53"] = (String( bytes:data[15..<30], encoding:.utf8) ?? "") + + (String( bytes:data[48..<59], encoding:.utf8) ?? "") + elements["5F57"] = String( bytes:data[30..<36], encoding:.utf8) + elements["5F05"] = String( bytes:data[36..<37], encoding:.utf8) + elements["5F35"] = String( bytes:data[37..<38], encoding:.utf8) + elements["59"] = String( bytes:data[38..<44], encoding:.utf8) + elements["5F06"] = String( bytes:data[44..<45], encoding:.utf8) + elements["5F2C"] = String( bytes:data[45..<48], encoding:.utf8) + elements["5F07"] = String( bytes:data[59..<60], encoding:.utf8) + elements["5B"] = String( bytes:data[60...], encoding:.utf8) + } + + func parseTd2(_ data : [UInt8]) { + elements["5F03"] = String( bytes:data[0..<2], encoding:.utf8) + elements["5F28"] = String( bytes:data[2..<5], encoding:.utf8) + elements["5B"] = String( bytes:data[5..<36], encoding:.utf8) + elements["5A"] = String( bytes:data[36..<45], encoding:.utf8) + elements["5F04"] = String( bytes:data[45..<46], encoding:.utf8) + elements["5F2C"] = String( bytes:data[46..<49], encoding:.utf8) + elements["5F57"] = String( bytes:data[49..<55], encoding:.utf8) + elements["5F05"] = String( bytes:data[55..<56], encoding:.utf8) + elements["5F35"] = String( bytes:data[56..<57], encoding:.utf8) + elements["59"] = String( bytes:data[57..<63], encoding:.utf8) + elements["5F06"] = String( bytes:data[63..<64], encoding:.utf8) + elements["53"] = String( bytes:data[64..<71], encoding:.utf8) + elements["5F07"] = String( bytes:data[71..<72], encoding:.utf8) + } + + func parseOther(_ data : [UInt8]) { + elements["5F03"] = String( bytes:data[0..<2], encoding:.utf8) + elements["5F28"] = String( bytes:data[2..<5], encoding:.utf8) + elements["5B"] = String( bytes:data[5..<44], encoding:.utf8) + elements["5A"] = String( bytes:data[44..<53], encoding:.utf8) + elements["5F04"] = String( bytes:[data[53]], encoding:.utf8) + elements["5F2C"] = String( bytes:data[54..<57], encoding:.utf8) + elements["5F57"] = String( bytes:data[57..<63], encoding:.utf8) + elements["5F05"] = String( bytes:[data[63]], encoding:.utf8) + elements["5F35"] = String( bytes:[data[64]], encoding:.utf8) + elements["59"] = String( bytes:data[65..<71], encoding:.utf8) + elements["5F06"] = String( bytes:[data[71]], encoding:.utf8) + elements["53"] = String( bytes:data[72..<86], encoding:.utf8) + elements["5F02"] = String( bytes:[data[86]], encoding:.utf8) + elements["5F07"] = String( bytes:[data[87]], encoding:.utf8) + } + + private func getMRZType(length: Int) -> DocTypeEnum { + if length == 0x5A { + return .TD1 + } + if length == 0x48 { + return .TD2 + } + return .OTHER + } + +} diff --git a/app/ios/AwesomeProject/DataGroups/DataGroup11.swift b/app/ios/AwesomeProject/DataGroups/DataGroup11.swift new file mode 100644 index 00000000..970185ac --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/DataGroup11.swift @@ -0,0 +1,62 @@ + +import Foundation + +@available(iOS 13, macOS 10.15, *) +public class DataGroup11 : DataGroup { + + public private(set) var fullName : String? + public private(set) var personalNumber : String? + public private(set) var dateOfBirth : String? + public private(set) var placeOfBirth : String? + public private(set) var address : String? + public private(set) var telephone : String? + public private(set) var profession : String? + public private(set) var title : String? + public private(set) var personalSummary : String? + public private(set) var proofOfCitizenship : String? + public private(set) var tdNumbers : String? + public private(set) var custodyInfo : String? + + required init( _ data : [UInt8] ) throws { + try super.init(data) + datagroupType = .DG11 + } + + override func parse(_ data: [UInt8]) throws { + var tag = try getNextTag() + if tag != 0x5C { + throw NFCPassportReaderError.InvalidResponse + } + _ = try getNextValue() + + repeat { + tag = try getNextTag() + let val = try String( bytes:getNextValue(), encoding:.utf8) + if tag == 0x5F0E { + fullName = val + } else if tag == 0x5F10 { + personalNumber = val + } else if tag == 0x5F11 { + placeOfBirth = val + } else if tag == 0x5F2B { + dateOfBirth = val + } else if tag == 0x5F42 { + address = val + } else if tag == 0x5F12 { + telephone = val + } else if tag == 0x5F13 { + profession = val + } else if tag == 0x5F14 { + title = val + } else if tag == 0x5F15 { + personalSummary = val + } else if tag == 0x5F16 { + proofOfCitizenship = val + } else if tag == 0x5F17 { + tdNumbers = val + } else if tag == 0x5F18 { + custodyInfo = val + } + } while pos < data.count + } +} diff --git a/app/ios/AwesomeProject/DataGroups/DataGroup12.swift b/app/ios/AwesomeProject/DataGroups/DataGroup12.swift new file mode 100644 index 00000000..bc24b037 --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/DataGroup12.swift @@ -0,0 +1,72 @@ + +import Foundation + +@available(iOS 13, macOS 10.15, *) +public class DataGroup12 : DataGroup { + + public private(set) var issuingAuthority : String? + public private(set) var dateOfIssue : String? + public private(set) var otherPersonsDetails : String? + public private(set) var endorsementsOrObservations : String? + public private(set) var taxOrExitRequirements : String? + public private(set) var frontImage : [UInt8]? + public private(set) var rearImage : [UInt8]? + public private(set) var personalizationTime : String? + public private(set) var personalizationDeviceSerialNr : String? + + required init( _ data : [UInt8] ) throws { + try super.init(data) + datagroupType = .DG12 + } + + override func parse(_ data: [UInt8]) throws { + var tag = try getNextTag() + if tag != 0x5C { + throw NFCPassportReaderError.InvalidResponse + } + + // Skip the taglist - ideally we would check this but... + let _ = try getNextValue() + + repeat { + tag = try getNextTag() + let val = try getNextValue() + + if tag == 0x5F19 { + issuingAuthority = String( bytes:val, encoding:.utf8) + } else if tag == 0x5F26 { + dateOfIssue = parseDateOfIssue(value: val) + } else if tag == 0xA0 { + // Not yet handled + } else if tag == 0x5F1B { + endorsementsOrObservations = String( bytes:val, encoding:.utf8) + } else if tag == 0x5F1C { + taxOrExitRequirements = String( bytes:val, encoding:.utf8) + } else if tag == 0x5F1D { + frontImage = val + } else if tag == 0x5F1E { + rearImage = val + } else if tag == 0x5F55 { + personalizationTime = String( bytes:val, encoding:.utf8) + } else if tag == 0x5F56 { + personalizationDeviceSerialNr = String( bytes:val, encoding:.utf8) + } + } while pos < data.count + } + + private func parseDateOfIssue(value: [UInt8]) -> String? { + if value.count == 4 { + return decodeBCD(value: value) + } else { + return decodeASCII(value: value) + } + } + + private func decodeASCII(value: [UInt8]) -> String? { + return String(bytes:value, encoding:.utf8) + } + + private func decodeBCD(value: [UInt8]) -> String? { + value.map({ String(format: "%02X", $0) }).joined() + } +} diff --git a/app/ios/AwesomeProject/DataGroups/DataGroup14.swift b/app/ios/AwesomeProject/DataGroups/DataGroup14.swift new file mode 100644 index 00000000..8bb0124b --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/DataGroup14.swift @@ -0,0 +1,31 @@ + +import Foundation + +// SecurityInfos ::= SET of SecurityInfo +// SecurityInfo ::= SEQUENCE { +// protocol OBJECT IDENTIFIER, +// requiredData ANY DEFINED BY protocol, +// optionalData ANY DEFINED BY protocol OPTIONAL +@available(iOS 13, macOS 10.15, *) +public class DataGroup14 : DataGroup { + private var asn1 : ASN1Item! + public private(set) var securityInfos : [SecurityInfo] = [SecurityInfo]() + + required init( _ data : [UInt8] ) throws { + try super.init(data) + datagroupType = .DG14 + } + + override func parse(_ data: [UInt8]) throws { + let p = SimpleASN1DumpParser() + asn1 = try p.parse(data: Data(body)) + + // Bit of a hack at the moment - passing in the body - if we had a decent ASN1 parser then this would be better! ;) + for i in 0 ..< asn1.getNumberOfChildren() { + if let child = asn1.getChild(i), + let secInfo = SecurityInfo.getInstance( object:child, body : body ) { + securityInfos.append(secInfo) + } + } + } +} diff --git a/app/ios/AwesomeProject/DataGroups/DataGroup15.swift b/app/ios/AwesomeProject/DataGroups/DataGroup15.swift new file mode 100644 index 00000000..ce6ffdbd --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/DataGroup15.swift @@ -0,0 +1,40 @@ + +import Foundation +import OpenSSL + +@available(iOS 13, macOS 10.15, *) +public class DataGroup15 : DataGroup { + + public private(set) var rsaPublicKey : OpaquePointer? + public private(set) var ecdsaPublicKey : OpaquePointer? + + deinit { + if ( ecdsaPublicKey != nil ) { + EVP_PKEY_free(ecdsaPublicKey); + } + if ( rsaPublicKey != nil ) { + EVP_PKEY_free(rsaPublicKey); + } + } + + required init( _ data : [UInt8] ) throws { + try super.init(data) + datagroupType = .DG15 + } + + + override func parse(_ data: [UInt8]) throws { + + // the public key can either be in EC (elliptic curve) or RSA format + // Try ec first and if this fails try RSA + // Note - this will be improved in a later version to read the ASN1 body to + // check the actual type + if let key = try? OpenSSLUtils.readECPublicKey( data:body ) { + // NOTE We are responsible for freeing the key! + ecdsaPublicKey = key + } else if let key = try? OpenSSLUtils.readRSAPublicKey( data:body ) { + + rsaPublicKey = key + } + } +} diff --git a/app/ios/AwesomeProject/DataGroups/DataGroup2.swift b/app/ios/AwesomeProject/DataGroups/DataGroup2.swift new file mode 100644 index 00000000..eb3586d7 --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/DataGroup2.swift @@ -0,0 +1,164 @@ + +import Foundation + +#if !os(macOS) +import UIKit +#endif + +@available(iOS 13, macOS 10.15, *) +public class DataGroup2 : DataGroup { + public private(set) var nrImages : Int = 0 + public private(set) var versionNumber : Int = 0 + public private(set) var lengthOfRecord : Int = 0 + public private(set) var numberOfFacialImages : Int = 0 + public private(set) var facialRecordDataLength : Int = 0 + public private(set) var nrFeaturePoints : Int = 0 + public private(set) var gender : Int = 0 + public private(set) var eyeColor : Int = 0 + public private(set) var hairColor : Int = 0 + public private(set) var featureMask : Int = 0 + public private(set) var expression : Int = 0 + public private(set) var poseAngle : Int = 0 + public private(set) var poseAngleUncertainty : Int = 0 + public private(set) var faceImageType : Int = 0 + public private(set) var imageDataType : Int = 0 + public private(set) var imageWidth : Int = 0 + public private(set) var imageHeight : Int = 0 + public private(set) var imageColorSpace : Int = 0 + public private(set) var sourceType : Int = 0 + public private(set) var deviceType : Int = 0 + public private(set) var quality : Int = 0 + public private(set) var imageData : [UInt8] = [] + + +#if !os(macOS) +func getImage() -> UIImage? { + if imageData.count == 0 { + return nil + } + + let image = UIImage(data:Data(imageData) ) + return image + } +#endif + + required init( _ data : [UInt8] ) throws { + try super.init(data) + datagroupType = .DG2 + } + + override func parse(_ data: [UInt8]) throws { + var tag = try getNextTag() + if tag != 0x7F61 { + throw NFCPassportReaderError.InvalidResponse + } + _ = try getNextLength() + + // Tag should be 0x02 + tag = try getNextTag() + if tag != 0x02 { + throw NFCPassportReaderError.InvalidResponse + } + nrImages = try Int(getNextValue()[0]) + + // Next tag is 0x7F60 + tag = try getNextTag() + if tag != 0x7F60 { + throw NFCPassportReaderError.InvalidResponse + } + _ = try getNextLength() + + // Next tag is 0xA1 (Biometric Header Template) - don't care about this + tag = try getNextTag() + if tag != 0xA1 { + throw NFCPassportReaderError.InvalidResponse + } + _ = try getNextValue() + + // Now we get to the good stuff - next tag is either 5F2E or 7F2E + tag = try getNextTag() + if tag != 0x5F2E && tag != 0x7F2E { + throw NFCPassportReaderError.InvalidResponse + } + let value = try getNextValue() + + try parseISO19794_5( data:value ) + } + + func parseISO19794_5( data : [UInt8] ) throws { + // Validate header - 'F', 'A' 'C' 0x00 - 0x46414300 + if data[0] != 0x46 && data[1] != 0x41 && data[2] != 0x43 && data[3] != 0x00 { + throw NFCPassportReaderError.InvalidResponse + } + + var offset = 4 + versionNumber = binToInt(data[offset.. UIImage? { + if imageData.count == 0 { + return nil + } + + let image = UIImage(data:Data(imageData) ) + return image + } +#endif + + + override func parse(_ data: [UInt8]) throws { + var tag = try getNextTag() + if tag != 0x02 { + throw NFCPassportReaderError.InvalidResponse + } + _ = try getNextValue() + + tag = try getNextTag() + if tag != 0x5F43 { + throw NFCPassportReaderError.InvalidResponse + } + + imageData = try getNextValue() + } +} diff --git a/app/ios/AwesomeProject/DataGroups/DataGroupId.swift b/app/ios/AwesomeProject/DataGroups/DataGroupId.swift new file mode 100644 index 00000000..b2fcab53 --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/DataGroupId.swift @@ -0,0 +1,98 @@ + +import Foundation + +@available(iOS 13, macOS 10.15, *) +public enum DataGroupId : Int, CaseIterable { + case COM = 0x60 + case DG1 = 0x61 + case DG2 = 0x75 + case DG3 = 0x63 + case DG4 = 0x76 + case DG5 = 0x65 + case DG6 = 0x66 + case DG7 = 0x67 + case DG8 = 0x68 + case DG9 = 0x69 + case DG10 = 0x6A + case DG11 = 0x6B + case DG12 = 0x6C + case DG13 = 0x6D + case DG14 = 0x6E + case DG15 = 0x6F + case DG16 = 0x70 + case SOD = 0x77 + case Unknown = 0x00 + + public func getName() -> String { + switch( self ) { + case .COM: return "COM" + case .DG1: return "DG1" + case .DG2: return "DG2" + case .DG3: return "DG3" + case .DG4: return "DG4" + case .DG5: return "DG5" + case .DG6: return "DG6" + case .DG7: return "DG7" + case .DG8: return "DG8" + case .DG9: return "DG9" + case .DG10: return "DG10" + case .DG11: return "DG11" + case .DG12: return "DG12" + case .DG13: return "DG13" + case .DG14: return "DG14" + case .DG15: return "DG15" + case .DG16: return "DG16" + case .SOD: return "SOD" + case .Unknown: return "Unknown" + } + } + + static public func getIDFromName( name: String ) -> DataGroupId { + switch( name ) { + case "COM": return .COM + case "DG1": return .DG1 + case "DG2": return .DG2 + case "DG3": return .DG3 + case "DG4": return .DG4 + case "DG5": return .DG5 + case "DG6": return .DG6 + case "DG7": return .DG7 + case "DG8": return .DG8 + case "DG9": return .DG9 + case "DG10": return .DG10 + case "DG11": return .DG11 + case "DG12": return .DG12 + case "DG13": return .DG13 + case "DG14": return .DG14 + case "DG15": return .DG15 + case "DG16": return .DG16 + case "SOD": return .SOD + default: return .Unknown + } + } + + func getFileIDTag() -> [UInt8]? { + switch( self ) { + case .COM: return [0x01,0x1E] + case .DG1: return [0x01,0x01] + case .DG2: return [0x01,0x02] + case .DG3: return [0x01,0x03] + case .DG4: return [0x01,0x04] + case .DG5: return [0x01,0x05] + case .DG6: return [0x01,0x06] + case .DG7: return [0x01,0x07] + case .DG8: return [0x01,0x08] + case .DG9: return [0x01,0x09] + case .DG10: return [0x01,0x0A] + case .DG11: return [0x01,0x0B] + case .DG12: return [0x01,0x0C] + case .DG13: return [0x01,0x0D] + case .DG14: return [0x01,0x0E] + case .DG15: return [0x01,0x0F] + case .DG16: return [0x01,0x10] + case .SOD: return [0x01,0x1D] + case .Unknown: return nil + } + } +} + diff --git a/app/ios/AwesomeProject/DataGroups/NotImplementedDG.swift b/app/ios/AwesomeProject/DataGroups/NotImplementedDG.swift new file mode 100644 index 00000000..58e2c755 --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/NotImplementedDG.swift @@ -0,0 +1,11 @@ + +import Foundation + +@available(iOS 13, macOS 10.15, *) +public class NotImplementedDG : DataGroup { + required init( _ data : [UInt8] ) throws { + try super.init(data) + datagroupType = .Unknown + } +} + diff --git a/app/ios/AwesomeProject/DataGroups/PACEInfo.swift b/app/ios/AwesomeProject/DataGroups/PACEInfo.swift new file mode 100644 index 00000000..fe214c18 --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/PACEInfo.swift @@ -0,0 +1,397 @@ + +import Foundation +import OpenSSL + +public enum PACEMappingType { + case GM // Generic Mapping + case IM // Integrated Mapping + case CAM // Chip Authentication Mapping +} + +@available(iOS 13, macOS 10.15, *) +public class PACEInfo : SecurityInfo { + + // Standardized domain parameters. Based on Table 6. + public static let PARAM_ID_GFP_1024_160 = 0 + public static let PARAM_ID_GFP_2048_224 = 1 + public static let PARAM_ID_GFP_2048_256 = 2 + public static let PARAM_ID_ECP_NIST_P192_R1 = 8 + public static let PARAM_ID_ECP_BRAINPOOL_P192_R1 = 9 + public static let PARAM_ID_ECP_NIST_P224_R1 = 10 + public static let PARAM_ID_ECP_BRAINPOOL_P224_R1 = 11 + public static let PARAM_ID_ECP_NIST_P256_R1 = 12 + public static let PARAM_ID_ECP_BRAINPOOL_P256_R1 = 13 + public static let PARAM_ID_ECP_BRAINPOOL_P320_R1 = 14 + public static let PARAM_ID_ECP_NIST_P384_R1 = 15 + public static let PARAM_ID_ECP_BRAINPOOL_P384_R1 = 16 + public static let PARAM_ID_ECP_BRAINPOOL_P512_R1 = 17 + public static let PARAM_ID_ECP_NIST_P521_R1 = 18 + + static let allowedIdentifiers = [ + ID_PACE_DH_GM_3DES_CBC_CBC, + ID_PACE_DH_GM_AES_CBC_CMAC_128, + ID_PACE_DH_GM_AES_CBC_CMAC_192, + ID_PACE_DH_GM_AES_CBC_CMAC_256, + ID_PACE_DH_IM_3DES_CBC_CBC, + ID_PACE_DH_IM_AES_CBC_CMAC_128, + ID_PACE_DH_IM_AES_CBC_CMAC_192, + ID_PACE_DH_IM_AES_CBC_CMAC_256, + ID_PACE_ECDH_GM_3DES_CBC_CBC, + ID_PACE_ECDH_GM_AES_CBC_CMAC_128, + ID_PACE_ECDH_GM_AES_CBC_CMAC_192, + ID_PACE_ECDH_GM_AES_CBC_CMAC_256, + ID_PACE_ECDH_IM_3DES_CBC_CBC, + ID_PACE_ECDH_IM_AES_CBC_CMAC_128, + ID_PACE_ECDH_IM_AES_CBC_CMAC_192, + ID_PACE_ECDH_IM_AES_CBC_CMAC_256, + ID_PACE_ECDH_CAM_AES_CBC_CMAC_128, + ID_PACE_ECDH_CAM_AES_CBC_CMAC_192, + ID_PACE_ECDH_CAM_AES_CBC_CMAC_256] + + var oid : String + var version : Int + var parameterId : Int? + + static func checkRequiredIdentifier(_ oid : String) -> Bool { + return allowedIdentifiers.contains( oid ) + } + + init(oid: String, version: Int, parameterId: Int?) { + self.oid = oid + self.version = version + self.parameterId = parameterId + } + + public override func getObjectIdentifier() -> String { + return oid + } + + public override func getProtocolOIDString() -> String { + return PACEInfo.toProtocolOIDString(oid:oid) + } + + public func getVersion() -> Int { + return version + } + + public func getParameterId() -> Int? { + return parameterId + } + + public func getParameterSpec() throws -> Int32 { + return try PACEInfo.getParameterSpec(stdDomainParam: self.parameterId ?? -1 ) + } + + public func getMappingType() throws -> PACEMappingType { + return try PACEInfo.toMappingType(oid: oid); // Either GM, CAM, or IM. + } + + public func getKeyAgreementAlgorithm() throws -> String { + return try PACEInfo.toKeyAgreementAlgorithm(oid: oid); // Either DH or ECDH. + } + + public func getCipherAlgorithm() throws -> String { + return try PACEInfo.toCipherAlgorithm(oid: oid); // Either DESede or AES. + } + + public func getDigestAlgorithm() throws -> String { + return try PACEInfo.toDigestAlgorithm(oid: oid); // Either SHA-1 or SHA-256. + } + + public func getKeyLength() throws -> Int { + return try PACEInfo.toKeyLength(oid: oid); // Of the enc cipher. Either 128, 192, or 256. + } + + /// Caller is required to free the returned EVP_PKEY value + public func createMappingKey( ) throws -> OpaquePointer { + // This will get freed later + let mappingKey : OpaquePointer = EVP_PKEY_new() + + switch try getKeyAgreementAlgorithm() { + case "DH": + Log.debug( "Generating DH mapping keys") + //The EVP_PKEY_CTX_set_dh_rfc5114() and EVP_PKEY_CTX_set_dhx_rfc5114() macros are synonymous. They set the DH parameters to the values defined in RFC5114. The rfc5114 parameter must be 1, 2 or 3 corresponding to RFC5114 sections 2.1, 2.2 and 2.3. or 0 to clear the stored value. This macro can be called during parameter generation. The ctx must have a key type of EVP_PKEY_DHX. The rfc5114 parameter and the nid parameter are mutually exclusive. + var dhKey : OpaquePointer? = nil + switch try getParameterSpec() { + case 0: + Log.verbose( "Using DH_get_1024_160" ) + dhKey = DH_get_1024_160() + case 1: + Log.verbose( "Using DH_get_2048_224" ) + dhKey = DH_get_2048_224() + case 2: + Log.verbose( "Using DH_get_2048_256" ) + dhKey = DH_get_2048_256() + default: + // Error + break + } + guard dhKey != nil else { + throw NFCPassportReaderError.InvalidDataPassed("Unable to create DH mapping key") + } + defer{ DH_free( dhKey ) } + + DH_generate_key(dhKey) + EVP_PKEY_set1_DH(mappingKey, dhKey) + + case "ECDH": + let parameterSpec = try getParameterSpec() + Log.debug( "Generating ECDH mapping keys from parameterSpec - \(parameterSpec)") + guard let ecKey = EC_KEY_new_by_curve_name(parameterSpec) else { + throw NFCPassportReaderError.InvalidDataPassed("Unable to create EC mapping key") + } + defer{ EC_KEY_free( ecKey ) } + + EC_KEY_generate_key(ecKey) + EVP_PKEY_set1_EC_KEY(mappingKey, ecKey) + default: + throw NFCPassportReaderError.InvalidDataPassed("Unsupported agreement algorithm") + } + + return mappingKey + } + + public static func getParameterSpec(stdDomainParam : Int) throws -> Int32 { + switch (stdDomainParam) { + case PARAM_ID_GFP_1024_160: + return 0 // "rfc5114_1024_160"; + case PARAM_ID_GFP_2048_224: + return 1 // "rfc5114_2048_224"; + case PARAM_ID_GFP_2048_256: + return 2 // "rfc5114_2048_256"; + case PARAM_ID_ECP_NIST_P192_R1: + return NID_X9_62_prime192v1 // "secp192r1"; + case PARAM_ID_ECP_NIST_P224_R1: + return NID_secp224r1 // "secp224r1"; + case PARAM_ID_ECP_NIST_P256_R1: + return NID_X9_62_prime256v1 //"secp256r1"; + case PARAM_ID_ECP_NIST_P384_R1: + return NID_secp384r1 // "secp384r1"; + case PARAM_ID_ECP_BRAINPOOL_P192_R1: + return NID_brainpoolP192r1 //"brainpoolp192r1"; + case PARAM_ID_ECP_BRAINPOOL_P224_R1: + return NID_brainpoolP224r1 // "brainpoolp224r1"; + case PARAM_ID_ECP_BRAINPOOL_P256_R1: + return NID_brainpoolP256r1 // "brainpoolp256r1"; + case PARAM_ID_ECP_BRAINPOOL_P320_R1: + return NID_brainpoolP320r1 //"brainpoolp320r1"; + case PARAM_ID_ECP_BRAINPOOL_P384_R1: + return NID_brainpoolP384r1 //"brainpoolp384r1"; + case PARAM_ID_ECP_BRAINPOOL_P512_R1: + return NID_brainpoolP512r1 //""; + case PARAM_ID_ECP_NIST_P521_R1: + return NID_secp521r1 //"secp224r1"; + default: + throw NFCPassportReaderError.InvalidDataPassed( "Unable to lookup p arameterSpec - invalid oid" ) + } + } + + public static func toMappingType( oid : String ) throws -> PACEMappingType { + if ID_PACE_DH_GM_3DES_CBC_CBC == oid + || ID_PACE_DH_GM_AES_CBC_CMAC_128 == oid + || ID_PACE_DH_GM_AES_CBC_CMAC_192 == oid + || ID_PACE_DH_GM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_GM_3DES_CBC_CBC == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_256 == oid { + return PACEMappingType.GM + } else if ID_PACE_DH_IM_3DES_CBC_CBC == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_128 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_192 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_IM_3DES_CBC_CBC == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_256 == oid { + return PACEMappingType.IM + } else if ID_PACE_ECDH_CAM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_256 == oid { + return PACEMappingType.CAM + } + + throw NFCPassportReaderError.InvalidDataPassed( "Unable to lookup mapping type - invalid oid" ) + } + + + /// Returns the key agreement algorithm - DH or ECDH for the given Chip Authentication oid + /// - Parameter oid: the object identifier + /// - Returns: key agreement algorithm + /// - Throws: InvalidDataPassed error if invalid oid specified + public static func toKeyAgreementAlgorithm( oid : String ) throws -> String { + if ID_PACE_DH_GM_3DES_CBC_CBC == oid + || ID_PACE_DH_GM_AES_CBC_CMAC_128 == oid + || ID_PACE_DH_GM_AES_CBC_CMAC_192 == oid + || ID_PACE_DH_GM_AES_CBC_CMAC_256 == oid + || ID_PACE_DH_IM_3DES_CBC_CBC == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_128 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_192 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_256 == oid { + return "DH" + } else if ID_PACE_ECDH_GM_3DES_CBC_CBC == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_IM_3DES_CBC_CBC == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_256 == oid { + return "ECDH" + } + throw NFCPassportReaderError.InvalidDataPassed( "Unable to lookup key agreement algorithm - invalid oid" ) + } + + /// Returns the cipher algorithm - DESede or AES for the given Chip Authentication oid + /// - Parameter oid: the object identifier + /// - Returns: the cipher algorithm type + /// - Throws: InvalidDataPassed error if invalid oid specified + public static func toCipherAlgorithm( oid : String ) throws -> String { + if ID_PACE_DH_GM_3DES_CBC_CBC == oid + || ID_PACE_DH_IM_3DES_CBC_CBC == oid + || ID_PACE_ECDH_GM_3DES_CBC_CBC == oid + || ID_PACE_ECDH_IM_3DES_CBC_CBC == oid { + return "DESede" + } else if ID_PACE_DH_GM_AES_CBC_CMAC_128 == oid + || ID_PACE_DH_GM_AES_CBC_CMAC_192 == oid + || ID_PACE_DH_GM_AES_CBC_CMAC_256 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_128 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_192 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_256 == oid { + return "AES" + } + throw NFCPassportReaderError.InvalidDataPassed( "Unable to lookup cipher algorithm - invalid oid" ) + } + + public static func toDigestAlgorithm( oid : String ) throws -> String { + if ID_PACE_DH_GM_3DES_CBC_CBC == oid + || ID_PACE_DH_IM_3DES_CBC_CBC == oid + || ID_PACE_ECDH_GM_3DES_CBC_CBC == oid + || ID_PACE_ECDH_IM_3DES_CBC_CBC == oid + || ID_PACE_DH_GM_AES_CBC_CMAC_128 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_128 == oid { + return "SHA-1" + } else if ID_PACE_DH_GM_AES_CBC_CMAC_192 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_192 == oid + || ID_PACE_DH_GM_AES_CBC_CMAC_256 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_256 == oid { + return "SHA-256" + } + + throw NFCPassportReaderError.InvalidDataPassed( "Unable to lookup digest algorithm - invalid oid" ) + + } + /// Returns the key length in bits (128, 192, or 256) for the given Chip Authentication oid + /// - Parameter oid: the object identifier + /// - Returns: the key length in bits + /// - Throws: InvalidDataPassed error if invalid oid specified + public static func toKeyLength( oid : String ) throws -> Int { + if ID_PACE_DH_GM_3DES_CBC_CBC == oid + || ID_PACE_DH_IM_3DES_CBC_CBC == oid + || ID_PACE_ECDH_GM_3DES_CBC_CBC == oid + || ID_PACE_ECDH_IM_3DES_CBC_CBC == oid + || ID_PACE_DH_GM_AES_CBC_CMAC_128 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_128 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_128 == oid { + return 128 + } else if ID_PACE_DH_GM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_192 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_192 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_192 == oid { + return 192 + } else if ID_PACE_DH_GM_AES_CBC_CMAC_256 == oid + || ID_PACE_DH_IM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_GM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_IM_AES_CBC_CMAC_256 == oid + || ID_PACE_ECDH_CAM_AES_CBC_CMAC_256 == oid { + return 256 + } + throw NFCPassportReaderError.InvalidDataPassed( "Unable to get key length - invalid oid" ) + } + + private static func toProtocolOIDString(oid : String) -> String { + if ID_PACE_DH_GM_3DES_CBC_CBC == oid { + return "id-PACE-DH-GM-3DES-CBC-CBC" + } + if ID_PACE_DH_GM_AES_CBC_CMAC_128 == oid { + return "id-PACE-DH-GM-AES-CBC-CMAC-128" + } + if ID_PACE_DH_GM_AES_CBC_CMAC_192 == oid { + return "id-PACE-DH-GM-AES-CBC-CMAC-192" + } + if ID_PACE_DH_GM_AES_CBC_CMAC_256 == oid { + return "id-PACE-DH-GM-AES-CBC-CMAC-256" + } + if ID_PACE_DH_IM_3DES_CBC_CBC == oid { + return "id-PACE-DH-IM-3DES-CBC-CBC" + } + if ID_PACE_DH_IM_AES_CBC_CMAC_128 == oid { + return "id-PACE-DH-IM-AES-CBC-CMAC-128" + } + if ID_PACE_DH_IM_AES_CBC_CMAC_192 == oid { + return "id-PACE-DH-IM-AES-CBC-CMAC-192" + } + if ID_PACE_DH_IM_AES_CBC_CMAC_256 == oid { + return "id-PACE_DH-IM-AES-CBC-CMAC-256" + } + if ID_PACE_ECDH_GM_3DES_CBC_CBC == oid { + return "id-PACE-ECDH-GM-3DES-CBC-CBC" + } + if ID_PACE_ECDH_GM_AES_CBC_CMAC_128 == oid { + return "id-PACE-ECDH-GM-AES-CBC-CMAC-128" + } + if ID_PACE_ECDH_GM_AES_CBC_CMAC_192 == oid { + return "id-PACE-ECDH-GM-AES-CBC-CMAC-192" + } + if ID_PACE_ECDH_GM_AES_CBC_CMAC_256 == oid { + return "id-PACE-ECDH-GM-AES-CBC-CMAC-256" + } + if ID_PACE_ECDH_IM_3DES_CBC_CBC == oid { + return "id-PACE-ECDH-IM_3DES-CBC-CBC" + } + if ID_PACE_ECDH_IM_AES_CBC_CMAC_128 == oid { + return "id-PACE-ECDH-IM-AES-CBC-CMAC-128" + } + if ID_PACE_ECDH_IM_AES_CBC_CMAC_192 == oid { + return "id-PACE-ECDH-IM-AES-CBC-CMAC-192" + } + if ID_PACE_ECDH_IM_AES_CBC_CMAC_256 == oid { + return "id-PACE-ECDH-IM-AES-CBC-CMAC-256" + } + if ID_PACE_ECDH_CAM_AES_CBC_CMAC_128 == oid { + return "id-PACE-ECDH-CAM-AES-CBC-CMAC-128" + } + if ID_PACE_ECDH_CAM_AES_CBC_CMAC_192 == oid { + return "id-PACE-ECDH-CAM-AES-CBC-CMAC-192" + } + if ID_PACE_ECDH_CAM_AES_CBC_CMAC_256 == oid { + return "id-PACE-ECDH-CAM-AES-CBC-CMAC-256" + } + + return oid + } +} diff --git a/app/ios/AwesomeProject/DataGroups/SOD.swift b/app/ios/AwesomeProject/DataGroups/SOD.swift new file mode 100644 index 00000000..b4f779aa --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/SOD.swift @@ -0,0 +1,234 @@ + +import Foundation +import OpenSSL + + +// Format of SOD: ASN1 - Signed Data (taken from rfc5652 - https://tools.ietf.org/html/rfc5652): +// The SOD is a CMS container of type Signed-data +// +// Note - ideally I'd be using a proper ASN1 parser, however currently there isn't a reliable one for Swift +// and I haven't written on (yet?). So for the moment, I'm relying on the output from ASN1Dump and a +// simple parser for that +// +// Sequence +// Object ID: signedData +// Content: SignedData +// SignedData ::= SEQUENCE { +// INTEGER version CMSVersion, +// SET digestAlgorithms DigestAlgorithmIdentifiers, +// SEQUENCE encapContentInfo EncapsulatedContentInfo, +// certificates [0] IMPLICIT CertificateSet OPTIONAL, +// crls [1] IMPLICIT RevocationInfoChoices OPTIONAL, +// SET signerInfos SignerInfos } +// +// AlgorithmIdentifier ::= SEQUENCE { +// algorithm OBJECT IDENTIFIER, +// parameters ANY OPTIONAL +// } +// +// EncapsulatedContentInfo ::= SEQUENCE { +// eContentType ContentType, +// eContent [0] EXPLICIT OCTET STRING OPTIONAL } +// +// ContentType ::= OBJECT IDENTIFIER +// +// SignerInfos ::= SET OF SignerInfo +// +// SignerInfo ::= SEQUENCE { +// version CMSVersion, +// sid SignerIdentifier, +// digestAlgorithm DigestAlgorithmIdentifier, +// signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL, +// signatureAlgorithm SignatureAlgorithmIdentifier, +// signature SignatureValue, +// unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL } +// +// SignerIdentifier ::= CHOICE { +// issuerAndSerialNumber IssuerAndSerialNumber, +// subjectKeyIdentifier [0] SubjectKeyIdentifier } +// +// SignedAttributes ::= SET SIZE (1..MAX) OF Attribute +// UnsignedAttributes ::= SET SIZE (1..MAX) OF Attribute +// Attribute ::= SEQUENCE { +// attrType OBJECT IDENTIFIER, +// attrValues SET OF AttributeValue } +// AttributeValue ::= ANY +// SignatureValue ::= OCTET STRING +@available(iOS 13, macOS 10.15, *) +class SOD : DataGroup { + + public private(set) var pkcs7CertificateData : [UInt8] = [] + private var asn1 : ASN1Item! + private var pubKey : OpaquePointer? + + required init( _ data : [UInt8] ) throws { + try super.init(data) + self.pkcs7CertificateData = body + datagroupType = .SOD + } + + deinit { + if ( pubKey != nil ) { + EVP_PKEY_free(pubKey); + } + } + + override func parse(_ data: [UInt8]) throws { + let p = SimpleASN1DumpParser() + asn1 = try p.parse(data: Data(body)) + } + + /// Returns the public key from the embedded X509 certificate + /// - Returns pointer to the public key + func getPublicKey( ) throws -> OpaquePointer { + + if let key = pubKey { + return key + } + + let certs = try OpenSSLUtils.getX509CertificatesFromPKCS7(pkcs7Der:Data(pkcs7CertificateData)) + if let key = X509_get_pubkey (certs[0].cert) { + pubKey = key + return key + } + + throw OpenSSLError.UnableToExtractSignedDataFromPKCS7("Unable to get public key") + } + + + /// Extracts the encapsulated content section from a SignedData PKCS7 container (if present) + /// - Returns: The encapsulated content from a PKCS7 container if we could read it + /// - Throws: Error if we can't find or read the encapsulated content + func getEncapsulatedContent() throws -> Data { + guard let signedData = asn1.getChild(1)?.getChild(0), + let encContent = signedData.getChild(2)?.getChild(1), + let content = encContent.getChild(0) else { + + throw OpenSSLError.UnableToExtractSignedDataFromPKCS7("Data in invalid format") + } + + var sigData : Data? + if content.type.hasPrefix("OCTET STRING" ) { + sigData = Data(hexRepToBin( content.value )) + } + + guard let ret = sigData else { throw OpenSSLError.UnableToExtractSignedDataFromPKCS7("noDataReturned") } + return ret + } + + /// Gets the digest algorithm used to hash the encapsulated content in the signed data section (if present) + /// - Returns: The digest algorithm used to hash the encapsulated content in the signed data section + /// - Throws: Error if we can't find or read the digest algorithm + func getEncapsulatedContentDigestAlgorithm() throws -> String { + guard let signedData = asn1.getChild(1)?.getChild(0), + let digestAlgo = signedData.getChild(1)?.getChild(0)?.getChild(0) else { + throw OpenSSLError.UnableToExtractSignedDataFromPKCS7("Data in invalid format") + } + + return String(digestAlgo.value) + } + + /// Gets the signed attributes section (if present) + /// - Returns: the signed attributes section + /// - Throws: Error if we can't find or read the signed attributes + func getSignedAttributes( ) throws -> Data { + + // Get the SignedAttributes section. + guard let signedData = asn1.getChild(1)?.getChild(0), + let signerInfo = signedData.getChild(4), + let signedAttrs = signerInfo.getChild(0)?.getChild(3) else { + + throw OpenSSLError.UnableToExtractSignedDataFromPKCS7("Data in invalid format") + } + + var bytes = [UInt8](self.pkcs7CertificateData[signedAttrs.pos ..< signedAttrs.pos + signedAttrs.headerLen + signedAttrs.length]) + + // The first byte will be 0xA0 -> as its a explicit tag for a contextual item which we need to convert + // for the hash to calculate correctly + // We know that the actual tag is a SET (0x31) - See section 5.4 of https://tools.ietf.org/html/rfc5652 + // So we need to change this from 0xA0 to 0x31 + if bytes[0] == 0xA0 { + bytes[0] = 0x31 + } + let signedAttribs = Data(bytes) + + return signedAttribs + } + +/// Gets the message digest from the signed attributes section (if present) +/// - Returns: the message digest +/// - Throws: Error if we can't find or read the message digest + func getMessageDigestFromSignedAttributes( ) throws -> Data { + + // For the SOD, the SignedAttributes consists of: + // A Content type Object (which has the value of the attributes content type) + // A messageDigest Object which has the message digest as it value + // We want the messageDigest value + + guard let signedData = asn1.getChild(1)?.getChild(0), + let signerInfo = signedData.getChild(4), + let signedAttrs = signerInfo.getChild(0)?.getChild(3) else { + + throw OpenSSLError.UnableToExtractSignedDataFromPKCS7("Data in invalid format") + } + + // Find the messageDigest in the signedAttributes section + var sigData : Data? + for i in 0 ..< signedAttrs.getNumberOfChildren() { + let attrObj = signedAttrs.getChild(i) + if attrObj?.getChild(0)?.value == "messageDigest" { + if let set = attrObj?.getChild(1), + let digestVal = set.getChild(0) { + + if digestVal.type.hasPrefix("OCTET STRING" ) { + sigData = Data(hexRepToBin( digestVal.value ) ) + } + } + } + } + + guard let messageDigest = sigData else { throw OpenSSLError.UnableToExtractSignedDataFromPKCS7("No messageDigest Returned") } + + return messageDigest + } + + /// Gets the signature data (if present) + /// - Returns: the signature + /// - Throws: Error if we can't find or read the signature + func getSignature( ) throws -> Data { + + guard let signedData = asn1.getChild(1)?.getChild(0), + let signerInfo = signedData.getChild(4), + let signature = signerInfo.getChild(0)?.getChild(5) else { + + throw OpenSSLError.UnableToExtractSignedDataFromPKCS7("Data in invalid format") + } + + var sigData : Data? + if signature.type.hasPrefix("OCTET STRING" ) { + sigData = Data(hexRepToBin( signature.value )) + } + + guard let ret = sigData else { throw OpenSSLError.UnableToExtractSignedDataFromPKCS7("noDataReturned") } + return ret + } + + /// Gets the signature algorithm used (if present) + /// - Returns: the signature algorithm used + /// - Throws: Error if we can't find or read the signature algorithm + func getSignatureAlgorithm( ) throws -> String { + + guard let signedData = asn1.getChild(1)?.getChild(0), + let signerInfo = signedData.getChild(4), + let signatureAlgo = signerInfo.getChild(0)?.getChild(4)?.getChild(0) else { + + throw OpenSSLError.UnableToExtractSignedDataFromPKCS7("Data in invalid format") + } + + // Vals I've seen are: + // sha1WithRSAEncryption => default pkcs1 + // sha256WithRSAEncryption => default pkcs1 + // rsassaPss => pss + return signatureAlgo.value + } +} diff --git a/app/ios/AwesomeProject/DataGroups/SecurityInfo.swift b/app/ios/AwesomeProject/DataGroups/SecurityInfo.swift new file mode 100644 index 00000000..5b1c651d --- /dev/null +++ b/app/ios/AwesomeProject/DataGroups/SecurityInfo.swift @@ -0,0 +1,130 @@ + +import Foundation +import OpenSSL + +@available(iOS 13, macOS 10.15,*) +public class SecurityInfo { + // Active Authentication OID + static let ID_AA_OID = "2.23.136.1.1.5" + + // Active Authentication Signature Algorithm OIDS + // Specified in BSI TR 03111 Section 5.2.1. + static let ECDSA_PLAIN_SIGNATURES = "0.4.0.127.0.7.1.1.4.1"; + static let ECDSA_PLAIN_SHA1_OID = ECDSA_PLAIN_SIGNATURES + ".1"; // 0.4.0.127.0.7.1.1.4.1.1, ecdsa-plain-SHA1 + static let ECDSA_PLAIN_SHA224_OID = ECDSA_PLAIN_SIGNATURES + ".2"; // 0.4.0.127.0.7.1.1.4.1.2, ecdsa-plain-SHA224 + static let ECDSA_PLAIN_SHA256_OID = ECDSA_PLAIN_SIGNATURES + ".3"; // 0.4.0.127.0.7.1.1.4.1.3, ecdsa-plain-SHA256 + static let ECDSA_PLAIN_SHA384_OID = ECDSA_PLAIN_SIGNATURES + ".4"; // 0.4.0.127.0.7.1.1.4.1.4, ecdsa-plain-SHA384 + static let ECDSA_PLAIN_SHA512_OID = ECDSA_PLAIN_SIGNATURES + ".5"; // 0.4.0.127.0.7.1.1.4.1.5, ecdsa-plain-SHA512 + static let ECDSA_PLAIN_RIPEMD160_OID = ECDSA_PLAIN_SIGNATURES + ".6"; // 0.4.0.127.0.7.1.1.4.1.6, ecdsa-plain-RIPEMD160 + + // Chip Authentication Public Key OIDS + static let ID_PK_DH_OID = "0.4.0.127.0.7.2.2.1.1" + static let ID_PK_ECDH_OID = "0.4.0.127.0.7.2.2.1.2" + + // Chip Authentication OIDS + static let ID_CA_DH_3DES_CBC_CBC_OID = "0.4.0.127.0.7.2.2.3.1.1" + static let ID_CA_ECDH_3DES_CBC_CBC_OID = "0.4.0.127.0.7.2.2.3.2.1" + static let ID_CA_DH_AES_CBC_CMAC_128_OID = "0.4.0.127.0.7.2.2.3.1.2" + static let ID_CA_DH_AES_CBC_CMAC_192_OID = "0.4.0.127.0.7.2.2.3.1.3" + static let ID_CA_DH_AES_CBC_CMAC_256_OID = "0.4.0.127.0.7.2.2.3.1.4" + static let ID_CA_ECDH_AES_CBC_CMAC_128_OID = "0.4.0.127.0.7.2.2.3.2.2" + static let ID_CA_ECDH_AES_CBC_CMAC_192_OID = "0.4.0.127.0.7.2.2.3.2.3" + static let ID_CA_ECDH_AES_CBC_CMAC_256_OID = "0.4.0.127.0.7.2.2.3.2.4" + + + // PACE OIDS + static let ID_BSI = "0.4.0.127.0.7" + static let ID_PACE = ID_BSI + ".2.2.4" + static let ID_PACE_DH_GM = ID_PACE + ".1" + static let ID_PACE_DH_GM_3DES_CBC_CBC = ID_PACE_DH_GM + ".1"; // 0.4.0.127.0.7.2.2.4.1.1, id-PACE-DH-GM-3DES-CBC-CBC + static let ID_PACE_DH_GM_AES_CBC_CMAC_128 = ID_PACE_DH_GM + ".2"; // 0.4.0.127.0.7.2.2.4.1.2, id-PACE-DH-GM-AES-CBC-CMAC-128 + static let ID_PACE_DH_GM_AES_CBC_CMAC_192 = ID_PACE_DH_GM + ".3"; // 0.4.0.127.0.7.2.2.4.1.3, id-PACE-DH-GM-AES-CBC-CMAC-192 + static let ID_PACE_DH_GM_AES_CBC_CMAC_256 = ID_PACE_DH_GM + ".4"; // 0.4.0.127.0.7.2.2.4.1.4, id-PACE-DH-GM-AES-CBC-CMAC-256 + + static let ID_PACE_ECDH_GM = ID_PACE + ".2" + static let ID_PACE_ECDH_GM_3DES_CBC_CBC = ID_PACE_ECDH_GM + ".1"; // 0.4.0.127.0.7.2.2.4.2.1, id-PACE-ECDH-GM-3DES-CBC-CBC + static let ID_PACE_ECDH_GM_AES_CBC_CMAC_128 = ID_PACE_ECDH_GM + ".2"; // 0.4.0.127.0.7.2.2.4.2.2, id-PACE-ECDH-GM-AES-CBC-CMAC-128 + static let ID_PACE_ECDH_GM_AES_CBC_CMAC_192 = ID_PACE_ECDH_GM + ".3"; // 0.4.0.127.0.7.2.2.4.2.3, id-PACE-ECDH-GM-AES-CBC-CMAC-192 + static let ID_PACE_ECDH_GM_AES_CBC_CMAC_256 = ID_PACE_ECDH_GM + ".4"; // 0.4.0.127.0.7.2.2.4.2.4, id-PACE-ECDH-GM-AES-CBC-CMAC-256 + + static let ID_PACE_DH_IM = ID_PACE + ".3" + static let ID_PACE_DH_IM_3DES_CBC_CBC = ID_PACE_DH_IM + ".1"; // 0.4.0.127.0.7.2.2.4.3.1, id-PACE-DH-IM-3DES-CBC-CBC + static let ID_PACE_DH_IM_AES_CBC_CMAC_128 = ID_PACE_DH_IM + ".2"; // 0.4.0.127.0.7.2.2.4.3.2, id-PACE-DH-IM-AES-CBC-CMAC-128 + static let ID_PACE_DH_IM_AES_CBC_CMAC_192 = ID_PACE_DH_IM + ".3"; // 0.4.0.127.0.7.2.2.4.3.3, id-PACE-DH-IM-AES-CBC-CMAC-192 + static let ID_PACE_DH_IM_AES_CBC_CMAC_256 = ID_PACE_DH_IM + ".4"; // 0.4.0.127.0.7.2.2.4.3.4, id-PACE-DH-IM-AES-CBC-CMAC-256 + + static let ID_PACE_ECDH_IM = ID_PACE + ".4" + static let ID_PACE_ECDH_IM_3DES_CBC_CBC = ID_PACE_ECDH_IM + ".1"; // 0.4.0.127.0.7.2.2.4.4.1, id-PACE-ECDH-IM-3DES-CBC-CBC + static let ID_PACE_ECDH_IM_AES_CBC_CMAC_128 = ID_PACE_ECDH_IM + ".2"; // 0.4.0.127.0.7.2.2.4.4.2, id-PACE-ECDH-IM-AES-CBC-CMAC-128 + static let ID_PACE_ECDH_IM_AES_CBC_CMAC_192 = ID_PACE_ECDH_IM + ".3"; // 0.4.0.127.0.7.2.2.4.4.3, id-PACE-ECDH-IM-AES-CBC-CMAC-192 + static let ID_PACE_ECDH_IM_AES_CBC_CMAC_256 = ID_PACE_ECDH_IM + ".4"; // 0.4.0.127.0.7.2.2.4.4.4, id-PACE-ECDH-IM-AES-CBC-CMAC-256 + + static let ID_PACE_ECDH_CAM = ID_PACE + ".6" + static let ID_PACE_ECDH_CAM_AES_CBC_CMAC_128 = ID_PACE_ECDH_CAM + ".2"; // 0.4.0.127.0.7.2.2.4.6.2, id-PACE-ECDH-CAM-AES-CBC-CMAC-128 + static let ID_PACE_ECDH_CAM_AES_CBC_CMAC_192 = ID_PACE_ECDH_CAM + ".3"; // 0.4.0.127.0.7.2.2.4.6.3, id-PACE-ECDH-CAM-AES-CBC-CMAC-192 + static let ID_PACE_ECDH_CAM_AES_CBC_CMAC_256 = ID_PACE_ECDH_CAM + ".4"; // 0.4.0.127.0.7.2.2.4.6.4, id-PACE-ECDH-CAM-AES-CBC-CMAC-256 + + public func getObjectIdentifier() -> String { + preconditionFailure("This method must be overridden") + } + + public func getProtocolOIDString() -> String { + preconditionFailure("This method must be overridden") + } + + static func getInstance( object : ASN1Item, body: [UInt8] ) -> SecurityInfo? { + let oid = object.getChild(0)?.value ?? "" + let requiredData = object.getChild(1)! + var optionalData : ASN1Item? = nil + if (object.getNumberOfChildren() == 3) { + optionalData = object.getChild(2) + } + + if ChipAuthenticationPublicKeyInfo.checkRequiredIdentifier(oid) { + + let keyData : [UInt8] = [UInt8](body[requiredData.pos ..< requiredData.pos+requiredData.headerLen+requiredData.length]) + + var subjectPublicKeyInfo : OpaquePointer? = nil + let _ = keyData.withUnsafeBytes { (ptr) in + var newPtr = ptr.baseAddress?.assumingMemoryBound(to: UInt8.self) + + subjectPublicKeyInfo = d2i_PUBKEY(nil, &newPtr, keyData.count) + } + + if let subjectPublicKeyInfo = subjectPublicKeyInfo { + + if optionalData == nil { + return ChipAuthenticationPublicKeyInfo(oid:oid, pubKey:subjectPublicKeyInfo); + } else { + let keyId = Int(optionalData!.value, radix: 16) + return ChipAuthenticationPublicKeyInfo(oid:oid, pubKey:subjectPublicKeyInfo, keyId: keyId); + } + + } + } else if ChipAuthenticationInfo.checkRequiredIdentifier(oid) { + let version = Int(requiredData.value) ?? -1 + if let optionalData = optionalData { + let keyId = Int(optionalData.value, radix: 16) + return ChipAuthenticationInfo(oid: oid, version: version, keyId: keyId); + } else { + return ChipAuthenticationInfo(oid: oid, version: version); + } + } else if PACEInfo.checkRequiredIdentifier(oid) { + let version = Int(requiredData.value) ?? -1 + var parameterId : Int? = nil + + if let optionalData = optionalData { + parameterId = Int(optionalData.value, radix:16) + } + return PACEInfo(oid: oid, version: version, parameterId: parameterId); + } else if ActiveAuthenticationInfo.checkRequiredIdentifier(oid) { + let version = Int(requiredData.value) ?? -1 + if let optionalData = optionalData { + return ActiveAuthenticationInfo(oid: oid, version: version, signatureAlgorithmOID: optionalData.value) + } else { + return ActiveAuthenticationInfo(oid: oid, version: version) + } + } + return nil + } +} diff --git a/app/ios/AwesomeProject/Images.xcassets/AppIcon.appiconset/Contents.json b/app/ios/AwesomeProject/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..81213230 --- /dev/null +++ b/app/ios/AwesomeProject/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/app/ios/AwesomeProject/Images.xcassets/Contents.json b/app/ios/AwesomeProject/Images.xcassets/Contents.json new file mode 100644 index 00000000..2d92bd53 --- /dev/null +++ b/app/ios/AwesomeProject/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/app/ios/AwesomeProject/Info.plist b/app/ios/AwesomeProject/Info.plist new file mode 100644 index 00000000..b3165cf2 --- /dev/null +++ b/app/ios/AwesomeProject/Info.plist @@ -0,0 +1,56 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + AwesomeProject + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSApplicationCategoryType + + LSRequiresIPhoneOS + + NFCReaderUsageDescription + Need NFC to read Passport + NSAppTransportSecurity + + NSLocationWhenInUseUsageDescription + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + com.apple.developer.nfc.readersession.iso7816.select-identifiers + + A0000002471001 + A0000002472001 + 00000000000000 + + + diff --git a/app/ios/AwesomeProject/NFCViewDisplayMessage.swift b/app/ios/AwesomeProject/NFCViewDisplayMessage.swift new file mode 100644 index 00000000..94ad49b7 --- /dev/null +++ b/app/ios/AwesomeProject/NFCViewDisplayMessage.swift @@ -0,0 +1,50 @@ +import Foundation + +@available(iOS 13, macOS 10.15, *) +public enum NFCViewDisplayMessage { + case requestPresentPassport + case authenticatingWithPassport(Int) + case readingDataGroupProgress(DataGroupId, Int) + case error(NFCPassportReaderError) + case successfulRead +} + +@available(iOS 13, macOS 10.15, *) +extension NFCViewDisplayMessage { + public var description: String { + switch self { + case .requestPresentPassport: + return "Hold your iPhone near an NFC enabled passport." + case .authenticatingWithPassport(let progress): + let progressString = handleProgress(percentualProgress: progress) + return "Authenticating with passport.....\n\n\(progressString)" + case .readingDataGroupProgress(let dataGroup, let progress): + let progressString = handleProgress(percentualProgress: progress) + return "Reading \(dataGroup).....\n\n\(progressString)" + case .error(let tagError): + switch tagError { + case NFCPassportReaderError.TagNotValid: + return "Tag not valid." + case NFCPassportReaderError.MoreThanOneTagFound: + return "More than 1 tags was found. Please present only 1 tag." + case NFCPassportReaderError.ConnectionError: + return "Connection error. Please try again." + case NFCPassportReaderError.InvalidMRZKey: + return "MRZ Key not valid for this document." + case NFCPassportReaderError.ResponseError(let description, let sw1, let sw2): + return "Sorry, there was a problem reading the passport. \(description) - (0x\(sw1), 0x\(sw2)" + default: + return "Sorry, there was a problem reading the passport. Please try again" + } + case .successfulRead: + return "Passport read successfully" + } + } + + func handleProgress(percentualProgress: Int) -> String { + let p = (percentualProgress/20) + let full = String(repeating: "🟒 ", count: p) + let empty = String(repeating: "βšͺ️ ", count: 5-p) + return "\(full)\(empty)" + } +} diff --git a/app/ios/AwesomeProject/OpenSSLUtils.swift b/app/ios/AwesomeProject/OpenSSLUtils.swift new file mode 100644 index 00000000..b0b4851f --- /dev/null +++ b/app/ios/AwesomeProject/OpenSSLUtils.swift @@ -0,0 +1,697 @@ +import Foundation +import OpenSSL +import CryptoTokenKit + +@available(iOS 13, macOS 10.15, *) +public class OpenSSLUtils { + private static var loaded = false + + /// Returns any OpenSSL Error as a String + public static func getOpenSSLError() -> String { + + guard let out = BIO_new(BIO_s_mem()) else { return "Unknown" } + defer { BIO_free(out) } + + ERR_print_errors( out ) + let str = OpenSSLUtils.bioToString( bio:out ) + + return str + } + + /// Extracts the contents of a BIO object and returns it as a String + /// - Parameter bio: a Pointer to a BIO buffer + /// - Returns: A string containing the contents of the BIO buffer + static func bioToString( bio : OpaquePointer ) -> String { + + let len = BIO_ctrl(bio, BIO_CTRL_PENDING, 0, nil) + var buffer = [CChar](repeating: 0, count: len+1) + BIO_read(bio, &buffer, Int32(len)) + + // Ensure last value is 0 (null terminated) otherwise we get buffer overflow! + buffer[len] = 0 + let ret = String(cString:buffer) + return ret + } + + static func X509ToPEM( x509: OpaquePointer ) -> String { + + let out = BIO_new(BIO_s_mem())! + defer { BIO_free( out) } + + PEM_write_bio_X509(out, x509); + let str = OpenSSLUtils.bioToString( bio:out ) + + return str + } + + static func pubKeyToPEM( pubKey: OpaquePointer ) -> String { + + let out = BIO_new(BIO_s_mem())! + defer { BIO_free( out) } + + PEM_write_bio_PUBKEY(out, pubKey); + let str = OpenSSLUtils.bioToString( bio:out ) + + return str + } + + static func privKeyToPEM( privKey: OpaquePointer ) -> String { + + let out = BIO_new(BIO_s_mem())! + defer { BIO_free( out) } + + PEM_write_bio_PrivateKey(out, privKey, nil, nil, 0, nil, nil) + let str = OpenSSLUtils.bioToString( bio:out ) + + return str + } + + static func pkcs7DataToPEM( pkcs7: Data ) -> String { + + let inf = BIO_new(BIO_s_mem())! + defer { BIO_free( inf) } + let out = BIO_new(BIO_s_mem())! + defer { BIO_free( out) } + + let _ = pkcs7.withUnsafeBytes { (ptr) in + BIO_write(inf, ptr.baseAddress?.assumingMemoryBound(to: Int8.self), Int32(pkcs7.count)) + } + guard let p7 = d2i_PKCS7_bio(inf, nil) else { return "" } + defer { PKCS7_free(p7) } + + PEM_write_bio_PKCS7(out, p7) + let str = OpenSSLUtils.bioToString( bio:out ) + return str + } + + + /// Extracts a X509 certificate in PEM format from a PKCS7 container + /// - Parameter pkcs7Der: The PKCS7 container in DER format + /// - Returns: The PEM formatted X509 certificate + /// - Throws: A OpenSSLError.UnableToGetX509CertificateFromPKCS7 are thrown for any error + static func getX509CertificatesFromPKCS7( pkcs7Der : Data ) throws -> [X509Wrapper] { + + guard let inf = BIO_new(BIO_s_mem()) else { throw OpenSSLError.UnableToGetX509CertificateFromPKCS7("Unable to allocate input buffer") } + defer { BIO_free(inf) } + let _ = pkcs7Der.withUnsafeBytes { (ptr) in + BIO_write(inf, ptr.baseAddress?.assumingMemoryBound(to: Int8.self), Int32(pkcs7Der.count)) + } + guard let p7 = d2i_PKCS7_bio(inf, nil) else { throw OpenSSLError.UnableToGetX509CertificateFromPKCS7("Unable to read PKCS7 DER data") } + defer { PKCS7_free(p7) } + + var certs : OpaquePointer? = nil + let i = OBJ_obj2nid(p7.pointee.type); + switch (i) { + case NID_pkcs7_signed: + if let sign = p7.pointee.d.sign { + certs = sign.pointee.cert + } + break; + case NID_pkcs7_signedAndEnveloped: + if let signed_and_enveloped = p7.pointee.d.signed_and_enveloped { + certs = signed_and_enveloped.pointee.cert + } + break; + default: + break; + } + + var ret = [X509Wrapper]() + if let certs = certs { + let certCount = sk_X509_num(certs) + for i in 0 ..< certCount { + let x = sk_X509_value(certs, i); + if let x509 = X509Wrapper(with:x) { + ret.append( x509 ) + } + } + } + + return ret + } + + /// Checks whether a trust chain can be built up to verify a X509 certificate. A CAFile containing a list of trusted certificates (each in PEM format) + /// is used to build the trust chain. + /// The trusted certificates in this use case are typically from a Countries master list (see the scripts for more informaton on how to prepare this) + /// - Parameter x509Cert: The X509 certificate (in PEM format) to verify + /// - Parameter CAFile: The URL path of a file containing the list of certificates used to try to discover and build a trust chain + /// - Returns: either the X509 issue signing certificate that was used to sign the passed in X509 certificate or an error + static func verifyTrustAndGetIssuerCertificate( x509 : X509Wrapper, CAFile : URL ) -> Result { + + guard let cert_ctx = X509_STORE_new() else { return .failure(OpenSSLError.UnableToVerifyX509CertificateForSOD("Unable to create certificate store")) } + defer { X509_STORE_free(cert_ctx) } + + X509_STORE_set_verify_cb(cert_ctx) { (ok, ctx) -> Int32 in + let cert_error = X509_STORE_CTX_get_error(ctx) + + if ok == 0 { + let errVal = X509_verify_cert_error_string(Int(cert_error)) + let val = errVal!.withMemoryRebound(to: CChar.self, capacity: 1000) { (ptr) in + return String(cString: ptr) + } + + Log.error("error \(cert_error) at \(X509_STORE_CTX_get_error_depth(ctx)) depth lookup:\(val)" ) + } + + return ok; + } + + guard let lookup = X509_STORE_add_lookup(cert_ctx, X509_LOOKUP_file()) else { return .failure(OpenSSLError.UnableToVerifyX509CertificateForSOD("Unable to add lookup to store")) } + + // Load masterList.pem file + var rc = X509_LOOKUP_ctrl(lookup, X509_L_FILE_LOAD, CAFile.path, Int(X509_FILETYPE_PEM), nil) + + guard let store = X509_STORE_CTX_new() else { + return .failure(OpenSSLError.UnableToVerifyX509CertificateForSOD("Unable to create new X509_STORE_CTX")) + } + defer { X509_STORE_CTX_free(store) } + + X509_STORE_set_flags(cert_ctx, 0) + rc = X509_STORE_CTX_init(store, cert_ctx, x509.cert, nil) + if rc == 0 { + return .failure(OpenSSLError.UnableToVerifyX509CertificateForSOD("Unable to initialise X509_STORE_CTX")) + } + + // discover and verify X509 certificte chain + let i = X509_verify_cert(store); + if i != 1 { + let err = X509_STORE_CTX_get_error(store) + + return .failure(OpenSSLError.UnableToVerifyX509CertificateForSOD("Verification of certificate failed - errorCode \(err)")) + } + + // Get chain and issue certificate is the last cert in the chain + let chain = X509_STORE_CTX_get1_chain(store); + let nrCertsInChain = sk_X509_num(chain) + if nrCertsInChain > 1 { + let cert = sk_X509_value(chain, nrCertsInChain-1) + if let certWrapper = X509Wrapper(with: cert) { + return .success( certWrapper ) + } + } + + return .failure(OpenSSLError.UnableToVerifyX509CertificateForSOD("Unable to get issuer certificate - not found")) + } + + + /// Verifies the signed data section against the stored certificate and extracts the signed data section from a PKCS7 container (if present and valid) + /// - Parameter pkcs7Der: The PKCS7 container in DER format + /// - Returns: The signed data from a PKCS7 container if we could read it + /// + /// - Note: To test from the command line using openssl (NOTE NOT THE default mac version as it doesn't currently support CMS): + /// extract the SOD Base64 from an exported passport (you will need to unescape slashes!) - save this to ppt.b64 + /// convert to binary (cat ppt.b64 | base64 -D > ppt.bin + /// extract the der file from the SOD (which includes header) - tail -c+5 ppt.bin > aq.der (blindy discards header) + /// convert der to PEM - openssl pkcs7 -in ppt.der --inform der -out ppt.pem -outform pem + /// verify signature data against included document signing cert - openssl cms -verify -in ppt.pem -inform pem -noverify + /// the -noverify is don't verify against the signers certifcate (as we don' thave that!) + /// + /// This should return Verification Successful and the signed data + static func verifyAndReturnSODEncapsulatedDataUsingCMS( sod : SOD ) throws -> Data { + + guard let inf = BIO_new(BIO_s_mem()) else { throw OpenSSLError.VerifyAndReturnSODEncapsulatedData("CMS - Unable to allocate input buffer") } + defer { BIO_free(inf) } + + guard let out = BIO_new(BIO_s_mem()) else { throw OpenSSLError.VerifyAndReturnSODEncapsulatedData("CMS - Unable to allocate output buffer") } + defer { BIO_free(out) } + + let _ = sod.body.withUnsafeBytes { (ptr) in + BIO_write(inf, ptr.baseAddress?.assumingMemoryBound(to: UInt8.self), Int32(sod.body.count)) + } + + guard let cms = d2i_CMS_bio(inf, nil) else { + throw OpenSSLError.VerifyAndReturnSODEncapsulatedData("CMS - Verification of P7 failed - unable to create CMS") + } + defer { CMS_ContentInfo_free(cms) } + + let flags : UInt32 = UInt32(CMS_NO_SIGNER_CERT_VERIFY) + + if CMS_verify(cms, nil, nil, nil, out, flags) == 0 { + throw OpenSSLError.VerifyAndReturnSODEncapsulatedData("CMS - Verification of P7 failed - unable to verify signature") + } + + Log.debug("Verification successful\n"); + let len = BIO_ctrl(out, BIO_CTRL_PENDING, 0, nil) + var buffer = [UInt8](repeating: 0, count: len) + BIO_read(out, &buffer, Int32(len)) + let sigData = Data(buffer) + + return sigData + } + + + static func verifyAndReturnSODEncapsulatedData( sod : SOD ) throws -> Data { + + let encapsulatedContent = try sod.getEncapsulatedContent() + let signedAttribsHashAlgo = try sod.getEncapsulatedContentDigestAlgorithm() + let signedAttributes = try sod.getSignedAttributes() + let messageDigest = try sod.getMessageDigestFromSignedAttributes() + let signature = try sod.getSignature() + let sigType = try sod.getSignatureAlgorithm() + + let pubKey = try sod.getPublicKey() + + let mdHash : Data = try Data(calcHash(data: [UInt8](encapsulatedContent), hashAlgorithm: signedAttribsHashAlgo)) + + // Make sure that hash equals the messageDigest + if messageDigest != mdHash { + // Invalid - signed data hash doesn't match message digest hash + throw OpenSSLError.VerifyAndReturnSODEncapsulatedData("messageDigest Hash doesn't hatch that of the signed attributes") + } + + // Verify signed attributes + if !verifySignature( data : [UInt8](signedAttributes), signature : [UInt8](signature), pubKey : pubKey, digestType: sigType ) { + + throw OpenSSLError.VerifyAndReturnSODEncapsulatedData("Unable to verify signature for signed attributes") + } + + return encapsulatedContent + } + + /// Parses a signed data structures encoded in ASN1 format and returns the structure in text format + /// - Parameter data: The data to be parsed in ASN1 format + /// - Returns: The parsed data as A String + static func ASN1Parse( data: Data ) throws -> String { + + guard let out = BIO_new(BIO_s_mem()) else { throw OpenSSLError.UnableToParseASN1("Unable to allocate output buffer") } + defer { BIO_free(out) } + + var parsed : String = "" + let _ = try data.withUnsafeBytes { (ptr) in + let rc = ASN1_parse_dump(out, ptr.baseAddress?.assumingMemoryBound(to: UInt8.self), data.count, 0, 0) + if rc == 0 { + let str = OpenSSLUtils.getOpenSSLError() + Log.debug( "Failed to parse ASN1 Data - \(str)" ) + throw OpenSSLError.UnableToParseASN1("Failed to parse ASN1 Data - \(str)") + } + + parsed = bioToString(bio: out) + } + + return parsed + } + + + + /// Reads an RSA Public Key in DER format and converts it to an OpenSSL EVP_PKEY value for use whilst decrypting or verifying an RSA signature + /// - Parameter data: The RSA key in DER format + /// - Returns: The EVP_PKEY value + /// NOTE THE CALLER IS RESPONSIBLE FOR FREEING THE RETURNED KEY USING + /// EVP_PKEY_free(pemKey); + static func readRSAPublicKey( data : [UInt8] ) throws -> OpaquePointer? { + + guard let inf = BIO_new(BIO_s_mem()) else { throw OpenSSLError.UnableToReadECPublicKey("Unable to allocate output buffer") } + defer { BIO_free(inf) } + + let _ = data.withUnsafeBytes { (ptr) in + BIO_write(inf, ptr.baseAddress?.assumingMemoryBound(to: UInt8.self), Int32(data.count)) + } + + guard let rsakey = d2i_RSA_PUBKEY_bio(inf, nil) else { throw OpenSSLError.UnableToReadECPublicKey("Failed to load") } + defer{ RSA_free(rsakey) } + + let key = EVP_PKEY_new() + if EVP_PKEY_set1_RSA(key, rsakey) != 1 { + EVP_PKEY_free(key) + throw OpenSSLError.UnableToReadECPublicKey("Failed to load") + } + return key + } + + /// This code is taken pretty much from rsautl.c - to decrypt a signature with a public key + /// NOTE: Current no padding is used! - This seems to be the default for Active Authentication RSA signatures (guess) + /// - Parameter signature: The RSA encrypted signature to decrypt + /// - Parameter pubKey: The RSA Public Key + /// - Returns: The decrypted signature data + static func decryptRSASignature( signature : Data, pubKey : OpaquePointer ) throws -> [UInt8] { + + let pad = RSA_NO_PADDING + let rsa = EVP_PKEY_get1_RSA( pubKey ) + + let keysize = RSA_size(rsa); + var outputBuf = [UInt8](repeating: 0, count: Int(keysize)) + + // Decrypt signature + var outlen : Int32 = 0 + let _ = signature.withUnsafeBytes { (sigPtr) in + let _ = outputBuf.withUnsafeMutableBytes { (outPtr) in + outlen = RSA_public_decrypt(Int32(signature.count), sigPtr.baseAddress?.assumingMemoryBound(to: UInt8.self), outPtr.baseAddress?.assumingMemoryBound(to: UInt8.self), rsa, pad) + } + } + + if outlen == 0 { + let error = OpenSSLUtils.getOpenSSLError() + throw OpenSSLError.UnableToDecryptRSASignature( "RSA_public_decrypt failed - \(error)" ) + } + + return outputBuf + } + + /// Reads an ECDSA Public Key in DER format and converts it to an OpenSSL EVP_PKEY value for use whilst verifying a ECDSA signature + /// - Parameter data: The ECDSA key in DER forma + /// - Returns: The EVP_PKEY value + /// NOTE THE CALLER IS RESPONSIBLE FOR FREEING THE RETURNED KEY USING + /// EVP_PKEY_free(pemKey); + static func readECPublicKey( data : [UInt8] ) throws -> OpaquePointer? { + + guard let inf = BIO_new(BIO_s_mem()) else { throw OpenSSLError.UnableToReadECPublicKey("Unable to allocate output buffer") } + defer { BIO_free(inf) } + + let _ = data.withUnsafeBytes { (ptr) in + BIO_write(inf, ptr.baseAddress?.assumingMemoryBound(to: UInt8.self), Int32(data.count)) + } + + guard let eckey = d2i_EC_PUBKEY_bio(inf, nil) else { throw OpenSSLError.UnableToReadECPublicKey("Failed to load") } + defer{ EC_KEY_free(eckey) } + + guard let outf = BIO_new(BIO_s_mem()) else { throw OpenSSLError.UnableToReadECPublicKey("Unable to allocate output buffer") } + defer { BIO_free(outf) } + let _ = PEM_write_bio_EC_PUBKEY(outf, eckey); + let pemKey = PEM_read_bio_PUBKEY(outf, nil, nil, nil) + + return pemKey + } + + + /// Verifies Active Authentication data valid against an ECDSA signature and ECDSA Public Key - used in Active Authentication + /// - Parameter publicKey: The OpenSSL EVP_PKEY ECDSA key + /// - Parameter signature: The ECDSA signature to verify + /// - Parameter data: The data used to generate the signature + /// - Returns: True if the signature was verified + static func verifyECDSASignature( publicKey:OpaquePointer, signature: [UInt8], data: [UInt8], digestType: String = "" ) -> Bool { + + // We first need to convert the signature from PLAIN ECDSA to ASN1 DER encoded + let ecsig = ECDSA_SIG_new() + defer { ECDSA_SIG_free(ecsig) } + let sigData = signature + let l = sigData.count / 2 + sigData.withUnsafeBufferPointer { (unsafeBufPtr) in + let unsafePointer = unsafeBufPtr.baseAddress! + let r = BN_bin2bn(unsafePointer, Int32(l), nil) + let s = BN_bin2bn((unsafePointer + l), Int32(l), nil) + ECDSA_SIG_set0(ecsig, r, s) + } + let sigSize = i2d_ECDSA_SIG(ecsig, nil) + var derBytes = [UInt8](repeating: 0, count: Int(sigSize)) + derBytes.withUnsafeMutableBufferPointer { (unsafeBufPtr) in + var unsafePointer = unsafeBufPtr.baseAddress + let _ = i2d_ECDSA_SIG(ecsig, &unsafePointer) + } + + let rc = verifySignature(data: data, signature: derBytes, pubKey: publicKey, digestType: digestType) + return rc + } + + /// Verifies that a signature is valid for some data and a Public Key + /// - Parameter data: The data used to generate the signature + /// - Parameter signature: The signature to verify + /// - Parameter publicKey: The OpenSSL EVP_PKEY key + /// - Parameter digestType: the type of hash to use (empty string to use no digest type) + /// - Returns: True if the signature was verified + static func verifySignature( data : [UInt8], signature : [UInt8], pubKey : OpaquePointer, digestType: String ) -> Bool { + + var digest = "sha256" + let digestType = digestType.lowercased() + if digestType.contains( "sha1" ) { + digest = "sha1" + } else if digestType.contains( "sha224" ) { + digest = "sha224" + } else if digestType.contains( "sha256" ) || digestType.contains( "rsassapss" ) { + digest = "sha256" + } else if digestType.contains( "sha384" ) { + digest = "sha384" + } else if digestType.contains( "sha512" ) { + digest = "sha512" + } + + // Fix for some invalid ECDSA based signatures + // An ECDSA signature comprises of a Sequence of 2 big integers (R & S) and the verification + // is a linear equation of these two integers, the data hash and the public key + // However, in some passports the encoding of the integers is incorrect and has a leading 00 + // causing the verification to fail. + // So in this case, we check to see if it is actually a valid BigInteger, and if not, we remove the + // leading prefix, check again and if a valid big integer this time then we use this otherwise + // we keep the original value + // If we change any values then we re-generate the signature and use this + var fixedSignature = signature + if digestType.contains( "ecdsa" ) { + // Decode signature + if let sequence = TKBERTLVRecord(from:Data(signature)), + sequence.tag == 0x30, + var intRecords = TKBERTLVRecord.sequenceOfRecords(from: sequence.value), + intRecords.count == 2 { + + var didFix = false + for (idx, rec) in intRecords.enumerated() { + // Only process if the first byte is a 0 + if rec.value[0] != 0 { + continue + } + + // There is a feature in TKBERTLVRecord.sequenceOfRecords where the 2nd record.data call + // contains the data for the whole data not the actual record + // (reported as FB9077037) + // So for the moment, work aroud this and create a new record + let fixedRec = TKBERTLVRecord( tag: rec.tag, value: rec.value) + let data = [UInt8](fixedRec.data) + + // Check to see if a valid Big Integer (we need the whole record including tag and length for the d2i_ASN1_INTEGER call) + data.withUnsafeBufferPointer { (ptr) in + var address = ptr.baseAddress + let v = d2i_ASN1_INTEGER(nil, &address, data.count) + defer { ASN1_INTEGER_free(v) } + if v == nil { + // Not a valid BigInteger, so remove the first value and try again + let newRec = TKBERTLVRecord( tag: rec.tag, value: rec.value[1...]) + + let data2 = [UInt8](newRec.data) + data2.withUnsafeBufferPointer { (ptr) in + var address = ptr.baseAddress + let v2 = d2i_ASN1_INTEGER(nil, &address, data2.count) + defer { ASN1_INTEGER_free(v2) } + if v2 != nil { + // OK, we have a valid BigInteger this time so replace the original + // record with the new one + intRecords[idx] = newRec + didFix = true + } + } + } + } + } + + // We only reencode if we changed any of the integers, otherwise assume they were actually + // correctly encoded + if didFix { + // re-encode + let newSequence = TKBERTLVRecord( tag: sequence.tag, records: intRecords) + fixedSignature = [UInt8](newSequence.data) + } + } + } + + let md = EVP_get_digestbyname(digest) + + let ctx = EVP_MD_CTX_new() + var pkey_ctx : OpaquePointer? + + defer{ EVP_MD_CTX_free( ctx) } + + var nRes = EVP_DigestVerifyInit(ctx, &pkey_ctx, md, nil, pubKey) + if ( nRes != 1 ) { + return false; + } + + if digestType.contains( "rsassapss" ) { + EVP_PKEY_CTX_ctrl_str(pkey_ctx, "rsa_padding_mode", "pss" ) + EVP_PKEY_CTX_ctrl_str(pkey_ctx, "rsa_pss_saltlen", "auto" ) + } + + nRes = EVP_DigestUpdate(ctx, data, data.count); + if ( nRes != 1 ) { + return false; + } + + nRes = EVP_DigestVerifyFinal(ctx, fixedSignature, fixedSignature.count); + if (nRes != 1) { + return false; + } + + return true + } + + @available(iOS 13, macOS 10.15, *) + static func generateAESCMAC( key: [UInt8], message : [UInt8] ) -> [UInt8] { + let ctx = CMAC_CTX_new(); + defer { CMAC_CTX_free(ctx) } + var key = key + + var mac = [UInt8](repeating: 0, count: 32) + var maclen : Int = 0 + + if key.count == 16 { + CMAC_Init(ctx, &key, key.count, EVP_aes_128_cbc(), nil) + } else if key.count == 24 { + CMAC_Init(ctx, &key, key.count, EVP_aes_192_cbc(), nil) + } else if key.count == 32 { + CMAC_Init(ctx, &key, key.count, EVP_aes_256_cbc(), nil) + } + CMAC_Update(ctx, message, message.count); + CMAC_Final(ctx, &mac, &maclen); + + Log.verbose( "aesMac - mac - \(binToHexRep(mac))" ) + + return [UInt8](mac[0.. [UInt8] { + + let obj = OBJ_txt2obj( oid.cString(using: .utf8), 1) + let payloadLen = i2d_ASN1_OBJECT(obj, nil) + + var data = [UInt8](repeating: 0, count: Int(payloadLen)) + + let _ = data.withUnsafeMutableBytes { (ptr) in + var newPtr = ptr.baseAddress?.assumingMemoryBound(to: UInt8.self) + _ = i2d_ASN1_OBJECT(obj, &newPtr) + } + + return data + } + + @available(iOS 13, macOS 10.15, *) + public static func getPublicKeyData(from key:OpaquePointer) -> [UInt8]? { + var data : [UInt8] = [] + // Get Key type + let v = EVP_PKEY_base_id( key ) + if v == EVP_PKEY_DH || v == EVP_PKEY_DHX { + guard let dh = EVP_PKEY_get0_DH(key) else { + return nil + } + var dhPubKey : OpaquePointer? + DH_get0_key(dh, &dhPubKey, nil) + + let nrBytes = (BN_num_bits(dhPubKey)+7)/8 + data = [UInt8](repeating: 0, count: Int(nrBytes)) + _ = BN_bn2bin(dhPubKey, &data) + } else if v == EVP_PKEY_EC { + + guard let ec = EVP_PKEY_get0_EC_KEY(key), + let ec_pub = EC_KEY_get0_public_key(ec), + let ec_group = EC_KEY_get0_group(ec) else { + return nil + } + + let form = EC_KEY_get_conv_form(ec) + let len = EC_POINT_point2oct(ec_group, ec_pub, form, nil, 0, nil) + data = [UInt8](repeating: 0, count: Int(len)) + if len == 0 { + return nil + } + _ = EC_POINT_point2oct(ec_group, ec_pub, form, &data, len, nil) + } + + return data + } + + // Caller is responsible for freeing the key + @available(iOS 13, macOS 10.15, *) + public static func decodePublicKeyFromBytes(pubKeyData: [UInt8], params: OpaquePointer) -> OpaquePointer? { + var pubKey : OpaquePointer? + + let keyType = EVP_PKEY_base_id( params ) + if keyType == EVP_PKEY_DH || keyType == EVP_PKEY_DHX { + + let dhKey = DH_new() + defer{ DH_free(dhKey) } + + // We don't free this as its part of the key! + let bn = BN_bin2bn(pubKeyData, Int32(pubKeyData.count), nil) + DH_set0_key(dhKey, bn, nil) + + pubKey = EVP_PKEY_new() + guard EVP_PKEY_set1_DH(pubKey, dhKey) == 1 else { + return nil + } + } else { + let ec = EVP_PKEY_get1_EC_KEY(params) + let group = EC_KEY_get0_group(ec); + let ecp = EC_POINT_new(group); + let key = EC_KEY_new(); + defer { + EC_KEY_free(ec) + EC_POINT_free(ecp) + EC_KEY_free(key) + } + + // Read EC_Point from public key data + guard EC_POINT_oct2point(group, ecp, pubKeyData, pubKeyData.count, nil) == 1, + EC_KEY_set_group(key, group) == 1, + EC_KEY_set_public_key(key, ecp) == 1 else { + + return nil + } + + pubKey = EVP_PKEY_new() + guard EVP_PKEY_set1_EC_KEY(pubKey, key) == 1 else { + return nil + } + } + + return pubKey + } + + + public static func computeSharedSecret( privateKeyPair: OpaquePointer, publicKey: OpaquePointer ) -> [UInt8] { + + // Oddly it seems that we cant use EVP_PKEY stuff for DH as it uses DTX keys which OpenSSL doesn't quite handle right + // OR I'm misunderstanding something (which is more possible) + // Works fine though for ECDH keys + var secret : [UInt8] + let keyType = EVP_PKEY_base_id( privateKeyPair ) + if keyType == EVP_PKEY_DH || keyType == EVP_PKEY_DHX { + // Get bn for public key + let dh = EVP_PKEY_get1_DH(privateKeyPair); + + let dh_pub = EVP_PKEY_get1_DH(publicKey) + var bn = BN_new() + DH_get0_key( dh_pub, &bn, nil ) + + secret = [UInt8](repeating: 0, count: Int(DH_size(dh))) + let len = DH_compute_key(&secret, bn, dh); + + Log.verbose( "OpenSSLUtils.computeSharedSecret - DH secret len - \(len)" ) + } else { + let ctx = EVP_PKEY_CTX_new(privateKeyPair, nil) + defer{ EVP_PKEY_CTX_free(ctx) } + + if EVP_PKEY_derive_init(ctx) != 1 { + // error + Log.error( "ERROR - \(OpenSSLUtils.getOpenSSLError())" ) + } + + // Set the public key + if EVP_PKEY_derive_set_peer( ctx, publicKey ) != 1 { + // error + Log.error( "ERROR - \(OpenSSLUtils.getOpenSSLError())" ) + } + + // get buffer length needed for shared secret + var keyLen = 0 + if EVP_PKEY_derive(ctx, nil, &keyLen) != 1 { + // Error + Log.error( "ERROR - \(OpenSSLUtils.getOpenSSLError())" ) + } + + // Derive the shared secret + secret = [UInt8](repeating: 0, count: keyLen) + if EVP_PKEY_derive(ctx, &secret, &keyLen) != 1 { + // Error + Log.error( "ERROR - \(OpenSSLUtils.getOpenSSLError())" ) + } + } + return secret + } + +} diff --git a/app/ios/AwesomeProject/PACEHandler.swift b/app/ios/AwesomeProject/PACEHandler.swift new file mode 100644 index 00000000..f4f408fa --- /dev/null +++ b/app/ios/AwesomeProject/PACEHandler.swift @@ -0,0 +1,614 @@ +import Foundation +import OpenSSL +import CryptoTokenKit + +#if !os(macOS) +import CoreNFC +import CryptoKit + +@available(iOS 15, *) +private enum PACEHandlerError { + case DHKeyAgreementError(String) + case ECDHKeyAgreementError(String) + + var value: String { + switch self { + case .DHKeyAgreementError(let errMsg): return errMsg + case .ECDHKeyAgreementError(let errMsg): return errMsg + + } + } +} + +@available(iOS 15, *) +extension PACEHandlerError: LocalizedError { + public var errorDescription: String? { + return NSLocalizedString(value, comment: "PACEHandlerError") + } +} + +@available(iOS 15, *) +public class PACEHandler { + + + private static let MRZ_PACE_KEY_REFERENCE : UInt8 = 0x01 + private static let CAN_PACE_KEY_REFERENCE : UInt8 = 0x02 // Not currently supported + private static let PIN_PACE_KEY_REFERENCE : UInt8 = 0x03 // Not currently supported + private static let CUK_PACE_KEY_REFERENCE : UInt8 = 0x04 // Not currently supported + + var tagReader : TagReader + var paceInfo : PACEInfo + + var isPACESupported : Bool = false + var paceError : String = "" + + // Params used + private var paceKey : [UInt8] = [] + private var paceKeyType : UInt8 = 0 + private var paceOID : String = "" + private var parameterSpec : Int32 = -1 + private var mappingType : PACEMappingType! + private var agreementAlg : String = "" + private var cipherAlg : String = "" + private var digestAlg : String = "" + private var keyLength : Int = -1 + + public init(cardAccess : CardAccess, tagReader: TagReader) throws { + self.tagReader = tagReader + + guard let pi = cardAccess.paceInfo else { + throw NFCPassportReaderError.NotYetSupported( "PACE not supported" ) + } + + self.paceInfo = pi + isPACESupported = true + } + + public func doPACE( mrzKey : String ) async throws { + guard isPACESupported else { + throw NFCPassportReaderError.NotYetSupported( "PACE not supported" ) + } + + Log.info( "Performing PACE with \(paceInfo.getProtocolOIDString())" ) + + paceOID = paceInfo.getObjectIdentifier() + parameterSpec = try paceInfo.getParameterSpec() + + mappingType = try paceInfo.getMappingType() // Either GM, CAM, or IM. + agreementAlg = try paceInfo.getKeyAgreementAlgorithm() // Either DH or ECDH. + cipherAlg = try paceInfo.getCipherAlgorithm() // Either DESede or AES. + digestAlg = try paceInfo.getDigestAlgorithm() // Either SHA-1 or SHA-256. + keyLength = try paceInfo.getKeyLength() // Get key length the enc cipher. Either 128, 192, or 256. + + paceKeyType = PACEHandler.MRZ_PACE_KEY_REFERENCE + paceKey = try createPaceKey( from: mrzKey ) + + // Temporary logging + Log.verbose("doPace - inpit parameters" ) + Log.verbose("paceOID - \(paceOID)" ) + Log.verbose("parameterSpec - \(parameterSpec)" ) + Log.verbose("mappingType - \(mappingType!)" ) + Log.verbose("agreementAlg - \(agreementAlg)" ) + Log.verbose("cipherAlg - \(cipherAlg)" ) + Log.verbose("digestAlg - \(digestAlg)" ) + Log.verbose("keyLength - \(keyLength)" ) + Log.verbose("keyLength - \(mrzKey)" ) + Log.verbose("paceKey - \(binToHexRep(paceKey, asArray:true))" ) + + // First start the initial auth call + _ = try await tagReader.sendMSESetATMutualAuth(oid: paceOID, keyType: paceKeyType) + + let decryptedNonce = try await self.doStep1() + let ephemeralParams = try await self.doStep2(passportNonce: decryptedNonce) + let (ephemeralKeyPair, passportPublicKey) = try await self.doStep3KeyExchange(ephemeralParams: ephemeralParams) + let (encKey, macKey) = try await self.doStep4KeyAgreement( pcdKeyPair: ephemeralKeyPair, passportPublicKey: passportPublicKey) + try self.paceCompleted( ksEnc: encKey, ksMac: macKey ) + Log.debug("PACE SUCCESSFUL" ) + } + + /// Handles an error during the PACE process + /// Logs and stoes the error and returns false to the caller + /// - Parameters: + /// - stage: Where in the PACE process the error occurred + /// - error: The error message + func handleError( _ stage: String, _ error: String, needToTerminateGA: Bool = false ) { + Log.error( "PACEHandler: \(stage) - \(error)" ) + Log.error( " OpenSSLError: \(OpenSSLUtils.getOpenSSLError())" ) + self.paceError = "\(stage) - \(error)" + //self.completedHandler?( false ) + +/* + if needToTerminateGA { + // This is to fix some passports that don't automatically terminate command chaining! + // No idea if this is the correct way to do it but testing..... + let terminateGA = wrapDO(b:0x83, arr:[0x00]) + tagReader.sendGeneralAuthenticate(data:terminateGA, isLast:true, completed: { [weak self] response, error in + self?.completedHandler?( false ) + }) + } else { + self.completedHandler?( false ) + } +*/ + } + + /// Performs PACE Step 1- receives an encrypted nonce from the passport and decypts it with the PACE key - derived from MRZ, CAN (not yet supported) + func doStep1() async throws -> [UInt8] { + Log.debug("Doing PACE Step1...") + let response = try await tagReader.sendGeneralAuthenticate(data: [], isLast: false) + + let data = response.data + let encryptedNonce = try unwrapDO(tag: 0x80, wrappedData: data) + Log.verbose( "Encrypted nonce - \(binToHexRep(encryptedNonce, asArray:true))" ) + + let decryptedNonce: [UInt8] + if self.cipherAlg == "DESede" { + let iv = [UInt8](repeating:0, count: 8) + decryptedNonce = tripleDESDecrypt(key: self.paceKey, message: encryptedNonce, iv: iv) + } else if self.cipherAlg == "AES" { + let iv = [UInt8](repeating:0, count: 16) + decryptedNonce = AESDecrypt(key: self.paceKey, message: encryptedNonce, iv: iv) + } else { + throw NFCPassportReaderError.UnsupportedCipherAlgorithm + } + + Log.verbose( "Decrypted nonce - \(binToHexRep(decryptedNonce, asArray:true) )" ) + return decryptedNonce + } + + + /// Performs PACE Step 2 - computes ephemeral parameters by mapping the nonce received from the passport + /// (and if IM used the nonce generated by us) + /// + /// Using the supported + /// - Parameters: + /// - passportNonce: The decrypted nonce received from the passport + func doStep2( passportNonce: [UInt8]) async throws -> OpaquePointer { + Log.debug( "Doing PACE Step2...") + switch(mappingType) { + case .CAM, .GM: + Log.debug( " Using General Mapping (GM)...") + return try await doPACEStep2GM(passportNonce: passportNonce) + case .IM: + Log.debug( " Using Integrated Mapping (IM)...") + return try await doPACEStep2IM(passportNonce: passportNonce) + default: + throw NFCPassportReaderError.PACEError( "Step2GM", "Unsupported Mapping Type" ) + } + + } + + /// Performs PACEStep 2 using Generic Mapping + /// + /// Using the supported + /// - Parameters: + /// - passportNonce: The decrypted nonce received from the passport + func doPACEStep2GM(passportNonce : [UInt8]) async throws -> OpaquePointer { + + let mappingKey : OpaquePointer + mappingKey = try self.paceInfo.createMappingKey( ) + + guard let pcdMappingEncodedPublicKey = OpenSSLUtils.getPublicKeyData(from: mappingKey) else { + throw NFCPassportReaderError.PACEError( "Step2GM", "Unable to get public key from mapping key") + } + Log.verbose( "public mapping key - \(binToHexRep(pcdMappingEncodedPublicKey, asArray:true))") + + Log.debug( "Sending public mapping key to passport..") + let step2Data = wrapDO(b:0x81, arr:pcdMappingEncodedPublicKey) + let response = try await tagReader.sendGeneralAuthenticate(data:step2Data, isLast:false) + + let piccMappingEncodedPublicKey = try unwrapDO(tag: 0x82, wrappedData: response.data) + + Log.debug( "Received passports public mapping key") + Log.verbose( " public mapping key - \(binToHexRep(piccMappingEncodedPublicKey, asArray: true))") + + // Do mapping agreement + + // First, Convert nonce to BIGNUM + guard let bn_nonce = BN_bin2bn(passportNonce, Int32(passportNonce.count), nil) else { + throw NFCPassportReaderError.PACEError( "Step2GM", "Unable to convert picc nonce to bignum" ) + } + defer { BN_free(bn_nonce) } + + // ephmeralParams are free'd in stage 3 + let ephemeralParams : OpaquePointer + if self.agreementAlg == "DH" { + Log.debug( "Doing DH Mapping agreement") + ephemeralParams = try self.doDHMappingAgreement(mappingKey: mappingKey, passportPublicKeyData: piccMappingEncodedPublicKey, nonce: bn_nonce ) + } else if self.agreementAlg == "ECDH" { + Log.debug( "Doing ECDH Mapping agreement") + ephemeralParams = try self.doECDHMappingAgreement(mappingKey: mappingKey, passportPublicKeyData: piccMappingEncodedPublicKey, nonce: bn_nonce ) + } else { + throw NFCPassportReaderError.PACEError( "Step2GM", "Unsupported agreement algorithm" ) + } + + // Need to free the mapping key we created now + EVP_PKEY_free(mappingKey) + return ephemeralParams + } + + func doPACEStep2IM( passportNonce: [UInt8] ) async throws -> OpaquePointer { + // Not implemented yet + throw NFCPassportReaderError.PACEError( "Step2IM", "IM not yet implemented" ) + } + + /// Generates an ephemeral public/private key pair based on mapping parameters from step 2, and then sends + /// the public key to the passport and receives its ephmeral public key in exchange + /// - Parameters: + /// - ephemeralParams: The ehpemeral mapping keys generated by step2 + /// - Returns: +/// - Tuple of Generated Ephemeral KeyPair and the Passport's public key + func doStep3KeyExchange(ephemeralParams: OpaquePointer) async throws -> (OpaquePointer, OpaquePointer) { + Log.debug( "Doing PACE Step3 - Key Exchange") + + // Generate ephemeral keypair from ephemeralParams + var ephKeyPair : OpaquePointer? = nil + let pctx = EVP_PKEY_CTX_new(ephemeralParams, nil) + EVP_PKEY_keygen_init(pctx) + EVP_PKEY_keygen(pctx, &ephKeyPair) + EVP_PKEY_CTX_free(pctx) + + guard let ephemeralKeyPair = ephKeyPair else { + throw NFCPassportReaderError.PACEError( "Step3 KeyEx", "Unable to get create ephermeral key pair" ) + } + + Log.debug( "Generated Ephemeral key pair") + + // We've finished with the ephemeralParams now - we can now free it + EVP_PKEY_free( ephemeralParams ) + + guard let publicKey = OpenSSLUtils.getPublicKeyData( from: ephemeralKeyPair ) else { + throw NFCPassportReaderError.PACEError( "Step3 KeyEx", "Unable to get public key from ephermeral key pair" ) + } + Log.verbose( "Ephemeral public key - \(binToHexRep(publicKey, asArray: true))") + + // exchange public keys + Log.debug( "Sending ephemeral public key to passport") + let step3Data = wrapDO(b:0x83, arr:publicKey) + let response = try await tagReader.sendGeneralAuthenticate(data:step3Data, isLast:false) + let passportEncodedPublicKey = try? unwrapDO(tag: 0x84, wrappedData: response.data) + guard let passportPublicKey = OpenSSLUtils.decodePublicKeyFromBytes(pubKeyData: passportEncodedPublicKey!, params: ephemeralKeyPair) else { + throw NFCPassportReaderError.PACEError( "Step3 KeyEx", "Unable to decode passports ephemeral key" ) + } + + Log.verbose( "Received passports ephemeral public key - \(binToHexRep(passportEncodedPublicKey!, asArray: true))" ) + return (ephemeralKeyPair, passportPublicKey) + } + + /// This performs PACE Step 4 - Key Agreement. + /// Here the shared secret is computed from our ephemeral private key and the passports ephemeral public key + /// The new secure messaging (ksEnc and ksMac) keys are computed from the shared secret + /// An authentication token is generated from the passports public key and the computed ksMac key + /// Then, the authetication token is send to the passport, it returns its own computed authentication token + /// We then compute an expected authentication token from the ksMac key and our ephemeral public key + /// Finally we compare the recieved auth token to the expected token and if they are the same then PACE has succeeded! + /// - Parameters: + /// - pcdKeyPair: our ephemeral key pair + /// - passportPublicKey: passports ephemeral public key + /// - Returns: + /// - Tuple of KSEnc KSMac + func doStep4KeyAgreement( pcdKeyPair: OpaquePointer, passportPublicKey: OpaquePointer) async throws -> ([UInt8], [UInt8]) { + Log.debug( "Doing PACE Step4 Key Agreement...") + + Log.debug( "Computing shared secret...") + let sharedSecret = OpenSSLUtils.computeSharedSecret(privateKeyPair: pcdKeyPair, publicKey: passportPublicKey) + Log.verbose( "Shared secret - \(binToHexRep(sharedSecret, asArray:true))") + + Log.debug( "Deriving ksEnc and ksMac keys from shared secret") + let gen = SecureMessagingSessionKeyGenerator() + let encKey = try! gen.deriveKey(keySeed: sharedSecret, cipherAlgName: cipherAlg, keyLength: keyLength, mode: .ENC_MODE) + let macKey = try! gen.deriveKey(keySeed: sharedSecret, cipherAlgName: cipherAlg, keyLength: keyLength, mode: .MAC_MODE) + Log.verbose( "encKey - \(binToHexRep(encKey, asArray:true))") + Log.verbose( "macKey - \(binToHexRep(macKey, asArray:true))") + + // Step 4 - generate authentication token + Log.debug( "Generating authentication token") + guard let pcdAuthToken = try? generateAuthenticationToken( publicKey: passportPublicKey, macKey: macKey) else { + throw NFCPassportReaderError.PACEError( "Step3 KeyAgreement", "Unable to generate authentication token using passports public key" ) + } + Log.verbose( "authentication token - \(pcdAuthToken)") + + Log.debug( "Sending auth token to passport") + let step4Data = wrapDO(b:0x85, arr:pcdAuthToken) + let response = try await tagReader.sendGeneralAuthenticate(data:step4Data, isLast:true) + + let tvlResp = TKBERTLVRecord.sequenceOfRecords(from: Data(response.data))! + if tvlResp[0].tag != 0x86 { + Log.warning("Was expecting tag 0x86, found: \(binToHex(UInt8(tvlResp[0].tag)))") + } + // Calculate expected authentication token + let expectedPICCToken = try self.generateAuthenticationToken( publicKey: pcdKeyPair, macKey: macKey) + + Log.verbose( "Expecting authentication token from passport - \(expectedPICCToken)") + + let piccToken = [UInt8](tvlResp[0].value) + Log.verbose( "Received authentication token from passport - \(piccToken)") + + guard piccToken == expectedPICCToken else { + Log.error( "Error PICC Token mismatch!\npicToken - \(piccToken)\nexpectedPICCToken - \(expectedPICCToken)" ) + throw NFCPassportReaderError.PACEError( "Step3 KeyAgreement", "Error PICC Token mismatch!\npicToken - \(piccToken)\nexpectedPICCToken - \(expectedPICCToken)" ) + } + + Log.debug( "Auth token from passport matches expected token!" ) + + // This will be added for CAM when supported + // var encryptedChipAuthenticationData : [UInt8]? = nil + // if (sself.mappingType == PACEMappingType.CAM) { + // if tvlResp[1].tag != 0x8A { + // Log.warning("CAM: Was expecting tag 0x86, found: \(binToHex(UInt8(tvlResp[1].tag)))") + // } + // encryptedChipAuthenticationData = [UInt8](tvlResp[1].value) + // } + + // We're done! + return (encKey, macKey) + } + + /// Called once PACE has completed with the newly generated ksEnc and ksMac keys for restarting secure messaging + /// - Parameters: + /// - ksEnc: the computed encryption key derived from the key agreement + /// - ksMac: the computed mac key derived from the key agreement + func paceCompleted( ksEnc: [UInt8], ksMac: [UInt8] ) throws { + // Restart secure messaging + let ssc = withUnsafeBytes(of: 0.bigEndian, Array.init) + if (cipherAlg.hasPrefix("DESede")) { + Log.info( "Restarting secure messaging using DESede encryption") + let sm = SecureMessaging(encryptionAlgorithm: .DES, ksenc: ksEnc, ksmac: ksMac, ssc: ssc) + tagReader.secureMessaging = sm + } else if (cipherAlg.hasPrefix("AES")) { + Log.info( "Restarting secure messaging using AES encryption") + let sm = SecureMessaging(encryptionAlgorithm: .AES, ksenc: ksEnc, ksmac: ksMac, ssc: ssc) + tagReader.secureMessaging = sm + } else { + throw NFCPassportReaderError.PACEError( "PACECompleted", "Not restarting secure messaging as unsupported cipher algorithm requested - \(cipherAlg)" ) + } + } +} + +// MARK - PACEHandler Utility functions +@available(iOS 15, *) +extension PACEHandler { + + /// Does the DH key Mapping agreement + /// - Parameter mappingKey - Pointer to an EVP_PKEY structure containing the mapping key + /// - Parameter passportPublicKeyData - byte array containing the publick key read from the passport + /// - Parameter nonce - Pointer to an BIGNUM structure containing the unencrypted nonce + /// - Returns the EVP_PKEY containing the mapped ephemeral parameters + func doDHMappingAgreement( mappingKey : OpaquePointer, passportPublicKeyData: [UInt8], nonce: OpaquePointer ) throws -> OpaquePointer { + guard let dh_mapping_key = EVP_PKEY_get1_DH(mappingKey) else { + // Error + throw PACEHandlerError.DHKeyAgreementError( "Unable to get DH mapping key" ) + } + + // Compute the shared secret using the mapping key and the passports public mapping key + let bn = BN_bin2bn(passportPublicKeyData, Int32(passportPublicKeyData.count), nil) + defer { BN_free( bn ) } + + var secret = [UInt8](repeating: 0, count: Int(DH_size(dh_mapping_key))) + DH_compute_key( &secret, bn, dh_mapping_key) + + // Convert the secret to a bignum + let bn_h = BN_bin2bn(secret, Int32(secret.count), nil) + defer { BN_clear_free(bn_h) } + + // Initialize ephemeral parameters with parameters from the mapping key + guard let ephemeral_key = DHparams_dup(dh_mapping_key) else { + // Error + throw PACEHandlerError.DHKeyAgreementError("Unable to get initialise ephemeral parameters from DH mapping key") + } + defer{ DH_free(ephemeral_key) } + + var p : OpaquePointer? = nil + var q : OpaquePointer? = nil + var g : OpaquePointer? = nil + DH_get0_pqg(dh_mapping_key, &p, &q, &g) + + // map to new generator + guard let bn_g = BN_new() else { + throw PACEHandlerError.DHKeyAgreementError( "Unable to create bn_g" ) + } + defer{ BN_free(bn_g) } + guard let new_g = BN_new() else { + throw PACEHandlerError.DHKeyAgreementError( "Unable to create new_g" ) + } + defer{ BN_free(new_g) } + + // bn_g = g^nonce mod p + // ephemeral_key->g = bn_g mod p * h => (g^nonce mod p) * h mod p + let bn_ctx = BN_CTX_new() + guard BN_mod_exp(bn_g, g, nonce, p, bn_ctx) == 1, + BN_mod_mul(new_g, bn_g, bn_h, p, bn_ctx) == 1 else { + // Error + throw PACEHandlerError.DHKeyAgreementError( "Failed to generate new parameters" ) + } + + guard DH_set0_pqg(ephemeral_key, BN_dup(p), BN_dup(q), BN_dup(new_g)) == 1 else { + // Error + throw PACEHandlerError.DHKeyAgreementError( "Unable to set DH pqg paramerters" ) + } + + // Set the ephemeral params + guard let ephemeralParams = EVP_PKEY_new() else { + throw PACEHandlerError.ECDHKeyAgreementError( "Unable to create ephemeral params" ) + } + + guard EVP_PKEY_set1_DH(ephemeralParams, ephemeral_key) == 1 else { + // Error + EVP_PKEY_free( ephemeralParams ) + throw PACEHandlerError.DHKeyAgreementError( "Unable to set ephemeral parameters" ) + } + return ephemeralParams + } + + /// Does the ECDH key Mapping agreement + /// - Parameter mappingKey - Pointer to an EVP_PKEY structure containing the mapping key + /// - Parameter passportPublicKeyData - byte array containing the publick key read from the passport + /// - Parameter nonce - Pointer to an BIGNUM structure containing the unencrypted nonce + /// - Returns the EVP_PKEY containing the mapped ephemeral parameters + func doECDHMappingAgreement( mappingKey : OpaquePointer, passportPublicKeyData: [UInt8], nonce: OpaquePointer ) throws -> OpaquePointer { + + let ec_mapping_key = EVP_PKEY_get1_EC_KEY(mappingKey) + + guard let group = EC_GROUP_dup(EC_KEY_get0_group(ec_mapping_key)) else { + // Error + throw PACEHandlerError.ECDHKeyAgreementError( "Unable to get EC group" ) + } + defer { EC_GROUP_free(group) } + + guard let order = BN_new() else { + // Error + throw PACEHandlerError.ECDHKeyAgreementError( "Unable to create order bignum" ) + } + defer { BN_free( order ) } + + guard let cofactor = BN_new() else { + // error + throw PACEHandlerError.ECDHKeyAgreementError( "Unable to create cofactor bignum" ) + } + defer { BN_free( cofactor ) } + + guard EC_GROUP_get_order(group, order, nil) == 1 || + EC_GROUP_get_cofactor(group, cofactor, nil) == 1 else { + // Handle error + throw PACEHandlerError.ECDHKeyAgreementError( "Unable to get order or cofactor from group" ) + } + + // Create the shared secret in the form of a ECPoint + + // Ideally I'd use OpenSSLUtls.computeSharedSecret for this but for reasons as yet unknown, it only returns the first 32 bytes + // NOT the full 64 bytes (would then convert to 65 with e header of 4 for uncompressed) + guard let sharedSecretMappingPoint = self.computeECDHMappingKeyPoint(privateKey: mappingKey, inputKey: passportPublicKeyData) else { + // Error + throw PACEHandlerError.ECDHKeyAgreementError( "Failed to compute new shared secret mapping point from mapping key and passport public mapping key" ) + } + defer { EC_POINT_free( sharedSecretMappingPoint ) } + + // Map the nonce using Generic mapping to get the new parameters (inc a new generator) + guard let newGenerater = EC_POINT_new(group) else { + throw PACEHandlerError.ECDHKeyAgreementError( "Unable to create new mapping generator point" ) + } + defer{ EC_POINT_free(newGenerater) } + + // g = (generator * nonce) + (sharedSecretMappingPoint * 1) + guard EC_POINT_mul(group, newGenerater, nonce, sharedSecretMappingPoint, BN_value_one(), nil) == 1 else { + throw PACEHandlerError.ECDHKeyAgreementError( "Failed to map nonce to get new generator params" ) + } + + // Initialize ephemeral parameters with parameters from the mapping key + guard let ephemeralParams = EVP_PKEY_new() else { + throw PACEHandlerError.ECDHKeyAgreementError( "Unable to create ephemeral params" ) + } + + let ephemeral_key = EC_KEY_dup(ec_mapping_key) + defer{ EC_KEY_free(ephemeral_key) } + + // configure the new EC_KEY + guard EVP_PKEY_set1_EC_KEY(ephemeralParams, ephemeral_key) == 1, + EC_GROUP_set_generator(group, newGenerater, order, cofactor) == 1, + EC_GROUP_check(group, nil) == 1, + EC_KEY_set_group(ephemeral_key, group) == 1 else { + // Error + + EVP_PKEY_free( ephemeralParams ) + throw PACEHandlerError.ECDHKeyAgreementError( "Unable to configure new ephemeral params" ) + } + return ephemeralParams + } + + /// Generate Authentication token from a publicKey and and a mac key + /// - Parameters: + /// - publicKey: An EVP_PKEY structure containing a public key data which will be used to generate the auth code + /// - macKey: The mac key derived from the key agreement + /// - Throws: An error if we are unable to encode the public key data + /// - Returns: The authentication token (8 bytes) + func generateAuthenticationToken( publicKey: OpaquePointer, macKey: [UInt8] ) throws -> [UInt8] { + var encodedPublicKeyData = try encodePublicKey(oid:self.paceOID, key:publicKey) + + if cipherAlg == "DESede" { + // If DESede (3DES), we need to pad the data + encodedPublicKeyData = pad(encodedPublicKeyData, blockSize: 8) + } + + Log.verbose( "Generating Authentication Token" ) + Log.verbose( "EncodedPubKey = \(binToHexRep(encodedPublicKeyData, asArray: true))" ) + Log.verbose( "macKey = \(binToHexRep(macKey, asArray: true))" ) + + let maccedPublicKeyDataObject = mac(algoName: cipherAlg == "DESede" ? .DES : .AES, key: macKey, msg: encodedPublicKeyData) + + // Take 8 bytes for auth token + let authToken = [UInt8](maccedPublicKeyDataObject[0..<8]) + Log.verbose( "Generated authToken = \(binToHexRep(authToken, asArray: true))" ) + return authToken + } + + /// Encodes a PublicKey as an TLV strucuture based on TR-SAC 1.01 4.5.1 and 4.5.2 + /// - Parameters: + /// - oid: The object identifier specifying the key type + /// - key: The ECP_PKEY public key to encode + /// - Throws: Error if unable to encode + /// - Returns: the encoded public key in tlv format + func encodePublicKey( oid : String, key : OpaquePointer ) throws -> [UInt8] { + let encodedOid = oidToBytes(oid:oid, replaceTag: false) + guard let pubKeyData = OpenSSLUtils.getPublicKeyData(from: key) else { + Log.error( "PACEHandler: encodePublicKey() - Unable to get public key data" ) + throw NFCPassportReaderError.InvalidDataPassed("Unable to get public key data") + } + + let keyType = EVP_PKEY_base_id( key ) + let tag : TKTLVTag + if keyType == EVP_PKEY_DH || keyType == EVP_PKEY_DHX { + tag = 0x84 + } else { + tag = 0x86 + } + + guard let encOid = TKBERTLVRecord(from: Data(encodedOid)) else { + throw NFCPassportReaderError.InvalidASN1Value + } + let encPub = TKBERTLVRecord(tag:tag, value: Data(pubKeyData)) + let record = TKBERTLVRecord(tag: 0x7F49, records:[encOid, encPub]) + let data = record.data + + return [UInt8](data) + } + + /// Computes a key seed based on an MRZ key + /// - Parameter the mrz key + /// - Returns a encoded key based on the mrz key that can be used for PACE + func createPaceKey( from mrzKey: String ) throws -> [UInt8] { + let buf: [UInt8] = Array(mrzKey.utf8) + let hash = calcSHA1Hash(buf) + + let smskg = SecureMessagingSessionKeyGenerator() + let key = try smskg.deriveKey(keySeed: hash, cipherAlgName: cipherAlg, keyLength: keyLength, nonce: nil, mode: .PACE_MODE, paceKeyReference: paceKeyType) + return key + } + + /// Performs the ECDH PACE GM key agreement protocol by multiplying a private key with a public key + /// - Parameters: + /// - key: an EVP_PKEY structure containng a ECDH private key + /// - inputKey: a public key + /// - Returns: a new EC_POINT + func computeECDHMappingKeyPoint( privateKey : OpaquePointer, inputKey : [UInt8] ) -> OpaquePointer? { + + let ecdh = EVP_PKEY_get1_EC_KEY(privateKey) + defer { EC_KEY_free(ecdh) } + + let privateECKey = EC_KEY_get0_private_key(ecdh) // BIGNUM + + // decode public key + guard let group = EC_KEY_get0_group(ecdh) else{ return nil } + guard let ecp = EC_POINT_new(group) else { return nil } + defer { EC_POINT_free(ecp) } + guard EC_POINT_oct2point(group, ecp, inputKey, inputKey.count,nil) != 0 else { return nil } + + // create our output point + let output = EC_POINT_new(group) + + // Multiply our private key with the passports public key to get a new point + EC_POINT_mul(group, output, nil, ecp, privateECKey, nil) + + return output + } +} + +#endif diff --git a/app/ios/AwesomeProject/PassportReader.swift b/app/ios/AwesomeProject/PassportReader.swift new file mode 100644 index 00000000..5f9499c6 --- /dev/null +++ b/app/ios/AwesomeProject/PassportReader.swift @@ -0,0 +1,405 @@ +import Foundation + +#if !os(macOS) +import UIKit +import CoreNFC + +@available(iOS 15, *) +public class PassportReader : NSObject { + private typealias NFCCheckedContinuation = CheckedContinuation + private var nfcContinuation: NFCCheckedContinuation? + + private var passport : NFCPassportModel = NFCPassportModel() + + private var readerSession: NFCTagReaderSession? + private var currentlyReadingDataGroup : DataGroupId? + + private var dataGroupsToRead : [DataGroupId] = [] + private var readAllDatagroups = false + private var skipSecureElements = true + private var skipCA = false + private var skipPACE = false + + private var bacHandler : BACHandler? + private var caHandler : ChipAuthenticationHandler? + private var paceHandler : PACEHandler? + private var mrzKey : String = "" + private var dataAmountToReadOverride : Int? = nil + + private var scanCompletedHandler: ((NFCPassportModel?, NFCPassportReaderError?)->())! + private var nfcViewDisplayMessageHandler: ((NFCViewDisplayMessage) -> String?)? + private var masterListURL : URL? + private var shouldNotReportNextReaderSessionInvalidationErrorUserCanceled : Bool = false + + // By default, Passive Authentication uses the new RFS5652 method to verify the SOD, but can be switched to use + // the previous OpenSSL CMS verification if necessary + public var passiveAuthenticationUsesOpenSSL : Bool = false + + public init( logLevel: LogLevel = .info, masterListURL: URL? = nil ) { + super.init() + + Log.logLevel = logLevel + self.masterListURL = masterListURL + } + + public func setMasterListURL( _ masterListURL : URL ) { + self.masterListURL = masterListURL + } + + // This function allows you to override the amount of data the TagReader tries to read from the NFC + // chip. NOTE - this really shouldn't be used for production but is useful for testing as different + // passports support different data amounts. + // It appears that the most reliable is 0xA0 (160 chars) but some will support arbitary reads (0xFF or 256) + public func overrideNFCDataAmountToRead( amount: Int ) { + dataAmountToReadOverride = amount + } + + public func readPassport( mrzKey : String, tags : [DataGroupId] = [], skipSecureElements : Bool = true, skipCA : Bool = false, skipPACE : Bool = false, customDisplayMessage : ((NFCViewDisplayMessage) -> String?)? = nil) async throws -> NFCPassportModel { + + self.passport = NFCPassportModel() + self.mrzKey = mrzKey + self.skipCA = skipCA + self.skipPACE = skipPACE + + self.dataGroupsToRead.removeAll() + self.dataGroupsToRead.append( contentsOf:tags) + self.nfcViewDisplayMessageHandler = customDisplayMessage + self.skipSecureElements = skipSecureElements + self.currentlyReadingDataGroup = nil + self.bacHandler = nil + self.caHandler = nil + self.paceHandler = nil + + // If no tags specified, read all + if self.dataGroupsToRead.count == 0 { + // Start off with .COM, will always read (and .SOD but we'll add that after), and then add the others from the COM + self.dataGroupsToRead.append(contentsOf:[.COM, .SOD] ) + self.readAllDatagroups = true + } else { + // We are reading specific datagroups + self.readAllDatagroups = false + } + + guard NFCNDEFReaderSession.readingAvailable else { + throw NFCPassportReaderError.NFCNotSupported + } + + if NFCTagReaderSession.readingAvailable { + readerSession = NFCTagReaderSession(pollingOption: [.iso14443], delegate: self, queue: nil) + + self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.requestPresentPassport ) + readerSession?.begin() + } + + return try await withCheckedThrowingContinuation({ (continuation: NFCCheckedContinuation) in + self.nfcContinuation = continuation + }) + } +} + +@available(iOS 15, *) +extension PassportReader : NFCTagReaderSessionDelegate { + // MARK: - NFCTagReaderSessionDelegate + public func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) { + // If necessary, you may perform additional operations on session start. + // At this point RF polling is enabled. + Log.debug( "tagReaderSessionDidBecomeActive" ) + } + + public func tagReaderSession(_ session: NFCTagReaderSession, didInvalidateWithError error: Error) { + // If necessary, you may handle the error. Note session is no longer valid. + // You must create a new session to restart RF polling. + Log.debug( "tagReaderSession:didInvalidateWithError - \(error.localizedDescription)" ) + self.readerSession?.invalidate() + self.readerSession = nil + + if let readerError = error as? NFCReaderError, readerError.code == NFCReaderError.readerSessionInvalidationErrorUserCanceled + && self.shouldNotReportNextReaderSessionInvalidationErrorUserCanceled { + + self.shouldNotReportNextReaderSessionInvalidationErrorUserCanceled = false + } else { + var userError = NFCPassportReaderError.UnexpectedError + if let readerError = error as? NFCReaderError { + Log.error( "tagReaderSession:didInvalidateWithError - Got NFCReaderError - \(readerError.localizedDescription)" ) + switch (readerError.code) { + case NFCReaderError.readerSessionInvalidationErrorUserCanceled: + Log.error( " - User cancelled session" ) + userError = NFCPassportReaderError.UserCanceled + default: + Log.error( " - some other error - \(readerError.localizedDescription)" ) + userError = NFCPassportReaderError.UnexpectedError + } + } else { + Log.error( "tagReaderSession:didInvalidateWithError - Received error - \(error.localizedDescription)" ) + } + nfcContinuation?.resume(throwing: userError) + nfcContinuation = nil + } + } + + public func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) { + Log.debug( "tagReaderSession:didDetect - \(tags[0])" ) + if tags.count > 1 { + Log.debug( "tagReaderSession:more than 1 tag detected! - \(tags)" ) + + let errorMessage = NFCViewDisplayMessage.error(.MoreThanOneTagFound) + self.invalidateSession(errorMessage: errorMessage, error: NFCPassportReaderError.MoreThanOneTagFound) + return + } + + let tag = tags.first! + var passportTag: NFCISO7816Tag + switch tags.first! { + case let .iso7816(tag): + passportTag = tag + default: + Log.debug( "tagReaderSession:invalid tag detected!!!" ) + + let errorMessage = NFCViewDisplayMessage.error(NFCPassportReaderError.TagNotValid) + self.invalidateSession(errorMessage:errorMessage, error: NFCPassportReaderError.TagNotValid) + return + } + + Task { [passportTag] in + do { + try await session.connect(to: tag) + + Log.debug( "tagReaderSession:connected to tag - starting authentication" ) + self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.authenticatingWithPassport(0) ) + + let tagReader = TagReader(tag:passportTag) + + if let newAmount = self.dataAmountToReadOverride { + tagReader.overrideDataAmountToRead(newAmount: newAmount) + } + + tagReader.progress = { [unowned self] (progress) in + if let dgId = self.currentlyReadingDataGroup { + self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.readingDataGroupProgress(dgId, progress) ) + } else { + self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.authenticatingWithPassport(progress) ) + } + } + + let passportModel = try await self.startReading( tagReader : tagReader) + nfcContinuation?.resume(returning: passportModel) + nfcContinuation = nil + + + } catch let error as NFCPassportReaderError { + let errorMessage = NFCViewDisplayMessage.error(error) + self.invalidateSession(errorMessage: errorMessage, error: error) + } catch let error { + + nfcContinuation?.resume(throwing: error) + nfcContinuation = nil + Log.debug( "tagReaderSession:failed to connect to tag - \(error.localizedDescription)" ) + let errorMessage = NFCViewDisplayMessage.error(NFCPassportReaderError.ConnectionError) + self.invalidateSession(errorMessage: errorMessage, error: NFCPassportReaderError.ConnectionError) + } + } + } + + func updateReaderSessionMessage(alertMessage: NFCViewDisplayMessage ) { + self.readerSession?.alertMessage = self.nfcViewDisplayMessageHandler?(alertMessage) ?? alertMessage.description + } +} + +@available(iOS 15, *) +extension PassportReader { + + func startReading(tagReader : TagReader) async throws -> NFCPassportModel { + + if !skipPACE { + do { + let data = try await tagReader.readCardAccess() + Log.verbose( "Read CardAccess - data \(binToHexRep(data))" ) + let cardAccess = try CardAccess(data) + passport.cardAccess = cardAccess + + Log.info( "Starting Password Authenticated Connection Establishment (PACE)" ) + + let paceHandler = try PACEHandler( cardAccess: cardAccess, tagReader: tagReader ) + try await paceHandler.doPACE(mrzKey: mrzKey ) + passport.PACEStatus = .success + Log.debug( "PACE Succeeded" ) + } catch { + passport.PACEStatus = .failed + Log.error( "PACE Failed - falling back to BAC" ) + } + + _ = try await tagReader.selectPassportApplication() + } + + // If either PACE isn't supported, we failed whilst doing PACE or we didn't even attempt it, then fall back to BAC + if passport.PACEStatus != .success { + try await doBACAuthentication(tagReader : tagReader) + } + + // Now to read the datagroups + try await readDataGroups(tagReader: tagReader) + + self.updateReaderSessionMessage(alertMessage: NFCViewDisplayMessage.successfulRead) + + try await doActiveAuthenticationIfNeccessary(tagReader : tagReader) + self.shouldNotReportNextReaderSessionInvalidationErrorUserCanceled = true + self.readerSession?.invalidate() + + // If we have a masterlist url set then use that and verify the passport now + self.passport.verifyPassport(masterListURL: self.masterListURL, useCMSVerification: self.passiveAuthenticationUsesOpenSSL) + + return self.passport + } + + + func doActiveAuthenticationIfNeccessary( tagReader : TagReader) async throws { + guard self.passport.activeAuthenticationSupported else { + return + } + + Log.info( "Performing Active Authentication" ) + + let challenge = generateRandomUInt8Array(8) + Log.verbose( "Generated Active Authentication challange - \(binToHexRep(challenge))") + let response = try await tagReader.doInternalAuthentication(challenge: challenge) + self.passport.verifyActiveAuthentication( challenge:challenge, signature:response.data ) + } + + + func doBACAuthentication(tagReader : TagReader) async throws { + self.currentlyReadingDataGroup = nil + + Log.info( "Starting Basic Access Control (BAC)" ) + + self.passport.BACStatus = .failed + + self.bacHandler = BACHandler( tagReader: tagReader ) + try await bacHandler?.performBACAndGetSessionKeys( mrzKey: mrzKey ) + Log.info( "Basic Access Control (BAC) - SUCCESS!" ) + + self.passport.BACStatus = .success + } + + func readDataGroups( tagReader: TagReader ) async throws { + + // Read COM + var DGsToRead = [DataGroupId]() + + self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.readingDataGroupProgress(.COM, 0) ) + if let com = try await readDataGroup(tagReader:tagReader, dgId:.COM) as? COM { + self.passport.addDataGroup( .COM, dataGroup:com ) + + // SOD and COM shouldn't be present in the DG list but just in case (worst case here we read the sod twice) + DGsToRead = [.SOD] + com.dataGroupsPresent.map { DataGroupId.getIDFromName(name:$0) } + DGsToRead.removeAll { $0 == .COM } + } + + if DGsToRead.contains( .DG14 ) { + DGsToRead.removeAll { $0 == .DG14 } + + if !skipCA { + // Do Chip Authentication + if let dg14 = try await readDataGroup(tagReader:tagReader, dgId:.DG14) as? DataGroup14 { + self.passport.addDataGroup( .DG14, dataGroup:dg14 ) + let caHandler = ChipAuthenticationHandler(dg14: dg14, tagReader: tagReader) + + if caHandler.isChipAuthenticationSupported { + do { + // Do Chip authentication and then continue reading datagroups + try await caHandler.doChipAuthentication() + self.passport.chipAuthenticationStatus = .success + } catch { + Log.info( "Chip Authentication failed - re-establishing BAC") + self.passport.chipAuthenticationStatus = .failed + + // Failed Chip Auth, need to re-establish BAC + try await doBACAuthentication(tagReader: tagReader) + } + } + } + } + } + + // If we are skipping secure elements then remove .DG3 and .DG4 + if self.skipSecureElements { + DGsToRead = DGsToRead.filter { $0 != .DG3 && $0 != .DG4 } + } + + if self.readAllDatagroups != true { + DGsToRead = DGsToRead.filter { dataGroupsToRead.contains($0) } + } + for dgId in DGsToRead { + self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.readingDataGroupProgress(dgId, 0) ) + if let dg = try await readDataGroup(tagReader:tagReader, dgId:dgId) { + self.passport.addDataGroup( dgId, dataGroup:dg ) + } + } + } + + func readDataGroup( tagReader : TagReader, dgId : DataGroupId ) async throws -> DataGroup? { + + self.currentlyReadingDataGroup = dgId + Log.info( "Reading tag - \(dgId)" ) + var readAttempts = 0 + + self.updateReaderSessionMessage( alertMessage: NFCViewDisplayMessage.readingDataGroupProgress(dgId, 0) ) + + repeat { + do { + let response = try await tagReader.readDataGroup(dataGroup:dgId) + let dg = try DataGroupParser().parseDG(data: response) + return dg + } catch let error as NFCPassportReaderError { + Log.error( "TagError reading tag - \(error)" ) + + // OK we had an error - depending on what happened, we may want to try to re-read this + // E.g. we failed to read the last Datagroup because its protected and we can't + let errMsg = error.value + Log.error( "ERROR - \(errMsg)" ) + + var redoBAC = false + if errMsg == "Session invalidated" || errMsg == "Class not supported" || errMsg == "Tag connection lost" { + // Check if we have done Chip Authentication, if so, set it to nil and try to redo BAC + if self.caHandler != nil { + self.caHandler = nil + redoBAC = true + } else { + // Can't go any more! + throw error + } + } else if errMsg == "Security status not satisfied" || errMsg == "File not found" { + // Can't read this element as we aren't allowed - remove it and return out so we re-do BAC + self.dataGroupsToRead.removeFirst() + redoBAC = true + } else if errMsg == "SM data objects incorrect" || errMsg == "Class not supported" { + // Can't read this element security objects now invalid - and return out so we re-do BAC + redoBAC = true + } else if errMsg.hasPrefix( "Wrong length" ) || errMsg.hasPrefix( "End of file" ) { // Should now handle errors 0x6C xx, and 0x67 0x00 + // OK passport can't handle max length so drop it down + tagReader.reduceDataReadingAmount() + redoBAC = true + } + + if redoBAC { + // Redo BAC and try again + try await doBACAuthentication(tagReader : tagReader) + } else { + // Some other error lets have another try + } + } + readAttempts += 1 + } while ( readAttempts < 2 ) + + return nil + } + + func invalidateSession(errorMessage: NFCViewDisplayMessage, error: NFCPassportReaderError) { + // Mark the next 'invalid session' error as not reportable (we're about to cause it by invalidating the + // session). The real error is reported back with the call to the completed handler + self.shouldNotReportNextReaderSessionInvalidationErrorUserCanceled = true + self.readerSession?.invalidate(errorMessage: self.nfcViewDisplayMessageHandler?(errorMessage) ?? errorMessage.description) + nfcContinuation?.resume(throwing: error) + nfcContinuation = nil + } +} +#endif diff --git a/app/ios/AwesomeProject/ResponseAPDU.swift b/app/ios/AwesomeProject/ResponseAPDU.swift new file mode 100644 index 00000000..4ce6dceb --- /dev/null +++ b/app/ios/AwesomeProject/ResponseAPDU.swift @@ -0,0 +1,17 @@ +#if !os(macOS) + +@available(iOS 13, *) +public struct ResponseAPDU { + + public var data : [UInt8] + public var sw1 : UInt8 + public var sw2 : UInt8 + + public init(data: [UInt8], sw1: UInt8, sw2: UInt8) { + self.data = data + self.sw1 = sw1 + self.sw2 = sw2 + } +} + +#endif diff --git a/app/ios/AwesomeProject/SecureMessaging.swift b/app/ios/AwesomeProject/SecureMessaging.swift new file mode 100644 index 00000000..7b3d9e3e --- /dev/null +++ b/app/ios/AwesomeProject/SecureMessaging.swift @@ -0,0 +1,292 @@ +import Foundation + +public enum SecureMessagingSupportedAlgorithms { + case DES + case AES +} + +#if !os(macOS) +import CoreNFC + + +/// This class implements the secure messaging protocol. +/// The class is a new layer that comes between the reader and the iso7816. +/// It gives a new transmit method that takes an APDU object formed by the iso7816 layer, +/// ciphers it following the doc9303 specification, sends the ciphered APDU to the reader +/// layer and returns the unciphered APDU. +@available(iOS 13, *) +public class SecureMessaging { + private var ksenc : [UInt8] + private var ksmac : [UInt8] + private var ssc : [UInt8] + private let algoName : SecureMessagingSupportedAlgorithms + private let padLength : Int + + public init( encryptionAlgorithm : SecureMessagingSupportedAlgorithms = .DES, ksenc : [UInt8], ksmac : [UInt8], ssc : [UInt8]) { + self.ksenc = ksenc + self.ksmac = ksmac + self.ssc = ssc + self.algoName = encryptionAlgorithm + self.padLength = algoName == .DES ? 8 : 16 + } + + /// Protect the apdu following the doc9303 specification + func protect(apdu : NFCISO7816APDU ) throws -> NFCISO7816APDU { + + Log.verbose("\t\tSSC: " + binToHexRep(self.ssc)) + self.ssc = self.incSSC() + let paddedSSC = algoName == .DES ? self.ssc : [UInt8](repeating: 0, count: 8) + ssc + Log.verbose("\tIncrement SSC with 1") + Log.verbose("\t\tSSC: " + binToHexRep(self.ssc)) + + + let cmdHeader = self.maskClassAndPad(apdu: apdu) + var do87 : [UInt8] = [] + var do97 : [UInt8] = [] + + var tmp = "Concatenate CmdHeader" + if apdu.data != nil { + tmp += " and DO87" + do87 = try self.buildD087(apdu: apdu) + } + + let isMSE = apdu.instructionCode == 0x22 + if apdu.expectedResponseLength > 0 && (isMSE ? apdu.expectedResponseLength < 256 : true) { + tmp += " and DO97" + do97 = try self.buildD097(apdu: apdu) + } + + let M = cmdHeader + do87 + do97 + Log.verbose(tmp) + Log.verbose("\tM: " + binToHexRep(M)) + + Log.verbose("Compute MAC of M") + + let N = pad(paddedSSC + M, blockSize:padLength) + Log.verbose("\tConcatenate SSC and M and add padding") + Log.verbose("\t\tN: " + binToHexRep(N)) + + var CC = mac(algoName: algoName, key: self.ksmac, msg: N) + if CC.count > 8 { + CC = [UInt8](CC[0..<8]) + } + Log.verbose("\tCompute MAC over N with KSmac") + Log.verbose("\t\tCC: " + binToHexRep(CC)) + + let do8e = self.buildD08E(mac: CC) + + // If dataSize > 255 then it will be encoded in 3 bytes with the first byte being 0x00 + // otherwise its a single byte of size + let size = do87.count + do97.count + do8e.count + var dataSize: [UInt8] + if size > 255 { + dataSize = [0x00] + intToBin(size, pad: 4) + } else { + dataSize = intToBin(size) + } + var protectedAPDU = [UInt8](cmdHeader[0..<4]) + dataSize + protectedAPDU += do87 + do97 + do8e + + // If the data is more that 255, specify the we are using extended length (0x00, 0x00) + // Thanks to @filom for the fix! + if size > 255 { + protectedAPDU += [0x00,0x00] + } else { + protectedAPDU += [0x00] + } + Log.verbose("Construct and send protected APDU") + Log.verbose("\tProtectedAPDU: " + binToHexRep(protectedAPDU)) + + let newAPDU = NFCISO7816APDU(data:Data(protectedAPDU))! + return newAPDU + } + + /// Unprotect the APDU following the iso7816 specification + func unprotect(rapdu : ResponseAPDU ) throws -> ResponseAPDU { + var needCC = false + var do87 : [UInt8] = [] + var do87Data : [UInt8] = [] + var do99 : [UInt8] = [] + //var do8e : [UInt8] = [] + var offset = 0 + + self.ssc = self.incSSC() + let paddedSSC = algoName == .DES ? self.ssc : [UInt8](repeating: 0, count: 8) + ssc + Log.verbose("\tIncrement SSC with 1") + Log.verbose("\t\tSSC: " + binToHexRep(self.ssc)) + + // Check for a SM error + if(rapdu.sw1 != 0x90 || rapdu.sw2 != 0x00) { + return rapdu + } + + let rapduBin = rapdu.data + [rapdu.sw1, rapdu.sw2] + Log.verbose("Receive response APDU of MRTD's chip") + Log.verbose("\tRAPDU: " + binToHexRep(rapduBin)) + + // DO'87' + // Mandatory if data is returned, otherwise absent + if rapduBin[0] == 0x87 { + let (encDataLength, o) = try asn1Length([UInt8](rapduBin[1...])) + offset = 1 + o + + if rapduBin[offset] != 0x1 { + throw NFCPassportReaderError.D087Malformed + } + + do87 = [UInt8](rapduBin[0 ..< offset + Int(encDataLength)]) + do87Data = [UInt8](rapduBin[offset+1 ..< offset + Int(encDataLength)]) + offset += Int(encDataLength) + needCC = true + } + + //DO'99' + // Mandatory, only absent if SM error occurs + guard rapduBin.count >= offset + 5 else { + print("size error") + let returnSw1 = (rapduBin.count >= offset+3) ? rapduBin[offset+2] : 0; + let returnSw2 = (rapduBin.count >= offset+4) ? rapduBin[offset+3] : 0; + return ResponseAPDU(data: [], sw1: returnSw1, sw2: returnSw2); + } + + do99 = [UInt8](rapduBin[offset.. 0 { + tmp += " DO'87" + } + if do99.count > 0 { + tmp += " DO'99" + } + Log.verbose("Verify RAPDU CC by computing MAC of" + tmp) + + let K = pad(paddedSSC + do87 + do99, blockSize:padLength) + Log.verbose("\tConcatenate SSC and" + tmp + " and add padding") + Log.verbose("\t\tK: " + binToHexRep(K)) + + Log.verbose("\tCompute MAC with KSmac") + var CCb = mac(algoName: algoName, key: self.ksmac, msg: K) + if CCb.count > 8 { + CCb = [UInt8](CC[0..<8]) + } + Log.verbose("\t\tCC: " + binToHexRep(CCb)) + + let res = (CC == CCb) + Log.verbose("\tCompare CC with data of DO'8E of RAPDU") + Log.verbose("\t\t\(binToHexRep(CC)) == \(binToHexRep(CCb)) ? \(res)") + + if !res { + throw NFCPassportReaderError.InvalidResponseChecksum + } + } + else if needCC { + throw NFCPassportReaderError.MissingMandatoryFields + } + + var data : [UInt8] = [] + if do87Data.count > 0 { + + let dec : [UInt8] + if algoName == .DES { + dec = tripleDESDecrypt(key: self.ksenc, message: do87Data, iv: [0,0,0,0,0,0,0,0]) + } else { + // for AES the IV is the ssc with AES/EBC/NOPADDING + let paddedssc = [UInt8](repeating: 0, count: 8) + ssc + let iv = AESECBEncrypt(key: ksenc, message: paddedssc) + dec = AESDecrypt(key: self.ksenc, message: do87Data, iv: iv) + } + + // There is a payload + data = unpad(dec) + Log.verbose("Decrypt data of DO'87 with KSenc") + Log.verbose("\tDecryptedData: " + binToHexRep(data)) + } + + Log.verbose("Unprotected APDU: [\(binToHexRep(data))] \(binToHexRep(sw1)) \(binToHexRep(sw2))" ) + return ResponseAPDU(data: data, sw1: sw1, sw2: sw2) + } + + func maskClassAndPad(apdu : NFCISO7816APDU ) -> [UInt8] { + Log.verbose("Mask class byte and pad command header") + let res = pad([0x0c, apdu.instructionCode, apdu.p1Parameter, apdu.p2Parameter], blockSize: padLength) + Log.verbose("\tCmdHeader: " + binToHexRep(res)) + return res + } + + func buildD087(apdu : NFCISO7816APDU) throws -> [UInt8] { + let cipher = [0x01] + self.padAndEncryptData(apdu) + let res = try [0x87] + toAsn1Length(cipher.count) + cipher + Log.verbose("Build DO'87") + Log.verbose("\tDO87: " + binToHexRep(res)) + return res + } + + func padAndEncryptData(_ apdu : NFCISO7816APDU) -> [UInt8] { + // Pad the data, encrypt data with KSenc and build DO'87 + let data = [UInt8](apdu.data!) + let paddedData = pad( data, blockSize: padLength ) + + let enc : [UInt8] + if algoName == .DES { + enc = tripleDESEncrypt(key: self.ksenc, message: paddedData, iv: [0,0,0,0,0,0,0,0]) + } else { + // for AES the IV is the ssc with AES/EBC/NOPADDING + let paddedssc = [UInt8](repeating: 0, count: 8) + ssc + let iv = AESECBEncrypt(key: ksenc, message: paddedssc) + enc = AESEncrypt(key: self.ksenc, message: paddedData, iv: iv) + } + + Log.verbose("Pad data") + Log.verbose("\tData: " + binToHexRep(paddedData)) + Log.verbose("Encrypt data with KSenc") + Log.verbose("\tEncryptedData: " + binToHexRep(enc)) + return enc + } + + func incSSC() -> [UInt8] { + let val = binToHex(self.ssc) + 1 + + // This needs to be fully zero padded - to 8 bytes = i.e. if SSC is 1 it should return [0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1] + // NOT [0x1] + return withUnsafeBytes(of: val.bigEndian, Array.init) + } + + func buildD08E(mac : [UInt8]) -> [UInt8] { + let res : [UInt8] = [0x8E, UInt8(mac.count)] + mac + Log.verbose("Build DO'8E") + Log.verbose("\tDO8E: \(binToHexRep(res))" ) + return res + } + + func buildD097(apdu : NFCISO7816APDU) throws -> [UInt8] { + let le = apdu.expectedResponseLength + var binLe = intToBin(le) + if (le == 256 || le == 65536) { + binLe = [0x00] + (le > 256 ? [0x00] : []) + } + + let res : [UInt8] = try [0x97] + toAsn1Length(binLe.count) + binLe + Log.verbose("Build DO'97") + Log.verbose("\tDO97: \(res)") + return res + } + +} +#endif diff --git a/app/ios/AwesomeProject/SecureMessagingSessionKeyGenerator.swift b/app/ios/AwesomeProject/SecureMessagingSessionKeyGenerator.swift new file mode 100644 index 00000000..01d8f569 --- /dev/null +++ b/app/ios/AwesomeProject/SecureMessagingSessionKeyGenerator.swift @@ -0,0 +1,149 @@ +import Foundation + +import CryptoKit + +@available(iOS 13, macOS 10.15, *) +class SecureMessagingSessionKeyGenerator { + static let NO_PACE_KEY_REFERENCE : UInt8 = 0x00 + enum SMSMode : UInt8 { + case ENC_MODE = 0x1; + case MAC_MODE = 0x2; + case PACE_MODE = 0x3; + } + + /// Derives the ENC or MAC key for BAC from the keySeed. + /// - Parameter keySeed the key seed. + /// - Parameter mode either ENC_MODE or MAC_MODE + /// - Returns the key. + /// - Throws InvalidDataPassed on data error + func deriveKey( keySeed : [UInt8], mode : SMSMode) throws -> [UInt8] { + return try deriveKey(keySeed: keySeed, cipherAlgName: "DESede", keyLength: 128, mode: mode); + } + + /// Derives the ENC or MAC key for BAC or PACE or CA. + /// - Parameter keySeed the key seed. + /// - Parameter cipherAlgName either AES or DESede + /// - Parameter keyLength key length in bits + /// - Parameter mode either {@code ENC_MODE}, {@code MAC_MODE}, or {@code PACE_MODE} + /// - Returns the key. + /// - Throws InvalidDataPassed on data error + func deriveKey(keySeed : [UInt8], cipherAlgName :String, keyLength : Int, mode : SMSMode) throws -> [UInt8] { + return try deriveKey(keySeed: keySeed, cipherAlgName: cipherAlgName, keyLength: keyLength, nonce: nil, mode: mode); + } + + /// Derives the ENC or MAC key for BAC or PACE or CA. + /// - Parameter keySeed the shared secret, as octets + /// - Parameter cipherAlg in Java mnemonic notation (for example "DESede", "AES") + /// - Parameter keyLength length in bits + /// - Parameter nonce optional nonce or nil + /// - Parameter mode the mode either {@code ENC}, {@code MAC}, or {@code PACE} mode + /// - Returns the key. + /// - Throws InvalidDataPassed on data error + func deriveKey(keySeed : [UInt8], cipherAlgName :String, keyLength : Int, nonce : [UInt8]? = nil, mode : SMSMode) throws -> [UInt8] { + return try deriveKey(keySeed: keySeed, cipherAlgName: cipherAlgName, keyLength: keyLength, nonce: nonce, mode: mode, paceKeyReference: SecureMessagingSessionKeyGenerator.NO_PACE_KEY_REFERENCE); + } + + /// Derives the ENC or MAC key for BAC or PACE or CA. + /// - Parameter keySeed the shared secret, as octets + /// - Parameter cipherAlg in Java mnemonic notation (for example "DESede", "AES") + /// - Parameter keyLength length in bits + /// - Parameter nonce optional nonce or null + /// - Parameter mode the mode either {@code ENC}, {@code MAC}, or {@code PACE} mode + /// - Parameter paceKeyReference Key Reference For Pace Protocol + /// - Returns the key. + /// - Throws InvalidDataPassed on data error + func deriveKey(keySeed : [UInt8], cipherAlgName :String, keyLength : Int, nonce : [UInt8]?, mode : SMSMode, paceKeyReference : UInt8) throws -> [UInt8] { + let digestAlgo = try inferDigestAlgorithmFromCipherAlgorithmForKeyDerivation(cipherAlg: cipherAlgName, keyLength: keyLength); + + let modeArr : [UInt8] = [0x00, 0x00, 0x00, mode.rawValue] + var dataEls = [Data(keySeed)] + if let nonce = nonce { + dataEls.append( Data(nonce) ) + } + dataEls.append( Data(modeArr) ) + let hashResult = try getHash(algo: digestAlgo, dataElements: dataEls) + + var keyBytes : [UInt8] + if cipherAlgName == "DESede" || cipherAlgName == "3DES" { + // TR-SAC 1.01, 4.2.1. + switch(keyLength) { + case 112, 128: + // Copy E (Octects 1 to 8), D (Octects 9 to 16), E (again Octects 1 to 8), 112-bit 3DES key + keyBytes = [UInt8](hashResult[0..<16] + hashResult[0..<8]) + break; + default: + throw NFCPassportReaderError.InvalidDataPassed("Can only use DESede with 128-but key length") + } + } else if cipherAlgName.lowercased() == "aes" || cipherAlgName.lowercased().hasPrefix("aes") { + // TR-SAC 1.01, 4.2.2. + switch(keyLength) { + case 128: + keyBytes = [UInt8](hashResult[0..<16]) // NOTE: 128 = 16 * 8 + case 192: + keyBytes = [UInt8](hashResult[0..<24]) // NOTE: 192 = 24 * 8 + case 256: + keyBytes = [UInt8](hashResult[0..<32]) // NOTE: 256 = 32 * 8 + default: + throw NFCPassportReaderError.InvalidDataPassed("Can only use AES with 128-bit, 192-bit key or 256-bit length") + } + } else { + throw NFCPassportReaderError.InvalidDataPassed( "Unsupported cipher algorithm used" ) + } + + return keyBytes + } + + func inferDigestAlgorithmFromCipherAlgorithmForKeyDerivation( cipherAlg : String, keyLength : Int) throws -> String { + if cipherAlg == "DESede" || cipherAlg == "AES-128" { + return "SHA1"; + } + if cipherAlg == "AES" && keyLength == 128 { + return "SHA1"; + } + if cipherAlg == "AES-256" || cipherAlg == "AES-192" { + return "SHA256"; + } + if cipherAlg == "AES" && (keyLength == 192 || keyLength == 256) { + return "SHA256"; + } + + throw NFCPassportReaderError.InvalidDataPassed("Unsupported cipher algorithm or key length") + } + + /// This generates a SHA-X hash based on the passed in algo. + /// There must be a more generic way to do this? + func getHash(algo: String, dataElements:[Data] ) throws -> [UInt8] { + var hash : [UInt8] + + let algo = algo.lowercased() + if algo == "sha1" { + var hasher = Insecure.SHA1() + for d in dataElements { + hasher.update( data:d ) + } + hash = Array(hasher.finalize()) + } else if algo == "sha256" { + var hasher = SHA256() + for d in dataElements { + hasher.update( data:d ) + } + hash = Array(hasher.finalize()) + } else if algo == "sha384" { + var hasher = SHA384() + for d in dataElements { + hasher.update( data:d ) + } + hash = Array(hasher.finalize()) + } else if algo == "sha512" { + var hasher = SHA512() + for d in dataElements { + hasher.update( data:d ) + } + hash = Array(hasher.finalize()) + } else { + throw NFCPassportReaderError.InvalidHashAlgorithmSpecified + } + + return hash + } +} diff --git a/app/ios/AwesomeProject/SimpleASN1DumpParser.swift b/app/ios/AwesomeProject/SimpleASN1DumpParser.swift new file mode 100644 index 00000000..90196b4d --- /dev/null +++ b/app/ios/AwesomeProject/SimpleASN1DumpParser.swift @@ -0,0 +1,166 @@ +import Foundation +import OpenSSL + +@available(iOS 13, macOS 10.15, *) +public class ASN1Item : CustomDebugStringConvertible { + var pos : Int = -1 + var depth : Int = -1 + var headerLen : Int = -1 + var length : Int = -1 + var itemType : String = "" // Primative or Constructed (prim or cons) + var type : String = "" // Actual type of the value ( object, set, etc) + var value : String = "" + var line : String = "" + var parent : ASN1Item? = nil + + private var children = [ASN1Item] () + + public init( line : String) { + self.line = line + + let scanner = Scanner(string: line) + + let space = CharacterSet(charactersIn: " =:") + let equals = CharacterSet(charactersIn: "= ") + let colon = CharacterSet(charactersIn: ":") + let end = CharacterSet(charactersIn: "\n") + + scanner.charactersToBeSkipped = space + self.pos = scanner.scanInt() ?? -1 + _ = scanner.scanUpToCharacters(from: equals) + self.depth = scanner.scanInt() ?? -1 + _ = scanner.scanUpToCharacters(from: equals) + self.headerLen = scanner.scanInt() ?? -1 + _ = scanner.scanUpToCharacters(from: equals) + self.length = scanner.scanInt() ?? -1 + self.itemType = scanner.scanUpToCharacters(from: colon) ?? "" + let rest = scanner.scanUpToCharacters(from: end)?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "" + + if itemType == "cons" { + type = rest + + } else { + let items = rest.components(separatedBy: ":" ).filter{ !$0.isEmpty } + self.type = items[0].trimmingCharacters(in: .whitespacesAndNewlines) + if ( items.count > 1 ) { + self.value = items[1].trimmingCharacters(in: .whitespacesAndNewlines) + } + } + } + + func addChild( _ child : ASN1Item ) { + child.parent = self + self.children.append( child ) + } + + public func getChild( _ child : Int ) -> ASN1Item? { + if ( child < children.count ) { + return children[child] + } else { + return nil + } + } + + public func getNumberOfChildren() -> Int { + return children.count + } + + public var debugDescription: String { + var ret = "pos:\(pos), d=\(depth), hl=\(headerLen), l=\(length): \(itemType): \(type) \(value)\n" + children.forEach { ret += $0.debugDescription } + return ret + } +} + +/// Very very basic ASN1 parser class - uses OpenSSL to dump an ASN1 structure to a string, and then parses that out into +/// a tree based hieracy of ASN1Item structures - depth based +@available(iOS 13, macOS 10.15, *) +public class SimpleASN1DumpParser { + public init() { + + } + + public func parse( data: Data ) throws -> ASN1Item { + var parsed : String = "" + + + let _ = try data.withUnsafeBytes { (ptr) in + guard let out = BIO_new(BIO_s_mem()) else { throw OpenSSLError.UnableToParseASN1("Unable to allocate output buffer") } + defer { BIO_free(out) } + + let rc = ASN1_parse_dump(out, ptr.baseAddress?.assumingMemoryBound(to: UInt8.self), data.count, 0, 0) + if rc == 0 { + throw OpenSSLError.UnableToParseASN1("Failed to parse ASN1 Data") + } + + parsed = OpenSSLUtils.bioToString(bio: out) + } + + let lines = parsed.components(separatedBy: "\n") + let topItem : ASN1Item? = parseLines( lines:lines) + + guard let ret = topItem else { + throw OpenSSLError.UnableToParseASN1("Failed to format ASN1 Data") + } + + return ret + } + + func parseLines( lines : [String] ) -> ASN1Item? { + var topItem : ASN1Item? + + var currentParent : ASN1Item? + for line in lines { + if line.trimmingCharacters(in: .whitespacesAndNewlines) == "" { + continue + } + let item = ASN1Item(line: line) + if item.depth == 0 { + topItem = item + } else if item.depth == currentParent!.depth { + currentParent!.parent!.addChild( item ) + } else if item.depth > currentParent!.depth { + currentParent!.addChild( item ) + } else { + repeat { + currentParent = currentParent!.parent + } while currentParent!.depth > item.depth-1 && currentParent!.depth != 0 + if currentParent!.depth == item.depth-1 { + currentParent!.addChild( item ) + } + } + currentParent = item + } + + return topItem + } + + public func test() { + let lines = [ + " 0:d=0 hl=4 l= 758 cons: SET ", + " 662:d=1 hl=2 l= 18 cons: SEQUENCE ", + " 664:d=2 hl=2 l= 10 prim: OBJECT :0.4.0.127.0.7.2.2.3.2.4", + " 676:d=2 hl=2 l= 1 prim: INTEGER :01", + " 679:d=2 hl=2 l= 1 prim: INTEGER :01", + " 682:d=1 hl=2 l= 18 cons: SEQUENCE ", + " 684:d=2 hl=2 l= 10 prim: OBJECT :0.4.0.127.0.7.2.2.3.2.1", + " 696:d=2 hl=2 l= 1 prim: INTEGER :01", + " 699:d=2 hl=2 l= 1 prim: INTEGER :02", + " 702:d=1 hl=2 l= 13 cons: SEQUENCE ", + " 704:d=2 hl=2 l= 8 prim: OBJECT :0.4.0.127.0.7.2.2.2", + " 714:d=2 hl=2 l= 1 prim: INTEGER :01", + " 717:d=1 hl=2 l= 18 cons: SEQUENCE ", + " 719:d=2 hl=2 l= 10 prim: OBJECT :0.4.0.127.0.7.2.2.4.2.4", + " 731:d=2 hl=2 l= 1 prim: INTEGER :02", + " 734:d=2 hl=2 l= 1 prim: INTEGER :0D", + " 737:d=1 hl=2 l= 23 cons: SEQUENCE ", + " 739:d=2 hl=2 l= 6 prim: OBJECT :2.23.136.1.1.5", + " 747:d=2 hl=2 l= 1 prim: INTEGER :01", + " 750:d=2 hl=2 l= 10 prim: OBJECT :0.4.0.127.0.7.1.1.4.1.3", + "" + ] + + let topItem = parseLines( lines:lines ) + print( topItem?.debugDescription ?? "" ) + } +} diff --git a/app/ios/AwesomeProject/TagReader.swift b/app/ios/AwesomeProject/TagReader.swift new file mode 100644 index 00000000..ef9c786a --- /dev/null +++ b/app/ios/AwesomeProject/TagReader.swift @@ -0,0 +1,349 @@ +import Foundation + +#if !os(macOS) +import CoreNFC + +@available(iOS 15, *) +public class TagReader { + var tag : NFCISO7816Tag + var secureMessaging : SecureMessaging? + var maxDataLengthToRead : Int = 0xA0 // Should be able to use 256 to read arbitrary amounts of data at full speed BUT this isn't supported across all passports so for reliability just use the smaller amount. + + var progress : ((Int)->())? + + init( tag: NFCISO7816Tag ) { + self.tag = tag + } + + func overrideDataAmountToRead( newAmount : Int ) { + maxDataLengthToRead = newAmount + } + + func reduceDataReadingAmount() { + if maxDataLengthToRead > 0xA0 { + maxDataLengthToRead = 0xA0 + } + } + + + func readDataGroup( dataGroup: DataGroupId ) async throws -> [UInt8] { + guard let tag = dataGroup.getFileIDTag() else { + throw NFCPassportReaderError.UnsupportedDataGroup + } + + return try await selectFileAndRead(tag: tag ) + } + + func getChallenge() async throws -> ResponseAPDU{ + let cmd : NFCISO7816APDU = NFCISO7816APDU(instructionClass: 00, instructionCode: 0x84, p1Parameter: 0, p2Parameter: 0, data: Data(), expectedResponseLength: 8) + + return try await send( cmd: cmd ) + } + + func doInternalAuthentication( challenge: [UInt8] ) async throws -> ResponseAPDU { + let randNonce = Data(challenge) + + let cmd = NFCISO7816APDU(instructionClass: 00, instructionCode: 0x88, p1Parameter: 0, p2Parameter: 0, data: randNonce, expectedResponseLength: 256) + + return try await send( cmd: cmd ) + } + + func doMutualAuthentication( cmdData : Data ) async throws -> ResponseAPDU{ + let cmd : NFCISO7816APDU = NFCISO7816APDU(instructionClass: 00, instructionCode: 0x82, p1Parameter: 0, p2Parameter: 0, data: cmdData, expectedResponseLength: 256) + + return try await send( cmd: cmd ) + } + + /// The MSE KAT APDU, see EAC 1.11 spec, Section B.1. + /// This command is sent in the "DESede" case. + /// - Parameter keyData key data object (tag 0x91) + /// - Parameter idData key id data object (tag 0x84), can be null + /// - Parameter completed the complete handler - returns the success response or an error + func sendMSEKAT( keyData : Data, idData: Data? ) async throws -> ResponseAPDU { + + var data = keyData + if let idData = idData { + data += idData + } + + let cmd : NFCISO7816APDU = NFCISO7816APDU(instructionClass: 00, instructionCode: 0x22, p1Parameter: 0x41, p2Parameter: 0xA6, data: data, expectedResponseLength: 256) + + return try await send( cmd: cmd ) + } + + /// The MSE Set AT for Chip Authentication. + /// This command is the first command that is sent in the "AES" case. + /// For Chip Authentication. We prefix 0x80 for OID and 0x84 for keyId. + /// + /// NOTE THIS IS CURRENTLY UNTESTED + /// - Parameter oid the OID + /// - Parameter keyId the keyId or {@code null} + /// - Parameter completed the complete handler - returns the success response or an error + func sendMSESetATIntAuth( oid: String, keyId: Int? ) async throws -> ResponseAPDU { + + let cmd : NFCISO7816APDU + let oidBytes = oidToBytes(oid: oid, replaceTag: true) + + if let keyId = keyId, keyId != 0 { + let keyIdBytes = wrapDO(b:0x84, arr:intToBytes(val:keyId, removePadding: true)) + let data = oidBytes + keyIdBytes + + cmd = NFCISO7816APDU(instructionClass: 00, instructionCode: 0x22, p1Parameter: 0x41, p2Parameter: 0xA4, data: Data(data), expectedResponseLength: 256) + + } else { + cmd = NFCISO7816APDU(instructionClass: 00, instructionCode: 0x22, p1Parameter: 0x41, p2Parameter: 0xA4, data: Data(oidBytes), expectedResponseLength: 256) + } + + return try await send( cmd: cmd ) + } + + func sendMSESetATMutualAuth( oid: String, keyType: UInt8 ) async throws -> ResponseAPDU { + + let oidBytes = oidToBytes(oid: oid, replaceTag: true) + let keyTypeBytes = wrapDO( b: 0x83, arr:[keyType]) + + let data = oidBytes + keyTypeBytes + + let cmd = NFCISO7816APDU(instructionClass: 00, instructionCode: 0x22, p1Parameter: 0xC1, p2Parameter: 0xA4, data: Data(data), expectedResponseLength: -1) + + return try await send( cmd: cmd ) + } + + + /// Sends a General Authenticate command. + /// This command is the second command that is sent in the "AES" case. + /// - Parameter data data to be sent, without the {@code 0x7C} prefix (this method will add it) + /// - Parameter lengthExpected the expected length defaults to 256 + /// - Parameter isLast indicates whether this is the last command in the chain + /// - Parameter completed the complete handler - returns the dynamic authentication data without the {@code 0x7C} prefix (this method will remove it) or an error + func sendGeneralAuthenticate( data : [UInt8], lengthExpected : Int = 256, isLast: Bool) async throws -> ResponseAPDU { + + let wrappedData = wrapDO(b:0x7C, arr:data) + let commandData = Data(wrappedData) + + // NOTE: Support of Protocol Response Data is CONDITIONAL: + // It MUST be provided for version 2 but MUST NOT be provided for version 1. + // So, we are expecting 0x7C (= tag), 0x00 (= length) here. + + // 0x10 is class command chaining + let instructionClass : UInt8 = isLast ? 0x00 : 0x10 + let INS_BSI_GENERAL_AUTHENTICATE : UInt8 = 0x86 + + let cmd : NFCISO7816APDU = NFCISO7816APDU(instructionClass: instructionClass, instructionCode: INS_BSI_GENERAL_AUTHENTICATE, p1Parameter: 0x00, p2Parameter: 0x00, data: commandData, expectedResponseLength: lengthExpected) + var response : ResponseAPDU + do { + response = try await send( cmd: cmd ) + response.data = try unwrapDO( tag:0x7c, wrappedData:response.data) + } catch { + // If wrong length error + if case NFCPassportReaderError.ResponseError(_, let sw1, let sw2) = error, + sw1 == 0x67, sw2 == 0x00 { + + // Resend + let cmd : NFCISO7816APDU = NFCISO7816APDU(instructionClass: instructionClass, instructionCode: INS_BSI_GENERAL_AUTHENTICATE, p1Parameter: 0x00, p2Parameter: 0x00, data: commandData, expectedResponseLength: 256) + response = try await send( cmd: cmd ) + response.data = try unwrapDO( tag:0x7c, wrappedData:response.data) + } else { + throw error + } + } + return response + } + + + func selectFileAndRead( tag: [UInt8]) async throws -> [UInt8] { + var resp = try await selectFile(tag: tag ) + + // Read first 4 bytes of header to see how big the data structure is + guard let readHeaderCmd = NFCISO7816APDU(data:Data([0x00, 0xB0, 0x00, 0x00, 0x00, 0x00,0x04])) else { + throw NFCPassportReaderError.UnexpectedError + } + resp = try await self.send( cmd: readHeaderCmd ) + + // Header looks like: e.g.60145F01 - + // the total length is the 2nd value plus the two header 2 bytes + // We've read 4 bytes so we now need to read the remaining bytes from offset 4 + let (len, o) = try! asn1Length([UInt8](resp.data[1..<4])) + var remaining = Int(len) + var amountRead = o + 1 + + var data = [UInt8](resp.data[.. 0 { + if maxDataLengthToRead != 256 && remaining < maxDataLengthToRead { + readAmount = remaining + } + + self.progress?( Int(Float(amountRead) / Float(remaining+amountRead ) * 100)) + let offset = intToBin(amountRead, pad:4) + + Log.verbose( "TagReader - data bytes remaining: \(remaining), will read : \(readAmount)" ) + let cmd = NFCISO7816APDU( + instructionClass: 00, + instructionCode: 0xB0, + p1Parameter: offset[0], + p2Parameter: offset[1], + data: Data(), + expectedResponseLength: readAmount + ) + resp = try await self.send( cmd: cmd ) + + Log.verbose( "TagReader - got resp - \(binToHexRep(resp.data, asArray: true)), sw1 : \(resp.sw1), sw2 : \(resp.sw2)" ) + data += resp.data + + remaining -= resp.data.count + amountRead += resp.data.count + Log.verbose( "TagReader - Amount of data left to read - \(remaining)" ) + } + + return data + } + + + func readCardAccess() async throws -> [UInt8]{ + // Info provided by @smulu + // By default NFCISO7816Tag requirers a list of ISO/IEC 7816 applets (AIDs). Upon discovery of NFC tag the first found applet from this list is automatically selected (and you have no way of changing this). + // This is a problem for PACE protocol becaues it requires reading parameters from file EF.CardAccess which lies outside of eMRTD applet (AID: A0000002471001) in the master file. + + // Now, the ICAO 9303 standard does specify command for selecting master file by sending SELECT APDU with P1=0x00, P2=0x0C and empty data field (see part 10 page 8). But after some testing I found out this command doesn't work on some passports (European passports) and although receiving success (sw=9000) from passport the master file is not selected. + + // After a bit of researching standard ISO/IEC 7816 I found there is an alternative SELECT command for selecting master file. The command doesn't differ much from the command specified in ICAO 9303 doc with only difference that data field is set to: 0x3F00. See section 6.11.3 of ISO/IEC 7816-4. + // By executing above SELECT command (with data=0x3F00) master file should be selected and you should be able to read EF.CardAccess from passport. + + // First select master file + let cmd : NFCISO7816APDU = NFCISO7816APDU(instructionClass: 0x00, instructionCode: 0xA4, p1Parameter: 0x00, p2Parameter: 0x0C, data: Data([0x3f,0x00]), expectedResponseLength: -1) + + _ = try await send( cmd: cmd) + + // Now read EC.CardAccess + let data = try await self.selectFileAndRead(tag: [0x01,0x1C]) + return data + } + + func selectPassportApplication() async throws -> ResponseAPDU { + // Finally reselect the eMRTD application so the rest of the reading works as normal + Log.debug( "Re-selecting eMRTD Application" ) + let cmd : NFCISO7816APDU = NFCISO7816APDU(instructionClass: 0x00, instructionCode: 0xA4, p1Parameter: 0x04, p2Parameter: 0x0C, data: Data([0xA0, 0x00, 0x00, 0x02, 0x47, 0x10, 0x01]), expectedResponseLength: -1) + + let response = try await self.send( cmd: cmd) + return response + } + + func selectFile( tag: [UInt8] ) async throws -> ResponseAPDU { + + let data : [UInt8] = [0x00, 0xA4, 0x02, 0x0C, 0x02] + tag + let cmd = NFCISO7816APDU(data:Data(data))! + + return try await send( cmd: cmd ) + } + + func send( cmd: NFCISO7816APDU ) async throws -> ResponseAPDU { + Log.verbose( "TagReader - sending \(cmd)" ) + var toSend = cmd + if let sm = secureMessaging { + toSend = try sm.protect(apdu:cmd) + Log.verbose("TagReader - [SM] \(toSend)" ) + } + + let (data, sw1, sw2) = try await tag.sendCommand(apdu: toSend) + Log.verbose( "TagReader - Received response" ) + var rep = ResponseAPDU(data: [UInt8](data), sw1: sw1, sw2: sw2) + + if let sm = self.secureMessaging { + rep = try sm.unprotect(rapdu:rep) + Log.verbose(String(format:"TagReader [SM - unprotected] \(binToHexRep(rep.data, asArray:true)), sw1:0x%02x sw2:0x%02x", rep.sw1, rep.sw2) ) + } else { + Log.verbose(String(format:"TagReader [unprotected] \(binToHexRep(rep.data, asArray:true)), sw1:0x%02x sw2:0x%02x", rep.sw1, rep.sw2) ) + + } + + if rep.sw1 != 0x90 && rep.sw2 != 0x00 { + Log.error( "Error reading tag: sw1 - 0x\(binToHexRep(sw1)), sw2 - 0x\(binToHexRep(sw2))" ) + let tagError: NFCPassportReaderError + if (rep.sw1 == 0x63 && rep.sw2 == 0x00) { + tagError = NFCPassportReaderError.InvalidMRZKey + } else { + let errorMsg = self.decodeError(sw1: rep.sw1, sw2: rep.sw2) + Log.error( "reason: \(errorMsg)" ) + tagError = NFCPassportReaderError.ResponseError( errorMsg, sw1, sw2 ) + } + throw tagError + } + + return rep + } + + private func decodeError( sw1: UInt8, sw2:UInt8 ) -> String { + + let errors : [UInt8 : [UInt8:String]] = [ + 0x62: [0x00:"No information given", + 0x81:"Part of returned data may be corrupted", + 0x82:"End of file/record reached before reading Le bytes", + 0x83:"Selected file invalidated", + 0x84:"FCI not formatted according to ISO7816-4 section 5.1.5"], + + 0x63: [0x81:"File filled up by the last write", + 0x82:"Card Key not supported", + 0x83:"Reader Key not supported", + 0x84:"Plain transmission not supported", + 0x85:"Secured Transmission not supported", + 0x86:"Volatile memory not available", + 0x87:"Non Volatile memory not available", + 0x88:"Key number not valid", + 0x89:"Key length is not correct", + 0xC:"Counter provided by X (valued from 0 to 15) (exact meaning depending on the command)"], + 0x65: [0x00:"No information given", + 0x81:"Memory failure"], + 0x67: [0x00:"Wrong length"], + 0x68: [0x00:"No information given", + 0x81:"Logical channel not supported", + 0x82:"Secure messaging not supported", + 0x83:"Last command of the chain expected", + 0x84:"Command chaining not supported"], + 0x69: [0x00:"No information given", + 0x81:"Command incompatible with file structure", + 0x82:"Security status not satisfied", + 0x83:"Authentication method blocked", + 0x84:"Referenced data invalidated", + 0x85:"Conditions of use not satisfied", + 0x86:"Command not allowed (no current EF)", + 0x87:"Expected SM data objects missing", + 0x88:"SM data objects incorrect"], + 0x6A: [0x00:"No information given", + 0x80:"Incorrect parameters in the data field", + 0x81:"Function not supported", + 0x82:"File not found", + 0x83:"Record not found", + 0x84:"Not enough memory space in the file", + 0x85:"Lc inconsistent with TLV structure", + 0x86:"Incorrect parameters P1-P2", + 0x87:"Lc inconsistent with P1-P2", + 0x88:"Referenced data not found"], + 0x6B: [0x00:"Wrong parameter(s) P1-P2]"], + 0x6D: [0x00:"Instruction code not supported or invalid"], + 0x6E: [0x00:"Class not supported"], + 0x6F: [0x00:"No precise diagnosis"], + 0x90: [0x00:"Success"] //No further qualification + ] + + // Special cases - where sw2 isn't an error but contains a value + if sw1 == 0x61 { + return "SW2 indicates the number of response bytes still available - (\(sw2) bytes still available)" + } else if sw1 == 0x64 { + return "State of non-volatile memory unchanged (SW2=00, other values are RFU)" + } else if sw1 == 0x6C { + return "Wrong length Le: SW2 indicates the exact length - (exact length :\(sw2))" + } + + if let dict = errors[sw1], let errorMsg = dict[sw2] { + return errorMsg + } + + return "Unknown error - sw1: 0x\(binToHexRep(sw1)), sw2 - 0x\(binToHexRep(sw2)) " + } +} + +#endif diff --git a/app/ios/AwesomeProject/Utils.swift b/app/ios/AwesomeProject/Utils.swift new file mode 100644 index 00000000..ac3f0af6 --- /dev/null +++ b/app/ios/AwesomeProject/Utils.swift @@ -0,0 +1,415 @@ +import Foundation +import CommonCrypto +import CryptoTokenKit + +#if canImport(CryptoKit) + import CryptoKit +#endif + +private extension UInt8 { + var hexString: String { + let string = String(self, radix: 16) + return (self < 16 ? "0" + string : string) + } +} + + +extension FileManager { + static var documentDir : URL { + return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! + } +} + +extension StringProtocol { + subscript(bounds: CountableClosedRange) -> SubSequence { + let start = index(startIndex, offsetBy: bounds.lowerBound) + let end = index(start, offsetBy: bounds.count) + return self[start..) -> SubSequence { + let start = index(startIndex, offsetBy: bounds.lowerBound) + let end = index(start, offsetBy: bounds.count) + return self[start.. Index? { + return range(of: string, options: options)?.lowerBound + } + +} + + +public func binToHexRep( _ val : [UInt8], asArray : Bool = false ) -> String { + var string = asArray ? "[" : "" + for x in val { + if asArray { + string += String(format:"0x%02x, ", x ) + + } else { + string += String(format:"%02x", x ) + } + } + string += asArray ? "]" : "" + return asArray ? string : string.uppercased() +} + +public func binToHexRep( _ val : UInt8 ) -> String { + let string = String(format:"%02x", val ).uppercased() + return string +} + +public func binToHex( _ val: UInt8 ) -> Int { + let hexRep = String(format:"%02X", val) + return Int(hexRep, radix:16)! +} + +public func binToHex( _ val: [UInt8] ) -> UInt64 { + let hexVal = UInt64(binToHexRep(val), radix:16)! + return hexVal +} + +public func binToHex( _ val: ArraySlice ) -> UInt64 { + return binToHex( [UInt8](val) ) +} + + +public func hexToBin( _ val : UInt64 ) -> [UInt8] { + let hexRep = String(format:"%lx", val) + return hexRepToBin( hexRep) +} + +public func binToInt( _ val: ArraySlice ) -> Int { + let hexVal = binToInt( [UInt8](val) ) + return hexVal +} + +public func binToInt( _ val: [UInt8] ) -> Int { + let hexVal = Int(binToHexRep(val), radix:16)! + return hexVal +} + +public func intToBin(_ data : Int, pad : Int = 2) -> [UInt8] { + if pad == 2 { + let hex = String(format:"%02x", data) + return hexRepToBin(hex) + } else { + let hex = String(format:"%04x", data) + return hexRepToBin(hex) + + } +} + +/// 'AABB' --> \xaa\xbb'""" +public func hexRepToBin(_ val : String) -> [UInt8] { + var output : [UInt8] = [] + var x = 0 + while x < val.count { + if x+2 <= val.count { + output.append( UInt8(val[x ..< x + 2], radix:16)! ) + } else { + output.append( UInt8(val[x ..< x+1], radix:16)! ) + + } + x += 2 + } + return output +} + +public func xor(_ kifd : [UInt8], _ response_kicc : [UInt8] ) -> [UInt8] { + var kseed = [UInt8]() + for i in 0 ..< kifd.count { + kseed.append( kifd[i] ^ response_kicc[i] ) + } + return kseed +} + +public func generateRandomUInt8Array( _ size: Int ) -> [UInt8] { + + var ret : [UInt8] = [] + for _ in 0 ..< size { + ret.append( UInt8(arc4random_uniform(UInt32(UInt8.max) + 1)) ) + } + return ret +} + +public func pad(_ toPad : [UInt8], blockSize : Int) -> [UInt8] { + + var ret = toPad + [0x80] + while ret.count % blockSize != 0 { + ret.append(0x00) + } + return ret +} + +public func unpad( _ tounpad : [UInt8]) -> [UInt8] { + var i = tounpad.count-1 + while tounpad[i] == 0x00 { + i -= 1 + } + + if tounpad[i] == 0x80 { + return [UInt8](tounpad[0.. [UInt8] { + if algoName == .DES { + return desMAC(key: key, msg: msg) + } else { + return aesMAC(key: key, msg: msg) + } +} + +@available(iOS 13, macOS 10.15, *) +public func desMAC(key : [UInt8], msg : [UInt8]) -> [UInt8]{ + + let size = msg.count / 8 + var y : [UInt8] = [0,0,0,0,0,0,0,0] + + Log.verbose("Calc mac" ) + for i in 0 ..< size { + let tmp = [UInt8](msg[i*8 ..< i*8+8]) + Log.verbose("x\(i): \(binToHexRep(tmp))" ) + y = DESEncrypt(key: [UInt8](key[0..<8]), message: tmp, iv: y) + Log.verbose("y\(i): \(binToHexRep(y))" ) + } + + Log.verbose("y: \(binToHexRep(y))" ) + Log.verbose("bkey: \(binToHexRep([UInt8](key[8..<16])))" ) + Log.verbose("akey: \(binToHexRep([UInt8](key[0..<8])))" ) + let iv : [UInt8] = [0,0,0,0,0,0,0,0] + let b = DESDecrypt(key: [UInt8](key[8..<16]), message: y, iv: iv, options:UInt32(kCCOptionECBMode)) + Log.verbose( "b: \(binToHexRep(b))" ) + let a = DESEncrypt(key: [UInt8](key[0..<8]), message: b, iv: iv, options:UInt32(kCCOptionECBMode)) + Log.verbose( "a: \(binToHexRep(a))" ) + + return a +} + +@available(iOS 13, macOS 10.15, *) +public func aesMAC( key: [UInt8], msg : [UInt8] ) -> [UInt8] { + let mac = OpenSSLUtils.generateAESCMAC( key: key, message:msg ) + return mac +} + +@available(iOS 13, macOS 10.15, *) +public func wrapDO( b : UInt8, arr : [UInt8] ) -> [UInt8] { + let tag = TKBERTLVRecord(tag: TKTLVTag(b), value: Data(arr)) + let result = [UInt8](tag.data) + return result; +} + +@available(iOS 13, macOS 10.15, *) +public func unwrapDO( tag : UInt8, wrappedData : [UInt8]) throws -> [UInt8] { + guard let rec = TKBERTLVRecord(from: Data(wrappedData)), + rec.tag == tag else { + throw NFCPassportReaderError.InvalidASN1Value + } + return [UInt8](rec.value); +} + + +public func intToBytes( val: Int, removePadding:Bool) -> [UInt8] { + if val == 0 { + return [0] + } + var data = withUnsafeBytes(of: val.bigEndian, Array.init) + + if removePadding { + // Remove initial 0 bytes + for i in 0 ..< data.count { + if data[i] != 0 { + data = [UInt8](data[i...]) + break + } + } + } + return data +} + +@available(iOS 13, macOS 10.15, *) +public func oidToBytes(oid : String, replaceTag : Bool) -> [UInt8] { + var encOID = OpenSSLUtils.asn1EncodeOID(oid: oid) + + if replaceTag { + // Replace tag (0x06) with 0x80 + encOID[0] = 0x80 + } + return encOID +} + + + +/// Take an asn.1 length, and return a couple with the decoded length in hexa and the total length of the encoding (1,2 or 3 bytes) +/// +/// Using Basic Encoding Rules (BER): +/// If the first byte is <= 0x7F (0-127), then this is the total length of the data +/// If the first byte is 0x81 then the length is the value of the next byte +/// If the first byte is 0x82 then the length is the value of the next two bytes +/// If the first byte is 0x80 then the length is indefinite (never seen this and not sure exactle what it means) +/// e.g. +/// if the data was 0x02, 0x11, 0x12, then the amount of data we have to read is two bytes, and the actual data is [0x11, 0x12] +/// If the length was 0x81,0x80,....... then we know that the data length is contained in the next byte - 0x80 (128), so the amount of data to read is 128 bytes +/// If the length was 0x82,0x01,0x01,....... then we know that the data length is contained in the next 2 bytes - 0x01, 0x01 (257) so the amount of data to read is 257 bytes +/// +/// @param data: A length value encoded in the asn.1 format. +/// @type data: A binary string. +/// @return: A tuple with the decoded hexa length and the length of the asn.1 encoded value. +/// @raise asn1Exception: If the parameter does not follow the asn.1 notation. + +@available(iOS 13, macOS 10.15, *) +public func asn1Length( _ data: ArraySlice ) throws -> (Int, Int) { + return try asn1Length( Array(data) ) +} + +@available(iOS 13, macOS 10.15, *) +public func asn1Length(_ data : [UInt8]) throws -> (Int, Int) { + if data[0] < 0x80 { + return (Int(binToHex(data[0])), 1) + } + if data[0] == 0x81 { + return (Int(binToHex(data[1])), 2) + } + if data[0] == 0x82 { + let val = binToHex([UInt8](data[1..<3])) + return (Int(val), 3) + } + + throw NFCPassportReaderError.CannotDecodeASN1Length + +} + +/// Convert a length to asn.1 format +/// @param data: The value to encode in asn.1 +/// @type data: An integer (hexa) +/// @return: The asn.1 encoded value +/// @rtype: A binary string +/// @raise asn1Exception: If the parameter is too big, must be >= 0 and <= FFFF +@available(iOS 13, macOS 10.15, *) +public func toAsn1Length(_ data : Int) throws -> [UInt8] { + if data < 0x80 { + return hexRepToBin(String(format:"%02x", data)) + } + if data >= 0x80 && data <= 0xFF { + return [0x81] + hexRepToBin( String(format:"%02x",data)) + } + if data >= 0x0100 && data <= 0xFFFF { + return [0x82] + hexRepToBin( String(format:"%04x",data)) + } + + throw NFCPassportReaderError.InvalidASN1Value +} + + + +/// This function calculates a Hash of the input data based on the input algorithm +/// @param data: a byte array of data +/// @param hashAlgorithm: the hash algorithm to be used - supported ones are SHA1, SHA224, SHA256, SHA384 and SHA512 +/// Currently specifying any others return empty array +/// @return: A hash of the data +@available(iOS 13, macOS 10.15, *) +public func calcHash( data: [UInt8], hashAlgorithm: String ) throws -> [UInt8] { + var ret : [UInt8] = [] + + let hashAlgorithm = hashAlgorithm.lowercased() + if hashAlgorithm == "sha1" { + ret = calcSHA1Hash(data) + } else if hashAlgorithm == "sha224" { + ret = calcSHA224Hash(data) + } else if hashAlgorithm == "sha256" { + ret = calcSHA256Hash(data) + } else if hashAlgorithm == "sha384" { + ret = calcSHA384Hash(data) + } else if hashAlgorithm == "sha512" { + ret = calcSHA512Hash(data) + } else { + throw NFCPassportReaderError.InvalidHashAlgorithmSpecified + } + + return ret +} + + +/// This function calculates a SHA1 Hash of the input data +/// @param data: a byte array of data +/// @return: A SHA1 hash of the data +@available(iOS 13, macOS 10.15, *) +public func calcSHA1Hash( _ data: [UInt8] ) -> [UInt8] { + #if canImport(CryptoKit) + var sha1 = Insecure.SHA1() + sha1.update(data: data) + let hash = sha1.finalize() + + return Array(hash) + #else + fatalError("Couldn't import CryptoKit") + #endif +} + +/// This function calculates a SHA224 Hash of the input data +/// @param data: a byte array of data +/// @return: A SHA224 hash of the data +@available(iOS 13, macOS 10.15, *) +public func calcSHA224Hash( _ data: [UInt8] ) -> [UInt8] { + + var digest = [UInt8](repeating: 0, count:Int(CC_SHA224_DIGEST_LENGTH)) + + data.withUnsafeBytes { + _ = CC_SHA224($0.baseAddress, CC_LONG(data.count), &digest) + } + return digest +} + +/// This function calculates a SHA256 Hash of the input data +/// @param data: a byte array of data +/// @return: A SHA256 hash of the data +@available(iOS 13, macOS 10.15, *) +public func calcSHA256Hash( _ data: [UInt8] ) -> [UInt8] { + #if canImport(CryptoKit) + var sha256 = SHA256() + sha256.update(data: data) + let hash = sha256.finalize() + + return Array(hash) + #else + fatalError("Couldn't import CryptoKit") + #endif +} + +/// This function calculates a SHA512 Hash of the input data +/// @param data: a byte array of data +/// @return: A SHA512 hash of the data +@available(iOS 13, macOS 10.15, *) +public func calcSHA512Hash( _ data: [UInt8] ) -> [UInt8] { + #if canImport(CryptoKit) + var sha512 = SHA512() + sha512.update(data: data) + let hash = sha512.finalize() + + return Array(hash) + #else + fatalError("Couldn't import CryptoKit") + #endif +} + +/// This function calculates a SHA384 Hash of the input data +/// @param data: a byte array of data +/// @return: A SHA384 hash of the data +@available(iOS 13, macOS 10.15, *) +public func calcSHA384Hash( _ data: [UInt8] ) -> [UInt8] { + #if canImport(CryptoKit) + var sha384 = SHA384() + sha384.update(data: data) + let hash = sha384.finalize() + + return Array(hash) + #else + fatalError("Couldn't import CryptoKit") + #endif +} + diff --git a/app/ios/AwesomeProject/X509Wrapper.swift b/app/ios/AwesomeProject/X509Wrapper.swift new file mode 100644 index 00000000..eb995a90 --- /dev/null +++ b/app/ios/AwesomeProject/X509Wrapper.swift @@ -0,0 +1,161 @@ +import OpenSSL + +@available(iOS 13, macOS 10.15, *) +public enum CertificateType { + case documentSigningCertificate + case issuerSigningCertificate +} + +@available(iOS 13, macOS 10.15, *) +public enum CertificateItem : String { + case fingerprint = "Certificate fingerprint" + case issuerName = "Issuer" + case subjectName = "Subject" + case serialNumber = "Serial number" + case signatureAlgorithm = "Signature algorithm" + case publicKeyAlgorithm = "Public key algorithm" + case notBefore = "Valid from" + case notAfter = "Valid to" +} + +@available(iOS 13, macOS 10.15, *) +public class X509Wrapper { + public let cert : OpaquePointer + + public init?( with cert: OpaquePointer? ) { + guard let cert = cert else { return nil } + + self.cert = X509_dup(cert) + } + + public func getItemsAsDict() -> [CertificateItem:String] { + var item = [CertificateItem:String]() + if let fingerprint = self.getFingerprint() { + item[.fingerprint] = fingerprint + } + if let issuerName = self.getIssuerName() { + item[.issuerName] = issuerName + + } + if let subjectName = self.getSubjectName() { + item[.subjectName] = subjectName + } + if let serialNr = self.getSerialNumber() { + item[.serialNumber] = serialNr + } + if let signatureAlgorithm = self.getSignatureAlgorithm() { + item[.signatureAlgorithm] = signatureAlgorithm + } + if let publicKeyAlgorithm = self.getPublicKeyAlgorithm() { + item[.publicKeyAlgorithm] = publicKeyAlgorithm + } + if let notBefore = self.getNotBeforeDate() { + item[.notBefore] = notBefore + } + if let notAfter = self.getNotAfterDate() { + item[.notAfter] = notAfter + } + + return item + } + public func certToPEM() -> String { + return OpenSSLUtils.X509ToPEM( x509:cert ) + } + + public func getFingerprint( ) -> String? { + let fdig = EVP_sha1(); + + var n : UInt32 = 0 + let md = UnsafeMutablePointer.allocate(capacity: Int(EVP_MAX_MD_SIZE)) + defer { md.deinitialize(count: Int(EVP_MAX_MD_SIZE)); md.deallocate() } + + X509_digest(cert, fdig, md, &n) + let arr = UnsafeMutableBufferPointer(start: md, count: Int(n)).map({ binToHexRep($0) }).joined(separator: ":") + return arr + } + + public func getNotBeforeDate() -> String? { + var notBefore : String? + if let val = X509_get0_notBefore(cert) { + notBefore = ASN1TimeToString( val ) + } + return notBefore + + } + + public func getNotAfterDate() -> String? { + var notAfter : String? + if let val = X509_get0_notAfter(cert) { + notAfter = ASN1TimeToString( val ) + } + return notAfter + } + + public func getSerialNumber() -> String? { + let serialNr = String( ASN1_INTEGER_get(X509_get_serialNumber(cert)), radix:16, uppercase: true ) + return serialNr + } + + public func getSignatureAlgorithm() -> String? { + let algor = X509_get0_tbs_sigalg(cert); + let algo = getAlgorithm( algor?.pointee.algorithm ) + return algo + } + + public func getPublicKeyAlgorithm() -> String? { + let pubKey = X509_get_X509_PUBKEY(cert) + var ptr : OpaquePointer? + X509_PUBKEY_get0_param(&ptr, nil, nil, nil, pubKey) + let algo = getAlgorithm(ptr) + return algo + } + + public func getIssuerName() -> String? { + return getName(for: X509_get_issuer_name(cert)) + } + + public func getSubjectName() -> String? { + return getName(for: X509_get_subject_name(cert)) + } + + private func getName( for name: OpaquePointer? ) -> String? { + guard let name = name else { return nil } + + var issuer: String = "" + + guard let out = BIO_new( BIO_s_mem()) else { return nil } + defer { BIO_free(out) } + + X509_NAME_print_ex(out, name, 0, UInt(ASN1_STRFLGS_ESC_2253 | + ASN1_STRFLGS_ESC_CTRL | + ASN1_STRFLGS_ESC_MSB | + ASN1_STRFLGS_UTF8_CONVERT | + ASN1_STRFLGS_DUMP_UNKNOWN | + ASN1_STRFLGS_DUMP_DER | XN_FLAG_SEP_COMMA_PLUS | + XN_FLAG_DN_REV | + XN_FLAG_FN_SN | + XN_FLAG_DUMP_UNKNOWN_FIELDS)) + issuer = OpenSSLUtils.bioToString(bio: out) + + return issuer + } + + private func getAlgorithm( _ algo: OpaquePointer? ) -> String? { + guard let algo = algo else { return nil } + let len = OBJ_obj2nid(algo) + var algoString : String? = nil + if let sa = OBJ_nid2ln(len) { + algoString = String(cString: sa ) + } + return algoString + } + + private func ASN1TimeToString( _ date: UnsafePointer ) -> String? { + guard let b = BIO_new(BIO_s_mem()) else { return nil } + defer { BIO_free(b) } + + ASN1_TIME_print(b, date) + return OpenSSLUtils.bioToString(bio: b) + } + +} diff --git a/app/ios/AwesomeProject/main.m b/app/ios/AwesomeProject/main.m new file mode 100644 index 00000000..d645c724 --- /dev/null +++ b/app/ios/AwesomeProject/main.m @@ -0,0 +1,10 @@ +#import + +#import "AppDelegate.h" + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/app/ios/AwesomeProject/masterList.pem b/app/ios/AwesomeProject/masterList.pem new file mode 100644 index 00000000..03341274 --- /dev/null +++ b/app/ios/AwesomeProject/masterList.pem @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFdDCCA1wCCQDFcc+Un66UsDANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJH +QjESMBAGA1UECAwJU29tZXdoZXJlMRIwEAYDVQQHDAlUaGlzIENpdHkxCzAJBgNV +BAoMAk5BMQswCQYDVQQLDAJOQTENMAsGA1UEAwwEdGVzdDEcMBoGCSqGSIb3DQEJ +ARYNdGVzdEB0ZXN0LmNvbTAeFw0xOTA2MjgxMzAyNTlaFw0yMDA2MjcxMzAyNTla +MHwxCzAJBgNVBAYTAkdCMRIwEAYDVQQIDAlTb21ld2hlcmUxEjAQBgNVBAcMCVRo +aXMgQ2l0eTELMAkGA1UECgwCTkExCzAJBgNVBAsMAk5BMQ0wCwYDVQQDDAR0ZXN0 +MRwwGgYJKoZIhvcNAQkBFg10ZXN0QHRlc3QuY29tMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA4sTb0Xd20ATso1VffMGK/N2TuEcsZvQkbhr75dd6f77y +3h5r5ikFCcppGwlgEy6/wn0iEiv4iGDm7cxvVSfwZ+Bm7nbYZVHl8G7vYUZRdLnh +tcUpfa+jPyrQ+XXfTygjoE2shAs8Wv+uB/O0oLbltdx5HMcitHj6MkIz3bs6hY4Z +2kSy6JB1Iw0GwB6vfHbD8MUkn0Aqxwdrd5ks61lVpYx3JyvhUXVjC/9rE+dk6+cN +16WvRhCEH6aClgWcfkSfDtZ85ltcyL3glAqX1YMLl4CFRKZ3NLVgXjHj/QYvAXJq +yWoNbAQvCFv5WK8/JjtAzFYKwjGGUhG5tL6etLrfDF/RudrLDIS2Js9cTMbbB10O +UehVksJvYQBaj8VRSsI7GrGydecfBixwqYD5DxcPzZsGcsfzuQYkotG+poDhjRE4 +Ow9zqIG20hgnBn3VTbP21yc4woYLzIK7M7MdWDiDqqcrLwtxolIk6R6lc/3wVR8i +19F5HFwKM0RW3cWZhXqCHrpYBzj8gx7hJAKSFZWDygLFH8h1LtMx93kstxPR7FA6 +99737YU1HF0j7kjKJAIQqoJ43ftUN9q8sDN/rRpEgKnRUuFrvcaTdTZCJ7NT3u6p +edC+8rdbKQO6TX0JC8PEl1FjTiVnb3wpMpWPYaI3hspSN/CMUunypoKRJ5IgSK8C +AwEAATANBgkqhkiG9w0BAQsFAAOCAgEAJtrliSVzukKjUJR3AnZrgcnWZ8kTGH9E +TSfpmc9IkMvwWvBs/vgpKMm3XVzTM1RcI/pQYR9Y4beXf4wgTQIg1I2kWLVcRMzU +rwFWl2/h6uA6G+tJpaVVy30rPcYGqLmBqzCCRb3sf/H77/6nknafA4jMASlIWnTE +R7HBd0cJa50jaTgFaIe734oIMqaAZvFFKK5KDnxSBMHwUf7ej1ibT/rB5Ry80qpJ +FsKlxpjaeUDWsnnjR4Z98rjDsWOSI8tUTStdnPYTw/6VFsf+zPKwE2u2Qe7SXg3S +eUoCQqWYaSMqmAfTVJx7zIDIvxa8+LmtijeqYUZcfnos0xxTEeJ6EH65rAPOi23x +1pg8Z28NAAinqFAo74Hr2hTKESmq0mykF/XP4wLhhaxYHy+FFwm984IIpqbKJmuY +/LapNMi6hZXRXft5PQYe57ZXD9/Lp8pn+19nX0nyv5agius0/R4M3CvuPbdose64 +jm+2325MQAhihrHmcU0YIt1kwSMuiYOqwD5plx+yenCIhdR6Oa5WX7Xf/hiKZult +5UVNVxfG1tZbsk/u2iwd2fDMBGQ3/D36REA5el6GUPpBOaa6gVmpS38qRCTVTBqH +NY8Qy6N+AHsahMtMakwo/EWsDsGTajcrvXX1psLgpRdMNeXgU3nNzJ+wPMUPCTFB +ZhNynFjgmgY= +-----END CERTIFICATE----- diff --git a/app/ios/AwesomeProjectTests/AwesomeProjectTests.m b/app/ios/AwesomeProjectTests/AwesomeProjectTests.m new file mode 100644 index 00000000..adc7bf16 --- /dev/null +++ b/app/ios/AwesomeProjectTests/AwesomeProjectTests.m @@ -0,0 +1,66 @@ +#import +#import + +#import +#import + +#define TIMEOUT_SECONDS 600 +#define TEXT_TO_LOOK_FOR @"Welcome to React" + +@interface AwesomeProjectTests : XCTestCase + +@end + +@implementation AwesomeProjectTests + +- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL (^)(UIView *view))test +{ + if (test(view)) { + return YES; + } + for (UIView *subview in [view subviews]) { + if ([self findSubviewInView:subview matching:test]) { + return YES; + } + } + return NO; +} + +- (void)testRendersWelcomeScreen +{ + UIViewController *vc = [[[RCTSharedApplication() delegate] window] rootViewController]; + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; + BOOL foundElement = NO; + + __block NSString *redboxError = nil; +#ifdef DEBUG + RCTSetLogFunction( + ^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { + if (level >= RCTLogLevelError) { + redboxError = message; + } + }); +#endif + + while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { + [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + foundElement = [self findSubviewInView:vc.view + matching:^BOOL(UIView *view) { + if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { + return YES; + } + return NO; + }]; + } + +#ifdef DEBUG + RCTSetLogFunction(RCTDefaultLogFunction); +#endif + + XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); + XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); +} + +@end diff --git a/app/ios/AwesomeProjectTests/Info.plist b/app/ios/AwesomeProjectTests/Info.plist new file mode 100644 index 00000000..ba72822e --- /dev/null +++ b/app/ios/AwesomeProjectTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/app/ios/NFCPassportReader/BACHandler.swift b/app/ios/NFCPassportReader/BACHandler.swift new file mode 100644 index 00000000..cd35be7c --- /dev/null +++ b/app/ios/NFCPassportReader/BACHandler.swift @@ -0,0 +1,193 @@ +// +// BACHandler.swift +// NFCTest +// +// Created by Andy Qua on 07/06/2019. +// Copyright Β© 2019 Andy Qua. All rights reserved. +// + +import Foundation + +#if !os(macOS) +import CoreNFC + +@available(iOS 15, *) +public class BACHandler { + let KENC : [UInt8] = [0,0,0,1] + let KMAC : [UInt8] = [0,0,0,2] + + public var ksenc : [UInt8] = [] + public var ksmac : [UInt8] = [] + + var rnd_icc : [UInt8] = [] + var rnd_ifd : [UInt8] = [] + public var kifd : [UInt8] = [] + + var tagReader : TagReader? + + public init() { + // For testing only + } + + public init(tagReader: TagReader) { + self.tagReader = tagReader + } + + public func performBACAndGetSessionKeys( mrzKey : String ) async throws { + guard let tagReader = self.tagReader else { + throw NFCPassportReaderError.NoConnectedTag + } + + Log.debug( "BACHandler - deriving Document Basic Access Keys" ) + _ = try self.deriveDocumentBasicAccessKeys(mrz: mrzKey) + + // Make sure we clear secure messaging (could happen if we read an invalid DG or we hit a secure error + tagReader.secureMessaging = nil + + // get Challenge + Log.debug( "BACHandler - Getting initial challenge" ) + let response = try await tagReader.getChallenge() + + Log.verbose( "DATA - \(response.data)" ) + + Log.debug( "BACHandler - Doing mutual authentication" ) + let cmd_data = self.authentication(rnd_icc: [UInt8](response.data)) + let maResponse = try await tagReader.doMutualAuthentication(cmdData: Data(cmd_data)) + Log.debug( "DATA - \(maResponse.data)" ) + guard maResponse.data.count > 0 else { + throw NFCPassportReaderError.InvalidMRZKey + } + + let (KSenc, KSmac, ssc) = try self.sessionKeys(data: [UInt8](maResponse.data)) + tagReader.secureMessaging = SecureMessaging(ksenc: KSenc, ksmac: KSmac, ssc: ssc) + Log.debug( "BACHandler - complete" ) + } + + + func deriveDocumentBasicAccessKeys(mrz: String) throws -> ([UInt8], [UInt8]) { + let kseed = generateInitialKseed(kmrz:mrz) + + Log.verbose("Calculate the Basic Access Keys (Kenc and Kmac) using TR-SAC 1.01, 4.2") + let smskg = SecureMessagingSessionKeyGenerator() + self.ksenc = try smskg.deriveKey(keySeed: kseed, mode: .ENC_MODE) + self.ksmac = try smskg.deriveKey(keySeed: kseed, mode: .MAC_MODE) + + return (ksenc, ksmac) + } + + /// + /// Calculate the kseed from the kmrz: + /// - Calculate a SHA-1 hash of the kmrz + /// - Take the most significant 16 bytes to form the Kseed. + /// @param kmrz: The MRZ information + /// @type kmrz: a string + /// @return: a 16 bytes string + /// + /// - Parameter kmrz: mrz key + /// - Returns: first 16 bytes of the mrz SHA1 hash + /// + func generateInitialKseed(kmrz : String ) -> [UInt8] { + + Log.verbose("Calculate the SHA-1 hash of MRZ_information") + Log.verbose("\tMRZ KEY - \(kmrz)") + let hash = calcSHA1Hash( [UInt8](kmrz.data(using:.utf8)!) ) + + Log.verbose("\tsha1(MRZ_information): \(binToHexRep(hash))") + + let subHash = Array(hash[0..<16]) + Log.verbose("Take the most significant 16 bytes to form the Kseed") + Log.verbose("\tKseed: \(binToHexRep(subHash))" ) + + return Array(subHash) + } + + + /// Construct the command data for the mutual authentication. + /// - Request an 8 byte random number from the MRTD's chip (rnd.icc) + /// - Generate an 8 byte random (rnd.ifd) and a 16 byte random (kifd) + /// - Concatenate rnd.ifd, rnd.icc and kifd (s = rnd.ifd + rnd.icc + kifd) + /// - Encrypt it with TDES and the Kenc key (eifd = TDES(s, Kenc)) + /// - Compute the MAC over eifd with TDES and the Kmax key (mifd = mac(pad(eifd)) + /// - Construct the APDU data for the mutualAuthenticate command (cmd_data = eifd + mifd) + /// + /// @param rnd_icc: The challenge received from the ICC. + /// @type rnd_icc: A 8 bytes binary string + /// @return: The APDU binary data for the mutual authenticate command + func authentication( rnd_icc : [UInt8]) -> [UInt8] { + self.rnd_icc = rnd_icc + + Log.verbose("Request an 8 byte random number from the MRTD's chip") + Log.verbose("\tRND.ICC: " + binToHexRep(self.rnd_icc)) + + self.rnd_icc = rnd_icc + + let rnd_ifd = generateRandomUInt8Array(8) + let kifd = generateRandomUInt8Array(16) + + Log.verbose("Generate an 8 byte random and a 16 byte random") + Log.verbose("\tRND.IFD: \(binToHexRep(rnd_ifd))" ) + Log.verbose("\tRND.Kifd: \(binToHexRep(kifd))") + + let s = rnd_ifd + rnd_icc + kifd + + Log.verbose("Concatenate RND.IFD, RND.ICC and Kifd") + Log.verbose("\tS: \(binToHexRep(s))") + + let iv : [UInt8] = [0, 0, 0, 0, 0, 0, 0, 0] + let eifd = tripleDESEncrypt(key: ksenc,message: s, iv: iv) + + Log.verbose("Encrypt S with TDES key Kenc as calculated in Appendix 5.2") + Log.verbose("\tEifd: \(binToHexRep(eifd))") + + let mifd = mac(algoName: .DES, key: ksmac, msg: pad(eifd, blockSize:8)) + + Log.verbose("Compute MAC over eifd with TDES key Kmac as calculated in-Appendix 5.2") + Log.verbose("\tMifd: \(binToHexRep(mifd))") + // Construct APDU + + let cmd_data = eifd + mifd + Log.verbose("Construct command data for MUTUAL AUTHENTICATE") + Log.verbose("\tcmd_data: \(binToHexRep(cmd_data))") + + self.rnd_ifd = rnd_ifd + self.kifd = kifd + + return cmd_data + } + + /// Calculate the session keys (KSenc, KSmac) and the SSC from the data + /// received by the mutual authenticate command. + + /// @param data: the data received from the mutual authenticate command send to the chip. + /// @type data: a binary string + /// @return: A set of two 16 bytes keys (KSenc, KSmac) and the SSC + public func sessionKeys(data : [UInt8] ) throws -> ([UInt8], [UInt8], [UInt8]) { + Log.verbose("Decrypt and verify received data and compare received RND.IFD with generated RND.IFD \(binToHexRep(self.ksmac))" ) + + let response = tripleDESDecrypt(key: self.ksenc, message: [UInt8](data[0..<32]), iv: [0,0,0,0,0,0,0,0] ) + + let response_kicc = [UInt8](response[16..<32]) + let Kseed = xor(self.kifd, response_kicc) + Log.verbose("Calculate XOR of Kifd and Kicc") + Log.verbose("\tKseed: \(binToHexRep(Kseed))" ) + + let smskg = SecureMessagingSessionKeyGenerator() + let KSenc = try smskg.deriveKey(keySeed: Kseed, mode: .ENC_MODE) + let KSmac = try smskg.deriveKey(keySeed: Kseed, mode: .MAC_MODE) + +// let KSenc = self.keyDerivation(kseed: Kseed,c: KENC) +// let KSmac = self.keyDerivation(kseed: Kseed,c: KMAC) + + Log.verbose("Calculate Session Keys (KSenc and KSmac) using Appendix 5.1") + Log.verbose("\tKSenc: \(binToHexRep(KSenc))" ) + Log.verbose("\tKSmac: \(binToHexRep(KSmac))" ) + + + let ssc = [UInt8](self.rnd_icc.suffix(4) + self.rnd_ifd.suffix(4)) + Log.verbose("Calculate Send Sequence Counter") + Log.verbose("\tSSC: \(binToHexRep(ssc))" ) + return (KSenc, KSmac, ssc) + } + +} +#endif diff --git a/app/ios/NFCPassportReader/ChipAuthenticationHandler.swift b/app/ios/NFCPassportReader/ChipAuthenticationHandler.swift new file mode 100644 index 00000000..c374bf9b --- /dev/null +++ b/app/ios/NFCPassportReader/ChipAuthenticationHandler.swift @@ -0,0 +1,223 @@ +// +// ChipAuthenticationHandler.swift +// NFCPassportReader +// +// Created by Andy Qua on 25/02/2021. +// + +import Foundation +import OpenSSL + +#if !os(macOS) +import CoreNFC +import CryptoKit + +@available(iOS 15, *) +class ChipAuthenticationHandler { + + private static let NO_PACE_KEY_REFERENCE : UInt8 = 0x00 + private static let ENC_MODE : UInt8 = 0x1 + private static let MAC_MODE : UInt8 = 0x2 + private static let PACE_MODE : UInt8 = 0x3 + + private static let COMMAND_CHAINING_CHUNK_SIZE = 224 + + var tagReader : TagReader? + var gaSegments = [[UInt8]]() + + var chipAuthInfos = [Int:ChipAuthenticationInfo]() + var chipAuthPublicKeyInfos = [ChipAuthenticationPublicKeyInfo]() + + var isChipAuthenticationSupported : Bool = false + + public init(dg14 : DataGroup14, tagReader: TagReader) { + self.tagReader = tagReader + + for secInfo in dg14.securityInfos { + if let cai = secInfo as? ChipAuthenticationInfo { + let keyId = cai.getKeyId() + chipAuthInfos[keyId] = cai + } else if let capki = secInfo as? ChipAuthenticationPublicKeyInfo { + chipAuthPublicKeyInfos.append(capki) + } + } + + if chipAuthPublicKeyInfos.count > 0 { + isChipAuthenticationSupported = true + } + } + + public func doChipAuthentication() async throws { + + Log.info( "Performing Chip Authentication - number of public keys found - \(chipAuthPublicKeyInfos.count)" ) + guard isChipAuthenticationSupported else { + throw NFCPassportReaderError.NotYetSupported( "ChipAuthentication not supported" ) + } + + var success = false + for pubKey in chipAuthPublicKeyInfos { + do { + success = try await self.doChipAuthentication( with: pubKey) + if success { + break + } + } catch { + // try next key + } + } + + if !success { + throw NFCPassportReaderError.ChipAuthenticationFailed + } + } + + private func doChipAuthentication( with chipAuthPublicKeyInfo : ChipAuthenticationPublicKeyInfo ) async throws -> Bool { + + // So it turns out that some passports don't have ChipAuthInfo items. + // So if we do have a ChipAuthInfo the we take the keyId (if present) and OID from there, + // BUT if we don't then we will try to infer the OID from the public key + let keyId = chipAuthPublicKeyInfo.keyId + let chipAuthInfoOID : String + if let chipAuthInfo = chipAuthInfos[keyId ?? 0] { + chipAuthInfoOID = chipAuthInfo.oid + } else { + if let oid = inferOID( fromPublicKeyOID:chipAuthPublicKeyInfo.oid) { + chipAuthInfoOID = oid + } else { + return false + } + } + + try await self.doCA( keyId: keyId, encryptionDetailsOID: chipAuthInfoOID, publicKey: chipAuthPublicKeyInfo.pubKey ) + return true + } + + /// Infer OID from public key type - Best guess seems to be to use 3DES_CBC_CBC for both ECDH and DH keys + /// Apparently works for French passports + private func inferOID(fromPublicKeyOID: String ) -> String? { + if fromPublicKeyOID == SecurityInfo.ID_PK_ECDH_OID { + Log.warning("No ChipAuthenticationInfo - guessing its id-CA-ECDH-3DES-CBC-CBC"); + return SecurityInfo.ID_CA_ECDH_3DES_CBC_CBC_OID + } else if fromPublicKeyOID == SecurityInfo.ID_PK_DH_OID { + Log.warning("No ChipAuthenticationInfo - guessing its id-CA-DH-3DES-CBC-CBC"); + return SecurityInfo.ID_CA_DH_3DES_CBC_CBC_OID + } + + Log.warning("No ChipAuthenticationInfo and unsupported ChipAuthenticationPublicKeyInfo public key OID \(fromPublicKeyOID)") + return nil; + } + + private func doCA( keyId: Int?, encryptionDetailsOID oid: String, publicKey: OpaquePointer) async throws { + + // Generate Ephemeral Keypair from parameters from DG14 Public key + // This should work for both EC and DH keys + var ephemeralKeyPair : OpaquePointer? = nil + let pctx = EVP_PKEY_CTX_new(publicKey, nil) + EVP_PKEY_keygen_init(pctx) + EVP_PKEY_keygen(pctx, &ephemeralKeyPair) + EVP_PKEY_CTX_free(pctx) + + // Send the public key to the passport + try await sendPublicKey(oid: oid, keyId: keyId, pcdPublicKey: ephemeralKeyPair!) + + Log.debug( "Public Key successfully sent to passport!" ) + + // Use our ephemeral private key and the passports public key to generate a shared secret + // (the passport with do the same thing with their private key and our public key) + let sharedSecret = OpenSSLUtils.computeSharedSecret(privateKeyPair:ephemeralKeyPair!, publicKey:publicKey) + + // Now try to restart Secure Messaging using the new shared secret and + try restartSecureMessaging( oid : oid, sharedSecret : sharedSecret, maxTranceiveLength : 1, shouldCheckMAC : true) + } + + private func sendPublicKey(oid : String, keyId : Int?, pcdPublicKey : OpaquePointer) async throws { + let cipherAlg = try ChipAuthenticationInfo.toCipherAlgorithm(oid: oid) + guard let keyData = OpenSSLUtils.getPublicKeyData(from: pcdPublicKey) else { + throw NFCPassportReaderError.InvalidDataPassed("Unable to get public key data from public key" ) + } + + if cipherAlg.hasPrefix("DESede") { + + var idData : [UInt8] = [] + if let keyId = keyId { + idData = intToBytes( val:keyId, removePadding:true) + idData = wrapDO( b:0x84, arr:idData) + } + let wrappedKeyData = wrapDO( b:0x91, arr:keyData) + _ = try await self.tagReader?.sendMSEKAT(keyData: Data(wrappedKeyData), idData: Data(idData)) + } else if cipherAlg.hasPrefix("AES") { + _ = try await self.tagReader?.sendMSESetATIntAuth(oid: oid, keyId: keyId) + let data = wrapDO(b: 0x80, arr:keyData) + gaSegments = self.chunk(data: data, segmentSize: ChipAuthenticationHandler.COMMAND_CHAINING_CHUNK_SIZE ) + try await self.handleGeneralAuthentication() + } else { + throw NFCPassportReaderError.InvalidDataPassed("Cipher Algorithm \(cipherAlg) not supported") + } + } + + private func handleGeneralAuthentication() async throws { + repeat { + // Pull next segment from list + let segment = gaSegments.removeFirst() + let isLast = gaSegments.isEmpty + + // send it + _ = try await self.tagReader?.sendGeneralAuthenticate(data: segment, isLast: isLast) + } while ( !gaSegments.isEmpty ) + } + + private func restartSecureMessaging( oid : String, sharedSecret : [UInt8], maxTranceiveLength : Int, shouldCheckMAC : Bool) throws { + let cipherAlg = try ChipAuthenticationInfo.toCipherAlgorithm(oid: oid) + let keyLength = try ChipAuthenticationInfo.toKeyLength(oid: oid) + + // Start secure messaging. + let smskg = SecureMessagingSessionKeyGenerator() + let ksEnc = try smskg.deriveKey(keySeed: sharedSecret, cipherAlgName: cipherAlg, keyLength: keyLength, mode: .ENC_MODE) + let ksMac = try smskg.deriveKey(keySeed: sharedSecret, cipherAlgName: cipherAlg, keyLength: keyLength, mode: .MAC_MODE) + + let ssc = withUnsafeBytes(of: 0.bigEndian, Array.init) + if (cipherAlg.hasPrefix("DESede")) { + Log.info( "Restarting secure messaging using DESede encryption") + let sm = SecureMessaging(encryptionAlgorithm: .DES, ksenc: ksEnc, ksmac: ksMac, ssc: ssc) + tagReader?.secureMessaging = sm + } else if (cipherAlg.hasPrefix("AES")) { + Log.info( "Restarting secure messaging using AES encryption") + let sm = SecureMessaging(encryptionAlgorithm: .AES, ksenc: ksEnc, ksmac: ksMac, ssc: ssc) + tagReader?.secureMessaging = sm + } else { + Log.error( "Not restarting secure messaging as unsupported cipher algorithm requested - \(cipherAlg)") + throw NFCPassportReaderError.InvalidDataPassed("Unsupported cipher algorithm \(cipherAlg)" ) + } + } + + + func inferDigestAlgorithmFromCipherAlgorithmForKeyDerivation( cipherAlg : String, keyLength : Int) throws -> String { + if cipherAlg == "DESede" || cipherAlg == "AES-128" { + return "SHA1" + } + if cipherAlg == "AES" && keyLength == 128 { + return "SHA1" + } + if cipherAlg == "AES-256" || cipherAlg == "AES-192" { + return "SHA256" + } + if cipherAlg == "AES" && (keyLength == 192 || keyLength == 256) { + return "SHA256" + } + + throw NFCPassportReaderError.InvalidDataPassed("Unsupported cipher algorithm or key length") + } + + /// Chunks up a byte array into a number of segments of the given size, + /// and a final segment if there is a remainder. + /// - Parameter segmentSize the number of bytes per segment + /// - Parameter data the data to be partitioned + /// - Parameter a list with the segments + func chunk( data : [UInt8], segmentSize: Int ) -> [[UInt8]] { + return stride(from: 0, to: data.count, by: segmentSize).map { + Array(data[$0 ..< Swift.min($0 + segmentSize, data.count)]) + } + } +} + +#endif diff --git a/app/ios/NFCPassportReader/DataGroupHash.swift b/app/ios/NFCPassportReader/DataGroupHash.swift new file mode 100644 index 00000000..578fd9f2 --- /dev/null +++ b/app/ios/NFCPassportReader/DataGroupHash.swift @@ -0,0 +1,16 @@ +// +// DataGroupHash.swift +// NFCPassportReader +// +// Created by Andy Qua on 09/02/2021. +// Copyright Β© 2021 Andy Qua. All rights reserved. +// + +@available(iOS 13, macOS 10.15, *) +public struct DataGroupHash { + public var id: String + public var sodHash: String + public var computedHash : String + public var match : Bool +} + diff --git a/app/ios/NFCPassportReader/DataGroupParser.swift b/app/ios/NFCPassportReader/DataGroupParser.swift new file mode 100644 index 00000000..42b462bc --- /dev/null +++ b/app/ios/NFCPassportReader/DataGroupParser.swift @@ -0,0 +1,36 @@ +// +// DataGroupParser.swift +// +// Created by Andy Qua on 14/06/2019. +// + +import OpenSSL + +@available(iOS 13, macOS 10.15, *) +class DataGroupParser { + + static let dataGroupNames = ["Common", "DG1", "DG2", "DG3", "DG4", "DG5", "DG6", "DG7", "DG8", "DG9", "DG10", "DG11", "DG12", "DG13", "DG14", "DG15", "DG16", "SecurityData"] + static let tags : [UInt8] = [0x60, 0x61, 0x75, 0x63, 0x76, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x77] + static let classes : [DataGroup.Type] = [COM.self, DataGroup1.self, DataGroup2.self, + NotImplementedDG.self, NotImplementedDG.self, NotImplementedDG.self, + NotImplementedDG.self, DataGroup7.self, NotImplementedDG.self, + NotImplementedDG.self, NotImplementedDG.self, DataGroup11.self, + DataGroup12.self, NotImplementedDG.self, DataGroup14.self, + DataGroup15.self, NotImplementedDG.self, SOD.self] + + + func parseDG( data : [UInt8] ) throws -> DataGroup { + + let header = data[0..<4] + + let dg = try tagToDG(header[0]) + + return try dg.init(data) + } + + + func tagToDG( _ tag : UInt8 ) throws -> DataGroup.Type { + guard let index = DataGroupParser.tags.firstIndex(of: tag) else { throw NFCPassportReaderError.UnknownTag} + return DataGroupParser.classes[index] + } +} diff --git a/app/ios/NFCPassportReader/Errors.swift b/app/ios/NFCPassportReader/Errors.swift new file mode 100644 index 00000000..14077db2 --- /dev/null +++ b/app/ios/NFCPassportReader/Errors.swift @@ -0,0 +1,145 @@ +// +// Errors.swift +// NFCPassportReader +// +// Created by Andy Qua on 09/02/2021. +// Copyright Β© 2021 Andy Qua. All rights reserved. +// + +import Foundation + +// MARK: TagError +@available(iOS 13, macOS 10.15, *) +public enum NFCPassportReaderError: Error { + case ResponseError(String, UInt8, UInt8) + case InvalidResponse + case UnexpectedError + case NFCNotSupported + case NoConnectedTag + case D087Malformed + case InvalidResponseChecksum + case MissingMandatoryFields + case CannotDecodeASN1Length + case InvalidASN1Value + case UnableToProtectAPDU + case UnableToUnprotectAPDU + case UnsupportedDataGroup + case DataGroupNotRead + case UnknownTag + case UnknownImageFormat + case NotImplemented + case TagNotValid + case ConnectionError + case UserCanceled + case InvalidMRZKey + case MoreThanOneTagFound + case InvalidHashAlgorithmSpecified + case UnsupportedCipherAlgorithm + case UnsupportedMappingType + case PACEError(String,String) + case ChipAuthenticationFailed + case InvalidDataPassed(String) + case NotYetSupported(String) + + var value: String { + switch self { + case .ResponseError(let errMsg, _, _): return errMsg + case .InvalidResponse: return "InvalidResponse" + case .UnexpectedError: return "UnexpectedError" + case .NFCNotSupported: return "NFCNotSupported" + case .NoConnectedTag: return "NoConnectedTag" + case .D087Malformed: return "D087Malformed" + case .InvalidResponseChecksum: return "InvalidResponseChecksum" + case .MissingMandatoryFields: return "MissingMandatoryFields" + case .CannotDecodeASN1Length: return "CannotDecodeASN1Length" + case .InvalidASN1Value: return "InvalidASN1Value" + case .UnableToProtectAPDU: return "UnableToProtectAPDU" + case .UnableToUnprotectAPDU: return "UnableToUnprotectAPDU" + case .UnsupportedDataGroup: return "UnsupportedDataGroup" + case .DataGroupNotRead: return "DataGroupNotRead" + case .UnknownTag: return "UnknownTag" + case .UnknownImageFormat: return "UnknownImageFormat" + case .NotImplemented: return "NotImplemented" + case .TagNotValid: return "TagNotValid" + case .ConnectionError: return "ConnectionError" + case .UserCanceled: return "UserCanceled" + case .InvalidMRZKey: return "InvalidMRZKey" + case .MoreThanOneTagFound: return "MoreThanOneTagFound" + case .InvalidHashAlgorithmSpecified: return "InvalidHashAlgorithmSpecified" + case .UnsupportedCipherAlgorithm: return "UnsupportedCipherAlgorithm" + case .UnsupportedMappingType: return "UnsupportedMappingType" + case .PACEError(let step, let reason): return "PACEError (\(step)) - \(reason)" + case .ChipAuthenticationFailed: return "ChipAuthenticationFailed" + case .InvalidDataPassed(let reason) : return "Invalid data passed - \(reason)" + case .NotYetSupported(let reason) : return "Not yet supported - \(reason)" + } + } +} + +@available(iOS 13, macOS 10.15, *) +extension NFCPassportReaderError: LocalizedError { + public var errorDescription: String? { + return NSLocalizedString(value, comment: "My error") + } +} + + +// MARK: OpenSSLError +@available(iOS 13, macOS 10.15, *) +public enum OpenSSLError: Error { + case UnableToGetX509CertificateFromPKCS7(String) + case UnableToVerifyX509CertificateForSOD(String) + case VerifyAndReturnSODEncapsulatedData(String) + case UnableToReadECPublicKey(String) + case UnableToExtractSignedDataFromPKCS7(String) + case VerifySignedAttributes(String) + case UnableToParseASN1(String) + case UnableToDecryptRSASignature(String) +} + +@available(iOS 13, macOS 10.15, *) +extension OpenSSLError: LocalizedError { + public var errorDescription: String? { + switch self { + case .UnableToGetX509CertificateFromPKCS7(let reason): + return NSLocalizedString("Unable to read the SOD PKCS7 Certificate. \(reason)", comment: "UnableToGetPKCS7CertificateForSOD") + case .UnableToVerifyX509CertificateForSOD(let reason): + return NSLocalizedString("Unable to verify the SOD X509 certificate. \(reason)", comment: "UnableToVerifyX509CertificateForSOD") + case .VerifyAndReturnSODEncapsulatedData(let reason): + return NSLocalizedString("Unable to verify the SOD Datagroup hashes. \(reason)", comment: "UnableToGetSignedDataFromPKCS7") + case .UnableToReadECPublicKey(let reason): + return NSLocalizedString("Unable to read ECDSA Public key \(reason)!", comment: "UnableToReadECPublicKey") + case .UnableToExtractSignedDataFromPKCS7(let reason): + return NSLocalizedString("Unable to extract Signer data from PKCS7 \(reason)!", comment: "UnableToExtractSignedDataFromPKCS7") + case .VerifySignedAttributes(let reason): + return NSLocalizedString("Unable to Verify the SOD SignedAttributes \(reason)!", comment: "UnableToExtractSignedDataFromPKCS7") + case .UnableToParseASN1(let reason): + return NSLocalizedString("Unable to parse ASN1 \(reason)!", comment: "UnableToParseASN1") + case .UnableToDecryptRSASignature(let reason): + return NSLocalizedString("DatUnable to decrypt RSA Signature \(reason)!", comment: "UnableToDecryptRSSignature") + } + } +} + + +// MARK: PassiveAuthenticationError +public enum PassiveAuthenticationError: Error { + case UnableToParseSODHashes(String) + case InvalidDataGroupHash(String) + case SODMissing(String) +} + + +extension PassiveAuthenticationError: LocalizedError { + public var errorDescription: String? { + switch self { + case .UnableToParseSODHashes(let reason): + return NSLocalizedString("Unable to parse the SOD Datagroup hashes. \(reason)", comment: "UnableToParseSODHashes") + case .InvalidDataGroupHash(let reason): + return NSLocalizedString("DataGroup hash not present or didn't match \(reason)!", comment: "InvalidDataGroupHash") + case .SODMissing(let reason): + return NSLocalizedString("DataGroup SOD not present or not read \(reason)!", comment: "SODMissing") + + } + } +} diff --git a/app/ios/NFCPassportReader/LaunchScreen.storyboard b/app/ios/NFCPassportReader/LaunchScreen.storyboard new file mode 100644 index 00000000..1ba1a646 --- /dev/null +++ b/app/ios/NFCPassportReader/LaunchScreen.storyboard @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/ios/NFCPassportReader/Logging.swift b/app/ios/NFCPassportReader/Logging.swift new file mode 100644 index 00000000..2201b540 --- /dev/null +++ b/app/ios/NFCPassportReader/Logging.swift @@ -0,0 +1,68 @@ +// +// Logging.swift +// NFCTest +// +// Created by Andy Qua on 11/06/2019. +// Copyright Β© 2019 Andy Qua. All rights reserved. +// + +import Foundation + +// TODO: Quick log functions - will move this to something better +public enum LogLevel : Int, CaseIterable { + case verbose = 0 + case debug = 1 + case info = 2 + case warning = 3 + case error = 4 + case none = 5 +} + +public class Log { + public static var logLevel : LogLevel = .info + public static var storeLogs = false + public static var logData = [String]() + + private static let df = DateFormatter() + private static var dfInit = false + + public class func verbose( _ msg : @autoclosure () -> String ) { + log( .verbose, msg ) + } + public class func debug( _ msg : @autoclosure () -> String ) { + log( .debug, msg ) + } + public class func info( _ msg : @autoclosure () -> String ) { + log( .info, msg ) + } + public class func warning( _ msg : @autoclosure () -> String ) { + log( .warning, msg ) + } + public class func error( _ msg : @autoclosure () -> String ) { + log( .error, msg ) + } + + public class func clearStoredLogs() { + logData.removeAll() + } + + class func log( _ logLevel : LogLevel, _ msg : () -> String ) { + guard logLevel != .none else { return } + + if !dfInit { + df.dateFormat = "y-MM-dd H:m:ss.SSSS" + dfInit = true + } + + if self.logLevel.rawValue <= logLevel.rawValue { + let message = msg() + + + print( "\(df.string(from:Date())) - \(message)" ) + + if storeLogs { + logData.append( message ) + } + } + } +} diff --git a/app/ios/NFCPassportReader/NFCPassportModel.swift b/app/ios/NFCPassportReader/NFCPassportModel.swift new file mode 100644 index 00000000..a2714b13 --- /dev/null +++ b/app/ios/NFCPassportReader/NFCPassportModel.swift @@ -0,0 +1,534 @@ +// +// NFCPassportModel.swift +// NFCPassportReader +// +// Created by Andy Qua on 29/10/2019. +// + + +import Foundation + +#if os(iOS) +import UIKit +#endif + + +public enum PassportAuthenticationStatus { + case notDone + case success + case failed +} + +@available(iOS 13, macOS 10.15, *) +public class NFCPassportModel { + + public private(set) lazy var documentType : String = { return String( passportDataElements?["5F03"]?.first ?? "?" ) }() + public private(set) lazy var documentSubType : String = { return String( passportDataElements?["5F03"]?.last ?? "?" ) }() + public private(set) lazy var documentNumber : String = { return (passportDataElements?["5A"] ?? "?").replacingOccurrences(of: "<", with: "" ) }() + public private(set) lazy var issuingAuthority : String = { return passportDataElements?["5F28"] ?? "?" }() + public private(set) lazy var documentExpiryDate : String = { return passportDataElements?["59"] ?? "?" }() + public private(set) lazy var dateOfBirth : String = { return passportDataElements?["5F57"] ?? "?" }() + public private(set) lazy var gender : String = { return passportDataElements?["5F35"] ?? "?" }() + public private(set) lazy var nationality : String = { return passportDataElements?["5F2C"] ?? "?" }() + + public private(set) lazy var lastName : String = { + return names[0].replacingOccurrences(of: "<", with: " " ) + }() + + public private(set) lazy var firstName : String = { + var name = "" + for i in 1 ..< names.count { + let fn = names[i].replacingOccurrences(of: "<", with: " " ).trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + name += fn + " " + } + return name.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + }() + + public private(set) lazy var passportMRZ : String = { return passportDataElements?["5F1F"] ?? "NOT FOUND" }() + + // Extract fields from DG11 if present + private lazy var names : [String] = { + guard let dg11 = dataGroupsRead[.DG11] as? DataGroup11, + let fullName = dg11.fullName?.components(separatedBy: "<<") else { return (passportDataElements?["5B"] ?? "?").components(separatedBy: "<<") } + return fullName + }() + + public private(set) lazy var placeOfBirth : String? = { + guard let dg11 = dataGroupsRead[.DG11] as? DataGroup11, + let placeOfBirth = dg11.placeOfBirth else { return nil } + return placeOfBirth + }() + + /// residence address + public private(set) lazy var residenceAddress : String? = { + guard let dg11 = dataGroupsRead[.DG11] as? DataGroup11, + let address = dg11.address else { return nil } + return address + }() + + /// phone number + public private(set) lazy var phoneNumber : String? = { + guard let dg11 = dataGroupsRead[.DG11] as? DataGroup11, + let telephone = dg11.telephone else { return nil } + return telephone + }() + + /// personal number + public private(set) lazy var personalNumber : String? = { + if let dg11 = dataGroupsRead[.DG11] as? DataGroup11, + let personalNumber = dg11.personalNumber { return personalNumber } + + return (passportDataElements?["53"] ?? "?").replacingOccurrences(of: "<", with: "" ) + }() + + public private(set) lazy var documentSigningCertificate : X509Wrapper? = { + return certificateSigningGroups[.documentSigningCertificate] + }() + + public private(set) lazy var countrySigningCertificate : X509Wrapper? = { + return certificateSigningGroups[.issuerSigningCertificate] + }() + + // Extract data from COM + public private(set) lazy var LDSVersion : String = { + guard let com = dataGroupsRead[.COM] as? COM else { return "Unknown" } + return com.version + }() + + + public private(set) lazy var dataGroupsPresent : [String] = { + guard let com = dataGroupsRead[.COM] as? COM else { return [] } + return com.dataGroupsPresent + }() + + // Parsed datagroup hashes + public private(set) var dataGroupsAvailable = [DataGroupId]() + public private(set) var dataGroupsRead : [DataGroupId:DataGroup] = [:] + public private(set) var dataGroupHashes = [DataGroupId: DataGroupHash]() + + public internal(set) var cardAccess : CardAccess? + public internal(set) var BACStatus : PassportAuthenticationStatus = .notDone + public internal(set) var PACEStatus : PassportAuthenticationStatus = .notDone + public internal(set) var chipAuthenticationStatus : PassportAuthenticationStatus = .notDone + + public private(set) var passportCorrectlySigned : Bool = false + public private(set) var documentSigningCertificateVerified : Bool = false + public private(set) var passportDataNotTampered : Bool = false + public private(set) var activeAuthenticationPassed : Bool = false + public private(set) var activeAuthenticationChallenge : [UInt8] = [] + public private(set) var activeAuthenticationSignature : [UInt8] = [] + public private(set) var verificationErrors : [Error] = [] + + public var isPACESupported : Bool { + get { + if cardAccess?.paceInfo != nil { + return true + } else { + // We may not have stored the cardAccess so check the DG14 + if let dg14 = dataGroupsRead[.DG14] as? DataGroup14, + (dg14.securityInfos.filter { ($0 as? PACEInfo) != nil }).count > 0 { + return true + } + return false + } + } + } + + public var isChipAuthenticationSupported : Bool { + get { + if let dg14 = dataGroupsRead[.DG14] as? DataGroup14, + (dg14.securityInfos.filter { ($0 as? ChipAuthenticationPublicKeyInfo) != nil }).count > 0 { + + return true + } else { + return false + } + } + } + +#if os(iOS) + public var passportImage : UIImage? { + guard let dg2 = dataGroupsRead[.DG2] as? DataGroup2 else { return nil } + + return dg2.getImage() + } + + public var signatureImage : UIImage? { + guard let dg7 = dataGroupsRead[.DG7] as? DataGroup7 else { return nil } + + return dg7.getImage() + } +#endif + + public var activeAuthenticationSupported : Bool { + guard let dg15 = dataGroupsRead[.DG15] as? DataGroup15 else { return false } + if dg15.ecdsaPublicKey != nil || dg15.rsaPublicKey != nil { + return true + } + return false + } + + private var certificateSigningGroups : [CertificateType:X509Wrapper] = [:] + + private var passportDataElements : [String:String]? { + guard let dg1 = dataGroupsRead[.DG1] as? DataGroup1 else { return nil } + + return dg1.elements + } + + + public init() { + + } + + public init( from dump: [String:String] ) { + var AAChallenge : [UInt8]? + var AASignature : [UInt8]? + for (key,value) in dump { + if let data = Data(base64Encoded: value) { + let bin = [UInt8](data) + if key == "AASignature" { + AASignature = bin + } else if key == "AAChallenge" { + AAChallenge = bin + } else { + do { + let dg = try DataGroupParser().parseDG(data: bin) + let dgId = DataGroupId.getIDFromName(name:key) + self.addDataGroup( dgId, dataGroup:dg ) + } catch { + Log.error("Failed to import Datagroup - \(key) from dump - \(error)" ) + } + } + } + } + + // See if we have Active Auth info in the dump + if let challenge = AAChallenge, let signature = AASignature { + verifyActiveAuthentication(challenge: challenge, signature: signature) + } + } + + public func addDataGroup(_ id : DataGroupId, dataGroup: DataGroup ) { + self.dataGroupsRead[id] = dataGroup + if id != .COM && id != .SOD { + self.dataGroupsAvailable.append( id ) + } + } + + public func getDataGroup( _ id : DataGroupId ) -> DataGroup? { + return dataGroupsRead[id] + } + + /// Dumps the passport data + /// - Parameters: + /// selectedDataGroups - the Data Groups to be exported (if they are present in the passport) + /// includeActiveAutheticationData - Whether to include the Active Authentication challenge and response (if supported and retrieved) + /// - Returns: dictionary of DataGroup ids and Base64 encoded data + public func dumpPassportData( selectedDataGroups : [DataGroupId], includeActiveAuthenticationData : Bool = false) -> [String:String] { + var ret = [String:String]() + for dg in selectedDataGroups { + if let dataGroup = self.dataGroupsRead[dg] { + let val = Data(dataGroup.data) + let base64 = val.base64EncodedString() + ret[dg.getName()] = base64 + } + } + if includeActiveAuthenticationData && self.activeAuthenticationSupported { + ret["AAChallenge"] = Data(activeAuthenticationChallenge).base64EncodedString() + ret["AASignature"] = Data(activeAuthenticationSignature).base64EncodedString() + } + return ret + } + + public func getHashesForDatagroups( hashAlgorythm: String ) -> [DataGroupId:[UInt8]] { + var ret = [DataGroupId:[UInt8]]() + + for (key, value) in dataGroupsRead { + if hashAlgorythm == "SHA1" { + ret[key] = calcSHA1Hash(value.body) + } else if hashAlgorythm == "SHA224" { + ret[key] = calcSHA224Hash(value.body) + } else if hashAlgorythm == "SHA256" { + ret[key] = calcSHA256Hash(value.body) + } else if hashAlgorythm == "SHA384" { + ret[key] = calcSHA384Hash(value.body) + } else if hashAlgorythm == "SHA512" { + ret[key] = calcSHA512Hash(value.body) + } + } + + return ret + } + + + /// This method performs the passive authentication + /// Passive Authentication : Two Parts: + /// Part 1 - Has the SOD (Security Object Document) been signed by a valid country signing certificate authority (CSCA)? + /// Part 2 - has it been tampered with (e.g. hashes of Datagroups match those in the SOD? + /// guard let sod = model.getDataGroup(.SOD) else { return } + /// + /// - Parameter masterListURL: the path to the masterlist to try to verify the document signing certiifcate in the SOD + /// - Parameter useCMSVerification: Should we use OpenSSL CMS verification to verify the SOD content + /// is correctly signed by the document signing certificate OR should we do this manully based on RFC5652 + /// CMS fails under certain circumstances (e.g. hashes are SHA512 whereas content is signed with SHA256RSA). + /// Currently defaulting to manual verification - hoping this will replace the CMS verification totally + /// CMS Verification currently there just in case + public func verifyPassport( masterListURL: URL?, useCMSVerification : Bool = false ) { + if let masterListURL = masterListURL { + do { + try validateAndExtractSigningCertificates( masterListURL: masterListURL ) + } catch let error { + verificationErrors.append( error ) + } + } + + do { + try ensureReadDataNotBeenTamperedWith( useCMSVerification : useCMSVerification ) + } catch let error { + verificationErrors.append( error ) + } + } + + public func verifyActiveAuthentication( challenge: [UInt8], signature: [UInt8] ) { + self.activeAuthenticationChallenge = challenge + self.activeAuthenticationSignature = signature + + Log.verbose( "Active Authentication") + Log.verbose( " challange - \(binToHexRep(challenge))") + Log.verbose( " signature - \(binToHexRep(signature))") + + // Get AA Public key + self.activeAuthenticationPassed = false + guard let dg15 = self.dataGroupsRead[.DG15] as? DataGroup15 else { return } + if let rsaKey = dg15.rsaPublicKey { + do { + var decryptedSig = try OpenSSLUtils.decryptRSASignature(signature: Data(signature), pubKey: rsaKey) + + // Decrypted signature compromises of header (6A), Message, Digest hash, Trailer + // Trailer can be 1 byte (BC - SHA-1 hash) or 2 bytes (xxCC) - where xx identifies the hash algorithm used + + // if the last byte of the digest is 0xBC, then this uses dedicated hash function 3 (SHA-1), + // If the last byte is 0xCC, then the preceding byte tells you which hash function + // should be used (currently not yet implemented!) + // See ISO/IEC9796-2 for details on the verification and ISO/IEC 10118-3 for the dedicated hash functions! + var hashTypeByte = decryptedSig.popLast() ?? 0x00 + if hashTypeByte == 0xCC { + hashTypeByte = decryptedSig.popLast() ?? 0x00 + } + var hashType : String = "" + var hashLength = 0 + + switch hashTypeByte { + case 0xBC, 0x33: + hashType = "SHA1" + hashLength = 20 // 160 bits for SHA-1 -> 20 bytes + case 0x34: + hashType = "SHA256" + hashLength = 32 // 256 bits for SHA-256 -> 32 bytes + case 0x35: + hashType = "SHA512" + hashLength = 64 // 512 bits for SHA-512 -> 64 bytes + case 0x36: + hashType = "SHA384" + hashLength = 48 // 384 bits for SHA-384 -> 48 bytes + case 0x38: + hashType = "SHA224" + hashLength = 28 // 224 bits for SHA-224 -> 28 bytes + default: + Log.error( "Error identifying Active Authentication RSA message digest hash algorithm" ) + return + } + + let message = [UInt8](decryptedSig[1 ..< (decryptedSig.count-hashLength)]) + let digest = [UInt8](decryptedSig[(decryptedSig.count-hashLength)...]) + + // Concatenate the challenge to the end of the message + let fullMsg = message + challenge + + // Then generate the hash + let msgHash : [UInt8] = try calcHash(data: fullMsg, hashAlgorithm: hashType) + + // Check hashes match + if msgHash == digest { + self.activeAuthenticationPassed = true + Log.debug( "Active Authentication (RSA) successful" ) + } else { + Log.error( "Error verifying Active Authentication RSA signature - Hash doesn't match" ) + } + } catch { + Log.error( "Error verifying Active Authentication RSA signature - \(error)" ) + } + } else if let ecdsaPublicKey = dg15.ecdsaPublicKey { + var digestType = "" + if let dg14 = dataGroupsRead[.DG14] as? DataGroup14, + let aa = dg14.securityInfos.compactMap({ $0 as? ActiveAuthenticationInfo }).first { + digestType = aa.getSignatureAlgorithmOIDString() ?? "" + } + + if OpenSSLUtils.verifyECDSASignature( publicKey:ecdsaPublicKey, signature: signature, data: challenge, digestType: digestType ) { + self.activeAuthenticationPassed = true + Log.debug( "Active Authentication (ECDSA) successful" ) + } else { + Log.error( "Error verifying Active Authentication ECDSA signature" ) + } + } + } + + // Check if signing certificate is on the revocation list + // We do this by trying to build a trust chain of the passport certificate against the ones in the revocation list + // and if we are successful then its been revoked. + // NOTE - NOT USED YET AS NOT ABLE TO TEST + func hasCertBeenRevoked( revocationListURL : URL ) -> Bool { + var revoked = false + do { + try validateAndExtractSigningCertificates( masterListURL: revocationListURL ) + + // Certificate chain found - which means certificate is on revocation list + revoked = true + } catch { + // No chain found - certificate not revoked + } + + return revoked + } + + private func validateAndExtractSigningCertificates( masterListURL: URL ) throws { + self.passportCorrectlySigned = false + + guard let sod = getDataGroup(.SOD) else { + throw PassiveAuthenticationError.SODMissing("No SOD found" ) + } + + let data = Data(sod.body) + let cert = try OpenSSLUtils.getX509CertificatesFromPKCS7( pkcs7Der: data ).first! + self.certificateSigningGroups[.documentSigningCertificate] = cert + + let rc = OpenSSLUtils.verifyTrustAndGetIssuerCertificate( x509:cert, CAFile: masterListURL ) + switch rc { + case .success(let csca): + self.certificateSigningGroups[.issuerSigningCertificate] = csca + case .failure(let error): + throw error + } + + Log.debug( "Passport passed SOD Verification" ) + self.passportCorrectlySigned = true + + } + + private func ensureReadDataNotBeenTamperedWith( useCMSVerification: Bool ) throws { + guard let sod = getDataGroup(.SOD) as? SOD else { + throw PassiveAuthenticationError.SODMissing("No SOD found" ) + } + + // Get SOD Content and verify that its correctly signed by the Document Signing Certificate + var signedData : Data + documentSigningCertificateVerified = false + do { + if useCMSVerification { + signedData = try OpenSSLUtils.verifyAndReturnSODEncapsulatedDataUsingCMS(sod: sod) + } else { + signedData = try OpenSSLUtils.verifyAndReturnSODEncapsulatedData(sod: sod) + } + documentSigningCertificateVerified = true + } catch { + signedData = try sod.getEncapsulatedContent() + } + + // Now Verify passport data by comparing compare Hashes in SOD against + // computed hashes to ensure data not been tampered with + passportDataNotTampered = false + let asn1Data = try OpenSSLUtils.ASN1Parse( data: signedData ) + let (sodHashAlgorythm, sodHashes) = try parseSODSignatureContent( asn1Data ) + + var errors : String = "" + // pour chaque dataGroupsRead, il faut que le hash sodHashVal parsΓ© du eContent (signedData) soit Γ©gal + // au computedHashVal qui sort du dataGroupsRead + for (id,dgVal) in dataGroupsRead { + guard let sodHashVal = sodHashes[id] else { + // SOD and COM don't have hashes so these aren't errors + if id != .SOD && id != .COM { + errors += "DataGroup \(id) is missing!\n" + } + continue + } + + let computedHashVal = binToHexRep(dgVal.hash(sodHashAlgorythm)) + + var match = true + if computedHashVal != sodHashVal { + errors += "\(id) invalid hash:\n SOD hash:\(sodHashVal)\n Computed hash:\(computedHashVal)\n" + match = false + } + + dataGroupHashes[id] = DataGroupHash(id: id.getName(), sodHash:sodHashVal, computedHash:computedHashVal, match:match) + } + + if errors != "" { + Log.error( "HASH ERRORS - \(errors)" ) + throw PassiveAuthenticationError.InvalidDataGroupHash(errors) + } + + Log.debug( "Passport passed Datagroup Tampering check" ) + passportDataNotTampered = true + } + + + /// Parses an text ASN1 structure, and extracts the Hash Algorythm and Hashes contained from the Octect strings + /// - Parameter content: the text ASN1 stucure format + /// - Returns: The Hash Algorythm used - either SHA1 or SHA256, and a dictionary of hashes for the datagroups (currently only DG1 and DG2 are handled) + private func parseSODSignatureContent( _ content : String ) throws -> (String, [DataGroupId : String]){ + var currentDG = "" + var sodHashAlgo = "" + var sodHashes : [DataGroupId : String] = [:] + + let lines = content.components(separatedBy: "\n") + + let dgList : [DataGroupId] = [.COM,.DG1,.DG2,.DG3,.DG4,.DG5,.DG6,.DG7,.DG8,.DG9,.DG10,.DG11,.DG12,.DG13,.DG14,.DG15,.DG16,.SOD] + + for line in lines { + if line.contains( "d=2" ) && line.contains( "OBJECT" ) { + if line.contains( "sha1" ) { + sodHashAlgo = "SHA1" + } else if line.contains( "sha224" ) { + sodHashAlgo = "SHA224" + } else if line.contains( "sha256" ) { + sodHashAlgo = "SHA256" + } else if line.contains( "sha384" ) { + sodHashAlgo = "SHA384" + } else if line.contains( "sha512" ) { + sodHashAlgo = "SHA512" + } + } else if line.contains("d=3" ) && line.contains( "INTEGER" ) { + if let range = line.range(of: "INTEGER") { + let substr = line[range.upperBound.. +#import "React/RCTBridgeModule.h" + +@interface RCT_EXTERN_MODULE(PassportReader, NSObject) + +RCT_EXTERN_METHOD(scanPassport:(NSString *)passportNumber + dateOfBirth:(NSString *)dateOfBirth + dateOfExpiry:(NSString *)dateOfExpiry + resolve:(RCTPromiseResolveBlock)resolve + reject:(RCTPromiseRejectBlock)reject) + +@end diff --git a/app/ios/PassportReader.swift b/app/ios/PassportReader.swift new file mode 100644 index 00000000..2b2b33fa --- /dev/null +++ b/app/ios/PassportReader.swift @@ -0,0 +1,101 @@ +// +// PassportReader.swift +// AwesomeProject +// +// Created by Y E on 27/07/2023. +// + +import Foundation +import React +import NFCPassportReader + +@available(iOS 15, *) +@objc(PassportReader) +class PassportReader: NSObject{ + + private let passportReader = NFCPassportReader.PassportReader() + + func getMRZKey(passportNumber: String, dateOfBirth: String, dateOfExpiry: String ) -> String { + + // Pad fields if necessary + let pptNr = pad( passportNumber, fieldLength:9) + let dob = pad( dateOfBirth, fieldLength:6) + let exp = pad( dateOfExpiry, fieldLength:6) + + // Calculate checksums + let passportNrChksum = calcCheckSum(pptNr) + let dateOfBirthChksum = calcCheckSum(dob) + let expiryDateChksum = calcCheckSum(exp) + + let mrzKey = "\(pptNr)\(passportNrChksum)\(dob)\(dateOfBirthChksum)\(exp)\(expiryDateChksum)" + + return mrzKey + } + + func pad( _ value : String, fieldLength:Int ) -> String { + // Pad out field lengths with < if they are too short + let paddedValue = (value + String(repeating: "<", count: fieldLength)).prefix(fieldLength) + return String(paddedValue) + } + + func calcCheckSum( _ checkString : String ) -> Int { + let characterDict = ["0" : "0", "1" : "1", "2" : "2", "3" : "3", "4" : "4", "5" : "5", "6" : "6", "7" : "7", "8" : "8", "9" : "9", "<" : "0", " " : "0", "A" : "10", "B" : "11", "C" : "12", "D" : "13", "E" : "14", "F" : "15", "G" : "16", "H" : "17", "I" : "18", "J" : "19", "K" : "20", "L" : "21", "M" : "22", "N" : "23", "O" : "24", "P" : "25", "Q" : "26", "R" : "27", "S" : "28","T" : "29", "U" : "30", "V" : "31", "W" : "32", "X" : "33", "Y" : "34", "Z" : "35"] + + var sum = 0 + var m = 0 + let multipliers : [Int] = [7, 3, 1] + for c in checkString { + guard let lookup = characterDict["\(c)"], + let number = Int(lookup) else { return 0 } + let product = number * multipliers[m] + sum += product + m = (m+1) % 3 + } + + return (sum % 10) + } + + @objc(scanPassport:dateOfBirth:dateOfExpiry:resolve:reject:) + func scanPassport(_ passportNumber: String, dateOfBirth: String, dateOfExpiry: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { + let customMessageHandler : (NFCViewDisplayMessage)->String? = { (displayMessage) in + switch displayMessage { + case .requestPresentPassport: + return "Hold your iPhone near ann NFC enabled passport." + default: + // Return nil for all other messages so we use the provided default + return nil + } + } + + Task { [weak self] in + guard let self = self else { + return + } + + do { + let mrzKey = getMRZKey( passportNumber: passportNumber, dateOfBirth: dateOfBirth, dateOfExpiry: dateOfExpiry) + let masterListURL = Bundle.main.url(forResource: "masterList", withExtension: ".pem") + passportReader.setMasterListURL( masterListURL! ) + + let passport = try await passportReader.readPassport( mrzKey: mrzKey, customDisplayMessage: customMessageHandler) + + let passportData = passport.lastName + resolve(passportData) + } catch { + reject("E_PASSPORT_READ", "Failed to read passport", error) + } + } + } + +// @objc(scanPassport:dateOfBirth:dateOfExpiry:resolve:reject:) +// func scanPassport(_ passportNumber: String, dateOfBirth: String, dateOfExpiry: String, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { +// let concatenatedString = "\(passportNumber), \(dateOfBirth), \(dateOfExpiry)" +// resolve(concatenatedString) +// } + + + @objc + static func requiresMainQueueSetup() -> Bool { + return true + } +} diff --git a/app/ios/Podfile b/app/ios/Podfile new file mode 100644 index 00000000..c30a8a70 --- /dev/null +++ b/app/ios/Podfile @@ -0,0 +1,65 @@ +# Resolve react_native_pods.rb with node to allow for hoisting +require Pod::Executable.execute_command('node', ['-p', + 'require.resolve( + "react-native/scripts/react_native_pods.rb", + {paths: [process.argv[1]]}, + )', __dir__]).strip + +platform :ios, min_ios_version_supported +prepare_react_native_project! + +# If you are using a `react-native-flipper` your iOS build will fail when `NO_FLIPPER=1` is set. +# because `react-native-flipper` depends on (FlipperKit,...) that will be excluded +# +# To fix this you can also exclude `react-native-flipper` using a `react-native.config.js` +# ```js +# module.exports = { +# dependencies: { +# ...(process.env.NO_FLIPPER ? { 'react-native-flipper': { platforms: { ios: null } } } : {}), +# ``` +flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled + +linkage = ENV['USE_FRAMEWORKS'] +if linkage != nil + Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green + use_frameworks! :linkage => linkage.to_sym +end + +target 'AwesomeProject' do + config = use_native_modules! + + # Flags change depending on the env values. + flags = get_default_flags() + + use_frameworks! + pod 'NFCPassportReader', git:'https://github.com/yssf-io/NFCPassportReader.git' + + use_react_native!( + :path => config[:reactNativePath], + # Hermes is now enabled by default. Disable by setting this flag to false. + :hermes_enabled => false, + :fabric_enabled => flags[:fabric_enabled], + # Enables Flipper. + # + # Note that if you have use_frameworks! enabled, Flipper will not work and + # you should disable the next line. + #:flipper_configuration => flipper_config, + # An absolute path to your application root. + :app_path => "#{Pod::Config.instance.installation_root}/.." + ) + + target 'AwesomeProjectTests' do + inherit! :complete + # Pods for testing + end + + post_install do |installer| + # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 + react_native_post_install( + installer, + config[:reactNativePath], + :mac_catalyst_enabled => false + ) + __apply_Xcode_12_5_M1_post_install_workaround(installer) + end +end diff --git a/app/ios/Podfile.lock b/app/ios/Podfile.lock new file mode 100644 index 00000000..782f3898 --- /dev/null +++ b/app/ios/Podfile.lock @@ -0,0 +1,581 @@ +PODS: + - boost (1.76.0) + - DoubleConversion (1.1.6) + - FBLazyVector (0.72.3) + - FBReactNativeSpec (0.72.3): + - RCT-Folly (= 2021.07.22.00) + - RCTRequired (= 0.72.3) + - RCTTypeSafety (= 0.72.3) + - React-Core (= 0.72.3) + - React-jsi (= 0.72.3) + - ReactCommon/turbomodule/core (= 0.72.3) + - fmt (6.2.1) + - glog (0.3.5) + - NFCPassportReader (2.0.2): + - OpenSSL-Universal (= 1.1.1100) + - OpenSSL-Universal (1.1.1100) + - RCT-Folly (2021.07.22.00): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCT-Folly/Default (= 2021.07.22.00) + - RCT-Folly/Default (2021.07.22.00): + - boost + - DoubleConversion + - fmt (~> 6.2.1) + - glog + - RCTRequired (0.72.3) + - RCTTypeSafety (0.72.3): + - FBLazyVector (= 0.72.3) + - RCTRequired (= 0.72.3) + - React-Core (= 0.72.3) + - React (0.72.3): + - React-Core (= 0.72.3) + - React-Core/DevSupport (= 0.72.3) + - React-Core/RCTWebSocket (= 0.72.3) + - React-RCTActionSheet (= 0.72.3) + - React-RCTAnimation (= 0.72.3) + - React-RCTBlob (= 0.72.3) + - React-RCTImage (= 0.72.3) + - React-RCTLinking (= 0.72.3) + - React-RCTNetwork (= 0.72.3) + - React-RCTSettings (= 0.72.3) + - React-RCTText (= 0.72.3) + - React-RCTVibration (= 0.72.3) + - React-callinvoker (0.72.3) + - React-Codegen (0.72.3): + - DoubleConversion + - FBReactNativeSpec + - glog + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - React-jsc + - React-jsi + - React-jsiexecutor + - React-NativeModulesApple + - React-rncore + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - React-Core (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default (= 0.72.3) + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/CoreModulesHeaders (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/Default (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/DevSupport (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default (= 0.72.3) + - React-Core/RCTWebSocket (= 0.72.3) + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-jsinspector (= 0.72.3) + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/RCTActionSheetHeaders (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/RCTAnimationHeaders (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/RCTBlobHeaders (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/RCTImageHeaders (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/RCTLinkingHeaders (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/RCTNetworkHeaders (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/RCTSettingsHeaders (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/RCTTextHeaders (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/RCTVibrationHeaders (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-Core/RCTWebSocket (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-Core/Default (= 0.72.3) + - React-cxxreact + - React-jsc + - React-jsi + - React-jsiexecutor + - React-perflogger + - React-runtimeexecutor + - React-utils + - SocketRocket (= 0.6.1) + - Yoga + - React-CoreModules (0.72.3): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.3) + - React-Codegen (= 0.72.3) + - React-Core/CoreModulesHeaders (= 0.72.3) + - React-jsi (= 0.72.3) + - React-RCTBlob + - React-RCTImage (= 0.72.3) + - ReactCommon/turbomodule/core (= 0.72.3) + - SocketRocket (= 0.6.1) + - React-cxxreact (0.72.3): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker (= 0.72.3) + - React-debug (= 0.72.3) + - React-jsi (= 0.72.3) + - React-jsinspector (= 0.72.3) + - React-logger (= 0.72.3) + - React-perflogger (= 0.72.3) + - React-runtimeexecutor (= 0.72.3) + - React-debug (0.72.3) + - React-jsc (0.72.3): + - React-jsc/Fabric (= 0.72.3) + - React-jsi (= 0.72.3) + - React-jsc/Fabric (0.72.3): + - React-jsi (= 0.72.3) + - React-jsi (0.72.3): + - boost (= 1.76.0) + - DoubleConversion + - glog + - RCT-Folly (= 2021.07.22.00) + - React-jsiexecutor (0.72.3): + - DoubleConversion + - glog + - RCT-Folly (= 2021.07.22.00) + - React-cxxreact (= 0.72.3) + - React-jsi (= 0.72.3) + - React-perflogger (= 0.72.3) + - React-jsinspector (0.72.3) + - React-logger (0.72.3): + - glog + - React-NativeModulesApple (0.72.3): + - React-callinvoker + - React-Core + - React-cxxreact + - React-jsi + - React-runtimeexecutor + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - React-perflogger (0.72.3) + - React-RCTActionSheet (0.72.3): + - React-Core/RCTActionSheetHeaders (= 0.72.3) + - React-RCTAnimation (0.72.3): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.3) + - React-Codegen (= 0.72.3) + - React-Core/RCTAnimationHeaders (= 0.72.3) + - React-jsi (= 0.72.3) + - ReactCommon/turbomodule/core (= 0.72.3) + - React-RCTAppDelegate (0.72.3): + - RCT-Folly + - RCTRequired + - RCTTypeSafety + - React-Core + - React-CoreModules + - React-jsc + - React-NativeModulesApple + - React-RCTImage + - React-RCTNetwork + - React-runtimescheduler + - ReactCommon/turbomodule/core + - React-RCTBlob (0.72.3): + - RCT-Folly (= 2021.07.22.00) + - React-Codegen (= 0.72.3) + - React-Core/RCTBlobHeaders (= 0.72.3) + - React-Core/RCTWebSocket (= 0.72.3) + - React-jsi (= 0.72.3) + - React-RCTNetwork (= 0.72.3) + - ReactCommon/turbomodule/core (= 0.72.3) + - React-RCTImage (0.72.3): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.3) + - React-Codegen (= 0.72.3) + - React-Core/RCTImageHeaders (= 0.72.3) + - React-jsi (= 0.72.3) + - React-RCTNetwork (= 0.72.3) + - ReactCommon/turbomodule/core (= 0.72.3) + - React-RCTLinking (0.72.3): + - React-Codegen (= 0.72.3) + - React-Core/RCTLinkingHeaders (= 0.72.3) + - React-jsi (= 0.72.3) + - ReactCommon/turbomodule/core (= 0.72.3) + - React-RCTNetwork (0.72.3): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.3) + - React-Codegen (= 0.72.3) + - React-Core/RCTNetworkHeaders (= 0.72.3) + - React-jsi (= 0.72.3) + - ReactCommon/turbomodule/core (= 0.72.3) + - React-RCTSettings (0.72.3): + - RCT-Folly (= 2021.07.22.00) + - RCTTypeSafety (= 0.72.3) + - React-Codegen (= 0.72.3) + - React-Core/RCTSettingsHeaders (= 0.72.3) + - React-jsi (= 0.72.3) + - ReactCommon/turbomodule/core (= 0.72.3) + - React-RCTText (0.72.3): + - React-Core/RCTTextHeaders (= 0.72.3) + - React-RCTVibration (0.72.3): + - RCT-Folly (= 2021.07.22.00) + - React-Codegen (= 0.72.3) + - React-Core/RCTVibrationHeaders (= 0.72.3) + - React-jsi (= 0.72.3) + - ReactCommon/turbomodule/core (= 0.72.3) + - React-rncore (0.72.3) + - React-runtimeexecutor (0.72.3): + - React-jsi (= 0.72.3) + - React-runtimescheduler (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker + - React-debug + - React-jsi + - React-runtimeexecutor + - React-utils (0.72.3): + - glog + - RCT-Folly (= 2021.07.22.00) + - React-debug + - ReactCommon/turbomodule/bridging (0.72.3): + - DoubleConversion + - glog + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker (= 0.72.3) + - React-cxxreact (= 0.72.3) + - React-jsi (= 0.72.3) + - React-logger (= 0.72.3) + - React-perflogger (= 0.72.3) + - ReactCommon/turbomodule/core (0.72.3): + - DoubleConversion + - glog + - RCT-Folly (= 2021.07.22.00) + - React-callinvoker (= 0.72.3) + - React-cxxreact (= 0.72.3) + - React-jsi (= 0.72.3) + - React-logger (= 0.72.3) + - React-perflogger (= 0.72.3) + - RNFS (2.20.0): + - React-Core + - SocketRocket (0.6.1) + - Yoga (1.14.0) + +DEPENDENCIES: + - boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`) + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - NFCPassportReader (from `https://github.com/yssf-io/NFCPassportReader.git`) + - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) + - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) + - React-Codegen (from `build/generated/ios`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-debug (from `../node_modules/react-native/ReactCommon/react/debug`) + - React-jsc (from `../node_modules/react-native/ReactCommon/jsc`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - React-logger (from `../node_modules/react-native/ReactCommon/logger`) + - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) + - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - React-rncore (from `../node_modules/react-native/ReactCommon`) + - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) + - React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`) + - React-utils (from `../node_modules/react-native/ReactCommon/react/utils`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - RNFS (from `../node_modules/react-native-fs`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - fmt + - OpenSSL-Universal + - SocketRocket + +EXTERNAL SOURCES: + boost: + :podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec" + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + FBReactNativeSpec: + :path: "../node_modules/react-native/React/FBReactNativeSpec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + NFCPassportReader: + :git: https://github.com/yssf-io/NFCPassportReader.git + RCT-Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" + RCTRequired: + :path: "../node_modules/react-native/Libraries/RCTRequired" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-callinvoker: + :path: "../node_modules/react-native/ReactCommon/callinvoker" + React-Codegen: + :path: build/generated/ios + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-debug: + :path: "../node_modules/react-native/ReactCommon/react/debug" + React-jsc: + :path: "../node_modules/react-native/ReactCommon/jsc" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector" + React-logger: + :path: "../node_modules/react-native/ReactCommon/logger" + React-NativeModulesApple: + :path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios" + React-perflogger: + :path: "../node_modules/react-native/ReactCommon/reactperflogger" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTAppDelegate: + :path: "../node_modules/react-native/Libraries/AppDelegate" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + React-rncore: + :path: "../node_modules/react-native/ReactCommon" + React-runtimeexecutor: + :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" + React-runtimescheduler: + :path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler" + React-utils: + :path: "../node_modules/react-native/ReactCommon/react/utils" + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + RNFS: + :path: "../node_modules/react-native-fs" + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +CHECKOUT OPTIONS: + NFCPassportReader: + :commit: 08f9874f1e3287c9a726225e1e9193ef2b194d93 + :git: https://github.com/yssf-io/NFCPassportReader.git + +SPEC CHECKSUMS: + boost: 57d2868c099736d80fcd648bf211b4431e51a558 + DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54 + FBLazyVector: 4cce221dd782d3ff7c4172167bba09d58af67ccb + FBReactNativeSpec: c6bd9e179757b3c0ecf815864fae8032377903ef + fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 + glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b + NFCPassportReader: 09906a0f1940f09eea79c141cb5b53a19aa74bab + OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c + RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 + RCTRequired: a2faf4bad4e438ca37b2040cb8f7799baa065c18 + RCTTypeSafety: cb09f3e4747b6d18331a15eb05271de7441ca0b3 + React: 13109005b5353095c052f26af37413340ccf7a5d + React-callinvoker: c8c87bce983aa499c13cb06d4447c025a35274d6 + React-Codegen: 487d19287ca2be1fc3d2422fe9a5ad3b1951c543 + React-Core: 8293312ad137ea82fd2c29deb163dbc24aa4e00e + React-CoreModules: 32fab1d62416849a3b6dac6feff9d54e5ddc2d1e + React-cxxreact: 55d0f7cb6b4cc09ba9190797f1da87182d1a2fb6 + React-debug: 6c3d27a8aef6df933dff63b0f31fdcf2ad437718 + React-jsc: 0db8e8cc2074d979c37ffa7b8d7c914833960497 + React-jsi: 58677ff4848ceb6aeb9118fe03448a843ea5e16a + React-jsiexecutor: 2c15ba1bace70177492368d5180b564f165870fd + React-jsinspector: b511447170f561157547bc0bef3f169663860be7 + React-logger: c5b527272d5f22eaa09bb3c3a690fee8f237ae95 + React-NativeModulesApple: a1c74fa3d7f0b1f93bbd4102061a93abfc8a739a + React-perflogger: 6bd153e776e6beed54c56b0847e1220a3ff92ba5 + React-RCTActionSheet: c0b62af44e610e69d9a2049a682f5dba4e9dff17 + React-RCTAnimation: fe7005136b58f58871cab2f70732343b6e330d30 + React-RCTAppDelegate: 91d492d0bbc6b689d3ff2aa65f4dc3b429285ea2 + React-RCTBlob: 1800e20816a61e86bd64f623c7f40a3fb56ca48f + React-RCTImage: f80d68a674b84db1322bbe287d82501fcd7b28b1 + React-RCTLinking: a3cf63eb18070cfa90499ee9cbbc88ad33338b3d + React-RCTNetwork: abde2f1c54ad9b42824685a8b2c854a25274d719 + React-RCTSettings: 6cb55e98d630e3594482b5a790c7655eddd805bd + React-RCTText: 19425aea9d8b6ccae55a27916355b17ab577e56e + React-RCTVibration: ea3a68a49873a54ced927c90923fc6932baf344a + React-rncore: 9672a017af4a7da7495d911f0b690cbcae9dd18d + React-runtimeexecutor: 369ae9bb3f83b65201c0c8f7d50b72280b5a1dbc + React-runtimescheduler: 5c392d612fffa213b673e651f886ead35995e262 + React-utils: 2589af83a714e02813d10a4c5fc064a6832c006b + ReactCommon: a34545a02528203cee0839eeb01d754e8c4ad948 + RNFS: 4ac0f0ea233904cb798630b3c077808c06931688 + SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 + Yoga: 8796b55dba14d7004f980b54bcc9833ee45b28ce + +PODFILE CHECKSUM: ef3dd3fed039eab5043d469e8f98dbcd0de8a7d5 + +COCOAPODS: 1.12.1 diff --git a/app/jest.config.js b/app/jest.config.js new file mode 100644 index 00000000..8eb675e9 --- /dev/null +++ b/app/jest.config.js @@ -0,0 +1,3 @@ +module.exports = { + preset: 'react-native', +}; diff --git a/app/metro.config.js b/app/metro.config.js new file mode 100644 index 00000000..2dc57458 --- /dev/null +++ b/app/metro.config.js @@ -0,0 +1,23 @@ +const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config'); +const path = require('path'); +const extraNodeModules = { + 'common': path.resolve(__dirname + '/../common'), +}; +const watchFolders = [ + path.resolve(__dirname + '/../common') +]; + +/** + * Metro configuration + * https://facebook.github.io/metro/docs/configuration + * + * @type {import('metro-config').MetroConfig} + */ +const config = { + resolver: { + extraNodeModules, + }, + watchFolders, +}; + +module.exports = mergeConfig(getDefaultConfig(__dirname), config); diff --git a/app/package.json b/app/package.json new file mode 100644 index 00000000..8429accc --- /dev/null +++ b/app/package.json @@ -0,0 +1,59 @@ +{ + "name": "proof-of-passport", + "version": "0.0.1", + "private": true, + "scripts": { + "android": "react-native run-android", + "ios": "react-native run-ios", + "lint": "eslint .", + "start": "watchman watch-del-all && react-native start", + "test": "jest" + }, + "dependencies": { + "@babel/plugin-transform-private-methods": "^7.23.3", + "@ethersproject/shims": "^5.7.0", + "@gluestack-style/react": "^1.0.12", + "@gluestack-ui/config": "^1.0.3", + "@gluestack-ui/themed": "^1.0.11", + "axios": "^1.6.3", + "body-parser": "^1.20.2", + "buffer": "^6.0.3", + "crypto-js": "^4.1.1", + "ethers": "^6.9.1", + "express": "^4.18.2", + "js-sha256": "^0.9.0", + "node-forge": "^1.3.1", + "pvutils": "^1.1.3", + "react": "18.2.0", + "react-native": "0.72.3", + "react-native-passport-reader": "^1.0.3", + "react-native-svg": "13.4.0", + "react-native-toast-message": "^2.2.0" + }, + "devDependencies": { + "@babel/core": "^7.20.0", + "@babel/preset-env": "^7.20.0", + "@babel/runtime": "^7.22.6", + "@react-native/eslint-config": "^0.72.2", + "@react-native/metro-config": "^0.72.9", + "@tsconfig/react-native": "^3.0.0", + "@types/crypto-js": "^4.1.1", + "@types/express": "^4.17.17", + "@types/node-forge": "^1.3.3", + "@types/react": "^18.0.24", + "@types/react-native-dotenv": "^0.2.0", + "@types/react-test-renderer": "^18.0.0", + "babel-jest": "^29.2.1", + "babel-plugin-module-resolver": "^5.0.0", + "eslint": "^8.19.0", + "jest": "^29.2.1", + "metro-react-native-babel-preset": "0.76.7", + "prettier": "^2.4.1", + "react-native-dotenv": "^3.4.9", + "react-test-renderer": "18.2.0", + "typescript": "4.8.4" + }, + "engines": { + "node": ">=16" + } +} diff --git a/app/scripts/build_rust.sh b/app/scripts/build_rust.sh new file mode 100755 index 00000000..01021a29 --- /dev/null +++ b/app/scripts/build_rust.sh @@ -0,0 +1,10 @@ +cd ../android + +./gradlew clean +./gradlew cargoBuild + +cd .. + +mkdir -p android/react-native-passport-reader/android/src/main/jniLibs/arm64/ + cp ark-circom-passport/target/aarch64-linux-android/release/libark_circom_passport.so android/react-native-passport-reader/android/src/main/jniLibs/arm64/ + echo copied release version \ No newline at end of file diff --git a/app/tsconfig.json b/app/tsconfig.json new file mode 100644 index 00000000..45a6c707 --- /dev/null +++ b/app/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "@tsconfig/react-native/tsconfig.json" +} diff --git a/app/utils/snarkjs.ts b/app/utils/snarkjs.ts new file mode 100644 index 00000000..2005645b --- /dev/null +++ b/app/utils/snarkjs.ts @@ -0,0 +1,45 @@ +// utils from snarkjs. If snarkjs is updated and this breaks, might move this to lambda function +function unstringifyBigInts(o: any): any { + if (typeof o == "string" && /^[0-9]+$/.test(o)) { + return BigInt(o); + } else if (typeof o == "string" && /^0x[0-9a-fA-F]+$/.test(o)) { + return BigInt(o); + } else if (Array.isArray(o)) { + return o.map(unstringifyBigInts); + } else if (typeof o == "object") { + if (o === null) return null; + const res: any = {}; + const keys = Object.keys(o); + keys.forEach((k) => { + res[k] = unstringifyBigInts(o[k]); + }); + return res; + } else { + return o; + } +} + +function p256(n: any) { + let nstr = n.toString(16); + while (nstr.length < 64) nstr = "0"+nstr; + nstr = `"0x${nstr}"`; + return nstr; +} + +export default function groth16ExportSolidityCallData(_proof: any, _pub: any) { + const proof = unstringifyBigInts(_proof); + const pub = unstringifyBigInts(_pub); + + let inputs = ""; + for (let i=0; i 0 ? `${minutes}m ${seconds}s` : `${seconds}s`; +} +export function checkInputs( + passportNumber: string, + dateOfBirth: string, + dateOfExpiry: string, +): {success: boolean, message: string} { + // if (passportNumber.length !== 9) { + // throw new Error('Passport number must be 9 characters long'); + // } + if (dateOfBirth.length !== 6) { + return { + success: false, + message: 'Date of birth must be 6 characters long' + }; + } + if (dateOfExpiry.length !== 6) { + return { + success: false, + message: 'Date of expiry must be 6 characters long' + }; + } + + return { + success: true, + message: '' + }; +} diff --git a/app/yarn.lock b/app/yarn.lock new file mode 100644 index 00000000..15153fd8 --- /dev/null +++ b/app/yarn.lock @@ -0,0 +1,8597 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@adraffy/ens-normalize@1.10.0": + version "1.10.0" + resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz#d2a39395c587e092d77cbbc80acf956a54f38bf7" + integrity sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/code-frame@^7.22.13": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== + dependencies: + "@babel/highlight" "^7.23.4" + chalk "^2.4.2" + +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.9.tgz#71cdb00a1ce3a329ce4cbec3a44f9fef35669730" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.9.tgz#bd96492c68822198f33e8a256061da3cf391f58f" + integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + semver "^6.3.1" + +"@babel/eslint-parser@^7.20.0": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz#75f8aa978d1e76c87cc6f26c1ea16ae58804d390" + integrity sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.1" + +"@babel/generator@^7.20.0", "@babel/generator@^7.22.7", "@babel/generator@^7.22.9", "@babel/generator@^7.7.2": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.9.tgz#572ecfa7a31002fa1de2a9d91621fd895da8493d" + integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz#a3f4758efdd0190d8927fcffd261755937c71878" + integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz#f9d0a7aaaa7cd32a3f31c9316a69f5a9bcacb892" + integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.5" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz#c36ea240bb3348f942f08b0fbe28d6d979fab236" + integrity sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.15": + version "7.23.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz#b2e6826e0e20d337143655198b79d58fdc9bd43d" + integrity sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-member-expression-to-functions" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz#9d8e61a8d9366fe66198f57c40565663de0825f6" + integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz#82c825cadeeeee7aad237618ebbe8fa1710015d7" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-environment-visitor@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz#0a7c56117cad3372fbf8d2fb4bf8f8d64a1e76b2" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz#92dfcb1fbbb2bc62529024f72d942a8c97142129" + integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz#53a25b7484e722d7efb9c350c75c032d4628de82" + integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" + +"@babel/helper-replace-supers@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz#cbdc27d6d8d18cd22c81ae4293765a5d9afd0779" + integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.9": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz#189937248c45b0182c1dcf32f3444ca153944cb9" + integrity sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.6.tgz#8e61d3395a4f0c5a8060f309fb008200969b5ecd" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== + +"@babel/parser@^7.22.15": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" + integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz#87245a21cd69a73b0b81bcda98d443d6df08f05e" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz#fef09f9499b1f1c930da8a0c419db42167d792ca" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + +"@babel/plugin-proposal-async-generator-functions@^7.0.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" + integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-remap-async-to-generator" "^7.18.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.18.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-export-default-from@^7.0.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.22.5.tgz#825924eda1fad382c3de4db6fe1711b6fa03362f" + integrity sha512-UCe1X/hplyv6A5g2WnQ90tnHRvYL29dabCWww92lO7VdfMVTVReBTRrhiMrKQejHD9oVkdnRdwYuzUZkBVQisg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-default-from" "^7.22.5" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.0.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.20.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" + integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.20.0": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.0.0", "@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.22.5.tgz#ac3a24b362a04415a017ab96b9b4483d0e2a6e44" + integrity sha512-ODAqWWXB/yReh/jVQDag/3/tl6lgBueQkk/TcfW/59Oykm4c8a55XloX0CTk2k2VJiFWMgHby9xNX29IbCv9dQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" + integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.0.0", "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.0.0", "@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.7": + version "7.22.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz#053e76c0a903b72b573cb1ab7d6882174d460a1b" + integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.20.0", "@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz#8bfc793b3a4b2742c0983fadc1480d843ecea31b" + integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz#3e40c46f048403472d6f4183116d5e46b1bff5ba" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz#e04d7d804ed5b8501311293d1a0e6d43e94c3363" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.20.0", "@babel/plugin-transform-destructuring@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz#d3aca7438f6c26c78cdd0b0ba920a336001b27cc" + integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz#d6908a8916a810468c4edff73b5b75bda6ad393e" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz#57c41cb1d0613d22f548fddd8b288eedb9973a5b" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2" + integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-flow" "^7.22.5" + +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz#ab1b8a200a8f990137aff9a084f8de4099ab173f" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz#14b64352fdf7e1f737eed68de1a1468bd2a77ec0" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz#66ae5f068fd5a9a5dc570df16f56c2a8462a9d6c" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz#4e045f55dcf98afd00f85691a68fc0780704f526" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz#7d9875908d19b8c0536085af7b053fd5bd651bfa" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz#18c31410b5e579a0092638f95c896c2a98a5d496" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz#f8872c65776e0b552e0849d7596cddd416c3e381" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz#57226a2ed9e512b9b446517ab6fa2d17abb83f58" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz#9686dc3447df4753b0b2a2fae7e8bc33cdc1f2e1" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" + +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz#842080be3076703be0eaf32ead6ac8174edee333" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz#4bacfe37001fe1901117672875e931d439811564" + integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz#c3542dd3c39b42c8069936e48717a8d179d63a18" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" + integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz#07a77f28cbb251546a43d175a1dda4cf3ef83e32" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-self@^7.0.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz#ca2fdc11bc20d4d46de01137318b13d04e481d8e" + integrity sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-source@^7.0.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz#49af1615bfdf6ed9d3e9e43e425e0b2b65d15b6c" + integrity sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz#932c291eb6dd1153359e2a90cb5e557dcf068416" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz#cd8a68b228a5f75fa01420e8cc2fc400f0fc32aa" + integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.0.0": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz#a87b11e170cbbfb018e6a2bf91f5c6e533b9e027" + integrity sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.22.5", "@babel/plugin-transform-typescript@^7.5.0": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz#91e08ad1eb1028ecc62662a842e93ecfbf3c7234" + integrity sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz#ce0c248522b1cb22c7c992d88301a5ead70e806c" + integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.20.0": + version "7.22.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.22.9.tgz#57f17108eb5dfd4c5c25a44c1977eba1df310ac7" + integrity sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-flow@^7.13.13": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.22.5.tgz#876f24ab6b38bd79703a93f32020ca2162312784" + integrity sha512-ta2qZ+LSiGCrP5pgcGt8xMnnkXQrq8Sa4Ulhy06BOlF5QbLw9q5hIx7bn5MrsvyTGAfh6kTOo07Q+Pfld/8Y5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-transform-flow-strip-types" "^7.22.5" + +"@babel/preset-modules@^0.1.5": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6.tgz#31bcdd8f19538437339d17af00d177d854d9d458" + integrity sha512-ID2yj6K/4lKfhuU3+EX4UvNbIt7eACFbHmNUjzA+ep+B5971CknnA/9DEWKbRokfbbtblxxxXFJJrH47UEAMVg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-typescript@^7.13.0": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz#16367d8b01d640e9a507577ed4ee54e0101e51c8" + integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-typescript" "^7.22.5" + +"@babel/register@^7.13.16": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.22.5.tgz#e4d8d0f615ea3233a27b5c6ada6750ee59559939" + integrity sha512-vV6pm/4CijSQ8Y47RH5SopXzursN35RQINfGJkmOlcpAtGuf94miFvIPhCKGQN7WGIcsgG1BHEX2KVdTYwTwUQ== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.22.6", "@babel/runtime@^7.8.4": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.8.7": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.0.0", "@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/template@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.20.0", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.7.4": + version "7.22.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.8.tgz#4d4451d31bc34efeae01eac222b514a77aa4000e" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@babel/types@^7.22.15", "@babel/types@^7.23.0": + version "7.23.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" + integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.6.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" + integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== + +"@eslint/eslintrc@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d" + integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.44.0": + version "8.44.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af" + integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== + +"@ethersproject/shims@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/shims/-/shims-5.7.0.tgz#ee32e543418595774029c5ea6123ea8995e7e154" + integrity sha512-WeDptc6oAprov5CCN2LJ/6/+dC9gTonnkdAtLepm/7P5Z+3PRxS5NpfVWmOMs1yE4Vitl2cU8bOPWC0GvGSbVg== + +"@expo/html-elements@latest": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@expo/html-elements/-/html-elements-0.5.1.tgz#94f86afb1a57f95dbd45fb8326b985683cde3c93" + integrity sha512-BDAVI3ayykNykAeAc3B2USSiA244te2WAJDYske/AtDnm/AWZM/DE9lCwSkysuu7uOMcNp78LM2L/v6TwvxqZQ== + +"@formatjs/ecma402-abstract@1.17.2": + version "1.17.2" + resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.2.tgz#d197c6e26b9fd96ff7ba3b3a0cc2f25f1f2dcac3" + integrity sha512-k2mTh0m+IV1HRdU0xXM617tSQTi53tVR2muvYOsBeYcUgEAyxV1FOC7Qj279th3fBVQ+Dj6muvNJZcHSPNdbKg== + dependencies: + "@formatjs/intl-localematcher" "0.4.2" + tslib "^2.4.0" + +"@formatjs/fast-memoize@2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz#33bd616d2e486c3e8ef4e68c99648c196887802b" + integrity sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA== + dependencies: + tslib "^2.4.0" + +"@formatjs/icu-messageformat-parser@2.7.0": + version "2.7.0" + resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.0.tgz#9b13f2710a3b4efddfeb544480f684f27a53483b" + integrity sha512-7uqC4C2RqOaBQtcjqXsSpGRYVn+ckjhNga5T/otFh6MgxRrCJQqvjfbrGLpX1Lcbxdm5WH3Z2WZqt1+Tm/cn/Q== + dependencies: + "@formatjs/ecma402-abstract" "1.17.2" + "@formatjs/icu-skeleton-parser" "1.6.2" + tslib "^2.4.0" + +"@formatjs/icu-skeleton-parser@1.6.2": + version "1.6.2" + resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.2.tgz#00303034dc08583973c8aa67b96534c49c0bad8d" + integrity sha512-VtB9Slo4ZL6QgtDFJ8Injvscf0xiDd4bIV93SOJTBjUF4xe2nAWOoSjLEtqIG+hlIs1sNrVKAaFo3nuTI4r5ZA== + dependencies: + "@formatjs/ecma402-abstract" "1.17.2" + tslib "^2.4.0" + +"@formatjs/intl-localematcher@0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.4.2.tgz#7e6e596dbaf2f0c5a7c22da5a01d5c55f4c37e9a" + integrity sha512-BGdtJFmaNJy5An/Zan4OId/yR9Ih1OojFjcduX/xOvq798OgWSyDtd6Qd5jqJXwJs1ipe4Fxu9+cshic5Ox2tA== + dependencies: + tslib "^2.4.0" + +"@gluestack-style/animation-resolver@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@gluestack-style/animation-resolver/-/animation-resolver-1.0.3.tgz#88ed314cf2e6f15b888cb09f5a7d970b0fe9ee30" + integrity sha512-SfBHBBY0PVlLDpYRMz0KKEcyc6GtZJpbt1yYlaaErVaRqPKI1cbBcgWAS29e23i2Q7iwLLRhRZnbnELigcp55w== + +"@gluestack-style/legend-motion-animation-driver@1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@gluestack-style/legend-motion-animation-driver/-/legend-motion-animation-driver-1.0.3.tgz#e2408ff8515ced92cb75f096f5eeff1f9636a0da" + integrity sha512-sD6aFS6Tq5XpyjrboFEIc8LrRY4TA4kodFYHzk6mDchvbkdLODijtjnaDQB1UqihOkMRg49e7ANRAOzc7eymaQ== + +"@gluestack-style/react@^1.0.12", "@gluestack-style/react@^1.0.18": + version "1.0.29" + resolved "https://registry.yarnpkg.com/@gluestack-style/react/-/react-1.0.29.tgz#253f92dbb78d4a49ef9c53b8c9c02872ff11dd31" + integrity sha512-NoI5kcVQsrhYYDld410YhuP7DVuB+k99b5ycOcarM1T55ZhZrmgwPBfG83/lVWT1w0wHcumHn6+pUSNBYQyr9g== + dependencies: + inline-style-prefixer "^6.0.1" + normalize-css-color "^1.0.2" + +"@gluestack-ui/accordion@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@gluestack-ui/accordion/-/accordion-0.0.2.tgz#fb6ea69133169262c327c67f5bd2c0d3b6396a86" + integrity sha512-t9aTPgGPHVkfvIBpDm3NALfMNZKrkirG+R2ARHClyeAr+Ok8XslcAqup+g1apZUxJPhXCuEn2FCjVFW+1ROxzw== + dependencies: + "@gluestack-style/react" "^1.0.18" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/accordion" "^0.0.2" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + +"@gluestack-ui/actionsheet@0.2.35": + version "0.2.35" + resolved "https://registry.yarnpkg.com/@gluestack-ui/actionsheet/-/actionsheet-0.2.35.tgz#17e374009cd44f36c94c12e8666ed811a8b682ff" + integrity sha512-Nkq3nHEz7Y0eemAQoHqSrrTDdPkbFme+fETy3kq8Q8faLFkjtyYapOS7tBmr0HPgxd24CBsnbKFloKLcghhf+g== + dependencies: + "@gluestack-ui/hooks" "^0.1.7" + "@gluestack-ui/overlay" "^0.1.12" + "@gluestack-ui/transitions" "^0.1.10" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/dialog" "^0.0.3" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + +"@gluestack-ui/alert-dialog@^0.1.23": + version "0.1.23" + resolved "https://registry.yarnpkg.com/@gluestack-ui/alert-dialog/-/alert-dialog-0.1.23.tgz#d69f1f04cbd437278e254d63e44617fe5069831b" + integrity sha512-RHscqdGP2oaT0uAh8jed3z/trlMZIECa59kCFfp963M2a8CUxxRwzkn2iP1L3eS0WZ1gwMjJquEV8x9Kfy5cmw== + dependencies: + "@gluestack-ui/hooks" "^0.1.7" + "@gluestack-ui/overlay" "^0.1.12" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/dialog" "^0.0.3" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + +"@gluestack-ui/alert@^0.1.12": + version "0.1.12" + resolved "https://registry.yarnpkg.com/@gluestack-ui/alert/-/alert-0.1.12.tgz#ef7efd7c978809da55cb7dc07c5f3db33b6b6aec" + integrity sha512-oiJfxryKh7+WKKx9PjIX088wgIQTXD9llC52h5HiK1dPUJiswjgGKbFHZbX7uoh9VMiXthBoUvzOIVMv0i5feA== + +"@gluestack-ui/avatar@^0.1.15": + version "0.1.15" + resolved "https://registry.yarnpkg.com/@gluestack-ui/avatar/-/avatar-0.1.15.tgz#a12a4d9afe7314c084fcc82eb9740eb186cc0a60" + integrity sha512-ohbgt4FVQ3yzdZrUsEx39LSxyLUqVoj1FIapENNqmCkXqk+wwDwcyEhALInu7JOsuzPAXpUuv4b478XNsYUCTg== + dependencies: + "@gluestack-ui/utils" "^0.1.12" + +"@gluestack-ui/button@^0.1.33": + version "0.1.33" + resolved "https://registry.yarnpkg.com/@gluestack-ui/button/-/button-0.1.33.tgz#fbfe2bc9fbdb866fc2ac3f8d4158b3425cd878c7" + integrity sha512-qB+Jc6ZVJLMhVn99tbnnjGSpNkC1jJMpWEN0DI7UtV+YjAHwO3fyb+wNFovS683cY1F3Rj8FsZSUT1gIlSvelQ== + dependencies: + "@gluestack-ui/utils" "0.1.12" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + +"@gluestack-ui/checkbox@^0.1.22": + version "0.1.22" + resolved "https://registry.yarnpkg.com/@gluestack-ui/checkbox/-/checkbox-0.1.22.tgz#8c339bf69c13bcfdc8a8613ca3bd934b85f05ba4" + integrity sha512-wpSyV5rcy4V2k8nLgkAkX0ltGgeSL7eMMKM7s508FZ5/5PcIc2FjUG6PD+Ixw7A4x8ZSjTJU4AcQq0rX8Hog+Q== + dependencies: + "@gluestack-ui/form-control" "^0.1.14" + "@gluestack-ui/utils" "^0.1.12" + "@react-aria/visually-hidden" "^3.8.6" + "@react-native-aria/checkbox" "^0.2.6" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + "@react-native-aria/utils" "^0.2.10" + "@react-stately/checkbox" "^3.4.2" + +"@gluestack-ui/config@^1.0.3": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@gluestack-ui/config/-/config-1.0.10.tgz#e0d226f95ea52900368e5b11e42f8d969268485d" + integrity sha512-19Ewiv/ETKKRlSCBwofoIA8v2ZouLeeycGWp87Okwlnrc6VdxEOrwm3OXmi1zxVe1lqQ2aNu1+Cvy/fTanh5CQ== + +"@gluestack-ui/divider@^0.1.8": + version "0.1.8" + resolved "https://registry.yarnpkg.com/@gluestack-ui/divider/-/divider-0.1.8.tgz#114584279aebc8bf6b718d039c521330051d8e44" + integrity sha512-l+OQ1XD5qI20ghxKbpi+pqntRtd0mtkmhfXYLODbjt2eec3U9kpV1xawXpfN/TFd45WWZTpEQ616sOQqFLo3RA== + +"@gluestack-ui/fab@^0.1.17": + version "0.1.17" + resolved "https://registry.yarnpkg.com/@gluestack-ui/fab/-/fab-0.1.17.tgz#c6411a73938cc2be13fa147b83c45f78e244bcf6" + integrity sha512-nNa7+Oe8C1WUoztzXv7xBTU50p3IS1oSctImm1KqbdpJamvrKgbzLGlklZ7WZOM0/+Qh1rXBC8g+Nr41WP3mTQ== + dependencies: + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + +"@gluestack-ui/form-control@^0.1.14", "@gluestack-ui/form-control@^0.1.15": + version "0.1.15" + resolved "https://registry.yarnpkg.com/@gluestack-ui/form-control/-/form-control-0.1.15.tgz#94da19379f55b723187e98cc87081147ac39f7e2" + integrity sha512-UEfGDY9doieEHpmkWri7nVnFrEcMHCPuy5pUSD8vXeAx4Vfg+vBfaeuPxGmlzhstAYo5zaBUhKEoVLfBs01BPQ== + dependencies: + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + +"@gluestack-ui/hooks@^0.1.7": + version "0.1.10" + resolved "https://registry.yarnpkg.com/@gluestack-ui/hooks/-/hooks-0.1.10.tgz#96cb9277fe65ce37bd7204662f53267cc8829fae" + integrity sha512-/FCvXn/YeKztXgaad38xeHqApEqqFaFPFQdGrNdcM2b8GfMb55wwEyOVGs3qEhpZIFlfLPw3gC/ZdWMdBdsZ8Q== + +"@gluestack-ui/icon@^0.1.20": + version "0.1.20" + resolved "https://registry.yarnpkg.com/@gluestack-ui/icon/-/icon-0.1.20.tgz#4140b5e94efeeb953ddc2c828800b27e103f7bfa" + integrity sha512-f/+DGR3139LU9NbMMvoumZWIwqy4B4e+xc02kAAubiv7p7aqGDV5KPm2JN5vVmCwiDRxX5u0F3SxodSQhEoQZA== + dependencies: + "@gluestack-ui/provider" "^0.1.6" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + +"@gluestack-ui/image@^0.1.7": + version "0.1.7" + resolved "https://registry.yarnpkg.com/@gluestack-ui/image/-/image-0.1.7.tgz#0cb2be72fd16a6a5d10aa850b9506f308330a901" + integrity sha512-ITfDX7gyxab+w0EMmJdITgG7EB2oF/3MfYgsFBV//VmIlu3OJg2xvnwvYzq3kNdGqr5Nt/5ZEG2ime7Kx2Wmxw== + dependencies: + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + +"@gluestack-ui/input@^0.1.23": + version "0.1.23" + resolved "https://registry.yarnpkg.com/@gluestack-ui/input/-/input-0.1.23.tgz#69580f67c6d7927ee6957e552d628999c42b87e6" + integrity sha512-tfPk6uXWJG8aiT8sqg+zp91IxOd+8GrQYwUdl5PZwrW+6Xk9siAHBjYYVO6lQCvFrFSqcj3JQeuL0CZWrdoFrg== + dependencies: + "@gluestack-ui/form-control" "^0.1.14" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + +"@gluestack-ui/linear-gradient@^0.1.2": + version "0.1.2" + resolved "https://registry.yarnpkg.com/@gluestack-ui/linear-gradient/-/linear-gradient-0.1.2.tgz#5eea2673339456723f1003b4c456e3387498b83a" + integrity sha512-bdZ8Y38odGJm0gYdOcafZkszmivuhgA5CLAAkb1ZcW+b4E+kvhDBFtD4WHXEZILPF3xVQtTDffmhAl4SVpBjRw== + dependencies: + expo-linear-gradient "12.3.0" + +"@gluestack-ui/link@^0.1.16": + version "0.1.16" + resolved "https://registry.yarnpkg.com/@gluestack-ui/link/-/link-0.1.16.tgz#43cb847c3929bf6a41e63fa13010732cc16b308a" + integrity sha512-tKUSwfxr02W/viDwZDpp5TgqD+8GNO685K9o8/6Br4dKUDdVsg+UBkUX6VwEtncyYjEQds6I28uqgKVuk1F5lg== + dependencies: + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + +"@gluestack-ui/menu@^0.2.25": + version "0.2.25" + resolved "https://registry.yarnpkg.com/@gluestack-ui/menu/-/menu-0.2.25.tgz#35588f37ff3d70d38e218a7ca4b8015d16475b65" + integrity sha512-9PkgDW1KMGdRAoS1LbYv6uSH62TT7MysxUNOxl9NTxLTHWGEDWLkLPKO3iS5Q0xTcNq3Xv7LMTB3McacJTIcXA== + dependencies: + "@gluestack-ui/hooks" "^0.1.7" + "@gluestack-ui/overlay" "^0.1.12" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + "@react-native-aria/menu" "^0.2.9" + "@react-native-aria/overlays" "^0.3.10" + "@react-stately/utils" "^3.6.0" + react-stately "^3.21.0" + +"@gluestack-ui/modal@^0.1.27": + version "0.1.27" + resolved "https://registry.yarnpkg.com/@gluestack-ui/modal/-/modal-0.1.27.tgz#3c7f3bc4ce11cadc9018e097ce65e7e9a0c7f8ec" + integrity sha512-0wKIpBthU+rvS51wNm8x7TbzDYCqvrI65EQOAhZhnY9+/Y/jLIeAikh7bW1C9B+8DaVKhpOlFcWvTOHwvGDwew== + dependencies: + "@gluestack-ui/hooks" "^0.1.7" + "@gluestack-ui/overlay" "^0.1.12" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/dialog" "^0.0.3" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + "@react-native-aria/overlays" "^0.3.10" + +"@gluestack-ui/overlay@^0.1.12", "@gluestack-ui/overlay@^0.1.7": + version "0.1.12" + resolved "https://registry.yarnpkg.com/@gluestack-ui/overlay/-/overlay-0.1.12.tgz#b8d373875e0cf8e1bbc244dfafdcbb76525fa424" + integrity sha512-rENETe40IRIrFW7rQKBsVotJ0J7DxTmY4xZGyMM/dct6TXnnZa2vIE+mqOK0CQs3cEIWypvDrQrJ0mHWHK1xig== + dependencies: + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + "@react-native-aria/overlays" "^0.3.10" + +"@gluestack-ui/popover@^0.1.27": + version "0.1.27" + resolved "https://registry.yarnpkg.com/@gluestack-ui/popover/-/popover-0.1.27.tgz#8bc282f9385c45b05af42e0306b7f58d4fda977d" + integrity sha512-KRJKXzUftyibeQIhWglT3ZHp2QOMbvENGQp3utNwxROu3CimZT2foVSjIezJNvLEpDETTNvADGIP39kqHHQrOA== + dependencies: + "@gluestack-ui/hooks" "^0.1.7" + "@gluestack-ui/overlay" "^0.1.12" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/dialog" "^0.0.3" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + "@react-native-aria/overlays" "^0.3.10" + +"@gluestack-ui/pressable@^0.1.13": + version "0.1.13" + resolved "https://registry.yarnpkg.com/@gluestack-ui/pressable/-/pressable-0.1.13.tgz#594d2a1162c10bb87f6334c23f11390d5fe7e172" + integrity sha512-9Wp6v/EG3a0IFQcfG7jnz7vnkvh88SGFFG82qUdMRU4fnZkgWjv5M2mmePnERzDSyxQT6cFjRCDYa7Xk9EVSrw== + dependencies: + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + +"@gluestack-ui/progress@^0.1.12": + version "0.1.12" + resolved "https://registry.yarnpkg.com/@gluestack-ui/progress/-/progress-0.1.12.tgz#a57c80941ac8d02ecb48cce2c64a4e86a687c3e1" + integrity sha512-i0bXUW+FT5G4SS/XqIFz9F+Vea5RPFsgM8T5v2lF4mNlAlBrStCez1RIEzUJjJ5tn36c858iQ6BkSeZXt6PW/w== + dependencies: + "@gluestack-ui/utils" "^0.1.12" + +"@gluestack-ui/provider@^0.1.10", "@gluestack-ui/provider@^0.1.6": + version "0.1.10" + resolved "https://registry.yarnpkg.com/@gluestack-ui/provider/-/provider-0.1.10.tgz#552c4da52f99cb300ef10cde5f830e27a52189b4" + integrity sha512-zAfwQM3AUETLL8Br1GUAsnOdn1RhF/Acd33DawbfFSH9GS/RXtgAgt/Fkh7ANirIxCAYmg5z8G9EN+egIbyuwA== + dependencies: + "@react-native-aria/interactions" "^0.2.10" + tsconfig "7" + typescript "^4.9.4" + +"@gluestack-ui/radio@^0.1.23": + version "0.1.23" + resolved "https://registry.yarnpkg.com/@gluestack-ui/radio/-/radio-0.1.23.tgz#7a0f0e35a7a3bf501d4a673198d7087aa42cf6ab" + integrity sha512-yKX/1eSGs5c4+YH12oo+siRjBRbQCR4XfQa7kWoZTz0h8qkgOVHoDfp/2uTQKryeyfbJm0ZbFt5PZleW6ORXxA== + dependencies: + "@gluestack-ui/form-control" "^0.1.14" + "@gluestack-ui/utils" "^0.1.12" + "@react-aria/visually-hidden" "^3.7.0" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + "@react-native-aria/radio" "^0.2.7" + "@react-stately/radio" "^3.8.1" + +"@gluestack-ui/react-native-aria@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@gluestack-ui/react-native-aria/-/react-native-aria-0.1.5.tgz#604b6ca22364841d644f6b2911f8f5b776a7cea9" + integrity sha512-6IaE4fcBaGMu3kSDKAoo1wE5qXcoKDX5YA14zzYzXN2d67/K9NYSjpoo/GbxDWZVl45X6Z9QLS/SBP7SmsPO+Q== + dependencies: + "@react-native-aria/focus" "^0.2.7" + +"@gluestack-ui/select@^0.1.20": + version "0.1.20" + resolved "https://registry.yarnpkg.com/@gluestack-ui/select/-/select-0.1.20.tgz#312a1ed4328f04b6cf8535b9ac47ed6b336b68c9" + integrity sha512-97YNSPt71xgAz3AAjPgp7BvCuSS5+Bhbr3UfUVFRnOtyUiExJrtu54A2wYw7wVbEaqiMi7aNv7KKqQ/n2cK7AA== + dependencies: + "@gluestack-ui/form-control" "^0.1.14" + "@gluestack-ui/hooks" "^0.1.7" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + +"@gluestack-ui/slider@^0.1.18": + version "0.1.18" + resolved "https://registry.yarnpkg.com/@gluestack-ui/slider/-/slider-0.1.18.tgz#7bf3b869cc6009f5a96e9b90eaccf01e0af3c043" + integrity sha512-Q9brkJnH9hlUeVrXowcsPRuclpczemxgXa0gSqR14DpLeinOqJgRCobg3uFiWjXqOOTHGC2oNik68tI4itehAQ== + dependencies: + "@gluestack-ui/form-control" "^0.1.14" + "@gluestack-ui/hooks" "^0.1.7" + "@gluestack-ui/utils" "^0.1.12" + "@react-aria/visually-hidden" "^3.8.1" + "@react-native-aria/interactions" "^0.2.11" + "@react-native-aria/slider" "^0.2.10" + "@react-stately/slider" "^3.2.4" + +"@gluestack-ui/spinner@^0.1.14": + version "0.1.14" + resolved "https://registry.yarnpkg.com/@gluestack-ui/spinner/-/spinner-0.1.14.tgz#b0afb1e310b409b343d6f59f9127642a97ce224b" + integrity sha512-6uLUvyJMhYR/sIMU/purfaYPqaKiLqnBi0n0LiWRsJNGDgENqdWVHMJpGTdWaFuCLxumZ7xnp0wG2KAdG9UyyQ== + +"@gluestack-ui/switch@^0.1.17": + version "0.1.17" + resolved "https://registry.yarnpkg.com/@gluestack-ui/switch/-/switch-0.1.17.tgz#b14d2a66f6a2b12f985bae981cca0afd2b14a69e" + integrity sha512-4Kwrlr0fmyHlwevCTawlivR/cxcGfEY+cr+5IM3rCcRlzR55+UbWKlY+F/W2jJ34mbREyQ5MQL29IN95t4Wo/A== + dependencies: + "@gluestack-ui/form-control" "^0.1.14" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + "@react-stately/toggle" "^3.4.4" + +"@gluestack-ui/tabs@^0.1.14": + version "0.1.14" + resolved "https://registry.yarnpkg.com/@gluestack-ui/tabs/-/tabs-0.1.14.tgz#5bcb5cc659927cde08f8e32497830257ed5cba4f" + integrity sha512-QIAf+ACVFIBm5khxMPNwo4hGtr+uOdc18ygeyHmCOQaCBAhQN9zyscDg5PjBDNasHk7I9WJf5sVr2A4ZzRXybg== + dependencies: + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + +"@gluestack-ui/textarea@^0.1.19": + version "0.1.19" + resolved "https://registry.yarnpkg.com/@gluestack-ui/textarea/-/textarea-0.1.19.tgz#71b1ecbe370a28a441206ffa3f0bfbdf8200d730" + integrity sha512-VYljvA5xrl856Oxbm951oDhxHYwHTjuIrk4+A+tIqRbgJodgzI1SgiU8DhgHTYAa+aYumMdyyrUPq6RL8ACIYQ== + dependencies: + "@gluestack-ui/form-control" "^0.1.14" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + +"@gluestack-ui/themed@^1.0.11": + version "1.0.30" + resolved "https://registry.yarnpkg.com/@gluestack-ui/themed/-/themed-1.0.30.tgz#7bba2335296f6902875f9f335eff41c83e57e76b" + integrity sha512-axzyF1W5O+d8dQjeaj7KgJwjmZKzIi3Zx3ztkPwzJy6XXJJJpLuxYZdyry9f9Z3URPjL2N/29Z1PnlaXFyd5wQ== + dependencies: + "@expo/html-elements" latest + "@gluestack-style/animation-resolver" "1.0.3" + "@gluestack-style/legend-motion-animation-driver" "1.0.3" + "@gluestack-ui/accordion" "^0.0.2" + "@gluestack-ui/actionsheet" "0.2.35" + "@gluestack-ui/alert" "^0.1.12" + "@gluestack-ui/alert-dialog" "^0.1.23" + "@gluestack-ui/avatar" "^0.1.15" + "@gluestack-ui/button" "^0.1.33" + "@gluestack-ui/checkbox" "^0.1.22" + "@gluestack-ui/divider" "^0.1.8" + "@gluestack-ui/fab" "^0.1.17" + "@gluestack-ui/form-control" "^0.1.15" + "@gluestack-ui/icon" "^0.1.20" + "@gluestack-ui/image" "^0.1.7" + "@gluestack-ui/input" "^0.1.23" + "@gluestack-ui/linear-gradient" "^0.1.2" + "@gluestack-ui/link" "^0.1.16" + "@gluestack-ui/menu" "^0.2.25" + "@gluestack-ui/modal" "^0.1.27" + "@gluestack-ui/overlay" "^0.1.12" + "@gluestack-ui/popover" "^0.1.27" + "@gluestack-ui/pressable" "^0.1.13" + "@gluestack-ui/progress" "^0.1.12" + "@gluestack-ui/provider" "^0.1.10" + "@gluestack-ui/radio" "^0.1.23" + "@gluestack-ui/select" "^0.1.20" + "@gluestack-ui/slider" "^0.1.18" + "@gluestack-ui/spinner" "^0.1.14" + "@gluestack-ui/switch" "^0.1.17" + "@gluestack-ui/tabs" "^0.1.14" + "@gluestack-ui/textarea" "^0.1.19" + "@gluestack-ui/toast" "^1.0.2" + "@gluestack-ui/tooltip" "^0.1.24" + "@legendapp/motion" latest + +"@gluestack-ui/toast@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@gluestack-ui/toast/-/toast-1.0.2.tgz#0b9d6989794a707f239ae9da7ac8c3a730499035" + integrity sha512-RqlqEaoQesW5l6qZ8/hWqhidvRh5GwijsYj2j3CJy2qeFv/G5mtSliV0L4iZ6hSWQ0mW5cYxR/kCQ6EPDco/wQ== + dependencies: + "@gluestack-ui/hooks" "^0.1.7" + "@gluestack-ui/overlay" "^0.1.12" + "@gluestack-ui/transitions" "^0.1.10" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + +"@gluestack-ui/tooltip@^0.1.24": + version "0.1.24" + resolved "https://registry.yarnpkg.com/@gluestack-ui/tooltip/-/tooltip-0.1.24.tgz#ce6eda8ca70c54b1a8265bbb3dfb4582dc524686" + integrity sha512-wINcseB6UXMlU8OWSgc08XnFPoXfzkB4WaH3/uVhTwbsl/Nio3lx4fs2pr4AUXghA/vwSJEmpXcYlUOm0cHSLA== + dependencies: + "@gluestack-ui/hooks" "^0.1.7" + "@gluestack-ui/overlay" "^0.1.12" + "@gluestack-ui/utils" "^0.1.12" + "@react-native-aria/focus" "^0.2.9" + "@react-native-aria/interactions" "^0.2.11" + "@react-native-aria/overlays" "^0.3.10" + +"@gluestack-ui/transitions@^0.1.10": + version "0.1.10" + resolved "https://registry.yarnpkg.com/@gluestack-ui/transitions/-/transitions-0.1.10.tgz#53e563dc0030bac020437ec3493e1bcda5373bab" + integrity sha512-oOwYAmbebAowDCDZyRdGwhK2of46b642OZQxBBkln/BX7YEvY4PhQIfup0HUCG9YA5IzlQnw0iwqREbaVNKIgA== + dependencies: + "@gluestack-ui/overlay" "^0.1.7" + "@gluestack-ui/react-native-aria" "^0.1.5" + "@gluestack-ui/utils" "^0.1.9" + "@react-native-aria/focus" "^0.2.7" + +"@gluestack-ui/utils@0.1.12", "@gluestack-ui/utils@^0.1.12", "@gluestack-ui/utils@^0.1.9": + version "0.1.12" + resolved "https://registry.yarnpkg.com/@gluestack-ui/utils/-/utils-0.1.12.tgz#0bb3400c9315fb6c0fd1bc697b20d80f82cd3899" + integrity sha512-OhOkljhr7foCUJP//8LwMN3EX4/pniFWmQpk1yDJMQL9DaTJbP7s3HsnTM7UzH2kp9DR1Utoz9Y9WscH3ajLpQ== + dependencies: + "@react-native-aria/focus" "^0.2.9" + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@internationalized/date@^3.5.0": + version "3.5.0" + resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.5.0.tgz#67f1dd62355f05140cc80e324842e9bfb4553abe" + integrity sha512-nw0Q+oRkizBWMioseI8+2TeUPEyopJVz5YxoYVzR0W1v+2YytiYah7s/ot35F149q/xAg4F1gT/6eTd+tsUpFQ== + dependencies: + "@swc/helpers" "^0.5.0" + +"@internationalized/message@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@internationalized/message/-/message-3.1.1.tgz#0f29c5a239b5dcd457b55f21dcd38d1a44a1236a" + integrity sha512-ZgHxf5HAPIaR0th+w0RUD62yF6vxitjlprSxmLJ1tam7FOekqRSDELMg4Cr/DdszG5YLsp5BG3FgHgqquQZbqw== + dependencies: + "@swc/helpers" "^0.5.0" + intl-messageformat "^10.1.0" + +"@internationalized/number@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@internationalized/number/-/number-3.3.0.tgz#92233d130a0591085f93be86a9e6356cfa0e2de2" + integrity sha512-PuxgnKE5NJMOGKUcX1QROo8jq7sW7UWLrL5B6Rfe8BdWgU/be04cVvLyCeALD46vvbAv3d1mUvyHav/Q9a237g== + dependencies: + "@swc/helpers" "^0.5.0" + +"@internationalized/string@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@internationalized/string/-/string-3.1.1.tgz#2ab7372d58bbb7ffd3de62fc2a311e4690186981" + integrity sha512-fvSr6YRoVPgONiVIUhgCmIAlifMVCeej/snPZVzbzRPxGpHl3o1GRe+d/qh92D8KhgOciruDUH8I5mjdfdjzfA== + dependencies: + "@swc/helpers" "^0.5.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.6.2.tgz#bf1d4101347c23e07c029a1b1ae07d550f5cc541" + integrity sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + slash "^3.0.0" + +"@jest/core@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.6.2.tgz#6f2d1dbe8aa0265fcd4fb8082ae1952f148209c8" + integrity sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg== + dependencies: + "@jest/console" "^29.6.2" + "@jest/reporters" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.5.0" + jest-config "^29.6.2" + jest-haste-map "^29.6.2" + jest-message-util "^29.6.2" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.2" + jest-resolve-dependencies "^29.6.2" + jest-runner "^29.6.2" + jest-runtime "^29.6.2" + jest-snapshot "^29.6.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + jest-watcher "^29.6.2" + micromatch "^4.0.4" + pretty-format "^29.6.2" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/create-cache-key-function@^29.2.1": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz#793be38148fab78e65f40ae30c36785f4ad859f0" + integrity sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA== + dependencies: + "@jest/types" "^29.6.3" + +"@jest/environment@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.6.2.tgz#794c0f769d85e7553439d107d3f43186dc6874a9" + integrity sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q== + dependencies: + "@jest/fake-timers" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-mock "^29.6.2" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + +"@jest/expect-utils@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.6.2.tgz#1b97f290d0185d264dd9fdec7567a14a38a90534" + integrity sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg== + dependencies: + jest-get-type "^29.4.3" + +"@jest/expect@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.6.2.tgz#5a2ad58bb345165d9ce0a1845bbf873c480a4b28" + integrity sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg== + dependencies: + expect "^29.6.2" + jest-snapshot "^29.6.2" + +"@jest/fake-timers@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.6.2.tgz#fe9d43c5e4b1b901168fe6f46f861b3e652a2df4" + integrity sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA== + dependencies: + "@jest/types" "^29.6.1" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.6.2" + jest-mock "^29.6.2" + jest-util "^29.6.2" + +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.6.2.tgz#74af81b9249122cc46f1eb25793617eec69bf21a" + integrity sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/expect" "^29.6.2" + "@jest/types" "^29.6.1" + jest-mock "^29.6.2" + +"@jest/reporters@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.6.2.tgz#524afe1d76da33d31309c2c4a2c8062d0c48780a" + integrity sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + jest-worker "^29.6.2" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.0": + version "29.6.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.0.tgz#0f4cb2c8e3dca80c135507ba5635a4fd755b0040" + integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.0": + version "29.6.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.0.tgz#bd34a05b5737cb1a99d43e1957020ac8e5b9ddb1" + integrity sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.6.2.tgz#fdd11583cd1608e4db3114e8f0cce277bf7a32ed" + integrity sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw== + dependencies: + "@jest/console" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz#585eff07a68dd75225a7eacf319780cb9f6b9bf4" + integrity sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw== + dependencies: + "@jest/test-result" "^29.6.2" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.2" + slash "^3.0.0" + +"@jest/transform@^29.6.2": + version "29.6.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.6.2.tgz#522901ebbb211af08835bc3bcdf765ab778094e3" + integrity sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.1" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.2" + jest-regex-util "^29.4.3" + jest-util "^29.6.2" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^26.6.2": + version "26.6.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e" + integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^15.0.0" + chalk "^4.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^29.6.1": + version "29.6.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.1.tgz#ae79080278acff0a6af5eb49d063385aaa897bf2" + integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== + dependencies: + "@jest/schemas" "^29.6.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@legendapp/motion@latest": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@legendapp/motion/-/motion-2.2.1.tgz#aca8f7667cd32c490e97c9c2bc5a7b7b5f67bc88" + integrity sha512-kh9+05qHvBLPT+qR2XE+KzP5KgqLqaqE0aZ19xu5yxKp8X+JH7d9SHPj6W5yo5ttSzaPx0IqApYMtHDVk73FvQ== + dependencies: + "@legendapp/tools" "2.0.1" + +"@legendapp/tools@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@legendapp/tools/-/tools-2.0.1.tgz#995fe6cb3e2398b939f645505aa8e1abc84bd07f" + integrity sha512-Kxt0HWvWElRK6oybHRzcYxdgaKGwuaiRNreS7usW7QuHXRIHaH4yMcW2YNRG4DHE5fpefv+Bno/BohQcCE4FaA== + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz#dbf733a965ca47b1973177dc0bb6c889edcfb129" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + +"@noble/curves@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.2.0.tgz#92d7e12e4e49b23105a2555c6984d41733d65c35" + integrity sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== + dependencies: + "@noble/hashes" "1.3.2" + +"@noble/hashes@1.3.2": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@react-aria/checkbox@^3.2.1": + version "3.11.2" + resolved "https://registry.yarnpkg.com/@react-aria/checkbox/-/checkbox-3.11.2.tgz#9e1045edf282298cb8337fd3fd1d953c6cf5f667" + integrity sha512-8cgXxpc7IMJ9buw+Rbhr1xc66zNp2ePuFpjw3uWyH7S3IJEd2f5kXUDNWLXQRADJso95UlajRlJQiG4QIObEnA== + dependencies: + "@react-aria/label" "^3.7.2" + "@react-aria/toggle" "^3.8.2" + "@react-aria/utils" "^3.21.1" + "@react-stately/checkbox" "^3.5.1" + "@react-stately/toggle" "^3.6.3" + "@react-types/checkbox" "^3.5.2" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/dialog@*": + version "3.5.7" + resolved "https://registry.yarnpkg.com/@react-aria/dialog/-/dialog-3.5.7.tgz#e57eca98e95114d618d583f5cc5400bdcf1190b0" + integrity sha512-IKeBaIQBl+WYkhytyE0eISW4ApOEvCJZuw9Xq7gjlKFBlF4X6ffo8souv12KpaznK6/fp1vtEXMmy1AfejiT8Q== + dependencies: + "@react-aria/focus" "^3.14.3" + "@react-aria/overlays" "^3.18.1" + "@react-aria/utils" "^3.21.1" + "@react-stately/overlays" "^3.6.3" + "@react-types/dialog" "^3.5.6" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/focus@^3.14.3", "@react-aria/focus@^3.2.3": + version "3.14.3" + resolved "https://registry.yarnpkg.com/@react-aria/focus/-/focus-3.14.3.tgz#5e66dbf47e1d92aebf67d52b3b08d1631591f5b6" + integrity sha512-gvO/frZ7SxyfyHJYC+kRsUXnXct8hGHKlG1TwbkzCCXim9XIPKDgRzfNGuFfj0i8ZpR9xmsjOBUkHZny0uekFA== + dependencies: + "@react-aria/interactions" "^3.19.1" + "@react-aria/utils" "^3.21.1" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + clsx "^1.1.1" + +"@react-aria/i18n@^3.8.4": + version "3.8.4" + resolved "https://registry.yarnpkg.com/@react-aria/i18n/-/i18n-3.8.4.tgz#e7ecd3edcaa66ceaf9ebb1034395e021685163af" + integrity sha512-YlTJn7YJlUxds/T5dNtme551qc118NoDQhK+IgGpzcmPQ3xSnwBAQP4Zwc7wCpAU+xEwnNcsGw+L1wJd49He/A== + dependencies: + "@internationalized/date" "^3.5.0" + "@internationalized/message" "^3.1.1" + "@internationalized/number" "^3.3.0" + "@internationalized/string" "^3.1.1" + "@react-aria/ssr" "^3.8.0" + "@react-aria/utils" "^3.21.1" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/interactions@^3.19.1", "@react-aria/interactions@^3.3.2": + version "3.19.1" + resolved "https://registry.yarnpkg.com/@react-aria/interactions/-/interactions-3.19.1.tgz#b17b1f9dc84624d4222c7fa0a4fa6b4c14fe125a" + integrity sha512-2QFOvq/rJfMGEezmtYcGcJmfaD16kHKcSTLFrZ8aeBK6hYFddGVZJZk+dXf+G7iNaffa8rMt6uwzVe/malJPBA== + dependencies: + "@react-aria/ssr" "^3.8.0" + "@react-aria/utils" "^3.21.1" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/label@^3.1.1", "@react-aria/label@^3.7.2": + version "3.7.2" + resolved "https://registry.yarnpkg.com/@react-aria/label/-/label-3.7.2.tgz#6563495cad2af9262e722514e88406baede48852" + integrity sha512-rS0xQy+4RH1+JLESzLZd9H285McjNNf2kKwBhzU0CW3akjlu7gqaMKEJhX9MlpPDIVOUc2oEObGdU3UMmqa8ew== + dependencies: + "@react-aria/utils" "^3.21.1" + "@react-types/label" "^3.8.1" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/menu@^3.1.3": + version "3.11.1" + resolved "https://registry.yarnpkg.com/@react-aria/menu/-/menu-3.11.1.tgz#fb31c5533d5106c41ed73c14516ecbf74742976a" + integrity sha512-1eVVDrGnSExaL7e8IiaM9ndWTjT23rsnQGUK3p66R1Ojs8Q5rPBuJpP74rsmIpYiKOCr8WyZunjm5Fjv5KfA5Q== + dependencies: + "@react-aria/focus" "^3.14.3" + "@react-aria/i18n" "^3.8.4" + "@react-aria/interactions" "^3.19.1" + "@react-aria/overlays" "^3.18.1" + "@react-aria/selection" "^3.17.1" + "@react-aria/utils" "^3.21.1" + "@react-stately/collections" "^3.10.2" + "@react-stately/menu" "^3.5.6" + "@react-stately/tree" "^3.7.3" + "@react-types/button" "^3.9.0" + "@react-types/menu" "^3.9.5" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/overlays@^3.18.1", "@react-aria/overlays@^3.7.0": + version "3.18.1" + resolved "https://registry.yarnpkg.com/@react-aria/overlays/-/overlays-3.18.1.tgz#b53093b2e1004feff155c81730e0101179cd6c47" + integrity sha512-C74eZbTp3OA/gXy9/+4iPrZiz7g27Zy6Q1+plbg5QTLpsFLBt2Ypy9jTTANNRZfW7a5NW/Bnw9WIRjCdtTBRXw== + dependencies: + "@react-aria/focus" "^3.14.3" + "@react-aria/i18n" "^3.8.4" + "@react-aria/interactions" "^3.19.1" + "@react-aria/ssr" "^3.8.0" + "@react-aria/utils" "^3.21.1" + "@react-aria/visually-hidden" "^3.8.6" + "@react-stately/overlays" "^3.6.3" + "@react-types/button" "^3.9.0" + "@react-types/overlays" "^3.8.3" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/radio@^3.1.2": + version "3.8.2" + resolved "https://registry.yarnpkg.com/@react-aria/radio/-/radio-3.8.2.tgz#318fb1bbdc67131181c03002a5d8458405239b85" + integrity sha512-j8yyGjboTgoBEQWlnJbQVvegKiUeQEUvU/kZ7ZAdj+eAL3BqfO6FO7yt6WzK7ZIBzjGS9YbesaUa3hwIjDi3LA== + dependencies: + "@react-aria/focus" "^3.14.3" + "@react-aria/i18n" "^3.8.4" + "@react-aria/interactions" "^3.19.1" + "@react-aria/label" "^3.7.2" + "@react-aria/utils" "^3.21.1" + "@react-stately/radio" "^3.9.1" + "@react-types/radio" "^3.5.2" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/selection@^3.17.1", "@react-aria/selection@^3.3.1": + version "3.17.1" + resolved "https://registry.yarnpkg.com/@react-aria/selection/-/selection-3.17.1.tgz#12df277b8806fd26093e16f6a2734bd1e6fbb3e2" + integrity sha512-g5gkSc/M+zJiVgWbUpKN095ea0D4fxdluH9ZcXxN4AAvcrVfEJyAnMmWOIKRebN8xR0KPfNRnKB7E6jld2tbuQ== + dependencies: + "@react-aria/focus" "^3.14.3" + "@react-aria/i18n" "^3.8.4" + "@react-aria/interactions" "^3.19.1" + "@react-aria/utils" "^3.21.1" + "@react-stately/collections" "^3.10.2" + "@react-stately/selection" "^3.14.0" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-aria/slider@^3.0.1": + version "3.7.2" + resolved "https://registry.yarnpkg.com/@react-aria/slider/-/slider-3.7.2.tgz#e122bbf945c5ae0f72be1c8977ef9be957c4bdbf" + integrity sha512-io7yJm2jS0gK1ILE9kjClh9zylKsOLbRy748CyD66LDV0ZIjj2D/uZF6BtfKq7Zhc2OsMvDB9+e2IkrszKe8uw== + dependencies: + "@react-aria/focus" "^3.14.3" + "@react-aria/i18n" "^3.8.4" + "@react-aria/interactions" "^3.19.1" + "@react-aria/label" "^3.7.2" + "@react-aria/utils" "^3.21.1" + "@react-stately/radio" "^3.9.1" + "@react-stately/slider" "^3.4.4" + "@react-types/radio" "^3.5.2" + "@react-types/shared" "^3.21.0" + "@react-types/slider" "^3.6.2" + "@swc/helpers" "^0.5.0" + +"@react-aria/ssr@^3.0.1", "@react-aria/ssr@^3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.8.0.tgz#e7f467ac42f72504682724304ce221f785d70d49" + integrity sha512-Y54xs483rglN5DxbwfCPHxnkvZ+gZ0LbSYmR72LyWPGft8hN/lrl1VRS1EW2SMjnkEWlj+Km2mwvA3kEHDUA0A== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-aria/toggle@^3.8.2": + version "3.8.2" + resolved "https://registry.yarnpkg.com/@react-aria/toggle/-/toggle-3.8.2.tgz#4336f0d70e33347c7bcf43f3ec4e617ce449127b" + integrity sha512-0+RmlOQtyRmU+Dd9qM9od4DPpITC7jqA+n3aZn732XtCsosz5gPGbhFuLbSdWRZ42FQgqo7pZQWaDRZpJPkipA== + dependencies: + "@react-aria/focus" "^3.14.3" + "@react-aria/interactions" "^3.19.1" + "@react-aria/utils" "^3.21.1" + "@react-stately/toggle" "^3.6.3" + "@react-types/checkbox" "^3.5.2" + "@react-types/shared" "^3.21.0" + "@react-types/switch" "^3.4.2" + "@swc/helpers" "^0.5.0" + +"@react-aria/utils@^3.21.1", "@react-aria/utils@^3.3.0", "@react-aria/utils@^3.6.0": + version "3.21.1" + resolved "https://registry.yarnpkg.com/@react-aria/utils/-/utils-3.21.1.tgz#35f5d545757ea38f05a0d2f5492f13217ebb03ce" + integrity sha512-tySfyWHXOhd/b6JSrSOl7krngEXN3N6pi1hCAXObRu3+MZlaZOMDf/j18aoteaIF2Jpv8HMWUJUJtQKGmBJGRA== + dependencies: + "@react-aria/ssr" "^3.8.0" + "@react-stately/utils" "^3.8.0" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + clsx "^1.1.1" + +"@react-aria/visually-hidden@^3.7.0", "@react-aria/visually-hidden@^3.8.1", "@react-aria/visually-hidden@^3.8.6": + version "3.8.6" + resolved "https://registry.yarnpkg.com/@react-aria/visually-hidden/-/visually-hidden-3.8.6.tgz#9b149851ac41e9c72c7819f8d4ad47ddfb45b863" + integrity sha512-6DmS/JLbK9KgU/ClK1WjwOyvpn8HtwYn+uisMLdP7HlCm692peYOkXDR1jqYbHL4GlyLCD0JLI+/xGdVh5aR/w== + dependencies: + "@react-aria/interactions" "^3.19.1" + "@react-aria/utils" "^3.21.1" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + clsx "^1.1.1" + +"@react-native-aria/accordion@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@react-native-aria/accordion/-/accordion-0.0.2.tgz#28e57f5c3690b2b33f36acd6aff7d91a75fbf384" + integrity sha512-2Wa/YDBc2aCunTLpqwxTfCwn1t63KSAIoXd0hqrUGJJF+N2bEs2Hqs9ZgyKJ/hzFxCknVPMqo0fEVE1H23Z5+g== + +"@react-native-aria/checkbox@^0.2.6": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@react-native-aria/checkbox/-/checkbox-0.2.6.tgz#80298eb1983e58d834fb9573e9082561368d60fa" + integrity sha512-is8riNMjLkdcpajcU928FwZMf6ZYmfT5+CEJH6NYmY/BoeYHri+w8UYqPIGi5+9//5nQAkpjopJx9Z7+jkEJlw== + dependencies: + "@react-aria/checkbox" "^3.2.1" + "@react-aria/utils" "^3.6.0" + "@react-native-aria/toggle" "^0.2.6" + "@react-native-aria/utils" "^0.2.10" + "@react-stately/toggle" "^3.2.1" + +"@react-native-aria/dialog@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@react-native-aria/dialog/-/dialog-0.0.3.tgz#62388983268f6a6c3a5cfa06c3eaccb996112009" + integrity sha512-EXDS2IfB6n8LlelfMZjMntuHC7e6iRTWLxrYIyHm5d2gdmRVD37dris03Zsw/iMBhb/Z8ZYKQ/O5APioN6Uovg== + dependencies: + "@react-aria/dialog" "*" + "@react-native-aria/utils" "*" + "@react-types/dialog" "*" + "@react-types/shared" "*" + +"@react-native-aria/focus@^0.2.7", "@react-native-aria/focus@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@react-native-aria/focus/-/focus-0.2.9.tgz#bdfa84f9711843df771877ac436ee3b4f8878b74" + integrity sha512-zVgOIzKwnsyyurUxlZnzUKB2ekK/cmK64sQJIKKUlkJKVxd2EAFf7Sjz/NVEoMhTODN3qGRASTv9bMk/pBzzVA== + dependencies: + "@react-aria/focus" "^3.2.3" + +"@react-native-aria/interactions@^0.2.10", "@react-native-aria/interactions@^0.2.11": + version "0.2.11" + resolved "https://registry.yarnpkg.com/@react-native-aria/interactions/-/interactions-0.2.11.tgz#033ed9675d67add72deaf6eeae02b005d0785276" + integrity sha512-qfdkD3DwYQm8UurvGLfdLFXPlU2QFdjYA0WWcDCKZD3R++rkpnFthExdws7kmsF1riKTaYcIN/R1MPTM4KZrsA== + dependencies: + "@react-aria/interactions" "^3.3.2" + "@react-aria/utils" "^3.6.0" + "@react-native-aria/utils" "^0.2.10" + +"@react-native-aria/menu@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@react-native-aria/menu/-/menu-0.2.9.tgz#363765807b5cfe4695e810752142f16f6ec0b7de" + integrity sha512-Sac2wGHhrH032bmtqoz0gWqAnLV7DXteuJMIMbBL+wP1UE+m5ns1APZB6BOLfH0A62SDgAiboco1/fZOicT/Dg== + dependencies: + "@react-aria/interactions" "^3.3.2" + "@react-aria/menu" "^3.1.3" + "@react-aria/selection" "^3.3.1" + "@react-aria/utils" "^3.6.0" + "@react-native-aria/interactions" "^0.2.11" + "@react-native-aria/overlays" "^0.3.10" + "@react-native-aria/utils" "^0.2.10" + "@react-stately/collections" "^3.3.0" + "@react-stately/menu" "^3.2.1" + "@react-stately/tree" "^3.1.2" + "@react-types/menu" "^3.1.1" + +"@react-native-aria/overlays@^0.3.10": + version "0.3.10" + resolved "https://registry.yarnpkg.com/@react-native-aria/overlays/-/overlays-0.3.10.tgz#8123935f67acb3ab86b7cd3e947c0ba756f28dd3" + integrity sha512-x4+b+RblNe0hwlPFR6qzcmNixqB5/1b5xcN33IP6/BR6F04zHlsmWpHT5PT1qiYQPXLekqw6HGiWp3MC3ItsOw== + dependencies: + "@react-aria/interactions" "^3.3.2" + "@react-aria/overlays" "^3.7.0" + "@react-native-aria/utils" "^0.2.10" + "@react-stately/overlays" "^3.1.1" + "@react-types/overlays" "^3.4.0" + dom-helpers "^5.0.0" + +"@react-native-aria/radio@^0.2.7": + version "0.2.7" + resolved "https://registry.yarnpkg.com/@react-native-aria/radio/-/radio-0.2.7.tgz#162d59b75c18d01871973d5d8e28a965fd584346" + integrity sha512-wps3AtqPLL7UniS7ubkrP/qSZiaXC6elMVNA9Wr2ngyLjHJQb31an3MocDyD2tijLlH4zO+ExzOS7iz7wEYrJw== + dependencies: + "@react-aria/radio" "^3.1.2" + "@react-aria/utils" "^3.6.0" + "@react-native-aria/interactions" "^0.2.11" + "@react-native-aria/utils" "^0.2.10" + "@react-stately/radio" "^3.2.1" + "@react-types/radio" "^3.1.1" + +"@react-native-aria/slider@^0.2.10": + version "0.2.10" + resolved "https://registry.yarnpkg.com/@react-native-aria/slider/-/slider-0.2.10.tgz#19cd79ac4481f41a744b4be5a179f9940e61670e" + integrity sha512-flwv/kKHrYmUqgMRO81VsZUccs9tf6dd9Z8SAerkVVj8BrJfVQ/Tb9cABaNsWHxIMUgtfKn0cMQYxLeySjjisw== + dependencies: + "@react-aria/focus" "^3.2.3" + "@react-aria/interactions" "^3.3.2" + "@react-aria/label" "^3.1.1" + "@react-aria/slider" "^3.0.1" + "@react-aria/utils" "^3.6.0" + "@react-native-aria/utils" "^0.2.10" + "@react-stately/slider" "^3.0.1" + +"@react-native-aria/toggle@^0.2.6": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@react-native-aria/toggle/-/toggle-0.2.6.tgz#916832079a551d57bbc5842a09884700a2925579" + integrity sha512-uqsoh3ISY3yVh6HBH6jklrZ9eZgLqZ2A8s3XhxLGZIZV3SbhSP0LwwjTOqRIMXK12lvHixWneObD0GpR4i7v+g== + dependencies: + "@react-aria/focus" "^3.2.3" + "@react-aria/utils" "^3.6.0" + "@react-native-aria/interactions" "^0.2.11" + "@react-native-aria/utils" "^0.2.10" + "@react-stately/toggle" "^3.2.1" + "@react-types/checkbox" "^3.2.1" + +"@react-native-aria/utils@*", "@react-native-aria/utils@^0.2.10": + version "0.2.10" + resolved "https://registry.yarnpkg.com/@react-native-aria/utils/-/utils-0.2.10.tgz#818c8940fb97850c0aff6ac4ae3004ccb1dff432" + integrity sha512-jaXMt9NEuLtOIWeHzOupVROVcNT9aZHhvHDMzoXzmWZ47/FUrAykXtilCpOiKTxYbcwuWKCvpDVjd/syoPyuYQ== + dependencies: + "@react-aria/ssr" "^3.0.1" + "@react-aria/utils" "^3.3.0" + +"@react-native-community/cli-clean@11.3.5": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-11.3.5.tgz#07c8a01e433ea6c6e32eb647908be48952888cdd" + integrity sha512-1+7BU962wKkIkHRp/uW3jYbQKKGtU7L+R3g59D8K6uLccuxJYUBJv18753ojMa6SD3SAq5Xh31bAre+YwVcOTA== + dependencies: + "@react-native-community/cli-tools" "11.3.5" + chalk "^4.1.2" + execa "^5.0.0" + prompts "^2.4.0" + +"@react-native-community/cli-config@11.3.5": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-11.3.5.tgz#07e48bb6cdecaa2aafa20da9888b5f35383a4382" + integrity sha512-fMblIsHlUleKfGsgWyjFJYfx1SqrsnhS/QXfA8w7iT6GrNOOjBp5UWx8+xlMDFcmOb9e42g1ExFDKl3n8FWkxQ== + dependencies: + "@react-native-community/cli-tools" "11.3.5" + chalk "^4.1.2" + cosmiconfig "^5.1.0" + deepmerge "^4.3.0" + glob "^7.1.3" + joi "^17.2.1" + +"@react-native-community/cli-debugger-ui@11.3.5": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.5.tgz#0dbb27759b9f6e4ca8cfcaab4fabfe349f765356" + integrity sha512-o5JVCKEpPUXMX4r3p1cYjiy3FgdOEkezZcQ6owWEae2dYvV19lLYyJwnocm9Y7aG9PvpgI3PIMVh3KZbhS21eA== + dependencies: + serve-static "^1.13.1" + +"@react-native-community/cli-doctor@11.3.5": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-11.3.5.tgz#f11e0651c53e0b58487837a272af725f046a5842" + integrity sha512-+4BuFHjoV4FFjX5y60l0s6nS0agidb1izTVwsFixeFKW73LUkOLu+Ae5HI94RAFEPE4ePEVNgYX3FynIau6K0g== + dependencies: + "@react-native-community/cli-config" "11.3.5" + "@react-native-community/cli-platform-android" "11.3.5" + "@react-native-community/cli-platform-ios" "11.3.5" + "@react-native-community/cli-tools" "11.3.5" + chalk "^4.1.2" + command-exists "^1.2.8" + envinfo "^7.7.2" + execa "^5.0.0" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + node-stream-zip "^1.9.1" + ora "^5.4.1" + prompts "^2.4.0" + semver "^6.3.0" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" + yaml "^2.2.1" + +"@react-native-community/cli-hermes@11.3.5": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-11.3.5.tgz#fb557790a34f4354fa7a91b02217cdded26cafc4" + integrity sha512-+3m34hiaJpFel8BlJE7kJOaPzWR/8U8APZG2LXojbAdBAg99EGmQcwXIgsSVJFvH8h/nezf4DHbsPKigIe33zA== + dependencies: + "@react-native-community/cli-platform-android" "11.3.5" + "@react-native-community/cli-tools" "11.3.5" + chalk "^4.1.2" + hermes-profile-transformer "^0.0.6" + ip "^1.1.5" + +"@react-native-community/cli-platform-android@11.3.5": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.5.tgz#8be7ef382a3182fe63a698ed2edd4d90ab19246a" + integrity sha512-s4Lj7FKxJ/BofGi/ifjPfrA9MjFwIgYpHnHBSlqtbsvPoSYzmVCU2qlWM8fb3AmkXIwyYt4A6MEr3MmNT2UoBg== + dependencies: + "@react-native-community/cli-tools" "11.3.5" + chalk "^4.1.2" + execa "^5.0.0" + glob "^7.1.3" + logkitty "^0.7.1" + +"@react-native-community/cli-platform-ios@11.3.5": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.5.tgz#12a8cbf2638400b9986709466653ce4e7c9eca2a" + integrity sha512-ytJC/YCFD7P+KuQHOT5Jzh1ho2XbJEjq71yHa1gJP2PG/Q/uB4h1x2XpxDqv5iXU6E250yjvKMmkReKTW4CTig== + dependencies: + "@react-native-community/cli-tools" "11.3.5" + chalk "^4.1.2" + execa "^5.0.0" + fast-xml-parser "^4.0.12" + glob "^7.1.3" + ora "^5.4.1" + +"@react-native-community/cli-plugin-metro@11.3.5": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.5.tgz#5614c7ef3bc83cf70bcb0e6d988ab9d84a76008a" + integrity sha512-r9AekfeLKdblB7LfWB71IrNy1XM03WrByQlUQajUOZAP2NmUUBLl9pMZscPjJeOSgLpHB9ixEFTIOhTabri/qg== + dependencies: + "@react-native-community/cli-server-api" "11.3.5" + "@react-native-community/cli-tools" "11.3.5" + chalk "^4.1.2" + execa "^5.0.0" + metro "0.76.7" + metro-config "0.76.7" + metro-core "0.76.7" + metro-react-native-babel-transformer "0.76.7" + metro-resolver "0.76.7" + metro-runtime "0.76.7" + readline "^1.3.0" + +"@react-native-community/cli-server-api@11.3.5": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-11.3.5.tgz#6f43f5844bd1eb73166546b8fa8bfd32064b21e7" + integrity sha512-PM/jF13uD1eAKuC84lntNuM5ZvJAtyb+H896P1dBIXa9boPLa3KejfUvNVoyOUJ5s8Ht25JKbc3yieV2+GMBDA== + dependencies: + "@react-native-community/cli-debugger-ui" "11.3.5" + "@react-native-community/cli-tools" "11.3.5" + compression "^1.7.1" + connect "^3.6.5" + errorhandler "^1.5.1" + nocache "^3.0.1" + pretty-format "^26.6.2" + serve-static "^1.13.1" + ws "^7.5.1" + +"@react-native-community/cli-tools@11.3.5": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-11.3.5.tgz#3f9d23a4c961d963f85c254718636db8a5fa3bce" + integrity sha512-zDklE1+ah/zL4BLxut5XbzqCj9KTHzbYBKX7//cXw2/0TpkNCaY9c+iKx//gZ5m7U1OKbb86Fm2b0AKtKVRf6Q== + dependencies: + appdirsjs "^1.2.4" + chalk "^4.1.2" + find-up "^5.0.0" + mime "^2.4.1" + node-fetch "^2.6.0" + open "^6.2.0" + ora "^5.4.1" + semver "^6.3.0" + shell-quote "^1.7.3" + +"@react-native-community/cli-types@11.3.5": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-11.3.5.tgz#9051205e164d5585f1ae3869a3b3ca1f2f43b9ba" + integrity sha512-pf0kdWMEfPSV/+8rcViDCFzbLMtWIHMZ8ay7hKwqaoWegsJ0oprSF2tSTH+LSC/7X1Beb9ssIvHj1m5C4es5Xg== + dependencies: + joi "^17.2.1" + +"@react-native-community/cli@11.3.5": + version "11.3.5" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-11.3.5.tgz#18ac20ba96182662cf1088cbed20b6065935ddba" + integrity sha512-wMXgKEWe6uesw7vyXKKjx5EDRog0QdXHxdgRguG14AjQRao1+4gXEWq2yyExOTi/GDY6dfJBUGTCwGQxhnk/Lg== + dependencies: + "@react-native-community/cli-clean" "11.3.5" + "@react-native-community/cli-config" "11.3.5" + "@react-native-community/cli-debugger-ui" "11.3.5" + "@react-native-community/cli-doctor" "11.3.5" + "@react-native-community/cli-hermes" "11.3.5" + "@react-native-community/cli-plugin-metro" "11.3.5" + "@react-native-community/cli-server-api" "11.3.5" + "@react-native-community/cli-tools" "11.3.5" + "@react-native-community/cli-types" "11.3.5" + chalk "^4.1.2" + commander "^9.4.1" + execa "^5.0.0" + find-up "^4.1.0" + fs-extra "^8.1.0" + graceful-fs "^4.1.3" + prompts "^2.4.0" + semver "^6.3.0" + +"@react-native/assets-registry@^0.72.0": + version "0.72.0" + resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.72.0.tgz#c82a76a1d86ec0c3907be76f7faf97a32bbed05d" + integrity sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ== + +"@react-native/codegen@^0.72.6": + version "0.72.8" + resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.72.8.tgz#0593f628e1310f430450a9479fbb4be35e7b63d6" + integrity sha512-jQCcBlXV7B7ap5VlHhwIPieYz89yiRgwd2FPUBu+unz+kcJ6pAiB2U8RdLDmyIs8fiWd+Vq1xxaWs4TR329/ng== + dependencies: + "@babel/parser" "^7.20.0" + flow-parser "^0.206.0" + glob "^7.1.1" + invariant "^2.2.4" + jscodeshift "^0.14.0" + mkdirp "^0.5.1" + nullthrows "^1.1.1" + +"@react-native/eslint-config@^0.72.2": + version "0.72.2" + resolved "https://registry.yarnpkg.com/@react-native/eslint-config/-/eslint-config-0.72.2.tgz#31da4cec65ad2805d4db9fdda138452821d72133" + integrity sha512-rAYuQQXzi63W7+9Pu/+23od/b/lTSzHjMFibum3sKgdG2LIyvhoMEWQ5+Chu7TqebqYy1b9SDn/KEMHvpWFtNg== + dependencies: + "@babel/core" "^7.20.0" + "@babel/eslint-parser" "^7.20.0" + "@react-native/eslint-plugin" "^0.72.0" + "@typescript-eslint/eslint-plugin" "^5.30.5" + "@typescript-eslint/parser" "^5.30.5" + eslint-config-prettier "^8.5.0" + eslint-plugin-eslint-comments "^3.2.0" + eslint-plugin-ft-flow "^2.0.1" + eslint-plugin-jest "^26.5.3" + eslint-plugin-prettier "^4.2.1" + eslint-plugin-react "^7.30.1" + eslint-plugin-react-hooks "^4.6.0" + eslint-plugin-react-native "^4.0.0" + +"@react-native/eslint-plugin@^0.72.0": + version "0.72.0" + resolved "https://registry.yarnpkg.com/@react-native/eslint-plugin/-/eslint-plugin-0.72.0.tgz#7ec4c6a73dfde4bd6b4a4d3c462cfdc2637bf91d" + integrity sha512-xWQthnyKd+H22TBqeJUTFebsyWAAwzUb7EQCT8F/WMZsS1sv5UG+2cM/cU9/2HEbVZgxHYuLIi915WznjKPvlg== + +"@react-native/gradle-plugin@^0.72.11": + version "0.72.11" + resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.72.11.tgz#c063ef12778706611de7a1e42b74b14d9405fb9f" + integrity sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw== + +"@react-native/js-polyfills@^0.72.1": + version "0.72.1" + resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.72.1.tgz#905343ef0c51256f128256330fccbdb35b922291" + integrity sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA== + +"@react-native/metro-config@^0.72.9": + version "0.72.9" + resolved "https://registry.yarnpkg.com/@react-native/metro-config/-/metro-config-0.72.9.tgz#bc103c7b5be0e6db179baab3f57096565557a039" + integrity sha512-5MGmyDnXPeprRuvgPGE4LZ+e+ovofSd5YY6nFDwg6wbjRGOkeCRRlaTlQT+fjmv+zr4vYG+MUTKBlaO+fui/vA== + dependencies: + "@react-native/js-polyfills" "^0.72.1" + metro-config "0.76.7" + metro-react-native-babel-transformer "0.76.7" + metro-runtime "0.76.7" + +"@react-native/normalize-colors@*": + version "0.74.1" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.1.tgz#6e8ccf99954728dcd3cfe0d56e758ee5050a7bea" + integrity sha512-r+bTRs6pImqE3fx4h7bPzH2sOWSrnSHF/RJ7d00pNUj2P6ws3DdhS7WV+/7YosZkloYQfkiIkK3pIHvcYn665w== + +"@react-native/normalize-colors@^0.72.0": + version "0.72.0" + resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.72.0.tgz#14294b7ed3c1d92176d2a00df48456e8d7d62212" + integrity sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw== + +"@react-native/virtualized-lists@^0.72.6": + version "0.72.8" + resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz#a2c6a91ea0f1d40eb5a122fb063daedb92ed1dc3" + integrity sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw== + dependencies: + invariant "^2.2.4" + nullthrows "^1.1.1" + +"@react-stately/calendar@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@react-stately/calendar/-/calendar-3.4.1.tgz#8982ca015c81f35154a23fb26a514a08f9b041a5" + integrity sha512-XKCdrXNA7/ukZ842EeDZfLqYUQDv/x5RoAVkzTbp++3U/MLM1XZXsqj+5xVlQfJiWpQzM9L6ySjxzzgepJDeuw== + dependencies: + "@internationalized/date" "^3.5.0" + "@react-stately/utils" "^3.8.0" + "@react-types/calendar" "^3.4.1" + "@react-types/datepicker" "^3.6.1" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/checkbox@^3.4.2", "@react-stately/checkbox@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@react-stately/checkbox/-/checkbox-3.5.1.tgz#a6f6ad01852aded85f4baa7c3e97e44d2c47a607" + integrity sha512-j+EbHpZgS8J2LbysbVDK3vQAJc7YZHOjHRX20auEzVmulAFKwkRpevo/R5gEL4EpOz4bRyu+BH/jbssHXG+Ezw== + dependencies: + "@react-stately/toggle" "^3.6.3" + "@react-stately/utils" "^3.8.0" + "@react-types/checkbox" "^3.5.2" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/collections@^3.10.2", "@react-stately/collections@^3.3.0": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@react-stately/collections/-/collections-3.10.2.tgz#c739d9d596ecb744be15fde6f064ad85dd6145db" + integrity sha512-h+LzCa1gWhVRWVH8uR+ZxsKmFSx7kW3RIlcjWjhfyc59BzXCuojsOJKTTAyPVFP/3kOdJeltw8g/reV1Cw/x6Q== + dependencies: + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/combobox@^3.7.1": + version "3.7.1" + resolved "https://registry.yarnpkg.com/@react-stately/combobox/-/combobox-3.7.1.tgz#d101280d406469479ba954cabd872188634033c4" + integrity sha512-JMKsbhCgP8HpwRjHLBmJILzyU9WzWykjXyP4QF/ifmkzGRjC/s46+Ieq+WonjVaLNGCoi6XqhYn2x2RyACSbsQ== + dependencies: + "@react-stately/collections" "^3.10.2" + "@react-stately/list" "^3.10.0" + "@react-stately/menu" "^3.5.6" + "@react-stately/select" "^3.5.5" + "@react-stately/utils" "^3.8.0" + "@react-types/combobox" "^3.8.1" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/data@^3.10.3": + version "3.10.3" + resolved "https://registry.yarnpkg.com/@react-stately/data/-/data-3.10.3.tgz#4cdbb0f29489e6f74d2ae7ae032930336695eaa0" + integrity sha512-cC9mxCZU4N9GbdOB4g2/J8+W+860GvBd874to0ObSc/XOR4VbuIsxAFIabW5UwmJV+XaqqK4TUBG0C6YScXeWQ== + dependencies: + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/datepicker@^3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@react-stately/datepicker/-/datepicker-3.8.0.tgz#f87eefb4c5dec937b9d5eb101dd4407457ecd0e7" + integrity sha512-6YDSmkrRafYCWhRHks8Z2tZavM1rqSOy8GY8VYjYMCVTFpRuhPK9TQaFv2BdzZL/vJ6OGThxqoglcEwywZVq2g== + dependencies: + "@internationalized/date" "^3.5.0" + "@internationalized/string" "^3.1.1" + "@react-stately/overlays" "^3.6.3" + "@react-stately/utils" "^3.8.0" + "@react-types/datepicker" "^3.6.1" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/dnd@^3.2.5": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@react-stately/dnd/-/dnd-3.2.5.tgz#e18c9708133071df911792e85ef6edd2508b3a71" + integrity sha512-f9S+ycjAMEaz9HqGxkx4jsqo/ZS8kh0o97rxSKpGFKPZ02UMFWCr9lJI1p3hVGukiMahrmsNtoQXAvMcFAZyQQ== + dependencies: + "@react-stately/selection" "^3.14.0" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/flags@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-stately/flags/-/flags-3.0.0.tgz#c5a73965f8c90e8bf5981adddb4bdbb0ba2f5690" + integrity sha512-e3i2ItHbIa0eEwmSXAnPdD7K8syW76JjGe8ENxwFJPW/H1Pu9RJfjkCb/Mq0WSPN/TpxBb54+I9TgrGhbCoZ9w== + dependencies: + "@swc/helpers" "^0.4.14" + +"@react-stately/grid@^3.8.2": + version "3.8.2" + resolved "https://registry.yarnpkg.com/@react-stately/grid/-/grid-3.8.2.tgz#b2bd8614489a46ad7d0de13551507afd68d95de2" + integrity sha512-CB5QpYjXFatuXZodj3r0vIiqTysUe6DURZdJu6RKG2Elx19n2k49fKyx7P7CTKD2sPBOMSSX4edWuTzpL8Tl+A== + dependencies: + "@react-stately/collections" "^3.10.2" + "@react-stately/selection" "^3.14.0" + "@react-types/grid" "^3.2.2" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/list@^3.10.0": + version "3.10.0" + resolved "https://registry.yarnpkg.com/@react-stately/list/-/list-3.10.0.tgz#6b2c66778b687d8c197809059f102029a9bb5079" + integrity sha512-Yspumiln2fvzoO8AND8jNAIfBu1XPaYioeeDmsB5Vrya2EvOkzEGsauQSNBJ6Vhee1fQqpnmzH1HB0jfIKUfzg== + dependencies: + "@react-stately/collections" "^3.10.2" + "@react-stately/selection" "^3.14.0" + "@react-stately/utils" "^3.8.0" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/menu@^3.2.1", "@react-stately/menu@^3.5.6": + version "3.5.6" + resolved "https://registry.yarnpkg.com/@react-stately/menu/-/menu-3.5.6.tgz#21861b7cfba579d69272509aef8197d3fad7463a" + integrity sha512-Cm82SVda1qP71Fcz8ohIn3JYKmKCuSUIFr1WsEo/YwDPkX0x9+ev6rmphHTsxDdkCLcYHSTQL6e2KL0wAg50zA== + dependencies: + "@react-stately/overlays" "^3.6.3" + "@react-stately/utils" "^3.8.0" + "@react-types/menu" "^3.9.5" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/numberfield@^3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@react-stately/numberfield/-/numberfield-3.6.2.tgz#2102d956239721fbf629891d2de46920416492fc" + integrity sha512-li/SO3BU3RGySRNlXhPRKr161GJyNbQe6kjnj+0BFTS/ST9nxCgxFK4llHf+S+I/shNI6+0U2nAjE85QOv4emQ== + dependencies: + "@internationalized/number" "^3.3.0" + "@react-stately/utils" "^3.8.0" + "@react-types/numberfield" "^3.6.1" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/overlays@^3.1.1", "@react-stately/overlays@^3.6.3": + version "3.6.3" + resolved "https://registry.yarnpkg.com/@react-stately/overlays/-/overlays-3.6.3.tgz#cdfe5edb1ed6ad84fc1022af931586489cb23552" + integrity sha512-K3eIiYAdAGTepYqNf2pVb+lPqLoVudXwmxPhyOSZXzjgpynD6tR3E9QfWQtkMazBuU73PnNX7zkH4l87r2AmTg== + dependencies: + "@react-stately/utils" "^3.8.0" + "@react-types/overlays" "^3.8.3" + "@swc/helpers" "^0.5.0" + +"@react-stately/radio@^3.2.1", "@react-stately/radio@^3.8.1", "@react-stately/radio@^3.9.1": + version "3.9.1" + resolved "https://registry.yarnpkg.com/@react-stately/radio/-/radio-3.9.1.tgz#c43c88e2bff23d3059b0ea22191337a1d644fe0c" + integrity sha512-DrQPHiP9pz1uQbBP/NDFdO8uOZigPbvuAWPUNK7Gq6kye5lW+RsS97IUnYJePNTSMvhiAVz/aleBt05Gr/PZmg== + dependencies: + "@react-stately/utils" "^3.8.0" + "@react-types/radio" "^3.5.2" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/searchfield@^3.4.6": + version "3.4.6" + resolved "https://registry.yarnpkg.com/@react-stately/searchfield/-/searchfield-3.4.6.tgz#8d2a394fc20fec559d669e5d63c0a4d7588cb4a0" + integrity sha512-DeVacER0MD35gzQjrYpX/e3k8rjKF82W0OooTkRjeQ2U48femZkQpmp3O+j10foQx2LLaxqt9PSW7QS0Ww1bCA== + dependencies: + "@react-stately/utils" "^3.8.0" + "@react-types/searchfield" "^3.5.1" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/select@^3.5.5": + version "3.5.5" + resolved "https://registry.yarnpkg.com/@react-stately/select/-/select-3.5.5.tgz#e0b6dc9635bf46632efeba552e7ff3641c2f581f" + integrity sha512-nDkvFeAZbN7dK/Ty+mk1h4LZYYaoPpkwrG49wa67DTHkCc8Zk2+UEjhKPwOK20th4vfJKHzKjVa0Dtq4DIj0rw== + dependencies: + "@react-stately/collections" "^3.10.2" + "@react-stately/list" "^3.10.0" + "@react-stately/menu" "^3.5.6" + "@react-stately/selection" "^3.14.0" + "@react-stately/utils" "^3.8.0" + "@react-types/select" "^3.8.4" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/selection@^3.14.0": + version "3.14.0" + resolved "https://registry.yarnpkg.com/@react-stately/selection/-/selection-3.14.0.tgz#26a574bf2e35657db1988974df8bd2747b09f5c6" + integrity sha512-E5rNH+gVGDJQDSnPO30ynu6jZ0Z0++VPUbM5Bu3P/bZ3+TgoTtDDvlONba3fspgSBDfdnHpsuG9eqYnDtEAyYA== + dependencies: + "@react-stately/collections" "^3.10.2" + "@react-stately/utils" "^3.8.0" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/slider@^3.0.1", "@react-stately/slider@^3.2.4", "@react-stately/slider@^3.4.4": + version "3.4.4" + resolved "https://registry.yarnpkg.com/@react-stately/slider/-/slider-3.4.4.tgz#36a3f171077fb0e5bd7af7accdc228f5fd2fbe32" + integrity sha512-tFexbtN50zSo6e1Gi8K9MBfqgOo1eemF/VvFbde3PP9nG+ODcxEIajaYDPlMUuFw5cemJuoKo3+G5NBBn2/AjQ== + dependencies: + "@react-aria/i18n" "^3.8.4" + "@react-aria/utils" "^3.21.1" + "@react-stately/utils" "^3.8.0" + "@react-types/shared" "^3.21.0" + "@react-types/slider" "^3.6.2" + "@swc/helpers" "^0.5.0" + +"@react-stately/table@^3.11.2": + version "3.11.2" + resolved "https://registry.yarnpkg.com/@react-stately/table/-/table-3.11.2.tgz#df78442355f3dd086042ad4bf6473a2aaf31f6c1" + integrity sha512-EVgksPAsnEoqeT+5ej4aGJdu9kAu3LCDqQfnmif2P/R1BP5eDU1Kv0N/mV/90Xp546g7kuZ1wS2if/hWDXEA5g== + dependencies: + "@react-stately/collections" "^3.10.2" + "@react-stately/flags" "^3.0.0" + "@react-stately/grid" "^3.8.2" + "@react-stately/selection" "^3.14.0" + "@react-stately/utils" "^3.8.0" + "@react-types/grid" "^3.2.2" + "@react-types/shared" "^3.21.0" + "@react-types/table" "^3.9.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/tabs@^3.6.1": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@react-stately/tabs/-/tabs-3.6.1.tgz#61c010c82ba0d6fde7804245742e0569d6b9eafd" + integrity sha512-akGmejEaXg2RMZuWbRZ0W1MLr515e0uV0iVZefKBlcHtD/mK9K9Bo2XxBScf0TIhaPJ6Qa2w2k2+V7RmT7r8Ag== + dependencies: + "@react-stately/list" "^3.10.0" + "@react-stately/utils" "^3.8.0" + "@react-types/shared" "^3.21.0" + "@react-types/tabs" "^3.3.3" + "@swc/helpers" "^0.5.0" + +"@react-stately/toggle@^3.2.1", "@react-stately/toggle@^3.4.4", "@react-stately/toggle@^3.6.3": + version "3.6.3" + resolved "https://registry.yarnpkg.com/@react-stately/toggle/-/toggle-3.6.3.tgz#4de25fd458890e37f6c363d058b018e5f11a9882" + integrity sha512-4kIMTjRjtaapFk4NVmBoFDUYfkmyqDaYAmHpRyEIHTDpBYn0xpxZL/MHv9WuLYa4MjJLRp0MeicuWiZ4ai7f6Q== + dependencies: + "@react-stately/utils" "^3.8.0" + "@react-types/checkbox" "^3.5.2" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/tooltip@^3.4.5": + version "3.4.5" + resolved "https://registry.yarnpkg.com/@react-stately/tooltip/-/tooltip-3.4.5.tgz#9ba147485d7d7123da91bb417d3722351e90394d" + integrity sha512-VrwQcjnrNddSulh+Zql8P8cORRnWqSPkHPqQwD/Ly91Rva3gUIy+VwnYeThbGDxRzlUv1wfN+UQraEcrgwSZ/Q== + dependencies: + "@react-stately/overlays" "^3.6.3" + "@react-stately/utils" "^3.8.0" + "@react-types/tooltip" "^3.4.5" + "@swc/helpers" "^0.5.0" + +"@react-stately/tree@^3.1.2", "@react-stately/tree@^3.7.3": + version "3.7.3" + resolved "https://registry.yarnpkg.com/@react-stately/tree/-/tree-3.7.3.tgz#d0b3da5db553e64e8f3def5bae45f765f62a3fd8" + integrity sha512-wB/68qetgCYTe7OMqbTFmtWRrEqVdIH2VlACPCsMlECr3lW9TrrbrOwlHIJfLhkxWvY3kSCoKcOJ5KTiJC9LGA== + dependencies: + "@react-stately/collections" "^3.10.2" + "@react-stately/selection" "^3.14.0" + "@react-stately/utils" "^3.8.0" + "@react-types/shared" "^3.21.0" + "@swc/helpers" "^0.5.0" + +"@react-stately/utils@^3.6.0", "@react-stately/utils@^3.8.0": + version "3.8.0" + resolved "https://registry.yarnpkg.com/@react-stately/utils/-/utils-3.8.0.tgz#88a45742c58bde804f6cbecb20ea3833915cfdf0" + integrity sha512-wCIoFDbt/uwNkWIBF+xV+21k8Z8Sj5qGO3uptTcVmjYcZngOaGGyB4NkiuZhmhG70Pkv+yVrRwoC1+4oav9cCg== + dependencies: + "@swc/helpers" "^0.5.0" + +"@react-types/button@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-types/button/-/button-3.9.0.tgz#66df80cafaa98aaa34c331e927d21fdf4a0bdc4a" + integrity sha512-YhbchUDB7yL88ZFA0Zqod6qOMdzCLD5yVRmhWymk0yNLvB7EB1XX4c5sRANalfZSFP0RpCTlkjB05Hzp4+xOYg== + dependencies: + "@react-types/shared" "^3.21.0" + +"@react-types/calendar@^3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@react-types/calendar/-/calendar-3.4.1.tgz#fa12696b3aae5247b3b1dcf747cbc2c5d5d7c30c" + integrity sha512-tiCkHi6IQtYcVoAESG79eUBWDXoo8NImo+Mj8WAWpo1lOA3SV1W2PpeXkoRNqtloilQ0aYcmsaJJUhciQG4ndg== + dependencies: + "@internationalized/date" "^3.5.0" + "@react-types/shared" "^3.21.0" + +"@react-types/checkbox@^3.2.1", "@react-types/checkbox@^3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@react-types/checkbox/-/checkbox-3.5.2.tgz#f463befdd37bc2c9e5c6febd62e53131e8983fa4" + integrity sha512-iRQrbY8vRRya3bt3i7sHAifhP/ozfkly1/TItkRK5MNPRNPRDKns55D8ZFkRMj4NSyKQpjVt1zzlBXrnSOxWdQ== + dependencies: + "@react-types/shared" "^3.21.0" + +"@react-types/combobox@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@react-types/combobox/-/combobox-3.8.1.tgz#ac9c7abcdde708b09fae78b0dd6d88993f6a8177" + integrity sha512-F910tk8K5qE0TksJ9LRGcJIpaPzpsCnFxT6E9oJH3ssK4N8qZL8QfT9tIKo2XWhK9Uxb/tIZOGQwA8Cn7TyZrA== + dependencies: + "@react-types/shared" "^3.21.0" + +"@react-types/datepicker@^3.6.1": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@react-types/datepicker/-/datepicker-3.6.1.tgz#07debffdd611da13f6926266687c22b92624b7ab" + integrity sha512-/M+0e9hL9w98f5k4EoxeH2UfPsUPoS6fvmFsmwUZJcDiw7wP510XngnDLy9GOHj9xgqagZ20S79cxcEuTq7U6g== + dependencies: + "@internationalized/date" "^3.5.0" + "@react-types/calendar" "^3.4.1" + "@react-types/overlays" "^3.8.3" + "@react-types/shared" "^3.21.0" + +"@react-types/dialog@*", "@react-types/dialog@^3.5.6": + version "3.5.6" + resolved "https://registry.yarnpkg.com/@react-types/dialog/-/dialog-3.5.6.tgz#e874f0896d595e5a7f5924165b0db78e5f62fe9d" + integrity sha512-lwwaAgoi4xe4eEJxBns+cBIRstIPTKWWddMkp51r7Teeh2uKs1Wki7N+Acb9CfT6JQTQDqtVJm6K76rcqNBVwg== + dependencies: + "@react-types/overlays" "^3.8.3" + "@react-types/shared" "^3.21.0" + +"@react-types/grid@^3.2.2": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@react-types/grid/-/grid-3.2.2.tgz#9434d8ed0a80a64e38b2c95f8bbccfa794fd3888" + integrity sha512-R4USOpn1xfsWVGwZsakRlIdsBA10XNCnAUcRXQTn2JmzLjDCtcln6uYo9IFob080lQuvjkSw3j4zkw7Yo4Qepg== + dependencies: + "@react-types/shared" "^3.21.0" + +"@react-types/label@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@react-types/label/-/label-3.8.1.tgz#b076a0fb955051307bfa3fed7e18ce0dc76d8c7b" + integrity sha512-fA6zMTF2TmfU7H8JBJi0pNd8t5Ak4gO+ZA3cZBysf8r3EmdAsgr3LLqFaGTnZzPH1Fux6c7ARI3qjVpyNiejZQ== + dependencies: + "@react-types/shared" "^3.21.0" + +"@react-types/menu@^3.1.1", "@react-types/menu@^3.9.5": + version "3.9.5" + resolved "https://registry.yarnpkg.com/@react-types/menu/-/menu-3.9.5.tgz#9f67aebda9f491f0e94e2de7a15898c6cabf0772" + integrity sha512-KB5lJM0p9PxwpVlHV9sRdpjh+sqINeHrJgGizy/cQI9bj26nupiEgamSD14dULNI6BFT9DkgKCsobBtE04DDKQ== + dependencies: + "@react-types/overlays" "^3.8.3" + "@react-types/shared" "^3.21.0" + +"@react-types/numberfield@^3.6.1": + version "3.6.1" + resolved "https://registry.yarnpkg.com/@react-types/numberfield/-/numberfield-3.6.1.tgz#da13f9086181a64a7e2e39f500584bdca20097b3" + integrity sha512-jdMCN0mQ7eZkPrCKYkkG+jSjcG2VQ5P7mR9tTaCQeQK1wo+tF/8LWD+6n6dU7hH/qlU9sxVEg3U3kJ9sgNK+Hw== + dependencies: + "@react-types/shared" "^3.21.0" + +"@react-types/overlays@^3.4.0", "@react-types/overlays@^3.8.3": + version "3.8.3" + resolved "https://registry.yarnpkg.com/@react-types/overlays/-/overlays-3.8.3.tgz#47132f08ae3a115273036d98b9441a51d4a4ab09" + integrity sha512-TrCG2I2+V+TD0PGi3CqfnyU5jEzcelSGgYJQvVxsl5Vv3ri7naBLIsOjF9x66tPxhINLCPUtOze/WYRAexp8aw== + dependencies: + "@react-types/shared" "^3.21.0" + +"@react-types/radio@^3.1.1", "@react-types/radio@^3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@react-types/radio/-/radio-3.5.2.tgz#399e220e2529b2e7c93aa117d39adcca6dc24d1f" + integrity sha512-crYQ+97abd5v0Iw9X+Tt+E7KWdm5ckr4g0+Iy8byV1g6MyiBOsNtq9QT99TOzyWJPqqD8T9qZfAOk49wK7KEDg== + dependencies: + "@react-types/shared" "^3.21.0" + +"@react-types/searchfield@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@react-types/searchfield/-/searchfield-3.5.1.tgz#9e8d9b4ff16749a821cbba20e0069f5d77a8b9f2" + integrity sha512-+v9fo50JrZOfFzbdgJsW39hyTFv1gVH458nx82aidYJzQocFJniiAEl0ZhhRzbE8RijyjLleKIAY+klPeFmEaQ== + dependencies: + "@react-types/shared" "^3.21.0" + "@react-types/textfield" "^3.8.1" + +"@react-types/select@^3.8.4": + version "3.8.4" + resolved "https://registry.yarnpkg.com/@react-types/select/-/select-3.8.4.tgz#564e6d89095d736ed580a733dd8baa7fadab05bc" + integrity sha512-jHBaLiAHTcYPz52kuJpypBbR0WAA+YCZHy2HH+W8711HuTqePZCEp6QAWHK9Fw0qwSZQ052jYaWvOsgEZZ6ojQ== + dependencies: + "@react-types/shared" "^3.21.0" + +"@react-types/shared@*", "@react-types/shared@^3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@react-types/shared/-/shared-3.21.0.tgz#1af41fdf7dfbdbd33bbc1210617c43ed0d4ef20c" + integrity sha512-wJA2cUF8dP4LkuNUt9Vh2kkfiQb2NLnV2pPXxVnKJZ7d4x2/7VPccN+LYPnH8m0X3+rt50cxWuPKQmjxSsCFOg== + +"@react-types/slider@^3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@react-types/slider/-/slider-3.6.2.tgz#b401bbbd473b62edc394ac3c41ed6df329d111d4" + integrity sha512-LSvna1gpOvBxOBI5I/CYEtkAshWYwPlxE9F/jCaxCa9Q7E9xZp1hFFGY87iQ1A3vQM5SCa5PFStwOvXO7rA55w== + dependencies: + "@react-types/shared" "^3.21.0" + +"@react-types/switch@^3.4.2": + version "3.4.2" + resolved "https://registry.yarnpkg.com/@react-types/switch/-/switch-3.4.2.tgz#8c0a8f8dfcaae29ccd9409a2beaac0d31a131027" + integrity sha512-OQWpawikWhF+ET1/kE0/JeJVr6gHjkR72p/idTsT7RUJySBcehhAscbIA8iWzVWJvdFCVF2hG7uzBAJTeDMr9A== + dependencies: + "@react-types/checkbox" "^3.5.2" + "@react-types/shared" "^3.21.0" + +"@react-types/table@^3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@react-types/table/-/table-3.9.0.tgz#0053ce5b78f2214afaf7e38cdd96a57eecbd2ff9" + integrity sha512-WOLxZ3tzLA4gxRxvnsZhnnQDbh4Qe/johpHNk4coSOFOP5W8PbunPacXnbvdPkSx6rqrOIzCnYcZCtgk4gDQmg== + dependencies: + "@react-types/grid" "^3.2.2" + "@react-types/shared" "^3.21.0" + +"@react-types/tabs@^3.3.3": + version "3.3.3" + resolved "https://registry.yarnpkg.com/@react-types/tabs/-/tabs-3.3.3.tgz#8601d9cd03c6aa4cca1227df667ae8cedb58839c" + integrity sha512-Zc4g5TIwJpKS5fiT9m4dypbCr1xqtauL4wqM76fGERCAZy0FwXTH/yjzHJDYKyWFJrQNWtJ0KAhJR/ZqKDVnIw== + dependencies: + "@react-types/shared" "^3.21.0" + +"@react-types/textfield@^3.8.1": + version "3.8.1" + resolved "https://registry.yarnpkg.com/@react-types/textfield/-/textfield-3.8.1.tgz#433c82d8f696ed77b1d5e71aadc40cbe378b536c" + integrity sha512-p8Xmew9kzJd+tCM7h9LyebZHpv7SH1IE1Nu13hLCOV5cZ/tVVVCwjNGLMv4MtUpSn++H42YLJgAW9Uif+a+RHg== + dependencies: + "@react-types/shared" "^3.21.0" + +"@react-types/tooltip@^3.4.5": + version "3.4.5" + resolved "https://registry.yarnpkg.com/@react-types/tooltip/-/tooltip-3.4.5.tgz#f1edf9940bc3cde89ae9d49fda815e16f253dfd5" + integrity sha512-pv87Vlu+Pn1Titw199y5aiSuXF/GHX+fBCihi9BeePqtwYm505e/Si01BNh5ejCeXXOS4JIMuXwmGGzGVdGk6Q== + dependencies: + "@react-types/overlays" "^3.8.3" + "@react-types/shared" "^3.21.0" + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@swc/helpers@^0.4.14": + version "0.4.36" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.36.tgz#fcfff76ed52c214f357e8e9d3f37b568908072d9" + integrity sha512-5lxnyLEYFskErRPenYItLRSge5DjrJngYKdVjRSrWfza9G6KkgHEXi0vUZiyUeMU5JfXH1YnvXZzSp8ul88o2Q== + dependencies: + legacy-swc-helpers "npm:@swc/helpers@=0.4.14" + tslib "^2.4.0" + +"@swc/helpers@^0.5.0": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.3.tgz#98c6da1e196f5f08f977658b80d6bd941b5f294f" + integrity sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A== + dependencies: + tslib "^2.4.0" + +"@tsconfig/react-native@^3.0.0": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/react-native/-/react-native-3.0.2.tgz#f7db242eee4820f5a3d0edcc86c920bb7d9ec0f2" + integrity sha512-F7IoHEqf741lut4Z2K+IkWQRvXAhBiZMeY5L7BysG7Z2Z3MlIyFR+AagD8jQ/CqC1vowGnRwfLjeuwIpaeoJxA== + +"@types/babel__core@^7.1.14": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b" + integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/crypto-js@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d" + integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA== + +"@types/express-serve-static-core@^4.17.33": + version "4.17.35" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz#c95dd4424f0d32e525d23812aa8ab8e4d3906c4f" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@^4.17.17": + version "4.17.17" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/http-errors@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.1.tgz#20172f9578b225f6c7da63446f56d4ce108d5a65" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/node-forge@^1.3.3": + version "1.3.3" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.3.tgz#43de56dd6a7c01b755a64759def25033356cfe5c" + integrity sha512-SWpOXtqCNKaDO4xY+ZHrU5ih7UeEeo6frW468B/G7eJ3d9t2r9Vi/9iLHUuuvdZdv5l2yvZ10R2NlY3cV/CuWQ== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "20.4.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.5.tgz#9dc0a5cb1ccce4f7a731660935ab70b9c00a5d69" + integrity sha512-rt40Nk13II9JwQBdeYqmbn2Q6IVTA5uPhvSO+JVqdXw/6/4glI6oR9ezty/A9Hg5u7JH4OmYmuQ+XvjKm0Datg== + +"@types/node@18.15.13": + version "18.15.13" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.13.tgz#f64277c341150c979e42b00e4ac289290c9df469" + integrity sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-native-dotenv@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@types/react-native-dotenv/-/react-native-dotenv-0.2.0.tgz#32c58422a422c1adf68acce363ed791314d5a8e7" + integrity sha512-ZxX+dU/yoQc0jTk+/NWttkiuXceJyN5FpOSqDl0WynN5GDzxwH7OMruQ47qcY8llo2RD3irjvzJ9BwC8gDiq0A== + +"@types/react-test-renderer@^18.0.0": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz#7b7f69ca98821ea5501b21ba24ea7b6139da2243" + integrity sha512-C7/5FBJ3g3sqUahguGi03O79b8afNeSD6T8/GU50oQrJCU0bVCCGQHaGKUbg2Ce8VQEEqTw8/HiS6lXHHdgkdQ== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.0.24": + version "18.2.17" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.17.tgz#baa565b17ddb649c2dac85b5eaf9e9a1fe0f3b4e" + integrity sha512-u+e7OlgPPh+aryjOm5UJMX32OvB2E3QASOAqVMY6Ahs90djagxwv2ya0IctglNbNTexC12qCSMZG47KPfy1hAA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + +"@types/semver@^7.3.12": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@types/send@*": + version "0.17.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.2.tgz#3e5419ecd1e40e7405d34093f10befb43f63381a" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/strip-bom@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" + integrity sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ== + +"@types/strip-json-comments@0.0.30": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" + integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ== + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^15.0.0": + version "15.0.15" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.15.tgz#e609a2b1ef9e05d90489c2f5f45bbfb2be092158" + integrity sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^16.0.0": + version "16.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^5.30.5": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.30.5": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.10.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +accepts@^1.3.7, accepts@~1.3.5, accepts@~1.3.7, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^8.8.2, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +aes-js@4.0.0-beta.5: + version "4.0.0-beta.5" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-4.0.0-beta.5.tgz#8d2452c52adedebc3a3e28465d858c11ca315873" + integrity sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +anser@^1.4.9: + version "1.4.10" + resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" + integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-fragments@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-fragments/-/ansi-fragments-0.2.1.tgz#24409c56c4cc37817c3d7caa99d8969e2de5a05e" + integrity sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w== + dependencies: + colorette "^1.0.7" + slice-ansi "^2.0.0" + strip-ansi "^5.0.0" + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +appdirsjs@^1.2.4: + version "1.2.7" + resolved "https://registry.yarnpkg.com/appdirsjs/-/appdirsjs-1.2.7.tgz#50b4b7948a26ba6090d4aede2ae2dc2b051be3b3" + integrity sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +ast-types@0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.15.2.tgz#39ae4809393c4b16df751ee563411423e85fb49d" + integrity sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg== + dependencies: + tslib "^2.0.1" + +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@^3.2.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axios@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.3.tgz#7f50f23b3aa246eff43c54834272346c396613f4" + integrity sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + +babel-jest@^29.2.1, babel-jest@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.6.2.tgz#cada0a59e07f5acaeb11cbae7e3ba92aec9c1126" + integrity sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A== + dependencies: + "@jest/transform" "^29.6.2" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-module-resolver@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.0.tgz#2b7fc176bd55da25f516abf96015617b4f70fc73" + integrity sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q== + dependencies: + find-babel-config "^2.0.0" + glob "^8.0.3" + pkg-up "^3.1.0" + reselect "^4.1.7" + resolve "^1.22.1" + +babel-plugin-polyfill-corejs2@^0.4.4: + version "0.4.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz#8097b4cb4af5b64a1d11332b6fb72ef5e64a054c" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.2: + version "0.8.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz#b4f719d0ad9bb8e0c23e3e630c0c8ec6dd7a1c52" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.31.0" + +babel-plugin-polyfill-regenerator@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz#80d0f3e1098c080c8b5a65f41e9427af692dc326" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + +babel-plugin-transform-flow-enums@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz#d1d0cc9bdc799c850ca110d0ddc9f21b9ec3ef25" + integrity sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ== + dependencies: + "@babel/plugin-syntax-flow" "^7.12.1" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-fbjs@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz#38a14e5a7a3b285a3f3a86552d650dca5cf6111c" + integrity sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow== + dependencies: + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" + +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== + dependencies: + babel-plugin-jest-hoist "^29.5.0" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.1.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +bl@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +body-parser@^1.20.2: + version "1.20.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.2.tgz#6feb0e21c4724d06de7ff38da36dad4f57a747fd" + integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.9: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== + dependencies: + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +caller-callsite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" + integrity sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ== + dependencies: + callsites "^2.0.0" + +caller-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" + integrity sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A== + dependencies: + caller-callsite "^2.0.0" + +callsites@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" + integrity sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ== + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001503: + version "1.0.30001517" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz#90fabae294215c3495807eb24fc809e11dc2f0a8" + integrity sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA== + +chalk@^2.0.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.5.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colorette@^1.0.7: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40" + integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^9.4.1: + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + +commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.1: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect@^3.6.5: + version "3.7.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" + integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== + dependencies: + debug "2.6.9" + finalhandler "1.1.2" + parseurl "~1.3.3" + utils-merge "1.0.1" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +core-js-compat@^3.31.0: + version "3.31.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.31.1.tgz#5084ad1a46858df50ff89ace152441a63ba7aae0" + integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== + dependencies: + browserslist "^4.21.9" + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^5.0.5, cosmiconfig@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" + integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== + dependencies: + import-fresh "^2.0.0" + is-directory "^0.3.1" + js-yaml "^3.13.1" + parse-json "^4.0.0" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-js@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf" + integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw== + +css-in-js-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/css-in-js-utils/-/css-in-js-utils-3.1.0.tgz#640ae6a33646d401fc720c54fc61c42cd76ae2bb" + integrity sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A== + dependencies: + hyphenate-style-name "^1.0.3" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +dayjs@^1.8.15: + version "1.11.9" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a" + integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== + +debug@2.6.9, debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +dedent@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.2.0.tgz#32039cd75c035f684e01c4a07cb88c0ecbeb57be" + integrity sha512-i4tcg0ClgvMUSxwHpt+NHQ01ZJmAkl6eBvDNrSZG9e+oLRTCSHv0wpr/Bzjpf6CwKeIHGevE1M34Y1Axdms5VQ== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2, deepmerge@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +denodeify@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" + integrity sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +deprecated-react-native-prop-types@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-4.1.0.tgz#8ed03a64c21b7fbdd2d000957b6838d4f38d2c66" + integrity sha512-WfepZHmRbbdTvhcolb8aOKEvQdcmTMn5tKLbqbXmkBvjFjRVWAYqsXk/DBsV8TZxws8SdGHLuHaJrHSQUPRdfw== + dependencies: + "@react-native/normalize-colors" "*" + invariant "*" + prop-types "*" + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-helpers@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dotenv@^16.3.1: + version "16.3.1" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" + integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.431: + version "1.4.473" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.473.tgz#4853de13a335c70fe1f9df8d4029be54068767d1" + integrity sha512-aVfC8+440vGfl06l8HKKn8/PD5jRfSnLkTTD65EFvU46igbpQRri1gxSzW9/+TeUlwYzrXk1sw867T96zlyECA== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +entities@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +envinfo@^7.7.2: + version "7.11.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.0.tgz#c3793f44284a55ff8c82faf1ffd91bc6478ea01f" + integrity sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +errorhandler@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.1.tgz#b9ba5d17cf90744cd1e851357a6e75bf806a9a91" + integrity sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A== + dependencies: + accepts "~1.3.7" + escape-html "~1.0.3" + +es-abstract@^1.19.0, es-abstract@^1.20.4: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.1" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^8.5.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.9.0.tgz#094b6254b2804b0544f7cee535f802b6d29ee10b" + integrity sha512-+sbni7NfVXnOpnRadUA8S28AUlsZt9GjgFvABIRL9Hkn8KqNzOp+7Lw4QWtrwn20KzU3wqu1QoOj2m+7rKRqkA== + +eslint-plugin-eslint-comments@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" + integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== + dependencies: + escape-string-regexp "^1.0.5" + ignore "^5.0.5" + +eslint-plugin-ft-flow@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.3.tgz#3b3c113c41902bcbacf0e22b536debcfc3c819e8" + integrity sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg== + dependencies: + lodash "^4.17.21" + string-natural-compare "^3.0.1" + +eslint-plugin-jest@^26.5.3: + version "26.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-26.9.0.tgz#7931c31000b1c19e57dbfb71bbf71b817d1bf949" + integrity sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng== + dependencies: + "@typescript-eslint/utils" "^5.10.0" + +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react-native-globals@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz#ee1348bc2ceb912303ce6bdbd22e2f045ea86ea2" + integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g== + +eslint-plugin-react-native@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-4.0.0.tgz#eec41984abe4970bdd7c6082dff7a98a5e34d0bb" + integrity sha512-kMmdxrSY7A1WgdqaGC+rY/28rh7kBGNBRsk48ovqkQmdg5j4K+DaFmegENDzMrdLkoufKGRNkKX6bgSwQTCAxQ== + dependencies: + "@babel/traverse" "^7.7.4" + eslint-plugin-react-native-globals "^0.1.1" + +eslint-plugin-react@^7.30.1: + version "7.33.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.0.tgz#6c356fb0862fec2cd1b04426c669ea746e9b6eb3" + integrity sha512-qewL/8P34WkY8jAqdQxsiL82pDUeT7nhs8IsuXgfgnsEloKCT4miAV9N9kGtx7/KM9NH/NCGUE7Edt9iGxLXFw== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.1" + string.prototype.matchall "^4.0.8" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.0: + version "7.2.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.1.tgz#936821d3462675f25a18ac5fd88a67cc15b393bd" + integrity sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint@^8.19.0: + version "8.45.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" + integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.1.0" + "@eslint/js" "8.44.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.6.0" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +espree@^9.6.0: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0, esprima@~4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +ethers@^6.9.1: + version "6.9.1" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.9.1.tgz#4d50c77b46b6661e00f5cc6292e6bcd933fe4cba" + integrity sha512-kuV8fGd4/8Gj7wkurbsuUsm1DCG6N5gKGYdw3fnWG/7QGknhy1xtHD7kbkCWQAcbAYmzLCLqCPedS3FYncFkKQ== + dependencies: + "@adraffy/ens-normalize" "1.10.0" + "@noble/curves" "1.2.0" + "@noble/hashes" "1.3.2" + "@types/node" "18.15.13" + aes-js "4.0.0-beta.5" + tslib "2.4.0" + ws "8.5.0" + +event-target-shim@^5.0.0, event-target-shim@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.6.2.tgz#7b08e83eba18ddc4a2cf62b5f2d1918f5cd84521" + integrity sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA== + dependencies: + "@jest/expect-utils" "^29.6.2" + "@types/node" "*" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + +expo-linear-gradient@12.3.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/expo-linear-gradient/-/expo-linear-gradient-12.3.0.tgz#7abd8fedbf0138c86805aebbdfbbf5e5fa865f19" + integrity sha512-f9e+Oxe5z7fNQarTBZXilMyswlkbYWQHONVfq8MqmiEnW3h9XsxxmVJLG8uVQSQPUsbW+x1UUT/tnU6mkMWeLg== + +express@^4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fast-loops@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-loops/-/fast-loops-1.1.3.tgz#ce96adb86d07e7bf9b4822ab9c6fac9964981f75" + integrity sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g== + +fast-xml-parser@^4.0.12: + version "4.2.6" + resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.2.6.tgz#30ad37b014c16e31eec0e01fbf90a85cedb4eacf" + integrity sha512-Xo1qV++h/Y3Ng8dphjahnYe+rGHaaNdsYOBWL9Y9GCPKpNKilJtilvWkLcI9f9X2DoKTLsZsGYAls5+JL5jfLA== + dependencies: + strnum "^1.0.5" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-babel-config@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-2.0.0.tgz#a8216f825415a839d0f23f4d18338a1cc966f701" + integrity sha512-dOKT7jvF3hGzlW60Gc3ONox/0rRZ/tz7WCil0bqA1In/3I8f1BctpXahRnEKDySZqci7u+dqq93sZST9fOJpFw== + dependencies: + json5 "^2.1.1" + path-exists "^4.0.0" + +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +flow-enums-runtime@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/flow-enums-runtime/-/flow-enums-runtime-0.0.5.tgz#95884bfcc82edaf27eef7e1dd09732331cfbafbc" + integrity sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ== + +flow-parser@0.*: + version "0.213.1" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.213.1.tgz#c1916465050b165c9d8b931c02d78fe582e6c20c" + integrity sha512-l+vyZO6hrWG60DredryA8mq62fK9vxL6/RR13HA/aVLBNh9No/wEJsKI+CJqPRkF4CIRUfcJQBeaMXSKcncxUQ== + +flow-parser@^0.206.0: + version "0.206.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.206.0.tgz#f4f794f8026535278393308e01ea72f31000bfef" + integrity sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w== + +follow-redirects@^1.15.0: + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.11, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + +hermes-estree@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.12.0.tgz#8a289f9aee854854422345e6995a48613bac2ca8" + integrity sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw== + +hermes-parser@0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.12.0.tgz#114dc26697cfb41a6302c215b859b74224383773" + integrity sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw== + dependencies: + hermes-estree "0.12.0" + +hermes-profile-transformer@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz#bd0f5ecceda80dd0ddaae443469ab26fb38fc27b" + integrity sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ== + dependencies: + source-map "^0.7.3" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.0.5, ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +image-size@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-1.0.2.tgz#d778b6d0ab75b2737c1556dd631652eb963bc486" + integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== + dependencies: + queue "6.0.2" + +import-fresh@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" + integrity sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg== + dependencies: + caller-path "^2.0.0" + resolve-from "^3.0.0" + +import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inline-style-prefixer@^6.0.1: + version "6.0.4" + resolved "https://registry.yarnpkg.com/inline-style-prefixer/-/inline-style-prefixer-6.0.4.tgz#4290ed453ab0e4441583284ad86e41ad88384f44" + integrity sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg== + dependencies: + css-in-js-utils "^3.1.0" + fast-loops "^1.1.3" + +internal-slot@^1.0.3, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +intl-messageformat@^10.1.0: + version "10.5.4" + resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.5.4.tgz#7b212b083f1b354d7e282518e78057e025134af9" + integrity sha512-z+hrFdiJ/heRYlzegrdFYqU1m/KOMOVMqNilIArj+PbsuU8TNE7v4TWdQgSoxlxbT4AcZH3Op3/Fu15QTp+W1w== + dependencies: + "@formatjs/ecma402-abstract" "1.17.2" + "@formatjs/fast-memoize" "2.2.0" + "@formatjs/icu-messageformat-parser" "2.7.0" + tslib "^2.4.0" + +invariant@*, invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ip@^1.1.5: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" + integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-directory@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== + dependencies: + execa "^5.0.0" + p-limit "^3.1.0" + +jest-circus@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.6.2.tgz#1e6ffca60151ac66cad63fce34f443f6b5bb4258" + integrity sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/expect" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.6.2" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-runtime "^29.6.2" + jest-snapshot "^29.6.2" + jest-util "^29.6.2" + p-limit "^3.1.0" + pretty-format "^29.6.2" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.6.2.tgz#edb381763398d1a292cd1b636a98bfa5644b8fda" + integrity sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q== + dependencies: + "@jest/core" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/types" "^29.6.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.6.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.6.2.tgz#c68723f06b31ca5e63030686e604727d406cd7c3" + integrity sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.6.2" + "@jest/types" "^29.6.1" + babel-jest "^29.6.2" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.6.2" + jest-environment-node "^29.6.2" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.2" + jest-runner "^29.6.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.6.2" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.6.2.tgz#c36001e5543e82a0805051d3ceac32e6825c1c46" + integrity sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.6.2" + +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.6.2.tgz#c9e4b340bcbe838c73adf46b76817b15712d02ce" + integrity sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw== + dependencies: + "@jest/types" "^29.6.1" + chalk "^4.0.0" + jest-get-type "^29.4.3" + jest-util "^29.6.2" + pretty-format "^29.6.2" + +jest-environment-node@^29.2.1: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +jest-environment-node@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.6.2.tgz#a9ea2cabff39b08eca14ccb32c8ceb924c8bb1ad" + integrity sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/fake-timers" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-mock "^29.6.2" + jest-util "^29.6.2" + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + +jest-haste-map@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.6.2.tgz#298c25ea5255cfad8b723179d4295cf3a50a70d1" + integrity sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA== + dependencies: + "@jest/types" "^29.6.1" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.6.2" + jest-worker "^29.6.2" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz#e2b307fee78cab091c37858a98c7e1d73cdf5b38" + integrity sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ== + dependencies: + jest-get-type "^29.4.3" + pretty-format "^29.6.2" + +jest-matcher-utils@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz#39de0be2baca7a64eacb27291f0bd834fea3a535" + integrity sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ== + dependencies: + chalk "^4.0.0" + jest-diff "^29.6.2" + jest-get-type "^29.4.3" + pretty-format "^29.6.2" + +jest-message-util@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.6.2.tgz#af7adc2209c552f3f5ae31e77cf0a261f23dc2bb" + integrity sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.6.2" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.6.2.tgz#ef9c9b4d38c34a2ad61010a021866dad41ce5e00" + integrity sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + jest-util "^29.6.2" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^27.0.6: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== + +jest-resolve-dependencies@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz#36435269b6672c256bcc85fb384872c134cc4cf2" + integrity sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w== + dependencies: + jest-regex-util "^29.4.3" + jest-snapshot "^29.6.2" + +jest-resolve@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.6.2.tgz#f18405fe4b50159b7b6d85e81f6a524d22afb838" + integrity sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.2" + jest-pnp-resolver "^1.2.2" + jest-util "^29.6.2" + jest-validate "^29.6.2" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.6.2.tgz#89e8e32a8fef24781a7c4c49cd1cb6358ac7fc01" + integrity sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w== + dependencies: + "@jest/console" "^29.6.2" + "@jest/environment" "^29.6.2" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.6.2" + jest-haste-map "^29.6.2" + jest-leak-detector "^29.6.2" + jest-message-util "^29.6.2" + jest-resolve "^29.6.2" + jest-runtime "^29.6.2" + jest-util "^29.6.2" + jest-watcher "^29.6.2" + jest-worker "^29.6.2" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.6.2.tgz#692f25e387f982e89ab83270e684a9786248e545" + integrity sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg== + dependencies: + "@jest/environment" "^29.6.2" + "@jest/fake-timers" "^29.6.2" + "@jest/globals" "^29.6.2" + "@jest/source-map" "^29.6.0" + "@jest/test-result" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.2" + jest-message-util "^29.6.2" + jest-mock "^29.6.2" + jest-regex-util "^29.4.3" + jest-resolve "^29.6.2" + jest-snapshot "^29.6.2" + jest-util "^29.6.2" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.6.2.tgz#9b431b561a83f2bdfe041e1cab8a6becdb01af9c" + integrity sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.6.2" + "@jest/transform" "^29.6.2" + "@jest/types" "^29.6.1" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.6.2" + graceful-fs "^4.2.9" + jest-diff "^29.6.2" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.2" + jest-message-util "^29.6.2" + jest-util "^29.6.2" + natural-compare "^1.4.0" + pretty-format "^29.6.2" + semver "^7.5.3" + +jest-util@^27.2.0: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.6.2.tgz#8a052df8fff2eebe446769fd88814521a517664d" + integrity sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.2.1, jest-validate@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.6.2.tgz#25d972af35b2415b83b1373baf1a47bb266c1082" + integrity sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg== + dependencies: + "@jest/types" "^29.6.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + leven "^3.1.0" + pretty-format "^29.6.2" + +jest-watcher@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.6.2.tgz#77c224674f0620d9f6643c4cfca186d8893ca088" + integrity sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA== + dependencies: + "@jest/test-result" "^29.6.2" + "@jest/types" "^29.6.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.6.2" + string-length "^4.0.1" + +jest-worker@^27.2.0: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.6.2.tgz#682fbc4b6856ad0aa122a5403c6d048b83f3fb44" + integrity sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ== + dependencies: + "@types/node" "*" + jest-util "^29.6.2" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.2.1: + version "29.6.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.6.2.tgz#3bd55b9fd46a161b2edbdf5f1d1bd0d1eab76c42" + integrity sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg== + dependencies: + "@jest/core" "^29.6.2" + "@jest/types" "^29.6.1" + import-local "^3.0.2" + jest-cli "^29.6.2" + +joi@^17.2.1: + version "17.9.2" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" + integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +js-sha256@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" + integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsc-android@^250231.0.0: + version "250231.0.0" + resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-250231.0.0.tgz#91720f8df382a108872fa4b3f558f33ba5e95262" + integrity sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw== + +jsc-safe-url@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz#141c14fbb43791e88d5dc64e85a374575a83477a" + integrity sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q== + +jscodeshift@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/jscodeshift/-/jscodeshift-0.14.0.tgz#7542e6715d6d2e8bde0b4e883f0ccea358b46881" + integrity sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA== + dependencies: + "@babel/core" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/preset-flow" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/register" "^7.13.16" + babel-core "^7.0.0-bridge.0" + chalk "^4.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^4.0.4" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.21.0" + temp "^0.8.4" + write-file-atomic "^2.3.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.1.1, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== + optionalDependencies: + graceful-fs "^4.1.6" + +"jsx-ast-utils@^2.4.1 || ^3.0.0": + version "3.3.4" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz#b896535fed5b867650acce5a9bd4135ffc7b3bf9" + integrity sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +"legacy-swc-helpers@npm:@swc/helpers@=0.4.14": + version "0.4.14" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74" + integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw== + dependencies: + tslib "^2.4.0" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +logkitty@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/logkitty/-/logkitty-0.7.1.tgz#8e8d62f4085a826e8d38987722570234e33c6aa7" + integrity sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ== + dependencies: + ansi-fragments "^0.2.1" + dayjs "^1.8.15" + yargs "^15.1.0" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^2.0.0, make-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memoize-one@^5.0.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-5.2.1.tgz#8337aa3c4335581839ec01c3d594090cebe8f00e" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +metro-babel-transformer@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.76.7.tgz#ba620d64cbaf97d1aa14146d654a3e5d7477fc62" + integrity sha512-bgr2OFn0J4r0qoZcHrwEvccF7g9k3wdgTOgk6gmGHrtlZ1Jn3oCpklW/DfZ9PzHfjY2mQammKTc19g/EFGyOJw== + dependencies: + "@babel/core" "^7.20.0" + hermes-parser "0.12.0" + nullthrows "^1.1.1" + +metro-cache-key@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.76.7.tgz#70913f43b92b313096673c37532edd07438cb325" + integrity sha512-0pecoIzwsD/Whn/Qfa+SDMX2YyasV0ndbcgUFx7w1Ct2sLHClujdhQ4ik6mvQmsaOcnGkIyN0zcceMDjC2+BFQ== + +metro-cache@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.76.7.tgz#e49e51423fa960df4eeff9760d131f03e003a9eb" + integrity sha512-nWBMztrs5RuSxZRI7hgFgob5PhYDmxICh9FF8anm9/ito0u0vpPvRxt7sRu8fyeD2AHdXqE7kX32rWY0LiXgeg== + dependencies: + metro-core "0.76.7" + rimraf "^3.0.2" + +metro-config@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.76.7.tgz#f0fc171707523aa7d3a9311550872136880558c0" + integrity sha512-CFDyNb9bqxZemiChC/gNdXZ7OQkIwmXzkrEXivcXGbgzlt/b2juCv555GWJHyZSlorwnwJfY3uzAFu4A9iRVfg== + dependencies: + connect "^3.6.5" + cosmiconfig "^5.0.5" + jest-validate "^29.2.1" + metro "0.76.7" + metro-cache "0.76.7" + metro-core "0.76.7" + metro-runtime "0.76.7" + +metro-core@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.76.7.tgz#5d2b8bac2cde801dc22666ad7be1336d1f021b61" + integrity sha512-0b8KfrwPmwCMW+1V7ZQPkTy2tsEKZjYG9Pu1PTsu463Z9fxX7WaR0fcHFshv+J1CnQSUTwIGGjbNvj1teKe+pw== + dependencies: + lodash.throttle "^4.1.1" + metro-resolver "0.76.7" + +metro-file-map@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.76.7.tgz#0f041a4f186ac672f0188180310609c8483ffe89" + integrity sha512-s+zEkTcJ4mOJTgEE2ht4jIo1DZfeWreQR3tpT3gDV/Y/0UQ8aJBTv62dE775z0GLsWZApiblAYZsj7ZE8P06nw== + dependencies: + anymatch "^3.0.3" + debug "^2.2.0" + fb-watchman "^2.0.0" + graceful-fs "^4.2.4" + invariant "^2.2.4" + jest-regex-util "^27.0.6" + jest-util "^27.2.0" + jest-worker "^27.2.0" + micromatch "^4.0.4" + node-abort-controller "^3.1.1" + nullthrows "^1.1.1" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +metro-inspector-proxy@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.76.7.tgz#c067df25056e932002a72a4b45cf7b4b749f808e" + integrity sha512-rNZ/6edTl/1qUekAhAbaFjczMphM50/UjtxiKulo6vqvgn/Mjd9hVqDvVYfAMZXqPvlusD88n38UjVYPkruLSg== + dependencies: + connect "^3.6.5" + debug "^2.2.0" + node-fetch "^2.2.0" + ws "^7.5.1" + yargs "^17.6.2" + +metro-minify-terser@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.76.7.tgz#aefac8bb8b6b3a0fcb5ea0238623cf3e100893ff" + integrity sha512-FQiZGhIxCzhDwK4LxyPMLlq0Tsmla10X7BfNGlYFK0A5IsaVKNJbETyTzhpIwc+YFRT4GkFFwgo0V2N5vxO5HA== + dependencies: + terser "^5.15.0" + +metro-minify-uglify@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.76.7.tgz#3e0143786718dcaea4e28a724698d4f8ac199a43" + integrity sha512-FuXIU3j2uNcSvQtPrAJjYWHruPiQ+EpE++J9Z+VznQKEHcIxMMoQZAfIF2IpZSrZYfLOjVFyGMvj41jQMxV1Vw== + dependencies: + uglify-es "^3.1.9" + +metro-react-native-babel-preset@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.7.tgz#dfe15c040d0918147a8b0e9f530d558287acbb54" + integrity sha512-R25wq+VOSorAK3hc07NW0SmN8z9S/IR0Us0oGAsBcMZnsgkbOxu77Mduqf+f4is/wnWHc5+9bfiqdLnaMngiVw== + dependencies: + "@babel/core" "^7.20.0" + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.18.0" + "@babel/plugin-proposal-export-default-from" "^7.0.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0" + "@babel/plugin-proposal-numeric-separator" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.20.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-optional-chaining" "^7.20.0" + "@babel/plugin-syntax-dynamic-import" "^7.8.0" + "@babel/plugin-syntax-export-default-from" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.18.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.20.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.20.0" + "@babel/plugin-transform-flow-strip-types" "^7.20.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-react-jsx-self" "^7.0.0" + "@babel/plugin-transform-react-jsx-source" "^7.0.0" + "@babel/plugin-transform-runtime" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.5.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + "@babel/template" "^7.0.0" + babel-plugin-transform-flow-enums "^0.0.2" + react-refresh "^0.4.0" + +metro-react-native-babel-transformer@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.7.tgz#ccc7c25b49ee8a1860aafdbf48bfa5441d206f8f" + integrity sha512-W6lW3J7y/05ph3c2p3KKJNhH0IdyxdOCbQ5it7aM2MAl0SM4wgKjaV6EYv9b3rHklpV6K3qMH37UKVcjMooWiA== + dependencies: + "@babel/core" "^7.20.0" + babel-preset-fbjs "^3.4.0" + hermes-parser "0.12.0" + metro-react-native-babel-preset "0.76.7" + nullthrows "^1.1.1" + +metro-resolver@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.76.7.tgz#f00ebead64e451c060f30926ecbf4f797588df52" + integrity sha512-pC0Wgq29HHIHrwz23xxiNgylhI8Rq1V01kQaJ9Kz11zWrIdlrH0ZdnJ7GC6qA0ErROG+cXmJ0rJb8/SW1Zp2IA== + +metro-runtime@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.76.7.tgz#4d75f2dbbcd19a4f01e0d89494e140b0ba8247e4" + integrity sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug== + dependencies: + "@babel/runtime" "^7.0.0" + react-refresh "^0.4.0" + +metro-source-map@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.76.7.tgz#9a4aa3a35e1e8ffde9a74cd7ab5f49d9d4a4da14" + integrity sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w== + dependencies: + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" + invariant "^2.2.4" + metro-symbolicate "0.76.7" + nullthrows "^1.1.1" + ob1 "0.76.7" + source-map "^0.5.6" + vlq "^1.0.0" + +metro-symbolicate@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.76.7.tgz#1720e6b4ce5676935d7a8a440f25d3f16638e87a" + integrity sha512-p0zWEME5qLSL1bJb93iq+zt5fz3sfVn9xFYzca1TJIpY5MommEaS64Va87lp56O0sfEIvh4307Oaf/ZzRjuLiQ== + dependencies: + invariant "^2.2.4" + metro-source-map "0.76.7" + nullthrows "^1.1.1" + source-map "^0.5.6" + through2 "^2.0.1" + vlq "^1.0.0" + +metro-transform-plugins@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.76.7.tgz#5d5f75371706fbf5166288e43ffd36b5e5bd05bc" + integrity sha512-iSmnjVApbdivjuzb88Orb0JHvcEt5veVyFAzxiS5h0QB+zV79w6JCSqZlHCrbNOkOKBED//LqtKbFVakxllnNg== + dependencies: + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.20.0" + nullthrows "^1.1.1" + +metro-transform-worker@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.76.7.tgz#b842d5a542f1806cca401633fc002559b3e3d668" + integrity sha512-cGvELqFMVk9XTC15CMVzrCzcO6sO1lURfcbgjuuPdzaWuD11eEyocvkTX0DPiRjsvgAmicz4XYxVzgYl3MykDw== + dependencies: + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/parser" "^7.20.0" + "@babel/types" "^7.20.0" + babel-preset-fbjs "^3.4.0" + metro "0.76.7" + metro-babel-transformer "0.76.7" + metro-cache "0.76.7" + metro-cache-key "0.76.7" + metro-source-map "0.76.7" + metro-transform-plugins "0.76.7" + nullthrows "^1.1.1" + +metro@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.76.7.tgz#4885917ad28738c7d1e556630e0155f687336230" + integrity sha512-67ZGwDeumEPnrHI+pEDSKH2cx+C81Gx8Mn5qOtmGUPm/Up9Y4I1H2dJZ5n17MWzejNo0XAvPh0QL0CrlJEODVQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/core" "^7.20.0" + "@babel/generator" "^7.20.0" + "@babel/parser" "^7.20.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.20.0" + "@babel/types" "^7.20.0" + accepts "^1.3.7" + async "^3.2.2" + chalk "^4.0.0" + ci-info "^2.0.0" + connect "^3.6.5" + debug "^2.2.0" + denodeify "^1.2.1" + error-stack-parser "^2.0.6" + graceful-fs "^4.2.4" + hermes-parser "0.12.0" + image-size "^1.0.2" + invariant "^2.2.4" + jest-worker "^27.2.0" + jsc-safe-url "^0.2.2" + lodash.throttle "^4.1.1" + metro-babel-transformer "0.76.7" + metro-cache "0.76.7" + metro-cache-key "0.76.7" + metro-config "0.76.7" + metro-core "0.76.7" + metro-file-map "0.76.7" + metro-inspector-proxy "0.76.7" + metro-minify-terser "0.76.7" + metro-minify-uglify "0.76.7" + metro-react-native-babel-preset "0.76.7" + metro-resolver "0.76.7" + metro-runtime "0.76.7" + metro-source-map "0.76.7" + metro-symbolicate "0.76.7" + metro-transform-plugins "0.76.7" + metro-transform-worker "0.76.7" + mime-types "^2.1.27" + node-fetch "^2.2.0" + nullthrows "^1.1.1" + rimraf "^3.0.2" + serialize-error "^2.1.0" + source-map "^0.5.6" + strip-ansi "^6.0.0" + throat "^5.0.0" + ws "^7.5.1" + yargs "^17.6.2" + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mime@^2.4.1: + version "2.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.5.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +nocache@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/nocache/-/nocache-3.0.4.tgz#5b37a56ec6e09fc7d401dceaed2eab40c8bfdf79" + integrity sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw== + +node-abort-controller@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== + +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== + dependencies: + minimatch "^3.0.2" + +node-fetch@^2.2.0, node-fetch@^2.6.0: + version "2.6.12" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.12.tgz#02eb8e22074018e3d5a83016649d04df0e348fba" + integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.12: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +node-stream-zip@^1.9.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/node-stream-zip/-/node-stream-zip-1.15.0.tgz#158adb88ed8004c6c49a396b50a6a5de3bca33ea" + integrity sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw== + +normalize-css-color@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/normalize-css-color/-/normalize-css-color-1.0.2.tgz#02991e97cccec6623fe573afbbf0de6a1f3e9f8d" + integrity sha512-jPJ/V7Cp1UytdidsPqviKEElFQJs22hUUgK5BOPHTwOonNCk7/2qOxhhqzEajmFrWJowADFfOFh1V+aWkRfy+w== + +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + +ob1@0.76.7: + version "0.76.7" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.76.7.tgz#95b68fadafd47e7a6a0ad64cf80f3140dd6d1124" + integrity sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ== + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^6.2.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9" + integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg== + dependencies: + is-wsl "^1.1.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +p-limit@^2.0.0, p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pirates@^4.0.4, pirates@^4.0.5: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.4.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +pretty-format@^26.5.2, pretty-format@^26.6.2: + version "26.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" + integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg== + dependencies: + "@jest/types" "^26.6.2" + ansi-regex "^5.0.0" + ansi-styles "^4.0.0" + react-is "^17.0.1" + +pretty-format@^29.6.2: + version "29.6.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.6.2.tgz#3d5829261a8a4d89d8b9769064b29c50ed486a47" + integrity sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg== + dependencies: + "@jest/schemas" "^29.6.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1, prompts@^2.4.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@*, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +pure-rand@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306" + integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ== + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +queue@6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" + integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== + dependencies: + inherits "~2.0.3" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +raw-body@2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" + integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +react-devtools-core@^4.27.2: + version "4.28.5" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.28.5.tgz#c8442b91f068cdf0c899c543907f7f27d79c2508" + integrity sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA== + dependencies: + shell-quote "^1.6.1" + ws "^7" + +"react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-native-dotenv@^3.4.9: + version "3.4.9" + resolved "https://registry.yarnpkg.com/react-native-dotenv/-/react-native-dotenv-3.4.9.tgz#621c5b0c1d0c5c7f569bfe5a1d804bec7885c010" + integrity sha512-dbyd+mcy7SUzxEgmt33TRf1FGcNe6swJhXmB0unKkI49F7+pidog9kPtjxMLTAfmKA8gcN2XHQSKltGfGbGCLQ== + dependencies: + dotenv "^16.3.1" + +react-native-passport-reader@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/react-native-passport-reader/-/react-native-passport-reader-1.0.3.tgz#3242bbdb3c1ade4c050a8632cca6f11fe0edc648" + integrity sha512-v6ZENSrYVXHYkaUs5dkgDXCPJazA4QIJeG4pT/GZ3ZW5+f2ZoqXLenIw38dY1gBy/+/IoRM2YnzSlR+lF9x7Aw== + +react-native-svg@13.4.0: + version "13.4.0" + resolved "https://registry.yarnpkg.com/react-native-svg/-/react-native-svg-13.4.0.tgz#82399ba0956c454144618aa581e2d748dd3f010a" + integrity sha512-B3TwK+H0+JuRhYPzF21AgqMt4fjhCwDZ9QUtwNstT5XcslJBXC0FoTkdZo8IEb1Sv4suSqhZwlAY6lwOv3tHag== + dependencies: + css-select "^5.1.0" + css-tree "^1.1.3" + +react-native-toast-message@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/react-native-toast-message/-/react-native-toast-message-2.2.0.tgz#c53a4746b15616858a7d61c4386b92cbe9fbf911" + integrity sha512-AFti8VzUk6JvyGAlLm9/BknTNDXrrhqnUk7ak/pM7uCTxDPveAu2ekszU0on6vnUPFnG04H/QfYE2IlETqeaWw== + +react-native@0.72.3: + version "0.72.3" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.72.3.tgz#f8d85ec81c9f3592d091ec8e9ac1694956a72765" + integrity sha512-QqISi+JVmCssNP2FlQ4MWhlc4O/I00MRE1/GClvyZ8h/6kdsyk/sOirkYdZqX3+DrJfI3q+OnyMnsyaXIQ/5tQ== + dependencies: + "@jest/create-cache-key-function" "^29.2.1" + "@react-native-community/cli" "11.3.5" + "@react-native-community/cli-platform-android" "11.3.5" + "@react-native-community/cli-platform-ios" "11.3.5" + "@react-native/assets-registry" "^0.72.0" + "@react-native/codegen" "^0.72.6" + "@react-native/gradle-plugin" "^0.72.11" + "@react-native/js-polyfills" "^0.72.1" + "@react-native/normalize-colors" "^0.72.0" + "@react-native/virtualized-lists" "^0.72.6" + abort-controller "^3.0.0" + anser "^1.4.9" + base64-js "^1.1.2" + deprecated-react-native-prop-types "4.1.0" + event-target-shim "^5.0.1" + flow-enums-runtime "^0.0.5" + invariant "^2.2.4" + jest-environment-node "^29.2.1" + jsc-android "^250231.0.0" + memoize-one "^5.0.0" + metro-runtime "0.76.7" + metro-source-map "0.76.7" + mkdirp "^0.5.1" + nullthrows "^1.1.1" + pretty-format "^26.5.2" + promise "^8.3.0" + react-devtools-core "^4.27.2" + react-refresh "^0.4.0" + react-shallow-renderer "^16.15.0" + regenerator-runtime "^0.13.2" + scheduler "0.24.0-canary-efb381bbf-20230505" + stacktrace-parser "^0.1.10" + use-sync-external-store "^1.0.0" + whatwg-fetch "^3.0.0" + ws "^6.2.2" + yargs "^17.6.2" + +react-refresh@^0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.3.tgz#966f1750c191672e76e16c2efa569150cc73ab53" + integrity sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA== + +react-shallow-renderer@^16.15.0: + version "16.15.0" + resolved "https://registry.yarnpkg.com/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz#48fb2cf9b23d23cde96708fe5273a7d3446f4457" + integrity sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA== + dependencies: + object-assign "^4.1.1" + react-is "^16.12.0 || ^17.0.0 || ^18.0.0" + +react-stately@^3.21.0: + version "3.27.1" + resolved "https://registry.yarnpkg.com/react-stately/-/react-stately-3.27.1.tgz#b24992bd72da1b1632bf4f4232d87ce6913a19bd" + integrity sha512-qHhivqOpyATaWwoj3xl3IqqoEnib+dsl2vYlOz92CT5Ntm6lprF7KO+LkxdkS0SnUckdGewFM1NjCmbK7wPJgw== + dependencies: + "@react-stately/calendar" "^3.4.1" + "@react-stately/checkbox" "^3.5.1" + "@react-stately/collections" "^3.10.2" + "@react-stately/combobox" "^3.7.1" + "@react-stately/data" "^3.10.3" + "@react-stately/datepicker" "^3.8.0" + "@react-stately/dnd" "^3.2.5" + "@react-stately/list" "^3.10.0" + "@react-stately/menu" "^3.5.6" + "@react-stately/numberfield" "^3.6.2" + "@react-stately/overlays" "^3.6.3" + "@react-stately/radio" "^3.9.1" + "@react-stately/searchfield" "^3.4.6" + "@react-stately/select" "^3.5.5" + "@react-stately/selection" "^3.14.0" + "@react-stately/slider" "^3.4.4" + "@react-stately/table" "^3.11.2" + "@react-stately/tabs" "^3.6.1" + "@react-stately/toggle" "^3.6.3" + "@react-stately/tooltip" "^3.4.5" + "@react-stately/tree" "^3.7.3" + "@react-types/shared" "^3.21.0" + +react-test-renderer@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-18.2.0.tgz#1dd912bd908ff26da5b9fca4fd1c489b9523d37e" + integrity sha512-JWD+aQ0lh2gvh4NM3bBM42Kx+XybOxCpgYK7F8ugAlpaTSnWsX+39Z4XkOykGZAHrjwwTZT3x3KxswVWxHPUqA== + dependencies: + react-is "^18.2.0" + react-shallow-renderer "^16.15.0" + scheduler "^0.23.0" + +react@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-stream@~2.3.6: + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readline@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" + integrity sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg== + +recast@^0.21.0: + version "0.21.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.21.5.tgz#e8cd22bb51bcd6130e54f87955d33a2b2e57b495" + integrity sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg== + dependencies: + ast-types "0.15.2" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.2: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +reselect@^4.1.7: + version "4.1.8" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524" + integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.14.2, resolve@^1.20.0: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^1.22.1: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scheduler@0.24.0-canary-efb381bbf-20230505: + version "0.24.0-canary-efb381bbf-20230505" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz#5dddc60e29f91cd7f8b983d7ce4a99c2202d178f" + integrity sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA== + dependencies: + loose-envify "^1.1.0" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.7, semver@^7.5.3: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-2.1.0.tgz#50b679d5635cdf84667bdc8e59af4e5b81d5f60a" + integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw== + +serve-static@1.15.0, serve-static@^1.13.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.6.1, shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@^0.5.16, source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +statuses@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^5.0.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-json-comments@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + +sudo-prompt@^9.0.0: + version "9.2.1" + resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.2.1.tgz#77efb84309c9ca489527a4e749f287e6bdd52afd" + integrity sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +temp@^0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + +terser@^5.15.0: + version "5.19.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.2.tgz#bdb8017a9a4a8de4663a7983f45c506534f9234e" + integrity sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +throat@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" + integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== + +through2@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tsconfig@7: + version "7.0.0" + resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" + integrity sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw== + dependencies: + "@types/strip-bom" "^3.0.0" + "@types/strip-json-comments" "0.0.30" + strip-bom "^3.0.0" + strip-json-comments "^2.0.0" + +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.1.tgz#fd8c9a0ff42590b25703c0acb3de3d3f4ede0410" + integrity sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig== + +tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typescript@4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + +typescript@^4.9.4: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== + +uglify-es@^3.1.9: + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + dependencies: + commander "~2.13.0" + source-map "~0.6.1" + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +use-sync-external-store@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +vlq@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" + integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== + +walker@^1.0.7, walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-fetch@^3.0.0: + version "3.6.17" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz#009bbbfc122b227b74ba1ff31536b3a1a0e0e212" + integrity sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.10, which-typed-array@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^2.3.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + +ws@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== + dependencies: + async-limiter "~1.0.0" + +ws@^7, ws@^7.5.1: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^15.1.0: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^17.3.1, yargs@^17.6.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/circuits/.gitignore b/circuits/.gitignore new file mode 100644 index 00000000..1b980143 --- /dev/null +++ b/circuits/.gitignore @@ -0,0 +1,3 @@ +inputs +build +node_modules/ \ No newline at end of file diff --git a/circuits/README.md b/circuits/README.md new file mode 100644 index 00000000..6d6204a3 --- /dev/null +++ b/circuits/README.md @@ -0,0 +1,37 @@ +# Proof of Passport Circuits + +Proof of Passport circuits verify signatures of passport-emitting authorities. + +🚧 under heavy development 🚧 + +#### Requirements + +Install `circom` and `nodejs v18` + +#### Installation + +```bash +yarn +``` + +#### Build circuits (dev only, not secure) + +```bash +./scripts/build_circuit.sh +``` + +#### Build only to use the app, not for running tests (dev only, not secure) + +```bash +./scripts/build_circuit.sh app-only +``` + +#### Run tests + +```bash +yarn test +``` + +This will run tests with sample data generated on the fly. + +To run tests with your own passport data, extract your `passportData.json` using the app (available soon), place it in `inputs/`, then run `yarn test` diff --git a/circuits/circuits/helpers/LICENSE b/circuits/circuits/helpers/LICENSE new file mode 100644 index 00000000..a1c6d7a8 --- /dev/null +++ b/circuits/circuits/helpers/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 zk-email + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/circuits/circuits/helpers/bigint.circom b/circuits/circuits/helpers/bigint.circom new file mode 100644 index 00000000..092497b2 --- /dev/null +++ b/circuits/circuits/helpers/bigint.circom @@ -0,0 +1,561 @@ +pragma circom 2.1.5; + +include "../../node_modules/circomlib/circuits/comparators.circom"; +include "../../node_modules/circomlib/circuits/bitify.circom"; +include "../../node_modules/circomlib/circuits/gates.circom"; + +include "./bigint_func.circom"; + +// addition mod 2**n with carry bit +template ModSum(n) { + assert(n <= 252); + signal input a; + signal input b; + signal output sum; + signal output carry; + + component n2b = Num2Bits(n + 1); + n2b.in <== a + b; + carry <== n2b.out[n]; + sum <== a + b - carry * (1 << n); +} + +// a - b +template ModSub(n) { + assert(n <= 252); + signal input a; + signal input b; + signal output out; + signal output borrow; + component lt = LessThan(n); + lt.in[0] <== a; + lt.in[1] <== b; + borrow <== lt.out; + out <== borrow * (1 << n) + a - b; +} + +// a - b - c +// assume a - b - c + 2**n >= 0 +template ModSubThree(n) { + assert(n + 2 <= 253); + signal input a; + signal input b; + signal input c; + assert(a - b - c + (1 << n) >= 0); + signal output out; + signal output borrow; + signal b_plus_c; + b_plus_c <== b + c; + component lt = LessThan(n + 1); + lt.in[0] <== a; + lt.in[1] <== b_plus_c; + borrow <== lt.out; + out <== borrow * (1 << n) + a - b_plus_c; +} + +template ModSumThree(n) { + assert(n + 2 <= 253); + signal input a; + signal input b; + signal input c; + signal output sum; + signal output carry; + + component n2b = Num2Bits(n + 2); + n2b.in <== a + b + c; + carry <== n2b.out[n] + 2 * n2b.out[n + 1]; + sum <== a + b + c - carry * (1 << n); +} + +template ModSumFour(n) { + assert(n + 2 <= 253); + signal input a; + signal input b; + signal input c; + signal input d; + signal output sum; + signal output carry; + + component n2b = Num2Bits(n + 2); + n2b.in <== a + b + c + d; + carry <== n2b.out[n] + 2 * n2b.out[n + 1]; + sum <== a + b + c + d - carry * (1 << n); +} + +// product mod 2**n with carry +template ModProd(n) { + assert(n <= 126); + signal input a; + signal input b; + signal output prod; + signal output carry; + + component n2b = Num2Bits(2 * n); + n2b.in <== a * b; + + component b2n1 = Bits2Num(n); + component b2n2 = Bits2Num(n); + var i; + for (i = 0; i < n; i++) { + b2n1.in[i] <== n2b.out[i]; + b2n2.in[i] <== n2b.out[i + n]; + } + prod <== b2n1.out; + carry <== b2n2.out; +} + +// split a n + m bit input into two outputs +template Split(n, m) { + assert(n <= 126); + signal input in; + signal output small; + signal output big; + + small <-- in % (1 << n); + big <-- in \ (1 << n); + + component n2b_small = Num2Bits(n); + n2b_small.in <== small; + component n2b_big = Num2Bits(m); + n2b_big.in <== big; + + in === small + big * (1 << n); +} + +// split a n + m + k bit input into three outputs +template SplitThree(n, m, k) { + assert(n <= 126); + signal input in; + signal output small; + signal output medium; + signal output big; + + small <-- in % (1 << n); + medium <-- (in \ (1 << n)) % (1 << m); + big <-- in \ (1 << n + m); + + component n2b_small = Num2Bits(n); + n2b_small.in <== small; + component n2b_medium = Num2Bits(m); + n2b_medium.in <== medium; + component n2b_big = Num2Bits(k); + n2b_big.in <== big; + + in === small + medium * (1 << n) + big * (1 << n + m); +} + +// a[i], b[i] in 0... 2**n-1 +// represent a = a[0] + a[1] * 2**n + .. + a[k - 1] * 2**(n * k) +template BigAdd(n, k) { + assert(n <= 252); + signal input a[k]; + signal input b[k]; + signal output out[k + 1]; + + component unit0 = ModSum(n); + unit0.a <== a[0]; + unit0.b <== b[0]; + out[0] <== unit0.sum; + + component unit[k - 1]; + for (var i = 1; i < k; i++) { + unit[i - 1] = ModSumThree(n); + unit[i - 1].a <== a[i]; + unit[i - 1].b <== b[i]; + if (i == 1) { + unit[i - 1].c <== unit0.carry; + } else { + unit[i - 1].c <== unit[i - 2].carry; + } + out[i] <== unit[i - 1].sum; + } + out[k] <== unit[k - 2].carry; +} + +// a and b have n-bit registers +// a has ka registers, each with NONNEGATIVE ma-bit values (ma can be > n) +// b has kb registers, each with NONNEGATIVE mb-bit values (mb can be > n) +// out has ka + kb - 1 registers, each with (ma + mb + ceil(log(max(ka, kb))))-bit values +template BigMultNoCarry(n, ma, mb, ka, kb) { + assert(ma + mb <= 253); + signal input a[ka]; + signal input b[kb]; + signal output out[ka + kb - 1]; + + var prod_val[ka + kb - 1]; + for (var i = 0; i < ka + kb - 1; i++) { + prod_val[i] = 0; + } + for (var i = 0; i < ka; i++) { + for (var j = 0; j < kb; j++) { + prod_val[i + j] += a[i] * b[j]; + } + } + for (var i = 0; i < ka + kb - 1; i++) { + out[i] <-- prod_val[i]; + } + + var a_poly[ka + kb - 1]; + var b_poly[ka + kb - 1]; + var out_poly[ka + kb - 1]; + for (var i = 0; i < ka + kb - 1; i++) { + out_poly[i] = 0; + a_poly[i] = 0; + b_poly[i] = 0; + for (var j = 0; j < ka + kb - 1; j++) { + out_poly[i] = out_poly[i] + out[j] * (i ** j); + } + for (var j = 0; j < ka; j++) { + a_poly[i] = a_poly[i] + a[j] * (i ** j); + } + for (var j = 0; j < kb; j++) { + b_poly[i] = b_poly[i] + b[j] * (i ** j); + } + } + for (var i = 0; i < ka + kb - 1; i++) { + out_poly[i] === a_poly[i] * b_poly[i]; + } +} + + +// in[i] contains longs +// out[i] contains shorts +template LongToShortNoEndCarry(n, k) { + assert(n <= 126); + signal input in[k]; + signal output out[k+1]; + + var split[k][3]; + for (var i = 0; i < k; i++) { + split[i] = SplitThreeFn(in[i], n, n, n); + } + + var carry[k]; + carry[0] = 0; + out[0] <-- split[0][0]; + if (k == 1) { + out[1] <-- split[0][1]; + } + if (k > 1) { + var sumAndCarry[2] = SplitFn(split[0][1] + split[1][0], n, n); + out[1] <-- sumAndCarry[0]; + carry[1] = sumAndCarry[1]; + } + if (k == 2) { + out[2] <-- split[1][1] + split[0][2] + carry[1]; + } + if (k > 2) { + for (var i = 2; i < k; i++) { + var sumAndCarry[2] = SplitFn(split[i][0] + split[i-1][1] + split[i-2][2] + carry[i-1], n, n); + out[i] <-- sumAndCarry[0]; + carry[i] = sumAndCarry[1]; + } + out[k] <-- split[k-1][1] + split[k-2][2] + carry[k-1]; + } + + component outRangeChecks[k+1]; + for (var i = 0; i < k+1; i++) { + outRangeChecks[i] = Num2Bits(n); + outRangeChecks[i].in <== out[i]; + } + + signal runningCarry[k]; + component runningCarryRangeChecks[k]; + runningCarry[0] <-- (in[0] - out[0]) / (1 << n); + runningCarryRangeChecks[0] = Num2Bits(n + log_ceil(k)); + runningCarryRangeChecks[0].in <== runningCarry[0]; + runningCarry[0] * (1 << n) === in[0] - out[0]; + for (var i = 1; i < k; i++) { + runningCarry[i] <-- (in[i] - out[i] + runningCarry[i-1]) / (1 << n); + runningCarryRangeChecks[i] = Num2Bits(n + log_ceil(k)); + runningCarryRangeChecks[i].in <== runningCarry[i]; + runningCarry[i] * (1 << n) === in[i] - out[i] + runningCarry[i-1]; + } + runningCarry[k-1] === out[k]; +} + +template BigMult(n, k) { + signal input a[k]; + signal input b[k]; + signal output out[2 * k]; + + component mult = BigMultNoCarry(n, n, n, k, k); + for (var i = 0; i < k; i++) { + mult.a[i] <== a[i]; + mult.b[i] <== b[i]; + } + + // no carry is possible in the highest order register + component longshort = LongToShortNoEndCarry(n, 2 * k - 1); + for (var i = 0; i < 2 * k - 1; i++) { + longshort.in[i] <== mult.out[i]; + } + for (var i = 0; i < 2 * k; i++) { + out[i] <== longshort.out[i]; + } +} + +template BigLessThan(n, k){ + signal input a[k]; + signal input b[k]; + signal output out; + + component lt[k]; + component eq[k]; + for (var i = 0; i < k; i++) { + lt[i] = LessThan(n); + lt[i].in[0] <== a[i]; + lt[i].in[1] <== b[i]; + eq[i] = IsEqual(); + eq[i].in[0] <== a[i]; + eq[i].in[1] <== b[i]; + } + + // ors[i] holds (lt[k - 1] || (eq[k - 1] && lt[k - 2]) .. || (eq[k - 1] && .. && lt[i])) + // ands[i] holds (eq[k - 1] && .. && lt[i]) + // eq_ands[i] holds (eq[k - 1] && .. && eq[i]) + component ors[k - 1]; + component ands[k - 1]; + component eq_ands[k - 1]; + for (var i = k - 2; i >= 0; i--) { + ands[i] = AND(); + eq_ands[i] = AND(); + ors[i] = OR(); + + if (i == k - 2) { + ands[i].a <== eq[k - 1].out; + ands[i].b <== lt[k - 2].out; + eq_ands[i].a <== eq[k - 1].out; + eq_ands[i].b <== eq[k - 2].out; + ors[i].a <== lt[k - 1].out; + ors[i].b <== ands[i].out; + } else { + ands[i].a <== eq_ands[i + 1].out; + ands[i].b <== lt[i].out; + eq_ands[i].a <== eq_ands[i + 1].out; + eq_ands[i].b <== eq[i].out; + ors[i].a <== ors[i + 1].out; + ors[i].b <== ands[i].out; + } + } + out <== ors[0].out; +} + +template BigIsEqual(k){ + signal input in[2][k]; + signal output out; + component isEqual[k+1]; + var sum = 0; + for(var i = 0; i < k; i++){ + isEqual[i] = IsEqual(); + isEqual[i].in[0] <== in[0][i]; + isEqual[i].in[1] <== in[1][i]; + sum = sum + isEqual[i].out; + } + + isEqual[k] = IsEqual(); + isEqual[k].in[0] <== sum; + isEqual[k].in[1] <== k; + out <== isEqual[k].out; +} + +// leading register of b should be non-zero +template BigMod(n, k) { + assert(n <= 126); + signal input a[2 * k]; + signal input b[k]; + + signal output div[k + 1]; + signal output mod[k]; + + var longdiv[2][100] = long_div(n, k, k, a, b); + for (var i = 0; i < k; i++) { + div[i] <-- longdiv[0][i]; + mod[i] <-- longdiv[1][i]; + } + div[k] <-- longdiv[0][k]; + component range_checks[k + 1]; + for (var i = 0; i <= k; i++) { + range_checks[i] = Num2Bits(n); + range_checks[i].in <== div[i]; + } + + component mul = BigMult(n, k + 1); + for (var i = 0; i < k; i++) { + mul.a[i] <== div[i]; + mul.b[i] <== b[i]; + } + mul.a[k] <== div[k]; + mul.b[k] <== 0; + + component add = BigAdd(n, 2 * k + 2); + for (var i = 0; i < 2 * k; i++) { + add.a[i] <== mul.out[i]; + if (i < k) { + add.b[i] <== mod[i]; + } else { + add.b[i] <== 0; + } + } + add.a[2 * k] <== mul.out[2 * k]; + add.a[2 * k + 1] <== mul.out[2 * k + 1]; + add.b[2 * k] <== 0; + add.b[2 * k + 1] <== 0; + + for (var i = 0; i < 2 * k; i++) { + add.out[i] === a[i]; + } + add.out[2 * k] === 0; + add.out[2 * k + 1] === 0; + + component lt = BigLessThan(n, k); + for (var i = 0; i < k; i++) { + lt.a[i] <== mod[i]; + lt.b[i] <== b[i]; + } + lt.out === 1; +} + +// a[i], b[i] in 0... 2**n-1 +// represent a = a[0] + a[1] * 2**n + .. + a[k - 1] * 2**(n * k) +// assume a >= b +template BigSub(n, k) { + assert(n <= 252); + signal input a[k]; + signal input b[k]; + signal output out[k]; + signal output underflow; + + component unit0 = ModSub(n); + unit0.a <== a[0]; + unit0.b <== b[0]; + out[0] <== unit0.out; + + component unit[k - 1]; + for (var i = 1; i < k; i++) { + unit[i - 1] = ModSubThree(n); + unit[i - 1].a <== a[i]; + unit[i - 1].b <== b[i]; + if (i == 1) { + unit[i - 1].c <== unit0.borrow; + } else { + unit[i - 1].c <== unit[i - 2].borrow; + } + out[i] <== unit[i - 1].out; + } + underflow <== unit[k - 2].borrow; +} + +// calculates (a - b) % p, where a, b < p +// note: does not assume a >= b +template BigSubModP(n, k){ + assert(n <= 252); + signal input a[k]; + signal input b[k]; + signal input p[k]; + signal output out[k]; + component sub = BigSub(n, k); + for (var i = 0; i < k; i++){ + sub.a[i] <== a[i]; + sub.b[i] <== b[i]; + } + signal flag; + flag <== sub.underflow; + component add = BigAdd(n, k); + for (var i = 0; i < k; i++){ + add.a[i] <== sub.out[i]; + add.b[i] <== flag * p[i]; + } + for (var i = 0; i < k; i++){ + out[i] <== add.out[i]; + } +} + +template BigMultModP(n, k) { + assert(n <= 252); + signal input a[k]; + signal input b[k]; + signal input p[k]; + signal output out[k]; + + component big_mult = BigMult(n, k); + for (var i = 0; i < k; i++) { + big_mult.a[i] <== a[i]; + big_mult.b[i] <== b[i]; + } + component big_mod = BigMod(n, k); + for (var i = 0; i < 2 * k; i++) { + big_mod.a[i] <== big_mult.out[i]; + } + for (var i = 0; i < k; i++) { + big_mod.b[i] <== p[i]; + } + for (var i = 0; i < k; i++) { + out[i] <== big_mod.mod[i]; + } +} + +template BigModInv(n, k) { + assert(n <= 252); + signal input in[k]; + signal input p[k]; + signal output out[k]; + + // length k + var inv[100] = mod_inv(n, k, in, p); + for (var i = 0; i < k; i++) { + out[i] <-- inv[i]; + } + component range_checks[k]; + for (var i = 0; i < k; i++) { + range_checks[i] = Num2Bits(n); + range_checks[i].in <== out[i]; + } + + component mult = BigMult(n, k); + for (var i = 0; i < k; i++) { + mult.a[i] <== in[i]; + mult.b[i] <== out[i]; + } + component mod = BigMod(n, k); + for (var i = 0; i < 2 * k; i++) { + mod.a[i] <== mult.out[i]; + } + for (var i = 0; i < k; i++) { + mod.b[i] <== p[i]; + } + mod.mod[0] === 1; + for (var i = 1; i < k; i++) { + mod.mod[i] === 0; + } +} + +// in[i] contains values in the range -2^(m-1) to 2^(m-1) +// constrain that in[] as a big integer is zero +// each limbs is n bits +template CheckCarryToZero(n, m, k) { + assert(k >= 2); + + var EPSILON = 3; + + assert(m + EPSILON <= 253); + + signal input in[k]; + + signal carry[k]; + component carryRangeChecks[k]; + for (var i = 0; i < k-1; i++){ + carryRangeChecks[i] = Num2Bits(m + EPSILON - n); + if( i == 0 ){ + carry[i] <-- in[i] / (1< 10944121435919637611123202872628637544274182200208017171849102093287904247808 ? 1 : 0; +} + +function div_ceil(m, n) { + var ret = 0; + if (m % n == 0) { + ret = m \ n; + } else { + ret = m \ n + 1; + } + return ret; +} + +function log_ceil(n) { + var n_temp = n; + for (var i = 0; i < 254; i++) { + if (n_temp == 0) { + return i; + } + n_temp = n_temp \ 2; + } + return 254; +} + +function SplitFn(in, n, m) { + return [in % (1 << n), (in \ (1 << n)) % (1 << m)]; +} + +function SplitThreeFn(in, n, m, k) { + return [in % (1 << n), (in \ (1 << n)) % (1 << m), (in \ (1 << n + m)) % (1 << k)]; +} + +// m bits per overflowed register (values are potentially negative) +// n bits per properly-sized register +// in has k registers +// out has k + ceil(m/n) - 1 + 1 registers. highest-order potentially negative, +// all others are positive +// - 1 since the last register is included in the last ceil(m/n) array +// + 1 since the carries from previous registers could push you over +function getProperRepresentation(m, n, k, in) { + var ceilMN = div_ceil(m, n); + + var out[100]; // should be out[k + ceilMN] + assert(k + ceilMN < 100); + for (var i = 0; i < k; i++) { + out[i] = in[i]; + } + for (var i = k; i < 100; i++) { + out[i] = 0; + } + assert(n <= m); + for (var i = 0; i+1 < k + ceilMN; i++) { + assert((1 << m) >= out[i] && out[i] >= -(1 << m)); + var shifted_val = out[i] + (1 << m); + assert(0 <= shifted_val && shifted_val <= (1 << (m+1))); + out[i] = shifted_val & ((1 << n) - 1); + out[i+1] += (shifted_val >> n) - (1 << (m - n)); + } + + return out; +} + +// Evaluate polynomial a at point x +function poly_eval(len, a, x) { + var v = 0; + for (var i = 0; i < len; i++) { + v += a[i] * (x ** i); + } + return v; +} + +// Interpolate a degree len-1 polynomial given its evaluations at 0..len-1 +function poly_interp(len, v) { + assert(len <= 200); + var out[200]; + for (var i = 0; i < len; i++) { + out[i] = 0; + } + + // Product_{i=0..len-1} (x-i) + var full_poly[201]; + full_poly[0] = 1; + for (var i = 0; i < len; i++) { + full_poly[i+1] = 0; + for (var j = i; j >= 0; j--) { + full_poly[j+1] += full_poly[j]; + full_poly[j] *= -i; + } + } + + for (var i = 0; i < len; i++) { + var cur_v = 1; + for (var j = 0; j < len; j++) { + if (i == j) { + // do nothing + } else { + cur_v *= i-j; + } + } + cur_v = v[i] / cur_v; + + var cur_rem = full_poly[len]; + for (var j = len-1; j >= 0; j--) { + out[j] += cur_v * cur_rem; + cur_rem = full_poly[j] + i * cur_rem; + } + assert(cur_rem == 0); + } + + return out; +} + +// 1 if true, 0 if false +function long_gt(n, k, a, b) { + for (var i = k - 1; i >= 0; i--) { + if (a[i] > b[i]) { + return 1; + } + if (a[i] < b[i]) { + return 0; + } + } + return 0; +} + +// n bits per register +// a has k registers +// b has k registers +// a >= b +function long_sub(n, k, a, b) { + var diff[100]; + var borrow[100]; + for (var i = 0; i < k; i++) { + if (i == 0) { + if (a[i] >= b[i]) { + diff[i] = a[i] - b[i]; + borrow[i] = 0; + } else { + diff[i] = a[i] - b[i] + (1 << n); + borrow[i] = 1; + } + } else { + if (a[i] >= b[i] + borrow[i - 1]) { + diff[i] = a[i] - b[i] - borrow[i - 1]; + borrow[i] = 0; + } else { + diff[i] = (1 << n) + a[i] - b[i] - borrow[i - 1]; + borrow[i] = 1; + } + } + } + return diff; +} + +// a is a n-bit scalar +// b has k registers +function long_scalar_mult(n, k, a, b) { + var out[100]; + for (var i = 0; i < 100; i++) { + out[i] = 0; + } + for (var i = 0; i < k; i++) { + var temp = out[i] + (a * b[i]); + out[i] = temp % (1 << n); + out[i + 1] = out[i + 1] + temp \ (1 << n); + } + return out; +} + + +// n bits per register +// a has k + m registers +// b has k registers +// out[0] has length m + 1 -- quotient +// out[1] has length k -- remainder +// implements algorithm of https://people.eecs.berkeley.edu/~fateman/282/F%20Wright%20notes/week4.pdf +function long_div(n, k, m, a, b){ + var out[2][100]; + m += k; + while (b[k-1] == 0) { + out[1][k] = 0; + k--; + assert(k > 0); + } + m -= k; + + var remainder[200]; + for (var i = 0; i < m + k; i++) { + remainder[i] = a[i]; + } + + var mult[200]; + var dividend[200]; + for (var i = m; i >= 0; i--) { + if (i == m) { + dividend[k] = 0; + for (var j = k - 1; j >= 0; j--) { + dividend[j] = remainder[j + m]; + } + } else { + for (var j = k; j >= 0; j--) { + dividend[j] = remainder[j + i]; + } + } + + out[0][i] = short_div(n, k, dividend, b); + + var mult_shift[100] = long_scalar_mult(n, k, out[0][i], b); + var subtrahend[200]; + for (var j = 0; j < m + k; j++) { + subtrahend[j] = 0; + } + for (var j = 0; j <= k; j++) { + if (i + j < m + k) { + subtrahend[i + j] = mult_shift[j]; + } + } + remainder = long_sub(n, m + k, remainder, subtrahend); + } + for (var i = 0; i < k; i++) { + out[1][i] = remainder[i]; + } + out[1][k] = 0; + + return out; +} + +// n bits per register +// a has k + 1 registers +// b has k registers +// assumes leading digit of b is at least 2 ** (n - 1) +// 0 <= a < (2**n) * b +function short_div_norm(n, k, a, b) { + var qhat = (a[k] * (1 << n) + a[k - 1]) \ b[k - 1]; + if (qhat > (1 << n) - 1) { + qhat = (1 << n) - 1; + } + + var mult[100] = long_scalar_mult(n, k, qhat, b); + if (long_gt(n, k + 1, mult, a) == 1) { + mult = long_sub(n, k + 1, mult, b); + if (long_gt(n, k + 1, mult, a) == 1) { + return qhat - 2; + } else { + return qhat - 1; + } + } else { + return qhat; + } +} + +// n bits per register +// a has k + 1 registers +// b has k registers +// assumes leading digit of b is non-zero +// 0 <= a < (2**n) * b +function short_div(n, k, a, b) { + var scale = (1 << n) \ (1 + b[k - 1]); + + // k + 2 registers now + var norm_a[200] = long_scalar_mult(n, k + 1, scale, a); + // k + 1 registers now + var norm_b[200] = long_scalar_mult(n, k, scale, b); + + var ret; + if (norm_b[k] != 0) { + ret = short_div_norm(n, k + 1, norm_a, norm_b); + } else { + ret = short_div_norm(n, k, norm_a, norm_b); + } + return ret; +} + +// n bits per register +// a and b both have k registers +// out[0] has length 2 * k +// adapted from BigMulShortLong and LongToShortNoEndCarry2 witness computation +function prod(n, k, a, b) { + // first compute the intermediate values. taken from BigMulShortLong + var prod_val[100]; // length is 2 * k - 1 + for (var i = 0; i < 2 * k - 1; i++) { + prod_val[i] = 0; + if (i < k) { + for (var a_idx = 0; a_idx <= i; a_idx++) { + prod_val[i] = prod_val[i] + a[a_idx] * b[i - a_idx]; + } + } else { + for (var a_idx = i - k + 1; a_idx < k; a_idx++) { + prod_val[i] = prod_val[i] + a[a_idx] * b[i - a_idx]; + } + } + } + + // now do a bunch of carrying to make sure registers not overflowed. taken from LongToShortNoEndCarry2 + var out[100]; // length is 2 * k + + var split[100][3]; // first dimension has length 2 * k - 1 + for (var i = 0; i < 2 * k - 1; i++) { + split[i] = SplitThreeFn(prod_val[i], n, n, n); + } + + var carry[100]; // length is 2 * k - 1 + carry[0] = 0; + out[0] = split[0][0]; + if (2 * k - 1 > 1) { + var sumAndCarry[2] = SplitFn(split[0][1] + split[1][0], n, n); + out[1] = sumAndCarry[0]; + carry[1] = sumAndCarry[1]; + } + if (2 * k - 1 > 2) { + for (var i = 2; i < 2 * k - 1; i++) { + var sumAndCarry[2] = SplitFn(split[i][0] + split[i-1][1] + split[i-2][2] + carry[i-1], n, n); + out[i] = sumAndCarry[0]; + carry[i] = sumAndCarry[1]; + } + out[2 * k - 1] = split[2*k-2][1] + split[2*k-3][2] + carry[2*k-2]; + } + return out; +} + +// n bits per register +// a has k registers +// p has k registers +// e has k registers +// k * n <= 500 +// p is a prime +// computes a^e mod p +function mod_exp(n, k, a, p, e) { + var eBits[500]; // length is k * n + for (var i = 0; i < k; i++) { + for (var j = 0; j < n; j++) { + eBits[j + n * i] = (e[i] >> j) & 1; + } + } + + var out[100]; // length is k + for (var i = 0; i < 100; i++) { + out[i] = 0; + } + out[0] = 1; + + // repeated squaring + for (var i = k * n - 1; i >= 0; i--) { + // multiply by a if bit is 0 + if (eBits[i] == 1) { + var temp[200]; // length 2 * k + temp = prod(n, k, out, a); + var temp2[2][100]; + temp2 = long_div(n, k, k, temp, p); + out = temp2[1]; + } + + // square, unless we're at the end + if (i > 0) { + var temp[200]; // length 2 * k + temp = prod(n, k, out, out); + var temp2[2][100]; + temp2 = long_div(n, k, k, temp, p); + out = temp2[1]; + } + + } + return out; +} + +// n bits per register +// a has k registers +// p has k registers +// k * n <= 500 +// p is a prime +// if a == 0 mod p, returns 0 +// else computes inv = a^(p-2) mod p +function mod_inv(n, k, a, p) { + var isZero = 1; + for (var i = 0; i < k; i++) { + if (a[i] != 0) { + isZero = 0; + } + } + if (isZero == 1) { + var ret[100]; + for (var i = 0; i < k; i++) { + ret[i] = 0; + } + return ret; + } + + var pCopy[100]; + for (var i = 0; i < 100; i++) { + if (i < k) { + pCopy[i] = p[i]; + } else { + pCopy[i] = 0; + } + } + + var two[100]; + for (var i = 0; i < 100; i++) { + two[i] = 0; + } + two[0] = 2; + + var pMinusTwo[100]; + pMinusTwo = long_sub(n, k, pCopy, two); // length k + var out[100]; + out = mod_exp(n, k, a, pCopy, pMinusTwo); + return out; +} + +// a, b and out are all n bits k registers +function long_sub_mod_p(n, k, a, b, p){ + var gt = long_gt(n, k, a, b); + var tmp[100]; + if(gt){ + tmp = long_sub(n, k, a, b); + } + else{ + tmp = long_sub(n, k, b, a); + } + var out[2][100]; + for(var i = k;i < 2 * k; i++){ + tmp[i] = 0; + } + out = long_div(n, k, k, tmp, p); + if(gt==0){ + tmp = long_sub(n, k, p, out[1]); + } + return tmp; +} + +// a, b, p and out are all n bits k registers +function prod_mod_p(n, k, a, b, p){ + var tmp[100]; + var result[2][100]; + tmp = prod(n, k, a, b); + result = long_div(n, k, k, tmp, p); + return result[1]; +} \ No newline at end of file diff --git a/circuits/circuits/helpers/extract.circom b/circuits/circuits/helpers/extract.circom new file mode 100644 index 00000000..c51bc796 --- /dev/null +++ b/circuits/circuits/helpers/extract.circom @@ -0,0 +1,175 @@ +pragma circom 2.1.2; +include "./utils.circom"; + +// circuits in this folder copied from zk-email, credits to them + +// A set of utils for shifting and packing signal arrays +// Performs extraction of reveal signals and packed signals + +// From https://github.com/iden3/circomlib/blob/master/circuits/multiplexer.circom +function log2(a) { + if (a == 0) { + return 0; + } + var n = 1; + var r = 1; + while (n n2b.in; + for (var i = 0; i<254; i++) { + n2b.out[i] ==> sign.in[i]; + } + sign.sign ==> out; +} \ No newline at end of file diff --git a/circuits/circuits/helpers/utils.circom b/circuits/circuits/helpers/utils.circom new file mode 100644 index 00000000..149c211d --- /dev/null +++ b/circuits/circuits/helpers/utils.circom @@ -0,0 +1,149 @@ +pragma circom 2.1.5; + +include "../../node_modules/circomlib/circuits/bitify.circom"; +include "../../node_modules/circomlib/circuits/comparators.circom"; +include "../../node_modules/circomlib/circuits/mimcsponge.circom"; +include "./fp.circom"; + +// returns ceil(log2(a+1)) +function log2_ceil(a) { + var n = a+1; + var r = 0; + while (n>0) { + r++; + n \= 2; + } + return r; +} + +// returns ceil(log2(a+1)) +function count_packed(n, chunks) { + return (n - 1) \ chunks + 1; +} + +// Lifted from MACI https://github.com/privacy-scaling-explorations/maci/blob/v1/circuits/circom/trees/incrementalQuinTree.circom#L29 +// Bits is ceil(log2 choices) +template QuinSelector(choices, bits) { + signal input in[choices]; + signal input index; + signal output out; + + // Ensure that index < choices + component lessThan = LessThan(bits); + lessThan.in[0] <== index; + lessThan.in[1] <== choices; + lessThan.out === 1; + + component calcTotal = CalculateTotal(choices); + component eqs[choices]; + + // For each item, check whether its index equals the input index. + for (var i = 0; i < choices; i ++) { + eqs[i] = IsEqual(); + eqs[i].in[0] <== i; + eqs[i].in[1] <== index; + + // eqs[i].out is 1 if the index matches. As such, at most one input to + // calcTotal is not 0. + calcTotal.nums[i] <== eqs[i].out * in[i]; + } + + // Returns 0 + 0 + ... + item + out <== calcTotal.sum; +} + +template CalculateTotal(n) { + signal input nums[n]; + signal output sum; + + signal sums[n]; + sums[0] <== nums[0]; + + for (var i=1; i < n; i++) { + sums[i] <== sums[i - 1] + nums[i]; + } + + sum <== sums[n - 1]; +} + +// Written by us +// n bytes per signal, n = 31 usually +template Packed2Bytes(n){ + signal input in; // < 2 ^ (8 * 31) + signal output out[n]; // each out is < 64 + // Rangecheck in and out? + + // Constrain bits + component nbytes = Num2Bits(8 * n); + nbytes.in <== in; + component bytes[n]; + + for (var k = 0; k < n; k++){ + // Witness gen out + out[k] <-- (in >> (k * 8)) % 256; + + // Constrain bits to match + bytes[k] = Num2Bits(8); + bytes[k].in <== out[k]; + for (var j = 0; j < 8; j++) { + nbytes.out[k * 8 + j] === bytes[k].out[j]; + } + } +} + +// n bytes per signal, n = 31 usually (i.e. 31 8-bit values being packed into 248 bits) +// when calling this, you must constrain each 'in' value yourself to be < 256 +// TODO: Rangecheck in and out? +template Bytes2Packed(n){ + signal input in[n]; // each in value is < 256 (i.e. 2^8) + signal pow2[n+1]; // [k] is 2^k + signal in_prefix_sum[n+1]; // each [k] is in[0] + 2^8 in[1]... 2^{8k-8} in[k-1]. cont. + // [0] is 0. [1] is in[0]. [n+1] is out. + signal output out; // < 2 ^ (8 * 31) + // Rangecheck in and out? + + // Witness gen out + in_prefix_sum[0] <-- 0; + for (var k = 0; k < n; k++){ + in_prefix_sum[k+1] <-- in_prefix_sum[k] + in[k] * (2 ** (k * 8)); + } + out <-- in_prefix_sum[n]; + + // Constrain out bits + component nbytes = Num2Bits(8 * n); + nbytes.in <== out; // I think this auto-rangechecks out to be < 8*n bits. + component bytes[n]; + + for (var k = 0; k < n; k++){ + bytes[k] = Num2Bits(8); + bytes[k].in <== in[k]; + for (var j = 0; j < 8; j++) { + nbytes.out[k * 8 + j] === bytes[k].out[j]; + } + } +} + +// salt_is_message_id_from, custom_anon_from_hashed_salt = MakeAnonEmailSalt(max_email_from_len, max_message_id_len)(email_from, custom_message_id_from, shifted_message_id) +template MakeAnonEmailSalt(email_len, blinder_len) { + signal input email[email_len]; + signal input custom_message_id[blinder_len]; // previous message id, used to source past account + signal input original_message_id[blinder_len]; // previous message id, used to source past account + signal intermediate_is_message_id_from[blinder_len + 1]; + signal isEq[blinder_len]; + signal output blinder_matches; + signal output anon_salt; + + component hasher = MiMCSponge(email_len + blinder_len, 220, 1); + hasher.k <== 123; + for (var i = 0; i < email_len; i++) { + hasher.ins[i] <== email[i]; + } + intermediate_is_message_id_from[0] <== 1; + for (var i = 0; i < blinder_len; i++) { + hasher.ins[i + email_len] <== custom_message_id[i]; + isEq[i] <== IsEqual()([custom_message_id[i], original_message_id[i]]); + intermediate_is_message_id_from[i + 1] <== isEq[i] * intermediate_is_message_id_from[i]; + } + blinder_matches <== intermediate_is_message_id_from[blinder_len]; + anon_salt <== hasher.outs[0]; +} diff --git a/circuits/circuits/passport_verifier.circom b/circuits/circuits/passport_verifier.circom new file mode 100644 index 00000000..53b7ce9a --- /dev/null +++ b/circuits/circuits/passport_verifier.circom @@ -0,0 +1,76 @@ +pragma circom 2.1.5; + +include "./rsa/rsa.circom"; +include "./sha256Bytes.circom"; +include "../node_modules/circomlib/circuits/sha256/sha256.circom"; + +template PassportVerifier(n, k) { + signal input mrz[93]; // formatted mrz (5 + 88) chars + signal input dataHashes[297]; + signal input eContentBytes[104]; + + signal input pubkey[k]; + signal input signature[k]; + + // compute sha256 of formatted mrz + signal mrzSha[256] <== Sha256Bytes(93)(mrz); + + // get output of sha256 into bytes to check against dataHashes + component sha256_bytes[32]; + for (var i = 0; i < 32; i++) { + sha256_bytes[i] = Bits2Num(8); + for (var j = 0; j < 8; j++) { + sha256_bytes[i].in[7 - j] <== mrzSha[i * 8 + j]; + } + } + + // check that it is in the right position in dataHashes + for(var i = 0; i < 32; i++) { + dataHashes[31 + i] === sha256_bytes[i].out; + } + + // hash dataHashes + signal dataHashesSha[256] <== Sha256Bytes(297)(dataHashes); + + // get output of dataHashes sha256 into bytes to check against eContent + component dataHashes_sha256_bytes[32]; + for (var i = 0; i < 32; i++) { + dataHashes_sha256_bytes[i] = Bits2Num(8); + for (var j = 0; j < 8; j++) { + dataHashes_sha256_bytes[i].in[7 - j] <== dataHashesSha[i * 8 + j]; + } + } + + // check that it is in the right position in eContent + for(var i = 0; i < 32; i++) { + eContentBytes[72 + i] === dataHashes_sha256_bytes[i].out; + } + + // hash eContentBytes + signal eContentSha[256] <== Sha256Bytes(104)(eContentBytes); + + // get output of eContentBytes sha256 into k chunks of n bits each + var msg_len = (256 + n) \ n; + + component eContentHash[msg_len]; + for (var i = 0; i < msg_len; i++) { + eContentHash[i] = Bits2Num(n); + } + for (var i = 0; i < 256; i++) { + eContentHash[i \ n].in[i % n] <== eContentSha[255 - i]; + } + for (var i = 256; i < n * msg_len; i++) { + eContentHash[i \ n].in[i % n] <== 0; + } + + // verify eContentHash signature + component rsa = RSAVerify65537(64, 32); + for (var i = 0; i < msg_len; i++) { + rsa.base_message[i] <== eContentHash[i].out; + } + for (var i = msg_len; i < k; i++) { + rsa.base_message[i] <== 0; + } + rsa.modulus <== pubkey; + rsa.signature <== signature; +} \ No newline at end of file diff --git a/circuits/circuits/proof_of_passport.circom b/circuits/circuits/proof_of_passport.circom new file mode 100644 index 00000000..ba1f2504 --- /dev/null +++ b/circuits/circuits/proof_of_passport.circom @@ -0,0 +1,56 @@ +pragma circom 2.1.5; + +include "../node_modules/circomlib/circuits/poseidon.circom"; +include "./helpers/extract.circom"; +include "./passport_verifier.circom"; + +template ProofOfPassport(n, k) { + signal input mrz[93]; // formatted mrz (5 + 88) chars + signal input dataHashes[297]; + signal input eContentBytes[104]; + signal input pubkey[k]; + signal input signature[k]; + + signal input reveal_bitmap[88]; + signal input address; + + // Verify passport + component PV = PassportVerifier(n, k); + PV.mrz <== mrz; + PV.dataHashes <== dataHashes; + PV.eContentBytes <== eContentBytes; + PV.pubkey <== pubkey; + PV.signature <== signature; + + // reveal reveal_bitmap bits of MRZ + signal reveal[88]; + for (var i = 0; i < 88; i++) { + reveal[i] <== mrz[5+i] * reveal_bitmap[i]; + } + signal output reveal_packed[3] <== PackBytes(88, 3, 31)(reveal); + + // make nullifier public; + // we take nullifier = signature[0, 1] which it 64 + 64 bits long, so chance of collision is 2^128 + signal output nullifier <== signature[0] * 2**64 + signature[1]; + + // we don't do Poseidon hash cuz it makes arkworks crash for obscure reasons + // we output the pubkey as 11 field elements. 9 is doable also cuz ceil(254/31) = 9 + signal output pubkey_packed[11]; + for (var i = 0; i < 11; i++) { + if (i < 10) { + pubkey_packed[i] <== pubkey[3*i] * 64 * 64 + pubkey[3*i + 1] * 64 + pubkey[3*i + 2]; + } else { + pubkey_packed[i] <== pubkey[3*i] * 64 * 64; + } + } +} + +component main { public [ address ] } = ProofOfPassport(64, 32); + +// Us: +// 1 + 1 + 3 + 1 +// pubkey_hash + nullifier + reveal_packed + address + +// Them: +// 1 + 3 + 1 +// pubkey_hash + reveal_twitter_packed + address \ No newline at end of file diff --git a/circuits/circuits/rsa/LICENSE b/circuits/circuits/rsa/LICENSE new file mode 100644 index 00000000..a1c6d7a8 --- /dev/null +++ b/circuits/circuits/rsa/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 zk-email + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/circuits/circuits/rsa/rsa.circom b/circuits/circuits/rsa/rsa.circom new file mode 100644 index 00000000..9f0327d2 --- /dev/null +++ b/circuits/circuits/rsa/rsa.circom @@ -0,0 +1,156 @@ +pragma circom 2.1.5; + +include "../helpers/fp.circom"; + +// Computes base^65537 mod modulus +// Does not necessarily reduce fully mod modulus (the answer could be +// too big by a multiple of modulus) +template FpPow65537Mod(n, k) { + signal input base[k]; + // Exponent is hardcoded at 65537 + signal input modulus[k]; + signal output out[k]; + + component doublers[16]; + component adder = FpMul(n, k); + for (var i = 0; i < 16; i++) { + doublers[i] = FpMul(n, k); + } + + for (var j = 0; j < k; j++) { + adder.p[j] <== modulus[j]; + for (var i = 0; i < 16; i++) { + doublers[i].p[j] <== modulus[j]; + } + } + for (var j = 0; j < k; j++) { + doublers[0].a[j] <== base[j]; + doublers[0].b[j] <== base[j]; + } + for (var i = 0; i + 1 < 16; i++) { + for (var j = 0; j < k; j++) { + doublers[i + 1].a[j] <== doublers[i].out[j]; + doublers[i + 1].b[j] <== doublers[i].out[j]; + } + } + for (var j = 0; j < k; j++) { + adder.a[j] <== base[j]; + adder.b[j] <== doublers[15].out[j]; + } + for (var j = 0; j < k; j++) { + out[j] <== adder.out[j]; + } +} + +template RSAPad(n, k) { + signal input modulus[k]; + signal input base_message[k]; + signal output padded_message[k]; + + var base_len = 408; + var msg_len = 256; + + signal padded_message_bits[n*k]; + + component modulus_n2b[k]; + component base_message_n2b[k]; + signal modulus_bits[n*k]; + signal base_message_bits[n*k]; + for (var i = 0; i < k; i++) { + base_message_n2b[i] = Num2Bits(n); + base_message_n2b[i].in <== base_message[i]; + for (var j = 0; j < n; j++) { + base_message_bits[i*n+j] <== base_message_n2b[i].out[j]; + } + modulus_n2b[i] = Num2Bits(n); + modulus_n2b[i].in <== modulus[i]; + for (var j = 0; j < n; j++) { + modulus_bits[i*n+j] <== modulus_n2b[i].out[j]; + } + } + + for (var i = msg_len; i < n*k; i++) { + base_message_bits[i] === 0; + } + + for (var i = 0; i < msg_len; i++) { + padded_message_bits[i] <== base_message_bits[i]; + } + + for (var i = base_len; i < base_len + 8; i++) { + padded_message_bits[i] <== 0; + } + + for (var i = msg_len; i < base_len; i++) { + padded_message_bits[i] <== (0x3031300d060960864801650304020105000420 >> (i - msg_len)) & 1; + } + + component modulus_zero[(n*k + 7 - (base_len + 8))\8]; + { + var modulus_prefix = 0; + for (var i = n*k - 1; i >= base_len + 8; i--) { + if (i+8 < n*k) { + modulus_prefix += modulus_bits[i+8]; + if (i % 8 == 0) { + var idx = (i - (base_len + 8)) / 8; + modulus_zero[idx] = IsZero(); + modulus_zero[idx].in <== modulus_prefix; + padded_message_bits[i] <== 1-modulus_zero[idx].out; + } else { + padded_message_bits[i] <== padded_message_bits[i+1]; + } + } else { + padded_message_bits[i] <== 0; + } + } + } + + // The RFC guarantees at least 8 octets of 0xff padding. + assert(base_len + 8 + 65 <= n*k); + for (var i = base_len + 8; i < base_len + 8 + 65; i++) { + padded_message_bits[i] === 1; + } + + component padded_message_b2n[k]; + for (var i = 0; i < k; i++) { + padded_message_b2n[i] = Bits2Num(n); + for (var j = 0; j < n; j++) { + padded_message_b2n[i].in[j] <== padded_message_bits[i*n+j]; + } + padded_message[i] <== padded_message_b2n[i].out; + } +} + +template RSAVerify65537(n, k) { + signal input signature[k]; + signal input modulus[k]; + signal input base_message[k]; + + component padder = RSAPad(n, k); + for (var i = 0; i < k; i++) { + padder.modulus[i] <== modulus[i]; + padder.base_message[i] <== base_message[i]; + } + + // Check that the signature is in proper form and reduced mod modulus. + component signatureRangeCheck[k]; + component bigLessThan = BigLessThan(n, k); + for (var i = 0; i < k; i++) { + signatureRangeCheck[i] = Num2Bits(n); + signatureRangeCheck[i].in <== signature[i]; + bigLessThan.a[i] <== signature[i]; + bigLessThan.b[i] <== modulus[i]; + } + bigLessThan.out === 1; + + component bigPow = FpPow65537Mod(n, k); + for (var i = 0; i < k; i++) { + bigPow.base[i] <== signature[i]; + bigPow.modulus[i] <== modulus[i]; + } + // By construction of the padding, the padded message is necessarily + // smaller than the modulus. Thus, we don't have to check that bigPow is fully reduced. + for (var i = 0; i < k; i++) { + bigPow.out[i] === padder.padded_message[i]; + } +} diff --git a/circuits/circuits/sha256Bytes.circom b/circuits/circuits/sha256Bytes.circom new file mode 100644 index 00000000..fcdee1eb --- /dev/null +++ b/circuits/circuits/sha256Bytes.circom @@ -0,0 +1,28 @@ +pragma circom 2.1.5; + +include "../node_modules/circomlib/circuits/bitify.circom"; +include "../node_modules/circomlib/circuits/sha256/sha256.circom"; +include "../node_modules/circomlib/circuits/bitify.circom"; + +template Sha256Bytes(max_num_bytes) { + signal input in_padded[max_num_bytes]; + // signal input in_len_padded_bytes; + signal output out[256]; + + var num_bits = max_num_bytes * 8; + component sha = Sha256(num_bits); + + component bytes[max_num_bytes]; + for (var i = 0; i < max_num_bytes; i++) { + bytes[i] = Num2Bits(8); + bytes[i].in <== in_padded[i]; + for (var j = 0; j < 8; j++) { + sha.in[i*8+j] <== bytes[i].out[7-j]; + } + } + // sha.in_len_padded_bits <== in_len_padded_bytes * 8; + + for (var i = 0; i < 256; i++) { + out[i] <== sha.out[i]; + } +} \ No newline at end of file diff --git a/circuits/package.json b/circuits/package.json new file mode 100644 index 00000000..55071649 --- /dev/null +++ b/circuits/package.json @@ -0,0 +1,27 @@ +{ + "name": "circom-passport", + "version": "0.0.1", + "author": "", + "license": "MIT", + "scripts": { + "test": "yarn ts-mocha test/**/*.test.ts --exit" + }, + "dependencies": { + "@types/chai-as-promised": "^7.1.6", + "@types/node": "^20.6.3", + "@types/node-forge": "^1.3.5", + "chai-as-promised": "^7.1.1", + "circomlib": "^2.0.5", + "js-sha256": "^0.10.1", + "node-forge": "^1.3.1", + "snarkjs": "^0.7.1", + "typescript": "^5.2.2" + }, + "devDependencies": { + "@types/chai": "^4.3.6", + "@types/mocha": "^10.0.1", + "chai": "^4.3.8", + "mocha": "^10.2.0", + "ts-mocha": "^10.0.0" + } +} diff --git a/circuits/scripts/build_circuit.sh b/circuits/scripts/build_circuit.sh new file mode 100755 index 00000000..6ff7025d --- /dev/null +++ b/circuits/scripts/build_circuit.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# Check if the first argument is "app-only" +if [ "$1" == "app-only" ]; then + echo "Building only for the app" + APP_ONLY=1 +else + APP_ONLY=0 +fi + +mkdir -p build +cd build +if [ ! -f powersOfTau28_hez_final_20.ptau ]; then + echo "Download power of tau...." + wget https://hermez.s3-eu-west-1.amazonaws.com/powersOfTau28_hez_final_20.ptau + echo "Finished download!" +else + echo "Powers of tau file already downloaded... Skip download action!" +fi +cd .. + +echo "compiling circuit" +circom circuits/proof_of_passport.circom --r1cs --wasm --output build + +mkdir -p ../app/ark-circom-passport/passport/ +cp build/proof_of_passport.r1cs ../app/ark-circom-passport/passport/ +cp build/proof_of_passport_js/proof_of_passport.wasm ../app/ark-circom-passport/passport/ +echo "copied proof_of_passport.r1cs and proof_of_passport.wasm to ark-circom-passport" +echo "file sizes:" +echo "Size of proof_of_passport.r1cs: $(wc -c <../app/ark-circom-passport/passport/proof_of_passport.r1cs) bytes" +echo "Size of proof_of_passport.wasm: $(wc -c <../app/ark-circom-passport/passport/proof_of_passport.wasm) bytes" + +# If APP_ONLY is 1, exit the script here +if [ $APP_ONLY -eq 1 ]; then + exit 0 +fi + +echo "building zkey" +yarn snarkjs groth16 setup build/proof_of_passport.r1cs build/powersOfTau28_hez_final_20.ptau build/proof_of_passport.zkey + +echo "building vkey" +echo "test random" | yarn snarkjs zkey contribute build/proof_of_passport.zkey build/proof_of_passport_final.zkey +yarn snarkjs zkey export verificationkey build/proof_of_passport_final.zkey build/verification_key.json + +yarn snarkjs zkey export solidityverifier build/proof_of_passport_final.zkey build/Verifier.sol +cp build/Verifier.sol ../contracts/contracts/Verifier.sol +cp build/proof_of_passport_final.zkey ../app/ark-circom-passport/passport/ +echo "copied Verifier.sol to contracts and proof_of_passport_final.zkey to ark-circom-passport" \ No newline at end of file diff --git a/circuits/scripts/mrzToSig.ts b/circuits/scripts/mrzToSig.ts new file mode 100644 index 00000000..32ccb734 --- /dev/null +++ b/circuits/scripts/mrzToSig.ts @@ -0,0 +1,79 @@ +import * as crypto from 'crypto'; +import { + arraysAreEqual, + formatMrz, + formatAndConcatenateDataHashes, + bytesToBigDecimal, +} from '../../common/src/utils/utils'; +import * as forge from 'node-forge'; +import passportData from '../../common/inputs/passportData.json'; +import {DataHash} from '../../common/src/utils/types'; + +// This script tests the whole flow from MRZ to signature +// The passportData is imported from passportData.json written by the server + +const mrz = passportData.mrz; + +console.log('mrz: ', mrz); + +// Transforms the dataHashes object into an array of arrays +const dataHashes = passportData.dataGroupHashes as DataHash[]; + +const mrzHash = hash(formatMrz(mrz)); + +console.log('mrzHash:', mrzHash); +console.log( + 'mrzHash === dataHashes[0][1] ?', + arraysAreEqual(mrzHash, dataHashes[0][1] as number[]), +); + +const concatenatedDataHashes = formatAndConcatenateDataHashes( + mrzHash, + dataHashes, +); + +const concatenatedDataHashesHashDigest = hash(concatenatedDataHashes); + +// check that concatenatedDataHashesHashDigest is at the right place of passportData.eContent +const sliceOfEContent = passportData.eContent.slice(72, 72 + 32); + +console.log( + 'Are they equal ?', + arraysAreEqual(sliceOfEContent, concatenatedDataHashesHashDigest), +); + +// now let's verify the signature +// const {modulus, exponent} = parsePubKeyString(passportData.publicKey); +// Create the public key +const rsa = forge.pki.rsa; +const publicKey = rsa.setPublicKey( + new forge.jsbn.BigInteger(passportData.pubKey.modulus, 10), + new forge.jsbn.BigInteger("10001", 16), +); + +// SHA-256 hash of the eContent +const md = forge.md.sha256.create(); +md.update(forge.util.binary.raw.encode(new Uint8Array(passportData.eContent))); +const hashOfEContent = md.digest().getBytes(); + +console.log('modulus', passportData.pubKey.modulus); +console.log('eContent', bytesToBigDecimal(passportData.eContent)); +console.log('signature', bytesToBigDecimal(passportData.encryptedDigest)); + +// Signature verification +const signatureBytes = Buffer.from(passportData.encryptedDigest).toString( + 'binary', +); +const valid = publicKey.verify(hashOfEContent, signatureBytes); + +if (valid) { + console.log('The signature is valid.'); +} else { + console.log('The signature is not valid.'); +} + +function hash(bytesArray: number[]): number[] { + const hash = crypto.createHash('sha256'); + hash.update(Buffer.from(bytesArray)); + return Array.from(hash.digest()).map(x => (x < 128 ? x : x - 256)); +} \ No newline at end of file diff --git a/circuits/test/passport.test.ts b/circuits/test/passport.test.ts new file mode 100644 index 00000000..2ea5a124 --- /dev/null +++ b/circuits/test/passport.test.ts @@ -0,0 +1,215 @@ +import { describe } from 'mocha' +import chai, { assert, expect } from 'chai' +import chaiAsPromised from 'chai-as-promised' +import { hash, toUnsignedByte, arraysAreEqual, bytesToBigDecimal, formatAndConcatenateDataHashes, formatMrz, splitToWords } from '../../common/src/utils/utils' +import { groth16 } from 'snarkjs' +import { DataHash } from '../../common/src/utils/types' +import { getPassportData } from '../../common/src/utils/passportData' +import { attributeToPosition } from '../../common/src/constants/constants' +const fs = require('fs'); + +chai.use(chaiAsPromised) + +console.log("The following snarkjs error logs are normal and expected if the tests pass.") + +describe('Circuit tests', function () { + this.timeout(0) + + let inputs: any; + + this.beforeAll(async () => { + const passportData = getPassportData(); + + const formattedMrz = formatMrz(passportData.mrz); + const mrzHash = hash(formatMrz(passportData.mrz)); + const concatenatedDataHashes = formatAndConcatenateDataHashes( + mrzHash, + passportData.dataGroupHashes as DataHash[], + ); + + const concatenatedDataHashesHashDigest = hash(concatenatedDataHashes); + + assert( + arraysAreEqual(passportData.eContent.slice(72, 72 + 32), concatenatedDataHashesHashDigest), + 'concatenatedDataHashesHashDigest is at the right place in passportData.eContent' + ) + + const reveal_bitmap = Array(88).fill('1'); + + inputs = { + mrz: formattedMrz.map(byte => String(byte)), + reveal_bitmap: reveal_bitmap.map(byte => String(byte)), + dataHashes: concatenatedDataHashes.map(toUnsignedByte).map(byte => String(byte)), + eContentBytes: passportData.eContent.map(toUnsignedByte).map(byte => String(byte)), + pubkey: splitToWords( + BigInt(passportData.pubKey.modulus), + BigInt(64), + BigInt(32) + ), + signature: splitToWords( + BigInt(bytesToBigDecimal(passportData.encryptedDigest)), + BigInt(64), + BigInt(32) + ), + address: "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", // sample address + } + + }) + + describe('Proof', function() { + it('should prove and verify with valid inputs', async function () { + const { proof, publicSignals } = await groth16.fullProve( + inputs, + "build/proof_of_passport_js/proof_of_passport.wasm", + "build/proof_of_passport_final.zkey" + ) + + const vKey = JSON.parse(fs.readFileSync("build/verification_key.json")); + const verified = await groth16.verify( + vKey, + publicSignals, + proof + ) + + assert(verified == true, 'Should verifiable') + }) + + it('should fail to prove with invalid mrz', async function () { + const invalidInputs = { + ...inputs, + mrz: inputs.mrz.map((byte: string) => String((parseInt(byte, 10) + 1) % 256)), + } + + return expect(groth16.fullProve( + invalidInputs, + "build/proof_of_passport_js/proof_of_passport.wasm", + "build/proof_of_passport_final.zkey" + )).to.be.rejected; + }) + + it('should fail to prove with invalid eContentBytes', async function () { + const invalidInputs = { + ...inputs, + eContentBytes: inputs.eContentBytes.map((byte: string) => String((parseInt(byte, 10) + 1) % 256)), + } + + return expect(groth16.fullProve( + invalidInputs, + "build/proof_of_passport_js/proof_of_passport.wasm", + "build/proof_of_passport_final.zkey" + )).to.be.rejected; + }) + + it('should fail to prove with invalid signature', async function () { + const invalidInputs = { + ...inputs, + signature: inputs.signature.map((byte: string) => String((parseInt(byte, 10) + 1) % 256)), + } + + return expect(groth16.fullProve( + invalidInputs, + "build/proof_of_passport_js/proof_of_passport.wasm", + "build/proof_of_passport_final.zkey" + )).to.be.rejected; + }) + + it("shouldn't allow address maleability", async function () { + const { proof, publicSignals } = await groth16.fullProve( + inputs, + "build/proof_of_passport_js/proof_of_passport.wasm", + "build/proof_of_passport_final.zkey" + ) + + publicSignals[publicSignals.length - 1] = BigInt("0xC5B4F2A7Ea7F675Fca6EF724d6E06FFB40dFC93F").toString(); + + const vKey = JSON.parse(fs.readFileSync("build/verification_key.json")); + return expect(await groth16.verify( + vKey, + publicSignals, + proof + )).to.be.false; + }) + }) + + describe('Selective disclosure', function() { + const attributeCombinations = [ + ['issuing_state', 'name'], + ['passport_number', 'nationality', 'date_of_birth'], + ['gender', 'expiry_date'], + ]; + + attributeCombinations.forEach(combination => { + it(`Disclosing ${combination.join(", ")}`, async function () { + const attributeToReveal = Object.keys(attributeToPosition).reduce((acc, attribute) => { + acc[attribute] = combination.includes(attribute); + return acc; + }, {}); + + const bitmap = Array(88).fill('0'); + + Object.entries(attributeToReveal).forEach(([attribute, reveal]) => { + if (reveal) { + const [start, end] = attributeToPosition[attribute]; + bitmap.fill('1', start, end + 1); + } + }); + + inputs = { + ...inputs, + reveal_bitmap: bitmap.map(String), + } + + const { proof, publicSignals } = await groth16.fullProve( + inputs, + "build/proof_of_passport_js/proof_of_passport.wasm", + "build/proof_of_passport_final.zkey" + ) + + console.log('proof done'); + + const vKey = JSON.parse(fs.readFileSync("build/verification_key.json")); + const verified = await groth16.verify( + vKey, + publicSignals, + proof + ) + + assert(verified == true, 'Should verifiable') + + console.log('proof verified'); + + const firstThreeElements = publicSignals.slice(0, 3); + const bytesCount = [31, 31, 26]; // nb of bytes in each of the first three field elements + + const bytesArray = firstThreeElements.flatMap((element: string, index: number) => { + const bytes = bytesCount[index]; + const elementBigInt = BigInt(element); + const byteMask = BigInt(255); // 0xFF + + const bytesOfElement = [...Array(bytes)].map((_, byteIndex) => { + return (elementBigInt >> (BigInt(byteIndex) * BigInt(8))) & byteMask; + }); + + return bytesOfElement; + }); + + const result = bytesArray.map((byte: bigint) => String.fromCharCode(Number(byte))); + + console.log(result); + + for(let i = 0; i < result.length; i++) { + if (bitmap[i] == '1') { + const char = String.fromCharCode(Number(inputs.mrz[i + 5])); + assert(result[i] == char, 'Should reveal the right one'); + } else { + assert(result[i] == '\x00', 'Should not reveal'); + } + } + }); + }); + + + }) +}) + + diff --git a/circuits/tsconfig.json b/circuits/tsconfig.json new file mode 100644 index 00000000..a05d480d --- /dev/null +++ b/circuits/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "resolveJsonModule": true, + "esModuleInterop": true, + "target": "ES2015", + "moduleResolution": "node" + } +} \ No newline at end of file diff --git a/circuits/yarn.lock b/circuits/yarn.lock new file mode 100644 index 00000000..e75e63bc --- /dev/null +++ b/circuits/yarn.lock @@ -0,0 +1,1006 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@iden3/bigarray@0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@iden3/bigarray/-/bigarray-0.0.2.tgz#6fc4ba5be18daf8a26ee393f2fb62b80d98c05e9" + integrity sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g== + +"@iden3/binfileutils@0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@iden3/binfileutils/-/binfileutils-0.0.11.tgz#9ffbbcc1279f2b2182bb6dcff4eee8a5b2167911" + integrity sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA== + dependencies: + fastfile "0.0.20" + ffjavascript "^0.2.48" + +"@types/chai-as-promised@^7.1.6": + version "7.1.6" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz#3b08cbe1e7206567a480dc6538bade374b19e4e1" + integrity sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA== + dependencies: + "@types/chai" "*" + +"@types/chai@*", "@types/chai@^4.3.6": + version "4.3.6" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.6.tgz#7b489e8baf393d5dd1266fb203ddd4ea941259e6" + integrity sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mocha@^10.0.1": + version "10.0.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.1.tgz#2f4f65bb08bc368ac39c96da7b2f09140b26851b" + integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== + +"@types/node-forge@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.5.tgz#75f041b66e584aae2bf01cffba8923693770034c" + integrity sha512-GASdDr5u+BDTUcmWaS9Ljs1QTcyI+iPuCh/FdpDqLuLJP7Stx+j3DI0g4/cBn0zFjOnajMKATkq6PqBD0K5uzQ== + dependencies: + "@types/node" "*" + +"@types/node@*", "@types/node@^20.6.3": + version "20.6.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.3.tgz#5b763b321cd3b80f6b8dde7a37e1a77ff9358dd9" + integrity sha512-HksnYH4Ljr4VQgEy2lTStbCKv/P590tmPe5HqOnv9Gprffgv5WXAY+Y5Gqniu0GGqeTCUdBnzC3QSrzPkBkAMA== + +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +b4a@^1.0.1: + version "1.6.4" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.4.tgz#ef1c1422cae5ce6535ec191baeed7567443f36c9" + integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +bfj@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/bfj/-/bfj-7.1.0.tgz#c5177d522103f9040e1b12980fe8c38cf41d3f8b" + integrity sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw== + dependencies: + bluebird "^3.7.2" + check-types "^11.2.3" + hoopy "^0.1.4" + jsonpath "^1.1.1" + tryer "^1.0.1" + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +blake2b-wasm@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz#9115649111edbbd87eb24ce7c04b427e4e2be5be" + integrity sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w== + dependencies: + b4a "^1.0.1" + nanoassert "^2.0.0" + +bluebird@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +buffer-from@^1.0.0, buffer-from@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +chai-as-promised@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== + dependencies: + check-error "^1.0.2" + +chai@^4.3.8: + version "4.3.8" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.8.tgz#40c59718ad6928da6629c70496fe990b2bb5b17c" + integrity sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^4.1.2" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + +chalk@^4.0.2, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== + +check-types@^11.2.3: + version "11.2.3" + resolved "https://registry.yarnpkg.com/check-types/-/check-types-11.2.3.tgz#1ffdf68faae4e941fce252840b1787b8edc93b71" + integrity sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg== + +chokidar@3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +circom_runtime@0.1.24: + version "0.1.24" + resolved "https://registry.yarnpkg.com/circom_runtime/-/circom_runtime-0.1.24.tgz#60ca8a31c3675802fbab5a0bcdeb02556e510733" + integrity sha512-H7/7I2J/cBmRnZm9docOCGhfxzS61BEm4TMCWcrZGsWNBQhePNfQq88Oj2XpUfzmBTCd8pRvRb3Mvazt3TMrJw== + dependencies: + ffjavascript "0.2.60" + +circomlib@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/circomlib/-/circomlib-2.0.5.tgz#183c703e53ed7d011811842dbeeeb9819f4cc1d6" + integrity sha512-O7NQ8OS+J4eshBuoy36z/TwQU0YHw8W3zxZcs4hVwpEll3e4hDm3mgkIPqItN8FDeLEKZFK3YeT/+k8TiLF3/A== + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +debug@4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-eql@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== + dependencies: + type-detect "^4.0.0" + +deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +diff@^3.1.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +ejs@^3.1.6: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^1.8.1: + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== + dependencies: + esprima "^4.0.1" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.6.1" + +esprima@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.2.2.tgz#76a0fd66fcfe154fd292667dc264019750b1657b" + integrity sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A== + +esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastfile@0.0.20: + version "0.0.20" + resolved "https://registry.yarnpkg.com/fastfile/-/fastfile-0.0.20.tgz#794a143d58cfda2e24c298e5ef619c748c8a1879" + integrity sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA== + +ffjavascript@0.2.60, ffjavascript@^0.2.48: + version "0.2.60" + resolved "https://registry.yarnpkg.com/ffjavascript/-/ffjavascript-0.2.60.tgz#4d8ae613d6bf4e98b3cc29ba10c626f5853854cf" + integrity sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A== + dependencies: + wasmbuilder "0.0.16" + wasmcurves "0.2.2" + web-worker "^1.2.0" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +js-sha256@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.10.1.tgz#b40104ba1368e823fdd5f41b66b104b15a0da60d" + integrity sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw== + +js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +jsonpath@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/jsonpath/-/jsonpath-1.1.1.tgz#0ca1ed8fb65bb3309248cc9d5466d12d5b0b9901" + integrity sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w== + dependencies: + esprima "1.2.2" + static-eval "2.0.2" + underscore "1.12.1" + +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +logplease@^1.2.15: + version "1.2.15" + resolved "https://registry.yarnpkg.com/logplease/-/logplease-1.2.15.tgz#3da442e93751a5992cc19010a826b08d0293c48a" + integrity sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA== + +loupe@^2.3.1: + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== + dependencies: + get-func-name "^2.0.0" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^3.0.4, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@^0.5.1: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mocha@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" + integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoassert@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/nanoassert/-/nanoassert-2.0.0.tgz#a05f86de6c7a51618038a620f88878ed1e490c09" + integrity sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA== + +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + +node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + +r1csfile@0.0.47: + version "0.0.47" + resolved "https://registry.yarnpkg.com/r1csfile/-/r1csfile-0.0.47.tgz#ed95a0dc8e910e9c070253906f7a31bd8c5333c8" + integrity sha512-oI4mAwuh1WwuFg95eJDNDDL8hCaZkwnPuNZrQdLBWvDoRU7EG+L/MOHL7SwPW2Y+ZuYcTLpj3rBkgllBQZN/JA== + dependencies: + "@iden3/bigarray" "0.0.2" + "@iden3/binfileutils" "0.0.11" + fastfile "0.0.20" + ffjavascript "0.2.60" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +snarkjs@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/snarkjs/-/snarkjs-0.7.1.tgz#c96ecaf4db8c2eb44d60b17ee02f37ed39c821bb" + integrity sha512-Qs1oxssa135WZkzfARgEp5SuKHKvKNtcspeJbE5je6MurUpBylD1rzcAzQSTGWA/EH/BV/TmUyTaTD64xScvbA== + dependencies: + "@iden3/binfileutils" "0.0.11" + bfj "^7.0.2" + blake2b-wasm "^2.4.0" + circom_runtime "0.1.24" + ejs "^3.1.6" + fastfile "0.0.20" + ffjavascript "0.2.60" + js-sha3 "^0.8.0" + logplease "^1.2.15" + r1csfile "0.0.47" + +source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +static-eval@2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.2.tgz#2d1759306b1befa688938454c546b7871f806a42" + integrity sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg== + dependencies: + escodegen "^1.8.1" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-mocha@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-10.0.0.tgz#41a8d099ac90dbbc64b06976c5025ffaebc53cb9" + integrity sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw== + dependencies: + ts-node "7.0.1" + optionalDependencies: + tsconfig-paths "^3.5.0" + +ts-node@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== + dependencies: + arrify "^1.0.0" + buffer-from "^1.1.0" + diff "^3.1.0" + make-error "^1.1.1" + minimist "^1.2.0" + mkdirp "^0.5.1" + source-map-support "^0.5.6" + yn "^2.0.0" + +tsconfig-paths@^3.5.0: + version "3.14.2" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +typescript@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== + +underscore@1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" + integrity sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw== + +wasmbuilder@0.0.16: + version "0.0.16" + resolved "https://registry.yarnpkg.com/wasmbuilder/-/wasmbuilder-0.0.16.tgz#f34c1f2c047d2f6e1065cbfec5603988f16d8549" + integrity sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA== + +wasmcurves@0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/wasmcurves/-/wasmcurves-0.2.2.tgz#ca444f6a6f6e2a5cbe6629d98ff478a62b4ccb2b" + integrity sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ== + dependencies: + wasmbuilder "0.0.16" + +web-worker@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/web-worker/-/web-worker-1.2.0.tgz#5d85a04a7fbc1e7db58f66595d7a3ac7c9c180da" + integrity sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA== + +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yn@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/common/.gitignore b/common/.gitignore new file mode 100644 index 00000000..281d0e41 --- /dev/null +++ b/common/.gitignore @@ -0,0 +1,2 @@ +inputs +node_modules/ \ No newline at end of file diff --git a/common/README.md b/common/README.md new file mode 100644 index 00000000..218bda03 --- /dev/null +++ b/common/README.md @@ -0,0 +1,3 @@ +# Proof of Passport Commons + +Constants and utils used in multiple Proof of Passport subdirectories. diff --git a/common/package.json b/common/package.json new file mode 100644 index 00000000..5de125cd --- /dev/null +++ b/common/package.json @@ -0,0 +1,10 @@ +{ + "dependencies": { + "@babel/runtime": "^7.23.4", + "js-sha256": "^0.10.1", + "node-forge": "^1.3.1" + }, + "devDependencies": { + "@types/node-forge": "^1.3.10" + } +} diff --git a/common/src/constants/constants.ts b/common/src/constants/constants.ts new file mode 100644 index 00000000..0bec20f4 --- /dev/null +++ b/common/src/constants/constants.ts @@ -0,0 +1,263 @@ +export const AWS_ENDPOINT = "https://0pw5u65m3a.execute-api.eu-north-1.amazonaws.com/api-stage/mint" + +export const attributeToPosition = { + issuing_state: [2, 4], + name: [5, 43], + passport_number: [44, 52], + nationality: [54, 56], + date_of_birth: [57, 62], + gender: [64, 64], + expiry_date: [65, 70], +} + +export const countryCodes = { + "AFG": "Afghanistan", + "ALA": "Aland Islands", + "ALB": "Albania", + "DZA": "Algeria", + "ASM": "American Samoa", + "AND": "Andorra", + "AGO": "Angola", + "AIA": "Anguilla", + "ATA": "Antarctica", + "ATG": "Antigua and Barbuda", + "ARG": "Argentina", + "ARM": "Armenia", + "ABW": "Aruba", + "AUS": "Australia", + "AUT": "Austria", + "AZE": "Azerbaijan", + "BHS": "Bahamas", + "BHR": "Bahrain", + "BGD": "Bangladesh", + "BRB": "Barbados", + "BLR": "Belarus", + "BEL": "Belgium", + "BLZ": "Belize", + "BEN": "Benin", + "BMU": "Bermuda", + "BTN": "Bhutan", + "BOL": "Bolivia (Plurinational State of)", + "BES": "Bonaire, Sint Eustatius and Saba", + "BIH": "Bosnia and Herzegovina", + "BWA": "Botswana", + "BVT": "Bouvet Island", + "BRA": "Brazil", + "IOT": "British Indian Ocean Territory", + "BRN": "Brunei Darussalam", + "BGR": "Bulgaria", + "BFA": "Burkina Faso", + "BDI": "Burundi", + "CPV": "Cabo Verde", + "KHM": "Cambodia", + "CMR": "Cameroon", + "CAN": "Canada", + "CYM": "Cayman Islands", + "CAF": "Central African Republic", + "TCD": "Chad", + "CHL": "Chile", + "CHN": "China", + "CXR": "Christmas Island", + "CCK": "Cocos (Keeling) Islands", + "COL": "Colombia", + "COM": "Comoros", + "COG": "Congo", + "COD": "Congo, Democratic Republic of the", + "COK": "Cook Islands", + "CRI": "Costa Rica", + "CIV": "Cote d'Ivoire", + "HRV": "Croatia", + "CUB": "Cuba", + "CUW": "Curacao", + "CYP": "Cyprus", + "CZE": "Czechia", + "DNK": "Denmark", + "DJI": "Djibouti", + "DMA": "Dominica", + "DOM": "Dominican Republic", + "ECU": "Ecuador", + "EGY": "Egypt", + "SLV": "El Salvador", + "GNQ": "Equatorial Guinea", + "ERI": "Eritrea", + "EST": "Estonia", + "SWZ": "Eswatini", + "ETH": "Ethiopia", + "FLK": "Falkland Islands (Malvinas)", + "FRO": "Faroe Islands", + "FJI": "Fiji", + "FIN": "Finland", + "FRA": "France", + "GUF": "French Guiana", + "PYF": "French Polynesia", + "ATF": "French Southern Territories", + "GAB": "Gabon", + "GMB": "Gambia", + "GEO": "Georgia", + "DEU": "Germany", + "GHA": "Ghana", + "GIB": "Gibraltar", + "GRC": "Greece", + "GRL": "Greenland", + "GRD": "Grenada", + "GLP": "Guadeloupe", + "GUM": "Guam", + "GTM": "Guatemala", + "GGY": "Guernsey", + "GIN": "Guinea", + "GNB": "Guinea-Bissau", + "GUY": "Guyana", + "HTI": "Haiti", + "HMD": "Heard Island and McDonald Islands", + "VAT": "Holy See", + "HND": "Honduras", + "HKG": "Hong Kong", + "HUN": "Hungary", + "ISL": "Iceland", + "IND": "India", + "IDN": "Indonesia", + "IRN": "Iran (Islamic Republic of)", + "IRQ": "Iraq", + "IRL": "Ireland", + "IMN": "Isle of Man", + "ISR": "Israel", + "ITA": "Italy", + "JAM": "Jamaica", + "JPN": "Japan", + "JEY": "Jersey", + "JOR": "Jordan", + "KAZ": "Kazakhstan", + "KEN": "Kenya", + "KIR": "Kiribati", + "PRK": "Korea (Democratic People's Republic of)", + "KOR": "Korea, Republic of", + "KWT": "Kuwait", + "KGZ": "Kyrgyzstan", + "LAO": "Lao People's Democratic Republic", + "LVA": "Latvia", + "LBN": "Lebanon", + "LSO": "Lesotho", + "LBR": "Liberia", + "LBY": "Libya", + "LIE": "Liechtenstein", + "LTU": "Lithuania", + "LUX": "Luxembourg", + "MAC": "Macao", + "MDG": "Madagascar", + "MWI": "Malawi", + "MYS": "Malaysia", + "MDV": "Maldives", + "MLI": "Mali", + "MLT": "Malta", + "MHL": "Marshall Islands", + "MTQ": "Martinique", + "MRT": "Mauritania", + "MUS": "Mauritius", + "MYT": "Mayotte", + "MEX": "Mexico", + "FSM": "Micronesia (Federated States of)", + "MDA": "Moldova, Republic of", + "MCO": "Monaco", + "MNG": "Mongolia", + "MNE": "Montenegro", + "MSR": "Montserrat", + "MAR": "Morocco", + "MOZ": "Mozambique", + "MMR": "Myanmar", + "NAM": "Namibia", + "NRU": "Nauru", + "NPL": "Nepal", + "NLD": "Netherlands", + "NCL": "New Caledonia", + "NZL": "New Zealand", + "NIC": "Nicaragua", + "NER": "Niger", + "NGA": "Nigeria", + "NIU": "Niue", + "NFK": "Norfolk Island", + "MKD": "North Macedonia", + "MNP": "Northern Mariana Islands", + "NOR": "Norway", + "OMN": "Oman", + "PAK": "Pakistan", + "PLW": "Palau", + "PSE": "Palestine, State of", + "PAN": "Panama", + "PNG": "Papua New Guinea", + "PRY": "Paraguay", + "PER": "Peru", + "PHL": "Philippines", + "PCN": "Pitcairn", + "POL": "Poland", + "PRT": "Portugal", + "PRI": "Puerto Rico", + "QAT": "Qatar", + "REU": "Reunion", + "ROU": "Romania", + "RUS": "Russian Federation", + "RWA": "Rwanda", + "BLM": "Saint Barthelemy", + "SHN": "Saint Helena, Ascension and Tristan da Cunha", + "KNA": "Saint Kitts and Nevis", + "LCA": "Saint Lucia", + "MAF": "Saint Martin (French part)", + "SPM": "Saint Pierre and Miquelon", + "VCT": "Saint Vincent and the Grenadines", + "WSM": "Samoa", + "SMR": "San Marino", + "STP": "Sao Tome and Principe", + "SAU": "Saudi Arabia", + "SEN": "Senegal", + "SRB": "Serbia", + "SYC": "Seychelles", + "SLE": "Sierra Leone", + "SGP": "Singapore", + "SXM": "Sint Maarten (Dutch part)", + "SVK": "Slovakia", + "SVN": "Slovenia", + "SLB": "Solomon Islands", + "SOM": "Somalia", + "ZAF": "South Africa", + "SGS": "South Georgia and the South Sandwich Islands", + "SSD": "South Sudan", + "ESP": "Spain", + "LKA": "Sri Lanka", + "SDN": "Sudan", + "SUR": "Suriname", + "SJM": "Svalbard and Jan Mayen", + "SWE": "Sweden", + "CHE": "Switzerland", + "SYR": "Syrian Arab Republic", + "TWN": "Taiwan, Province of China", + "TJK": "Tajikistan", + "TZA": "Tanzania, United Republic of", + "THA": "Thailand", + "TLS": "Timor-Leste", + "TGO": "Togo", + "TKL": "Tokelau", + "TON": "Tonga", + "TTO": "Trinidad and Tobago", + "TUN": "Tunisia", + "TUR": "Turkey", + "TKM": "Turkmenistan", + "TCA": "Turks and Caicos Islands", + "TUV": "Tuvalu", + "UGA": "Uganda", + "UKR": "Ukraine", + "ARE": "United Arab Emirates", + "GBR": "United Kingdom of Great Britain and Northern Ireland", + "USA": "United States of America", + "UMI": "United States Minor Outlying Islands", + "URY": "Uruguay", + "UZB": "Uzbekistan", + "VUT": "Vanuatu", + "VEN": "Venezuela (Bolivarian Republic of)", + "VNM": "Viet Nam", + "VGB": "Virgin Islands (British)", + "VIR": "Virgin Islands (U.S.)", + "WLF": "Wallis and Futuna", + "ESH": "Western Sahara", + "YEM": "Yemen", + "ZMB": "Zambia", + "ZWE": "Zimbabwe" +} diff --git a/common/src/utils/passportData.ts b/common/src/utils/passportData.ts new file mode 100644 index 00000000..2a2b2a75 --- /dev/null +++ b/common/src/utils/passportData.ts @@ -0,0 +1,95 @@ +import { DataHash, PassportData } from "./types"; +import { hash, assembleEContent, formatAndConcatenateDataHashes, formatMrz, hexToDecimal } from "./utils"; +import * as forge from 'node-forge'; +const fs = require('fs'); +const path = require('path'); + +const sampleMRZ = "P c.charCodeAt(0)); + + // Signature verification + // const hashOfEContent = md.digest().getBytes(); + // const publicKey = rsa.setPublicKey( + // new forge.jsbn.BigInteger(modulus, 16), + // new forge.jsbn.BigInteger("10001", 16), + // ); + // const valid = publicKey.verify(hashOfEContent, signature); + // console.log('valid ?', valid) + + return { + mrz: sampleMRZ, + signatureAlgorithm: 'SHA256withRSA', // sha256WithRSAEncryption + pubKey: { + modulus: hexToDecimal(modulus), + }, + dataGroupHashes: sampleDataHashes as DataHash[], + eContent: eContent, + encryptedDigest: signatureBytes, + } +} + +export function getPassportData(): PassportData { + const passportDataPath = path.join(__dirname, '../../inputs/passportData.json'); + + if (fs.existsSync(passportDataPath)) { + return require(passportDataPath); + } else { + const sampleData = genSampleData(); + const inputsDir = path.join(__dirname, '../../inputs/'); + + if (!fs.existsSync(inputsDir)) { + fs.mkdirSync(inputsDir); + } + + fs.writeFileSync(passportDataPath, JSON.stringify(sampleData)); + return sampleData; + } +} \ No newline at end of file diff --git a/common/src/utils/passportDataStatic.ts b/common/src/utils/passportDataStatic.ts new file mode 100644 index 00000000..428f7b32 --- /dev/null +++ b/common/src/utils/passportDataStatic.ts @@ -0,0 +1,19 @@ +import { PassportData } from "./types"; + + +// export const samplePassportData = { +// "mrz":"P { + const dataHash = dataHashes[key as keyof typeof dataHashes]; + return [Number(key), dataHash]; + }) + .sort((a, b) => (a[0] as number) - (b[0] as number)) as DataHash[]; +} + +export function formatMrz(mrz: string) { + const mrzCharcodes = [...mrz].map(char => char.charCodeAt(0)); + + // console.log('mrzCharcodes:', mrzCharcodes); + + mrzCharcodes.unshift(88); // the length of the mrz data + mrzCharcodes.unshift(95, 31); // the MRZ_INFO_TAG + mrzCharcodes.unshift(91); // the new length of the whole array + mrzCharcodes.unshift(97); // the tag for DG1 + + // console.log('mrzCharcodes with tags:', mrzCharcodes); + + return mrzCharcodes; +} + +export function parsePubKeyString(pubKeyString: string) { + const modulusMatch = pubKeyString.match(/modulus: ([\w\d]+)\s*public/); + const publicExponentMatch = pubKeyString.match(/public exponent: (\w+)/); + + const modulus = modulusMatch ? modulusMatch[1] : null; + const exponent = publicExponentMatch ? publicExponentMatch[1] : null; + + // console.log('Modulus:', modulus); + // console.log('Public Exponent:', exponent); + + if (!modulus || !exponent) { + throw new Error('Could not parse public key string'); + } + + return { + modulus, + exponent, + }; +} + +export function formatAndConcatenateDataHashes( + mrzHash: number[], + dataHashes: DataHash[], +) { + // Let's replace the first array with the MRZ hash + dataHashes.shift(); + dataHashes.unshift([1, mrzHash]); + // concatenating dataHashes : + + let concat: number[] = [] + + // Starting sequence. Should be the same for everybody, but not sure + concat.push(...[ + 48, -126, 1, 37, 2, 1, 0, 48, 11, 6, 9, 96, -122, 72, 1, 101, 3, 4, 2, 1, + 48, -126, 1, 17, + ]) + + for(const dataHash of dataHashes) { + concat.push(...[48, 37, 2, 1, dataHash[0], 4, 32, ...dataHash[1]]) + } + + return concat; +} + +export function assembleEContent( + messageDigest: number[], + timeOfSignature: number[], +) { + const constructedEContent = []; + + // Detailed description is in private file r&d.ts for now + // First, the tag and length, assumed to be always the same + constructedEContent.push(...[49, 102]); + + // 1.2.840.113549.1.9.3 is RFC_3369_CONTENT_TYPE_OID + constructedEContent.push( + ...[48, 21, 6, 9, 42, -122, 72, -122, -9, 13, 1, 9, 3], + ); + // 2.23.136.1.1.1 is ldsSecurityObject + constructedEContent.push(...[49, 8, 6, 6, 103, -127, 8, 1, 1, 1]); + + // 1.2.840.113549.1.9.5 is signing-time + constructedEContent.push( + ...[48, 28, 6, 9, 42, -122, 72, -122, -9, 13, 1, 9, 5], + ); + // time of the signature + constructedEContent.push(...timeOfSignature); + // 1.2.840.113549.1.9.4 is RFC_3369_MESSAGE_DIGEST_OID + constructedEContent.push( + ...[48, 47, 6, 9, 42, -122, 72, -122, -9, 13, 1, 9, 4], + ); + // TAG and length of the message digest + constructedEContent.push(...[49, 34, 4, 32]); + + constructedEContent.push(...messageDigest); + return constructedEContent; +} + +export function toUnsigned(byte: number) { + return byte & 0xff; +} + +export function arraysAreEqual(array1: number[], array2: number[]) { + return ( + array1.length === array2.length && + array1.every((value, index) => value === array2[index]) + ); +} + +export function toSigned(byte: number) { + return byte > 127 ? byte - 256 : byte; +} + +export const toBinaryString = (byte: any) => { + const binary = (parseInt(byte, 10) & 0xFF).toString(2).padStart(8, '0'); + return binary; +}; + +export function splitToWords( + number: bigint, + wordsize: bigint, + numberElement: bigint +) { + let t = number + const words: string[] = [] + for (let i = BigInt(0); i < numberElement; ++i) { + const baseTwo = BigInt(2) + + words.push(`${t % BigInt(Math.pow(Number(baseTwo), Number(wordsize)))}`) + t = BigInt(t / BigInt(Math.pow(Number(BigInt(2)), Number(wordsize)))) + } + if (!(t == BigInt(0))) { + throw `Number ${number} does not fit in ${( + wordsize * numberElement + ).toString()} bits` + } + return words +} + +export function bytesToBigDecimal(arr: number[]): string { + let result = BigInt(0); + for (let i = 0; i < arr.length; i++) { + result = result * BigInt(256) + BigInt(arr[i] & 0xff); + } + return result.toString(); +} + +export function hexToDecimal(hex: string): string { + return BigInt(`0x${hex}`).toString(); +} + +// hash logic here because the one in utils.ts only works with node +export function hash(bytesArray: number[]) { + let unsignedBytesArray = bytesArray.map(toUnsignedByte); + let hash = sha256(unsignedBytesArray); + return hexToSignedBytes(hash); +} + +export function hexToSignedBytes(hexString: string): number[] { + let bytes = []; + for (let i = 0; i < hexString.length - 1; i += 2) { + let byte = parseInt(hexString.substr(i, 2), 16); + bytes.push(byte >= 128 ? byte - 256 : byte); + } + return bytes; +} + +export function toUnsignedByte(signedByte: number) { + return signedByte < 0 ? signedByte + 256 : signedByte; +} diff --git a/common/tsconfig.json b/common/tsconfig.json new file mode 100644 index 00000000..a05d480d --- /dev/null +++ b/common/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "resolveJsonModule": true, + "esModuleInterop": true, + "target": "ES2015", + "moduleResolution": "node" + } +} \ No newline at end of file diff --git a/common/yarn.lock b/common/yarn.lock new file mode 100644 index 00000000..64ca82b0 --- /dev/null +++ b/common/yarn.lock @@ -0,0 +1,44 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/runtime@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.4.tgz#36fa1d2b36db873d25ec631dcc4923fdc1cf2e2e" + integrity sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg== + dependencies: + regenerator-runtime "^0.14.0" + +"@types/node-forge@^1.3.10": + version "1.3.10" + resolved "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz" + integrity sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "20.10.0" + resolved "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz" + integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ== + dependencies: + undici-types "~5.26.4" + +js-sha256@^0.10.1: + version "0.10.1" + resolved "https://registry.npmjs.org/js-sha256/-/js-sha256-0.10.1.tgz" + integrity sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw== + +node-forge@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== diff --git a/contracts/.gitignore b/contracts/.gitignore new file mode 100644 index 00000000..71f6a160 --- /dev/null +++ b/contracts/.gitignore @@ -0,0 +1,11 @@ +node_modules +.env +coverage +coverage.json +typechain +typechain-types + +#Hardhat files +cache +artifacts + diff --git a/contracts/README.md b/contracts/README.md new file mode 100644 index 00000000..89495d09 --- /dev/null +++ b/contracts/README.md @@ -0,0 +1,15 @@ +# Proof of Passport Contracts + +Contracts for Proof of Passport. + +🚧 under heavy development 🚧 + +Try running some of the following tasks: + +```shell +npx hardhat help +npx hardhat test +GAS_REPORT=true npx hardhat test +npx hardhat node +npx hardhat run scripts/deploy.ts +``` diff --git a/contracts/contracts/ProofOfPassport.sol b/contracts/contracts/ProofOfPassport.sol new file mode 100644 index 00000000..3766c8b5 --- /dev/null +++ b/contracts/contracts/ProofOfPassport.sol @@ -0,0 +1,203 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/utils/Strings.sol"; +import {Groth16Verifier} from "./Verifier.sol"; +import {Base64} from "./libraries/Base64.sol"; +import {Formatter} from "./libraries/Formatter.sol"; +import "hardhat/console.sol"; + +contract ProofOfPassport is ERC721Enumerable, Ownable { + using Strings for uint256; + using Base64 for *; + + Groth16Verifier public immutable verifier; + Formatter public formatter; + address public cscaPubkey = 0x0000000000000000000000000000000000000000; + + mapping(uint256 => bool) public nullifiers; + + struct AttributePosition { + string name; + uint256 start; + uint256 end; + uint256 index; + } + + struct Attributes { + string[7] values; + } + + AttributePosition[] public attributePositions; + + mapping(uint256 => Attributes) private tokenAttributes; + + constructor(Groth16Verifier v, Formatter f) ERC721("ProofOfPassport", "ProofOfPassport") { + verifier = v; + formatter = f; + setupAttributes(); + transferOwnership(msg.sender); + } + + function setupAttributes() internal { + attributePositions.push(AttributePosition("issuing_state", 2, 4, 0)); + attributePositions.push(AttributePosition("name", 5, 43, 1)); + attributePositions.push(AttributePosition("passport_number", 44, 52, 2)); + attributePositions.push(AttributePosition("nationality", 54, 56, 3)); + attributePositions.push(AttributePosition("date_of_birth", 57, 62, 4)); + attributePositions.push(AttributePosition("gender", 64, 64, 5)); + attributePositions.push(AttributePosition("expiry_date", 65, 70, 6)); + } + + function setCSCApubKey(address _CSCApubKey) public onlyOwner { + cscaPubkey = _CSCApubKey; + } + + function mint( + uint256[2] memory a, + uint256[2][2] memory b, + uint256[2] memory c, + uint256[16] memory inputs + ) public { + // check that the nullifier has not been used before + require(!nullifiers[inputs[3]], "Signature already nullified"); + + + + // Verify that the public key for RSA matches the hardcoded one + // for (uint256 i = body_len; i < msg_len - 1; i++) { + // require(mailServer.isVerified(domain, i - body_len, inputs[i]), "Invalid: RSA modulus not matched"); + // } + // inputs[4] + + // Verify that the public key for RSA matches the hardcoded one + // commented out for now, since hard to keep up with all + // require(cscaPubkey == inputs[], "Invalid pubkey in inputs"); + + require(verifier.verifyProof(a, b, c, inputs), "Invalid Proof"); + + // Effects: Mint token + address addr = address(uint160(inputs[inputs.length - 1])); // generally the last one + uint256 newTokenId = totalSupply(); + _mint(addr, newTokenId); + nullifiers[inputs[3]] = true; + + + // Set attributes + uint256[3] memory firstThree = sliceFirstThree(inputs); + bytes memory charcodes = fieldElementsToBytes(firstThree); + // console.logBytes1(charcodes[21]); + + Attributes storage attributes = tokenAttributes[newTokenId]; + + for (uint i = 0; i < attributePositions.length; i++) { + AttributePosition memory attribute = attributePositions[i]; + bytes memory attributeBytes = new bytes(attribute.end - attribute.start + 1); + for (uint j = attribute.start; j <= attribute.end; j++) { + attributeBytes[j - attribute.start] = charcodes[j]; + } + string memory attributeValue = string(attributeBytes); + attributes.values[i] = attributeValue; + console.log(attribute.name, attributes.values[i]); + } + } + + function fieldElementsToBytes(uint256[3] memory publicSignals) public pure returns (bytes memory) { + uint8[3] memory bytesCount = [31, 31, 26]; + bytes memory bytesArray = new bytes(88); // 31 + 31 + 26 + + uint256 index = 0; + for (uint256 i = 0; i < 3; i++) { + uint256 element = publicSignals[i]; + for (uint8 j = 0; j < bytesCount[i]; j++) { + bytesArray[index++] = bytes1(uint8(element & 0xFF)); + element = element >> 8; + } + } + + return bytesArray; + } + + function sliceFirstThree(uint256[16] memory input) public pure returns (uint256[3] memory) { + uint256[3] memory sliced; + + for (uint256 i = 0; i < 3; i++) { + sliced[i] = input[i]; + } + + return sliced; + } + + function _beforeTokenTransfer( + address from, + address to, + uint256 tokenId, + uint256 batchSize + ) internal virtual override { + super._beforeTokenTransfer(from, to, tokenId, batchSize); + require(from == address(0), "Cannot transfer - Proof of Passport is soulbound"); + } + + function tokenURI( + uint256 _tokenId + ) public view virtual override returns (string memory) { + require( + _exists(_tokenId), + "ERC721Metadata: URI query for nonexistent token" + ); + Attributes memory attributes = tokenAttributes[_tokenId]; + + console.log("Issuing state in tokenURI", attributes.values[0]); + + string memory firstName; + string memory lastName; + + (firstName, lastName) = formatter.formatName(attributes.values[1]); + + bytes memory baseURI = ( + abi.encodePacked( + '{ "attributes": [', + '{"trait_type": "Issuing State", "value": "', + formatter.formatCountryName(attributes.values[0]), + '"},{"trait_type": "FirstName", "value": "', + firstName, + '"},{"trait_type": "LastName", "value": "', + lastName, + '"},{"trait_type": "Passport Number", "value": "', + attributes.values[2], + '"},{"trait_type": "Nationality", "value": "', + formatter.formatCountryName(attributes.values[3]), + '"},{"trait_type": "Date of birth", "value": "', + formatter.formatDate(attributes.values[4]), + '"},{"trait_type": "Gender", "value": "', + attributes.values[5], + '"},{"trait_type": "Expiry date", "value": "', + formatter.formatDate(attributes.values[6]), + '"},{"trait_type": "Expired", "value": "', + isExpired(_tokenId) ? "Yes" : "No", + '"}', + "],", + '"description": "Proof of Passport guarantees possession of a valid passport.","external_url": "https://github.com/zk-passport/proof-of-passport","image": "https://i.imgur.com/9kvetij.png","name": "Proof of Passport #', + _tokenId.toString(), + '"}' + ) + ); + + return + string( + abi.encodePacked( + "data:application/json;base64,", + baseURI.encode() + ) + ); + } + + function isExpired(uint256 _tokenId) public view returns (bool) { + Attributes memory attributes = tokenAttributes[_tokenId]; + uint256 expiryDate = formatter.dateToUnixTimestamp(attributes.values[6]); + + return block.timestamp > expiryDate; + } +} \ No newline at end of file diff --git a/contracts/contracts/Verifier.sol b/contracts/contracts/Verifier.sol new file mode 100644 index 00000000..b520e828 --- /dev/null +++ b/contracts/contracts/Verifier.sol @@ -0,0 +1,275 @@ +// SPDX-License-Identifier: GPL-3.0 +/* + Copyright 2021 0KIMS association. + + This file is generated with [snarkJS](https://github.com/iden3/snarkjs). + + snarkJS is a free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + snarkJS is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with snarkJS. If not, see . +*/ + +pragma solidity >=0.7.0 <0.9.0; + +contract Groth16Verifier { + // Scalar field size + uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; + // Base field size + uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; + + // Verification Key data + uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042; + uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958; + uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132; + uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731; + uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679; + uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856; + uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; + uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; + uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; + uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; + uint256 constant deltax1 = 12998184568714886000581631691786755994010124591150064598929050024647883914791; + uint256 constant deltax2 = 8872291059618739753948146269965866576020927293610628703353695206084406761262; + uint256 constant deltay1 = 16861325509871102778290305020175325612267417377127302662019065930286874638729; + uint256 constant deltay2 = 5220802515382615575730334334650385921887178989834558858833060308898027679345; + + + uint256 constant IC0x = 4897812530436581420070048815704719785256466787655503857610889333796081821201; + uint256 constant IC0y = 21324217308758963004039464033551222626995062428505595457846546072979649950535; + + uint256 constant IC1x = 3402067829842345916430895428185245090645621522198317090797379965574771542636; + uint256 constant IC1y = 15689341079133962080137763365487039194375030636040098473539254350433970371666; + + uint256 constant IC2x = 17395362500217368985868893090734905039167826866091632900857231867723495577602; + uint256 constant IC2y = 7930260148586132748363663695528567251481992615924576457603406418853534765181; + + uint256 constant IC3x = 585494952178863414068208567603839798093905284375122061973360892129986520320; + uint256 constant IC3y = 9052106461455604192832593945466435172808609013430707922648579604917214395471; + + uint256 constant IC4x = 7009544555987721721525965879762930953012066717281509356647068054408609863246; + uint256 constant IC4y = 9820829334259318510794834811753840115411696228971683399345859623869811549881; + + uint256 constant IC5x = 14238418207024939545815829157744718461870627038741425938816007286311574134474; + uint256 constant IC5y = 281828200475697177916593309667507636329345262293367509851063337891478088781; + + uint256 constant IC6x = 2588875801176981985506740691573068253787601389179711941209167172577223524972; + uint256 constant IC6y = 15518320710469760878810555468816349074382837865578096899468878146062509663814; + + uint256 constant IC7x = 17316533695265131380437649603796400699657451230738779001098608159520582988369; + uint256 constant IC7y = 8192809588256960378913803069056080395056022087843425771582496472786713726350; + + uint256 constant IC8x = 7407001681033909392094003743482787694603426004447721439357204522366208646546; + uint256 constant IC8y = 14678011064151490372018354732758508739891026527348606433971585164806457243690; + + uint256 constant IC9x = 14324550585252189304511012915310919737099760521255841560510202883547241215550; + uint256 constant IC9y = 17843516173433864891394764190574725294294272661192260445890002683170043518436; + + uint256 constant IC10x = 7539891259658208616633326740578026995822087197681333710337145994575633967330; + uint256 constant IC10y = 11252528180616460725708054390959401682257312545535188972038868508936671228701; + + uint256 constant IC11x = 13300379642556942794398405666278194834327040509717856013516915921151482858342; + uint256 constant IC11y = 3765685546823952453740511654773017065896884149593650080085427606727523849353; + + uint256 constant IC12x = 9268919849281685133024784239234560640021437913056581963083327429501365255031; + uint256 constant IC12y = 11222912618976361984001818562665888490194957370177999142904578411305511279126; + + uint256 constant IC13x = 2597478889552428352737130179687206531821645186216868965539289093449836402726; + uint256 constant IC13y = 757968852987628828382971340903318389342984851650872494795704692702408158904; + + uint256 constant IC14x = 16147563600769233454259564579865458680953713847620754688678964339139397943562; + uint256 constant IC14y = 3229058257062194976564868360849873757615447419031013710509312378420932332089; + + uint256 constant IC15x = 11276405747528923910383092138862864843497716277810279291090775583122182049041; + uint256 constant IC15y = 17478497004985764197329627914040721906294759410027200889688899456335265284727; + + uint256 constant IC16x = 7537276704716430448981792598508402432998887447285614055846784939499149706536; + uint256 constant IC16y = 13397681836333574838145763582606233729786782316119672353292568940401561429759; + + + // Memory data + uint16 constant pVk = 0; + uint16 constant pPairing = 128; + + uint16 constant pLastMem = 896; + + function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[16] calldata _pubSignals) public view returns (bool) { + assembly { + function checkField(v) { + if iszero(lt(v, q)) { + mstore(0, 0) + return(0, 0x20) + } + } + + // G1 function to multiply a G1 value(x,y) to value in an address + function g1_mulAccC(pR, x, y, s) { + let success + let mIn := mload(0x40) + mstore(mIn, x) + mstore(add(mIn, 32), y) + mstore(add(mIn, 64), s) + + success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + + mstore(add(mIn, 64), mload(pR)) + mstore(add(mIn, 96), mload(add(pR, 32))) + + success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) + + if iszero(success) { + mstore(0, 0) + return(0, 0x20) + } + } + + function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { + let _pPairing := add(pMem, pPairing) + let _pVk := add(pMem, pVk) + + mstore(_pVk, IC0x) + mstore(add(_pVk, 32), IC0y) + + // Compute the linear combination vk_x + + g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) + + g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) + + g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) + + g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) + + g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) + + g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) + + g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192))) + + g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224))) + + g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256))) + + g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288))) + + g1_mulAccC(_pVk, IC11x, IC11y, calldataload(add(pubSignals, 320))) + + g1_mulAccC(_pVk, IC12x, IC12y, calldataload(add(pubSignals, 352))) + + g1_mulAccC(_pVk, IC13x, IC13y, calldataload(add(pubSignals, 384))) + + g1_mulAccC(_pVk, IC14x, IC14y, calldataload(add(pubSignals, 416))) + + g1_mulAccC(_pVk, IC15x, IC15y, calldataload(add(pubSignals, 448))) + + g1_mulAccC(_pVk, IC16x, IC16y, calldataload(add(pubSignals, 480))) + + + // -A + mstore(_pPairing, calldataload(pA)) + mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) + + // B + mstore(add(_pPairing, 64), calldataload(pB)) + mstore(add(_pPairing, 96), calldataload(add(pB, 32))) + mstore(add(_pPairing, 128), calldataload(add(pB, 64))) + mstore(add(_pPairing, 160), calldataload(add(pB, 96))) + + // alpha1 + mstore(add(_pPairing, 192), alphax) + mstore(add(_pPairing, 224), alphay) + + // beta2 + mstore(add(_pPairing, 256), betax1) + mstore(add(_pPairing, 288), betax2) + mstore(add(_pPairing, 320), betay1) + mstore(add(_pPairing, 352), betay2) + + // vk_x + mstore(add(_pPairing, 384), mload(add(pMem, pVk))) + mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) + + + // gamma2 + mstore(add(_pPairing, 448), gammax1) + mstore(add(_pPairing, 480), gammax2) + mstore(add(_pPairing, 512), gammay1) + mstore(add(_pPairing, 544), gammay2) + + // C + mstore(add(_pPairing, 576), calldataload(pC)) + mstore(add(_pPairing, 608), calldataload(add(pC, 32))) + + // delta2 + mstore(add(_pPairing, 640), deltax1) + mstore(add(_pPairing, 672), deltax2) + mstore(add(_pPairing, 704), deltay1) + mstore(add(_pPairing, 736), deltay2) + + + let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) + + isOk := and(success, mload(_pPairing)) + } + + let pMem := mload(0x40) + mstore(0x40, add(pMem, pLastMem)) + + // Validate that all evaluations ∈ F + + checkField(calldataload(add(_pubSignals, 0))) + + checkField(calldataload(add(_pubSignals, 32))) + + checkField(calldataload(add(_pubSignals, 64))) + + checkField(calldataload(add(_pubSignals, 96))) + + checkField(calldataload(add(_pubSignals, 128))) + + checkField(calldataload(add(_pubSignals, 160))) + + checkField(calldataload(add(_pubSignals, 192))) + + checkField(calldataload(add(_pubSignals, 224))) + + checkField(calldataload(add(_pubSignals, 256))) + + checkField(calldataload(add(_pubSignals, 288))) + + checkField(calldataload(add(_pubSignals, 320))) + + checkField(calldataload(add(_pubSignals, 352))) + + checkField(calldataload(add(_pubSignals, 384))) + + checkField(calldataload(add(_pubSignals, 416))) + + checkField(calldataload(add(_pubSignals, 448))) + + checkField(calldataload(add(_pubSignals, 480))) + + checkField(calldataload(add(_pubSignals, 512))) + + + // Validate all evaluations + let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) + + mstore(0, isValid) + return(0, 0x20) + } + } + } diff --git a/contracts/contracts/libraries/Base64.sol b/contracts/contracts/libraries/Base64.sol new file mode 100644 index 00000000..b8757227 --- /dev/null +++ b/contracts/contracts/libraries/Base64.sol @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: MIT + +/// @title Base64 +/// @author Brecht Devos - +/// @notice Provides a function for encoding some bytes in base64 +pragma solidity ^0.8.18; +library Base64 { + string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + + function encode(bytes memory data) internal pure returns (string memory) { + if (data.length == 0) return ''; + + // load the table into memory + string memory table = TABLE; + + // multiply by 4/3 rounded up + uint256 encodedLen = 4 * ((data.length + 2) / 3); + + // add some extra buffer at the end required for the writing + string memory result = new string(encodedLen + 32); + + assembly { + // set the actual output length + mstore(result, encodedLen) + + // prepare the lookup table + let tablePtr := add(table, 1) + + // input ptr + let dataPtr := data + let endPtr := add(dataPtr, mload(data)) + + // result ptr, jump over length + let resultPtr := add(result, 32) + + // run over the input, 3 bytes at a time + for {} lt(dataPtr, endPtr) {} + { + dataPtr := add(dataPtr, 3) + + // read 3 bytes + let input := mload(dataPtr) + + // write 4 characters + mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))) + resultPtr := add(resultPtr, 1) + mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))) + resultPtr := add(resultPtr, 1) + mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F))))) + resultPtr := add(resultPtr, 1) + mstore(resultPtr, shl(248, mload(add(tablePtr, and( input, 0x3F))))) + resultPtr := add(resultPtr, 1) + } + + // padding with '=' + switch mod(mload(data), 3) + case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } + case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } + } + + return result; + } +} diff --git a/contracts/contracts/libraries/Formatter.sol b/contracts/contracts/libraries/Formatter.sol new file mode 100644 index 00000000..76822ec2 --- /dev/null +++ b/contracts/contracts/libraries/Formatter.sol @@ -0,0 +1,166 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.18; + +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract Formatter is Ownable { + mapping(string => string) private countryCodes; + + constructor() { + transferOwnership(msg.sender); + } + + function formatName(string memory input) public pure returns (string memory firstName, string memory lastName) { + bytes memory inputBytes = bytes(input); + bytes memory firstNameBytes; + bytes memory lastNameBytes; + + uint i = 0; + // Extract last name + while(i < inputBytes.length && inputBytes[i] != '<') { + lastNameBytes = abi.encodePacked(lastNameBytes, inputBytes[i]); + i++; + } + + // Skip the separator "<<" + i += 2; + + // Extract first names + while(i < inputBytes.length) { + if(inputBytes[i] == '<') { + if (i + 1 < inputBytes.length && inputBytes[i + 1] == '<') { + break; + } + firstNameBytes = abi.encodePacked(firstNameBytes, ' '); + } else { + firstNameBytes = abi.encodePacked(firstNameBytes, inputBytes[i]); + } + i++; + } + + firstName = string(firstNameBytes); + lastName = string(lastNameBytes); + } + + function formatDate(string memory date) public pure returns (string memory) { + // Ensure the date string is the correct length + require(bytes(date).length == 6, "Invalid date length"); + + string memory year = substring(date, 0, 2); + string memory month = substring(date, 2, 4); + string memory day = substring(date, 4, 6); + + return string(abi.encodePacked(day, "-", month, "-", year)); + } + + function substring(string memory str, uint startIndex, uint endIndex) public pure returns (string memory) { + bytes memory strBytes = bytes(str); + bytes memory result = new bytes(endIndex - startIndex); + + for(uint i = startIndex; i < endIndex; i++) { + result[i - startIndex] = strBytes[i]; + } + + return string(result); + } + + function formatCountryName(string memory code) public view returns (string memory) { + string memory countryName = countryCodes[code]; + if(bytes(countryName).length == 0) { + return code; + } + return countryName; + } + + function addCountryCodes(string[][] memory codeToName) public onlyOwner { + for(uint i = 0; i < codeToName.length; i++) { + string memory code = codeToName[i][0]; + string memory name = codeToName[i][1]; + countryCodes[code] = name; + } + } + + function dateToUnixTimestamp(string memory date) public pure returns (uint256) { + // Ensure the date string is the correct length (6 characters) + require(bytes(date).length == 6, "Invalid date length"); + + // Extract day, month, and year + uint year = parseDatePart(substring(date, 0, 2)) + 2000; + uint month = parseDatePart(substring(date, 2, 4)); + uint day = parseDatePart(substring(date, 4, 6)); + + // Convert to Unix timestamp + return toTimestamp(year, month, day); + } + + // Helper function to convert a string to an integer + function parseDatePart(string memory value) internal pure returns (uint) { + bytes memory tempEmptyStringTest = bytes(value); + if (tempEmptyStringTest.length == 0) { + return 0; + } + + uint digit; + uint result; + for (uint i = 0; i < tempEmptyStringTest.length; i++) { + digit = uint(uint8(tempEmptyStringTest[i])) - 48; // '0' is 48 in ASCII + result = result * 10 + digit; + } + return result; + } + + // Convert date to Unix timestamp + function toTimestamp(uint256 year, uint256 month, uint256 day) internal pure returns (uint timestamp) { + uint16 i; + + // Year + for (i = 1970; i < year; i++) { + if (isLeapYear(i)) { + timestamp += 366 days; + } else { + timestamp += 365 days; + } + } + + // Month + uint8[12] memory monthDayCounts; + monthDayCounts[0] = 31; + if (isLeapYear(year)) { + monthDayCounts[1] = 29; + } else { + monthDayCounts[1] = 28; + } + monthDayCounts[2] = 31; + monthDayCounts[3] = 30; + monthDayCounts[4] = 31; + monthDayCounts[5] = 30; + monthDayCounts[6] = 31; + monthDayCounts[7] = 31; + monthDayCounts[8] = 30; + monthDayCounts[9] = 31; + monthDayCounts[10] = 30; + monthDayCounts[11] = 31; + + for (i = 1; i < month; i++) { + timestamp += monthDayCounts[i - 1] * 1 days; + } + + // Day + timestamp += (day - 1) * 1 days; + + return timestamp; + } + + // Check if year is a leap year + function isLeapYear(uint256 year) internal pure returns (bool) { + if (year % 4 != 0) { + return false; + } else if (year % 100 != 0) { + return true; + } else if (year % 400 != 0) { + return false; + } else { + return true; + } + } +} \ No newline at end of file diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts new file mode 100644 index 00000000..5191b375 --- /dev/null +++ b/contracts/hardhat.config.ts @@ -0,0 +1,25 @@ +import { HardhatUserConfig } from "hardhat/config"; +import "@nomicfoundation/hardhat-toolbox"; +require("dotenv").config(); +import "hardhat-contract-sizer"; + +const config: HardhatUserConfig = { + solidity: "0.8.18", + defaultNetwork: "hardhat", + networks: { + goerli: { + url: "https://eth-goerli.public.blastapi.io", + accounts: [process.env.PKEY as string], + }, + polygon: { + url: "https://polygon.llamarpc.com", + accounts: [process.env.PKEY as string], + }, + mumbai: { + url: "https://polygon-mumbai-bor.publicnode.com", + accounts: [process.env.PKEY as string], + } + }, +}; + +export default config; diff --git a/contracts/package-lock.json b/contracts/package-lock.json new file mode 100644 index 00000000..90daa5e5 --- /dev/null +++ b/contracts/package-lock.json @@ -0,0 +1,16751 @@ +{ + "name": "hardhat-project", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "hardhat-project", + "dependencies": { + "@openzeppelin/contracts": "^4.9.2", + "axios": "^1.6.2", + "dotenv": "^16.3.1", + "hardhat-contract-sizer": "^2.10.0", + "snarkjs": "^0.7.2" + }, + "devDependencies": { + "@nomicfoundation/hardhat-toolbox": "^3.0.0", + "@types/snarkjs": "^0.7.7", + "hardhat": "^2.17.0", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", + "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==", + "dev": true, + "peer": true + }, + "node_modules/@chainsafe/as-sha256": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", + "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" + }, + "node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", + "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "node_modules/@chainsafe/ssz": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", + "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.4.2", + "case": "^1.6.3" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@iden3/bigarray": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz", + "integrity": "sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==" + }, + "node_modules/@iden3/binfileutils": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.11.tgz", + "integrity": "sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA==", + "dependencies": { + "fastfile": "0.0.20", + "ffjavascript": "^0.2.48" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "devOptional": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "devOptional": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "dependencies": { + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "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, + "peer": 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, + "peer": 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, + "peer": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nomicfoundation/ethereumjs-block": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", + "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", + "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-ethash": "3.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", + "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", + "dependencies": { + "@nomicfoundation/ethereumjs-util": "9.0.1", + "crc-32": "^1.2.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-ethash": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", + "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-evm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", + "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", + "dependencies": { + "@ethersproject/providers": "^5.7.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", + "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", + "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1", + "js-sdsl": "^4.1.4" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-trie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", + "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@types/readable-stream": "^2.3.13", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", + "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", + "dependencies": { + "@chainsafe/ssz": "^0.9.2", + "@ethersproject/providers": "^5.7.2", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", + "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", + "dependencies": { + "@chainsafe/ssz": "^0.10.0", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", + "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", + "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.5.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", + "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.1.tgz", + "integrity": "sha512-qWKndseO8IPt8HiVamgEAutcBOYtX7/O6NPfe7uMNWxY2ywWaiWjDcRFuYYqxrZOMyQZl6ZuiHxbaRNctTUgLw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/chai-as-promised": "^7.1.3", + "chai-as-promised": "^7.1.1", + "deep-eql": "^4.0.1", + "ordinal": "^1.0.3" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "chai": "^4.2.0", + "ethers": "^6.1.0", + "hardhat": "^2.9.4" + } + }, + "node_modules/@nomicfoundation/hardhat-ethers": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz", + "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==", + "dev": true, + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "lodash.isequal": "^4.5.0" + }, + "peerDependencies": { + "ethers": "^6.1.0", + "hardhat": "^2.0.0" + } + }, + "node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", + "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", + "dev": true, + "peer": true, + "dependencies": { + "ethereumjs-util": "^7.1.4" + }, + "peerDependencies": { + "hardhat": "^2.9.5" + } + }, + "node_modules/@nomicfoundation/hardhat-toolbox": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz", + "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==", + "dev": true, + "peerDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-verify": "^1.0.0", + "@typechain/ethers-v6": "^0.4.0", + "@typechain/hardhat": "^8.0.0", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=12.0.0", + "chai": "^4.2.0", + "ethers": "^6.4.0", + "hardhat": "^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typechain": "^8.2.0", + "typescript": ">=4.5.0" + } + }, + "node_modules/@nomicfoundation/hardhat-verify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.0.4.tgz", + "integrity": "sha512-zKH7lCgesD9MQbrMsV9DH9NS5Qhkv9K1W9LvbkZWvUQdpyS6zzDyIuJwmfxRKfUGXVlpA2X8nSL3MtxSj3s5aw==", + "dev": true, + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", + "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", + "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", + "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", + "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", + "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", + "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", + "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", + "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", + "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", + "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", + "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@openzeppelin/contracts": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.2.tgz", + "integrity": "sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg==" + }, + "node_modules/@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dependencies": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "dependencies": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dependencies": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", + "dev": true, + "peer": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "devOptional": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "devOptional": true + }, + "node_modules/@typechain/ethers-v6": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz", + "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==", + "dev": true, + "peer": true, + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "ethers": "6.x", + "typechain": "^8.3.1", + "typescript": ">=4.7.0" + } + }, + "node_modules/@typechain/hardhat": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz", + "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==", + "dev": true, + "peer": true, + "dependencies": { + "fs-extra": "^9.1.0" + }, + "peerDependencies": { + "@typechain/ethers-v6": "^0.4.3", + "ethers": "^6.1.0", + "hardhat": "^2.9.9", + "typechain": "^8.3.1" + } + }, + "node_modules/@typechain/hardhat/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "peer": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typechain/hardhat/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@typechain/hardhat/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true, + "peer": true + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "peer": true + }, + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true, + "peer": true + }, + "node_modules/@types/node": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.4.tgz", + "integrity": "sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==" + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true, + "peer": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true, + "peer": true + }, + "node_modules/@types/readable-stream": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "dependencies": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, + "node_modules/@types/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/snarkjs": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@types/snarkjs/-/snarkjs-0.7.7.tgz", + "integrity": "sha512-t/fYLdqUDM7W/XP+CKh4kvo9SS2ejtqHJz/2LQf/UsrrCsDYRjQ85DQFdvIJ6FvJjUvtEEPpTSCPk9gDDjcBWQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true, + "peer": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-level": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", + "dependencies": { + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "devOptional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "devOptional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "optional": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true, + "peer": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "peer": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "peer": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "peer": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true, + "peer": true + }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "peer": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "peer": true + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/bigint-crypto-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", + "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "dependencies": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/bufferutil": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "hasInstallScript": true, + "optional": true, + "peer": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "peer": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/case": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "peer": true + }, + "node_modules/catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "peer": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "peer": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "peer": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/circom_runtime": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.24.tgz", + "integrity": "sha512-H7/7I2J/cBmRnZm9docOCGhfxzS61BEm4TMCWcrZGsWNBQhePNfQq88Oj2XpUfzmBTCd8pRvRb3Mvazt3TMrJw==", + "dependencies": { + "ffjavascript": "0.2.60" + }, + "bin": { + "calcwit": "calcwit.js" + } + }, + "node_modules/circom_runtime/node_modules/ffjavascript": { + "version": "0.2.60", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", + "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", + "dependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + }, + "node_modules/classic-level": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", + "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", + "hasInstallScript": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "^2.2.2", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "peer": true, + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "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" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "peer": true + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "peer": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", + "dev": true, + "peer": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "peer": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "peer": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dev": true, + "peer": true, + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "peer": true, + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, + "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, + "peer": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "peer": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/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/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "peer": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-abstract/node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true, + "peer": true + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } + }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "engines": { + "node": ">=0.10.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/eth-gas-reporter": { + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", + "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", + "dev": true, + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.0.0-beta.146", + "@solidity-parser/parser": "^0.14.0", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^4.0.40", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^7.1.1", + "req-cwd": "^2.0.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" + }, + "peerDependencies": { + "@codechecks/client": "^0.1.0" + }, + "peerDependenciesMeta": { + "@codechecks/client": { + "optional": true + } + } + }, + "node_modules/eth-gas-reporter/node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/eth-gas-reporter/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, + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "peer": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "peer": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true, + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "peer": true, + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dev": true, + "peer": true, + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/eth-gas-reporter/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, + "peer": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "peer": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/eth-gas-reporter/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eth-gas-reporter/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true, + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eth-gas-reporter/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, + "peer": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eth-gas-reporter/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eth-gas-reporter/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/eth-gas-reporter/node_modules/mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/eth-gas-reporter/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==", + "dev": true, + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eth-gas-reporter/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, + "peer": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "peer": true, + "dependencies": { + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eth-gas-reporter/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "dev": true, + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", + "dev": true, + "peer": true + }, + "node_modules/eth-gas-reporter/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, + "peer": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/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, + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "peer": true + }, + "node_modules/eth-gas-reporter/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, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/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==", + "dev": true, + "peer": true + }, + "node_modules/eth-gas-reporter/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, + "peer": 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/eth-gas-reporter/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, + "peer": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "peer": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/ethereum-bloom-filters": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "dev": true, + "peer": true, + "dependencies": { + "js-sha3": "^0.8.0" + } + }, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + }, + "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ethereumjs-abi/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ethers": { + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.6.5.tgz", + "integrity": "sha512-Tc3HXzI0UJ9EhPp6E0fntkgMIA2//rhcB0UsmiRMCR+Bii5iu0RjtwJV55IhlLJ4K39pd0ku+eE4WRgqrLLW2Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "peer": true, + "dependencies": { + "@adraffy/ens-normalize": "1.9.2", + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.7.1", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "dev": true, + "peer": true + }, + "node_modules/ethers/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "dev": true, + "peer": true + }, + "node_modules/ethers/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true, + "peer": true + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "dev": true, + "peer": true, + "dependencies": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true, + "peer": true + }, + "node_modules/ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "peer": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "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, + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "peer": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "peer": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/fastfile": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz", + "integrity": "sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==" + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "peer": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/ffjavascript": { + "version": "0.2.62", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.62.tgz", + "integrity": "sha512-uJ7MTrdzhX/3f+hxn0XhdXbJCqYZJSBB6y2/ui4t21vKYVjyTMlU80pPXu40ir6qpqbrdzUeKdlOdJ0aFG9UNA==", + "dependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "peer": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true, + "peer": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.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": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true, + "peer": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "peer": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "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, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "peer": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + }, + "bin": { + "testrpc-sc": "index.js" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "peer": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "peer": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "peer": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/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, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hardhat": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.0.tgz", + "integrity": "sha512-CaEGa13tkJNe2/rdaBiive4pmdNShwxvdWVhr1zfb6aVpRhQt9VNO0l/UIBt/zzajz38ZFjvhfM2bj8LDXo9gw==", + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-vm": "7.0.1", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/hardhat-contract-sizer": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz", + "integrity": "sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==", + "dependencies": { + "chalk": "^4.0.0", + "cli-table3": "^0.6.0", + "strip-ansi": "^6.0.0" + }, + "peerDependencies": { + "hardhat": "^2.0.0" + } + }, + "node_modules/hardhat-contract-sizer/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat-contract-sizer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/hardhat-contract-sizer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/hardhat-contract-sizer/node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/hardhat-contract-sizer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/hardhat-contract-sizer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/hardhat-contract-sizer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat-contract-sizer/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat-contract-sizer/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat-contract-sizer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat-contract-sizer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat-gas-reporter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", + "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", + "dev": true, + "peer": true, + "dependencies": { + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" + }, + "peerDependencies": { + "hardhat": "^2.0.2" + } + }, + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "peer": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true, + "peer": true + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "peer": true, + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true, + "peer": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "peer": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==" + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "peer": true + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "peer": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dependencies": { + "fp-ts": "^1.0.0" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "peer": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "peer": true, + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-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, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "peer": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "peer": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "peer": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "peer": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "peer": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "peer": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "peer": true + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-sdsl": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", + "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "peer": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "peer": true + }, + "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, + "peer": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "peer": true + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "peer": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/keccak": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "optionalDependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", + "dependencies": { + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" + } + }, + "node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "peer": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "peer": true + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true, + "peer": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "peer": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logplease": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/logplease/-/logplease-1.2.15.tgz", + "integrity": "sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "peer": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true + }, + "node_modules/markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true, + "peer": true + }, + "node_modules/mcl-wasm": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/memory-level": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", + "dependencies": { + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "engines": { + "node": ">= 0.10.0" + } + }, + "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, + "peer": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "peer": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "dependencies": { + "obliterator": "^2.0.0" + } + }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" + }, + "node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "peer": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "peer": true, + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node_modules/node-environment-flags/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "peer": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "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/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "dev": true, + "peer": true, + "dependencies": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true, + "peer": true + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "peer": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", + "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", + "dev": true, + "peer": true, + "dependencies": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "safe-array-concat": "^1.0.0" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ordinal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", + "dev": true, + "peer": true + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true, + "peer": true + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "peer": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "peer": true + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, + "peer": true, + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "peer": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/r1csfile": { + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.47.tgz", + "integrity": "sha512-oI4mAwuh1WwuFg95eJDNDDL8hCaZkwnPuNZrQdLBWvDoRU7EG+L/MOHL7SwPW2Y+ZuYcTLpj3rBkgllBQZN/JA==", + "dependencies": { + "@iden3/bigarray": "0.0.2", + "@iden3/binfileutils": "0.0.11", + "fastfile": "0.0.20", + "ffjavascript": "0.2.60" + } + }, + "node_modules/r1csfile/node_modules/ffjavascript": { + "version": "0.2.60", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", + "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", + "dependencies": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "peer": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, + "peer": true, + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "dev": true, + "peer": true, + "dependencies": { + "req-from": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/req-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", + "dev": true, + "peer": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "peer": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "peer": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "peer": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "peer": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "peer": true + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "peer": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "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" + } + ], + "peer": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "peer": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "dev": true, + "peer": true, + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" + } + }, + "node_modules/sc-istanbul/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "peer": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sc-istanbul/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sc-istanbul/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true, + "peer": true + }, + "node_modules/sc-istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "peer": true + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "dev": true, + "peer": true, + "dependencies": { + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "peer": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "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, + "peer": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "peer": true + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/snarkjs": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.2.tgz", + "integrity": "sha512-A8yPFm9pRnZ7XYXfPSjSFnugEV1rsHGjb8W7c0Qk7nzXl5h3WANTkpVC5FYxakmw/GKWekz7wjjHaOFtPp823Q==", + "dependencies": { + "@iden3/binfileutils": "0.0.11", + "bfj": "^7.0.2", + "blake2b-wasm": "^2.4.0", + "circom_runtime": "0.1.24", + "ejs": "^3.1.6", + "fastfile": "0.0.20", + "ffjavascript": "0.2.62", + "js-sha3": "^0.8.0", + "logplease": "^1.2.15", + "r1csfile": "0.0.47" + }, + "bin": { + "snarkjs": "build/cli.cjs" + } + }, + "node_modules/solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "dependencies": { + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solcjs" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/solc/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/solc/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/solidity-coverage": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.4.tgz", + "integrity": "sha512-xeHOfBOjdMF6hWTbt42iH4x+7j1Atmrf5OldDPMxI+i/COdExUxszOswD9qqvcBTaLGiOrrpnh9UZjSpt4rBsg==", + "dev": true, + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.16.0", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.0", + "difflib": "^0.2.4", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "mocha": "7.1.2", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.6" + }, + "bin": { + "solidity-coverage": "plugins/bin.js" + }, + "peerDependencies": { + "hardhat": "^2.11.0" + } + }, + "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", + "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", + "dev": true, + "peer": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/solidity-coverage/node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "peer": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/solidity-coverage/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "peer": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.1" + } + }, + "node_modules/solidity-coverage/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "peer": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/solidity-coverage/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "peer": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/solidity-coverage/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solidity-coverage/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/solidity-coverage/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true, + "peer": true + }, + "node_modules/solidity-coverage/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/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, + "peer": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "peer": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/solidity-coverage/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==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/solidity-coverage/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/solidity-coverage/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/solidity-coverage/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/solidity-coverage/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, + "peer": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/solidity-coverage/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, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/solidity-coverage/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/solidity-coverage/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/solidity-coverage/node_modules/mocha": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", + "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/solidity-coverage/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==", + "dev": true, + "peer": true + }, + "node_modules/solidity-coverage/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/solidity-coverage/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, + "peer": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "peer": true, + "dependencies": { + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/solidity-coverage/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "peer": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/solidity-coverage/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, + "peer": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/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, + "peer": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solidity-coverage/node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/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, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/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==", + "dev": true, + "peer": true + }, + "node_modules/solidity-coverage/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, + "peer": true + }, + "node_modules/solidity-coverage/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, + "peer": 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/solidity-coverage/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, + "peer": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/solidity-coverage/node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "peer": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "optional": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "peer": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "peer": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "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==", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "dev": true, + "peer": true + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "peer": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "dependencies": { + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "peer": true, + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "peer": true, + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "peer": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dev": true, + "peer": true, + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/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, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "peer": true + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/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, + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true, + "peer": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "peer": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "node_modules/ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", + "dev": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" + }, + "bin": { + "write-markdown": "dist/write-markdown.js" + } + }, + "node_modules/ts-command-line-args/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, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-command-line-args/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, + "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/ts-command-line-args/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, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-command-line-args/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, + "peer": true + }, + "node_modules/ts-command-line-args/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, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-command-line-args/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, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "typescript": ">=3.7.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "devOptional": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true, + "engines": { + "node": ">=0.3.1" + } + }, + "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/tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typechain": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.1.tgz", + "integrity": "sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.3.0" + } + }, + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "peer": true + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "node_modules/undici": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=14.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==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "optional": true, + "peer": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true, + "peer": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "peer": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" + }, + "node_modules/wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "dependencies": { + "wasmbuilder": "0.0.16" + } + }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, + "node_modules/web3-utils": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "dev": true, + "peer": true, + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "peer": true, + "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, + "peer": 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.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "peer": true + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "peer": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "peer": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "peer": true + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "peer": true, + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@adraffy/ens-normalize": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", + "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==", + "dev": true, + "peer": true + }, + "@chainsafe/as-sha256": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", + "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" + }, + "@chainsafe/persistent-merkle-tree": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", + "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", + "requires": { + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "@chainsafe/ssz": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", + "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", + "requires": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.4.2", + "case": "^1.6.3" + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "optional": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "requires": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "requires": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "requires": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "requires": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "requires": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "requires": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "requires": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "requires": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" + }, + "@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "requires": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "requires": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "requires": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "requires": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "@iden3/bigarray": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@iden3/bigarray/-/bigarray-0.0.2.tgz", + "integrity": "sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==" + }, + "@iden3/binfileutils": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@iden3/binfileutils/-/binfileutils-0.0.11.tgz", + "integrity": "sha512-LylnJoZ0CTdgErnKY8OxohvW4K+p6UHD3sxt+3P9AmMyBQjYR4IpoqoYZZ+9aMj89cmCQ21UvdhndAx04er3NA==", + "requires": { + "fastfile": "0.0.20", + "ffjavascript": "^0.2.48" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "devOptional": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "devOptional": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "requires": { + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" + }, + "dependencies": { + "@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "requires": { + "@types/node": "*" + } + }, + "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==" + }, + "ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + } + } + }, + "@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==" + }, + "@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==" + }, + "@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, + "peer": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "peer": 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, + "peer": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@nomicfoundation/ethereumjs-block": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", + "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", + "requires": { + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1" + }, + "dependencies": { + "ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "requires": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + } + } + }, + "@nomicfoundation/ethereumjs-blockchain": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", + "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", + "requires": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-ethash": "3.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + } + }, + "@nomicfoundation/ethereumjs-common": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", + "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", + "requires": { + "@nomicfoundation/ethereumjs-util": "9.0.1", + "crc-32": "^1.2.0" + } + }, + "@nomicfoundation/ethereumjs-ethash": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", + "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", + "requires": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-evm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", + "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", + "requires": { + "@ethersproject/providers": "^5.7.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + } + }, + "@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", + "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==" + }, + "@nomicfoundation/ethereumjs-statemanager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", + "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", + "requires": { + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1", + "js-sdsl": "^4.1.4" + }, + "dependencies": { + "ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "requires": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + } + } + }, + "@nomicfoundation/ethereumjs-trie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", + "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", + "requires": { + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@types/readable-stream": "^2.3.13", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + } + }, + "@nomicfoundation/ethereumjs-tx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", + "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", + "requires": { + "@chainsafe/ssz": "^0.9.2", + "@ethersproject/providers": "^5.7.2", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3" + } + }, + "@nomicfoundation/ethereumjs-util": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", + "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", + "requires": { + "@chainsafe/ssz": "^0.10.0", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "ethereum-cryptography": "0.1.3" + }, + "dependencies": { + "@chainsafe/persistent-merkle-tree": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", + "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", + "requires": { + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "@chainsafe/ssz": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", + "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", + "requires": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.5.0" + } + } + } + }, + "@nomicfoundation/ethereumjs-vm": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", + "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", + "requires": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + } + }, + "@nomicfoundation/hardhat-chai-matchers": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.1.tgz", + "integrity": "sha512-qWKndseO8IPt8HiVamgEAutcBOYtX7/O6NPfe7uMNWxY2ywWaiWjDcRFuYYqxrZOMyQZl6ZuiHxbaRNctTUgLw==", + "dev": true, + "peer": true, + "requires": { + "@types/chai-as-promised": "^7.1.3", + "chai-as-promised": "^7.1.1", + "deep-eql": "^4.0.1", + "ordinal": "^1.0.3" + } + }, + "@nomicfoundation/hardhat-ethers": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz", + "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==", + "dev": true, + "peer": true, + "requires": { + "debug": "^4.1.1", + "lodash.isequal": "^4.5.0" + } + }, + "@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", + "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", + "dev": true, + "peer": true, + "requires": { + "ethereumjs-util": "^7.1.4" + } + }, + "@nomicfoundation/hardhat-toolbox": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz", + "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==", + "dev": true, + "requires": {} + }, + "@nomicfoundation/hardhat-verify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.0.4.tgz", + "integrity": "sha512-zKH7lCgesD9MQbrMsV9DH9NS5Qhkv9K1W9LvbkZWvUQdpyS6zzDyIuJwmfxRKfUGXVlpA2X8nSL3MtxSj3s5aw==", + "dev": true, + "peer": true, + "requires": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + } + }, + "@nomicfoundation/solidity-analyzer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", + "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", + "requires": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" + } + }, + "@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", + "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", + "optional": true + }, + "@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", + "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", + "optional": true + }, + "@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", + "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", + "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", + "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", + "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", + "optional": true + }, + "@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", + "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", + "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", + "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", + "optional": true + }, + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", + "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", + "optional": true + }, + "@openzeppelin/contracts": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.2.tgz", + "integrity": "sha512-mO+y6JaqXjWeMh9glYVzVu8HYPGknAAnWyxTRhGeckOruyXQMNnlcW6w/Dx9ftLeIQk6N+ZJFuVmTwF7lEIFrg==" + }, + "@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==" + }, + "@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "requires": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "requires": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "requires": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "requires": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + } + }, + "@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==" + }, + "@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "requires": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", + "dev": true, + "peer": true, + "requires": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "devOptional": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "devOptional": true + }, + "@typechain/ethers-v6": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz", + "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==", + "dev": true, + "peer": true, + "requires": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + } + }, + "@typechain/hardhat": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz", + "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==", + "dev": true, + "peer": true, + "requires": { + "fs-extra": "^9.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "peer": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "peer": true + } + } + }, + "@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "requires": { + "@types/node": "*" + } + }, + "@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true, + "peer": true + }, + "@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "dev": true, + "peer": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dev": true, + "peer": true, + "requires": { + "@types/node": "*" + } + }, + "@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dev": true, + "peer": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "peer": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "peer": true + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true, + "peer": true + }, + "@types/node": { + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.4.tgz", + "integrity": "sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==" + }, + "@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true, + "peer": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true, + "peer": true + }, + "@types/readable-stream": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "requires": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "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==" + } + } + }, + "@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "requires": { + "@types/node": "*" + } + }, + "@types/snarkjs": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@types/snarkjs/-/snarkjs-0.7.7.tgz", + "integrity": "sha512-t/fYLdqUDM7W/XP+CKh4kvo9SS2ejtqHJz/2LQf/UsrrCsDYRjQ85DQFdvIJ6FvJjUvtEEPpTSCPk9gDDjcBWQ==", + "dev": true + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true, + "peer": 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==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "abstract-level": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", + "requires": { + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "devOptional": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "devOptional": true + }, + "address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true, + "peer": true + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==" + }, + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": 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" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "optional": true + }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "peer": 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" + } + }, + "antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true, + "peer": true + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "peer": true + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "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, + "peer": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "peer": true + }, + "array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "peer": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "peer": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "peer": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "peer": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "peer": true + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "peer": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true, + "peer": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "peer": true + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "peer": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "peer": true + }, + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true, + "peer": true + }, + "axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, + "b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "peer": true, + "requires": { + "tweetnacl": "^0.14.3" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "peer": true + } + } + }, + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "requires": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + } + }, + "bigint-crypto-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", + "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "blake2b-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/blake2b-wasm/-/blake2b-wasm-2.4.0.tgz", + "integrity": "sha512-S1kwmW2ZhZFFFOghcx73+ZajEfKBqhP82JMssxtLVMxlaPea1p9uoLiUZ5WYyHn0KddwbLc+0vh4wR0KBNoT5w==", + "requires": { + "b4a": "^1.0.1", + "nanoassert": "^2.0.0" + } + }, + "blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "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" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "requires": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "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" + } + }, + "bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "requires": { + "base-x": "^3.0.2" + } + }, + "bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "requires": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "bufferutil": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "optional": true, + "peer": true, + "requires": { + "node-gyp-build": "^4.3.0" + } + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "peer": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "case": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "peer": true + }, + "catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==" + }, + "cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "peer": true, + "requires": { + "nofilter": "^3.1.0" + } + }, + "chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "peer": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "peer": true, + "requires": { + "check-error": "^1.0.2" + } + }, + "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" + } + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "peer": true + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "peer": true + }, + "check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "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==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circom_runtime": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/circom_runtime/-/circom_runtime-0.1.24.tgz", + "integrity": "sha512-H7/7I2J/cBmRnZm9docOCGhfxzS61BEm4TMCWcrZGsWNBQhePNfQq88Oj2XpUfzmBTCd8pRvRb3Mvazt3TMrJw==", + "requires": { + "ffjavascript": "0.2.60" + }, + "dependencies": { + "ffjavascript": { + "version": "0.2.60", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", + "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", + "requires": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + } + } + }, + "classic-level": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", + "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", + "requires": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "^2.2.2", + "node-gyp-build": "^4.3.0" + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "peer": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "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==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "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": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "peer": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "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==" + }, + "command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "peer": true, + "requires": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + } + }, + "command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dev": true, + "peer": true, + "requires": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "dependencies": { + "array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "peer": true + }, + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true + } + } + }, + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "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, + "peer": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "peer": 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" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, + "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, + "peer": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "peer": true + }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "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==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "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==", + "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" + } + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "peer": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "peer": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", + "dev": true, + "peer": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "peer": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "peer": true + }, + "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==" + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "peer": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dev": true, + "peer": true, + "requires": { + "address": "^1.0.1", + "debug": "4" + } + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" + }, + "difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "peer": true, + "requires": { + "heap": ">= 0.2.0" + } + }, + "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, + "peer": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "peer": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "requires": { + "jake": "^10.8.5" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "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==" + } + } + }, + "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==" + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, + "es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "peer": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "dependencies": { + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + } + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true, + "peer": true + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "peer": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "peer": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==" + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "eth-gas-reporter": { + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", + "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", + "dev": true, + "peer": true, + "requires": { + "@ethersproject/abi": "^5.0.0-beta.146", + "@solidity-parser/parser": "^0.14.0", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^4.0.40", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^7.1.1", + "req-cwd": "^2.0.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" + }, + "dependencies": { + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "peer": true + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "peer": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "peer": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "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, + "peer": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "peer": true + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "peer": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "peer": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "peer": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "peer": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "peer": 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, + "peer": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": true + }, + "ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "peer": true, + "requires": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dev": true, + "peer": true, + "requires": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.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==", + "dev": true, + "peer": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "peer": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "peer": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "peer": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "peer": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true, + "peer": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "peer": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^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==", + "dev": true, + "peer": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "peer": true, + "requires": { + "chalk": "^2.4.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "peer": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "peer": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "peer": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + } + }, + "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==", + "dev": true, + "peer": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "peer": true, + "requires": { + "p-try": "^2.0.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==", + "dev": true, + "peer": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "peer": true + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "peer": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "dev": true, + "peer": true + }, + "setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", + "dev": true, + "peer": true + }, + "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, + "peer": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "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, + "peer": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "peer": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "peer": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "dev": true, + "peer": true + }, + "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, + "peer": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "peer": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "peer": true, + "requires": { + "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" + } + }, + "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, + "peer": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "peer": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + } + } + }, + "ethereum-bloom-filters": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "dev": true, + "peer": true, + "requires": { + "js-sha3": "^0.8.0" + } + }, + "ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "requires": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "requires": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + }, + "dependencies": { + "@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "requires": { + "@types/node": "*" + } + }, + "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==" + }, + "ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "requires": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + } + } + }, + "ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "peer": true, + "requires": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + } + }, + "ethers": { + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.6.5.tgz", + "integrity": "sha512-Tc3HXzI0UJ9EhPp6E0fntkgMIA2//rhcB0UsmiRMCR+Bii5iu0RjtwJV55IhlLJ4K39pd0ku+eE4WRgqrLLW2Q==", + "dev": true, + "peer": true, + "requires": { + "@adraffy/ens-normalize": "1.9.2", + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.7.1", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "dependencies": { + "@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", + "dev": true, + "peer": true + }, + "@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", + "dev": true, + "peer": true + }, + "aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", + "dev": true, + "peer": true + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", + "dev": true, + "peer": true + }, + "ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "dev": true, + "peer": true, + "requires": {} + } + } + }, + "ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "dev": true, + "peer": true, + "requires": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true, + "peer": true + } + } + }, + "ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "requires": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + } + }, + "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==" + }, + "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==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "peer": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "peer": true + }, + "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, + "peer": true + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "peer": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "peer": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "fastfile": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/fastfile/-/fastfile-0.0.20.tgz", + "integrity": "sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==" + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "peer": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "ffjavascript": { + "version": "0.2.62", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.62.tgz", + "integrity": "sha512-uJ7MTrdzhX/3f+hxn0XhdXbJCqYZJSBB6y2/ui4t21vKYVjyTMlU80pPXu40ir6qpqbrdzUeKdlOdJ0aFG9UNA==", + "requires": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.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==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "peer": true, + "requires": { + "array-back": "^3.0.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "requires": { + "locate-path": "^2.0.0" + } + }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "peer": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "peer": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "peer": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true, + "peer": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true, + "peer": true + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "peer": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "peer": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "peer": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "dev": true, + "peer": true + }, + "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, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "peer": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "dev": true, + "peer": true, + "requires": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "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, + "peer": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "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, + "peer": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + } + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "peer": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "peer": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "peer": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "peer": true + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "peer": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.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==", + "dev": true, + "peer": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "peer": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "peer": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hardhat": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.0.tgz", + "integrity": "sha512-CaEGa13tkJNe2/rdaBiive4pmdNShwxvdWVhr1zfb6aVpRhQt9VNO0l/UIBt/zzajz38ZFjvhfM2bj8LDXo9gw==", + "requires": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-vm": "7.0.1", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "dependencies": { + "ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "requires": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + } + } + }, + "hardhat-contract-sizer": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz", + "integrity": "sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA==", + "requires": { + "chalk": "^4.0.0", + "cli-table3": "^0.6.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "hardhat-gas-reporter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", + "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", + "dev": true, + "peer": true, + "requires": { + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "peer": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "peer": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "peer": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "peer": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "peer": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "peer": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "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==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true, + "peer": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==" + }, + "http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "peer": true, + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "peer": true, + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true, + "peer": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "peer": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "peer": true + }, + "immutable": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "peer": true + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "peer": true, + "requires": { + "get-intrinsic": "^1.2.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", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "peer": true + }, + "io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "requires": { + "fp-ts": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "peer": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "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==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "peer": true + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "peer": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==" + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "peer": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "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, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "peer": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "peer": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "peer": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "peer": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "peer": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "peer": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "peer": true + }, + "jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.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==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-sdsl": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", + "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==" + }, + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "peer": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "peer": true + }, + "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, + "peer": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "peer": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "requires": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + }, + "dependencies": { + "esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==" + } + } + }, + "jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "dev": true, + "peer": true + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "peer": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "keccak": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", + "requires": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "peer": true + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", + "requires": { + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" + } + }, + "level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==" + }, + "level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "requires": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "peer": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "peer": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true, + "peer": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "peer": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "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==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "logplease": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/logplease/-/logplease-1.2.15.tgz", + "integrity": "sha512-jLlHnlsPSJjpwUfcNyUxXCl33AYg2cHhIf9QhGL2T4iPT0XPB+xP1LRKFPgIg1M/sg9kAJvy94w9CzBNrfnstA==" + }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "peer": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + }, + "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==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true + }, + "markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true, + "peer": true + }, + "mcl-wasm": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==" + }, + "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==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "memory-level": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", + "requires": { + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "peer": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "peer": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "peer": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "peer": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "requires": { + "obliterator": "^2.0.0" + } + }, + "mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "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==" + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "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==" + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "requires": { + "p-locate": "^5.0.0" + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "requires": { + "p-limit": "^3.0.2" + } + }, + "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==" + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nanoassert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-2.0.0.tgz", + "integrity": "sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==" + }, + "nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==" + }, + "napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "peer": true, + "requires": { + "lodash": "^4.17.21" + } + }, + "node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "peer": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "peer": true + } + } + }, + "node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==" + }, + "nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "peer": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "peer": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "dev": true, + "peer": true, + "requires": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==", + "dev": true, + "peer": true + } + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "peer": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "peer": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "peer": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "peer": true + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "peer": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", + "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", + "dev": true, + "peer": true, + "requires": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "safe-array-concat": "^1.0.0" + } + }, + "obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "ordinal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", + "dev": true, + "peer": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "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": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==" + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true, + "peer": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "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, + "peer": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "peer": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "peer": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "peer": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "peer": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "peer": true + }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, + "peer": true, + "requires": { + "asap": "~2.0.6" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "peer": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "peer": true + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "peer": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "r1csfile": { + "version": "0.0.47", + "resolved": "https://registry.npmjs.org/r1csfile/-/r1csfile-0.0.47.tgz", + "integrity": "sha512-oI4mAwuh1WwuFg95eJDNDDL8hCaZkwnPuNZrQdLBWvDoRU7EG+L/MOHL7SwPW2Y+ZuYcTLpj3rBkgllBQZN/JA==", + "requires": { + "@iden3/bigarray": "0.0.2", + "@iden3/binfileutils": "0.0.11", + "fastfile": "0.0.20", + "ffjavascript": "0.2.60" + }, + "dependencies": { + "ffjavascript": { + "version": "0.2.60", + "resolved": "https://registry.npmjs.org/ffjavascript/-/ffjavascript-0.2.60.tgz", + "integrity": "sha512-T/9bnEL5xAZRDbQoEMf+pM9nrhK+C3JyZNmqiWub26EQorW7Jt+jR54gpqDhceA4Nj0YctPQwYnl8xa52/A26A==", + "requires": { + "wasmbuilder": "0.0.16", + "wasmcurves": "0.2.2", + "web-worker": "^1.2.0" + } + } + } + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "peer": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, + "peer": true, + "requires": { + "minimatch": "^3.0.5" + } + }, + "reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true, + "peer": true + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + }, + "req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "dev": true, + "peer": true, + "requires": { + "req-from": "^2.0.0" + } + }, + "req-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", + "dev": true, + "peer": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "peer": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "peer": true + } + } + }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "peer": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "peer": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "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==", + "dev": true, + "peer": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "peer": 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, + "peer": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "requires": { + "bn.js": "^5.2.0" + } + }, + "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, + "peer": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" + }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "peer": true + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "dev": true, + "peer": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "peer": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "peer": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "peer": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "peer": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": true + } + } + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true, + "peer": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "peer": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "requires": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "peer": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "dev": true, + "peer": true, + "requires": { + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" + } + }, + "shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "peer": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "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, + "peer": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "peer": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "peer": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "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==", + "dev": true, + "peer": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "peer": true + } + } + }, + "snarkjs": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/snarkjs/-/snarkjs-0.7.2.tgz", + "integrity": "sha512-A8yPFm9pRnZ7XYXfPSjSFnugEV1rsHGjb8W7c0Qk7nzXl5h3WANTkpVC5FYxakmw/GKWekz7wjjHaOFtPp823Q==", + "requires": { + "@iden3/binfileutils": "0.0.11", + "bfj": "^7.0.2", + "blake2b-wasm": "^2.4.0", + "circom_runtime": "0.1.24", + "ejs": "^3.1.6", + "fastfile": "0.0.20", + "ffjavascript": "0.2.62", + "js-sha3": "^0.8.0", + "logplease": "^1.2.15", + "r1csfile": "0.0.47" + } + }, + "solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "requires": { + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "dependencies": { + "fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + } + } + }, + "solidity-coverage": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.4.tgz", + "integrity": "sha512-xeHOfBOjdMF6hWTbt42iH4x+7j1Atmrf5OldDPMxI+i/COdExUxszOswD9qqvcBTaLGiOrrpnh9UZjSpt4rBsg==", + "dev": true, + "peer": true, + "requires": { + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.16.0", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.0", + "difflib": "^0.2.4", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "mocha": "7.1.2", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.6" + }, + "dependencies": { + "@solidity-parser/parser": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", + "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", + "dev": true, + "peer": true, + "requires": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "peer": true + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "peer": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "peer": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "peer": true + }, + "chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "peer": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "peer": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "peer": true, + "requires": { + "ms": "^2.1.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "peer": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "peer": 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, + "peer": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": 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==", + "dev": true, + "peer": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "peer": true, + "requires": { + "is-buffer": "~2.0.3" + } + }, + "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==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true, + "peer": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "peer": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "peer": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^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==", + "dev": true, + "peer": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "peer": true, + "requires": { + "chalk": "^2.4.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, + "peer": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "peer": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "peer": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", + "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", + "dev": true, + "peer": true, + "requires": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + } + }, + "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==", + "dev": true, + "peer": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "peer": true, + "requires": { + "p-try": "^2.0.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==", + "dev": true, + "peer": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "peer": true + }, + "readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "peer": true, + "requires": { + "picomatch": "^2.0.4" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "peer": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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, + "peer": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "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, + "peer": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "peer": true + }, + "supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "peer": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "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, + "peer": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "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, + "peer": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "peer": true, + "requires": { + "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" + } + }, + "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, + "peer": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "peer": true, + "requires": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + } + } + } + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "peer": true + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "peer": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "peer": true + } + } + }, + "stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "requires": { + "type-fest": "^0.7.1" + }, + "dependencies": { + "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==" + } + } + }, + "static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "requires": { + "escodegen": "^1.8.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "dev": true, + "peer": true + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "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==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "dev": true, + "peer": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "peer": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "peer": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "requires": { + "is-hex-prefixed": "1.0.0" + } + }, + "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==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "peer": true, + "requires": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + } + }, + "sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "peer": true, + "requires": { + "get-port": "^3.1.0" + } + }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "peer": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "peer": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "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, + "peer": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "peer": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "peer": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "peer": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "peer": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dev": true, + "peer": true, + "requires": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "dependencies": { + "array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "peer": true + }, + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true + } + } + }, + "then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "peer": true, + "requires": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true, + "peer": true + } + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "peer": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "ts-command-line-args": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", + "dev": true, + "peer": true, + "requires": { + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^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==", + "dev": true, + "peer": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "peer": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "dev": true, + "peer": true, + "requires": {} + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "devOptional": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "peer": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "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==", + "dev": true, + "peer": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + }, + "typechain": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.1.tgz", + "integrity": "sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==", + "dev": true, + "peer": true, + "requires": { + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "peer": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "peer": true + } + } + }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "peer": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "peer": true + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "devOptional": true + }, + "typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "peer": true + }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "peer": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "peer": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" + }, + "undici": { + "version": "5.22.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "requires": { + "busboy": "^1.6.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "peer": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "optional": true, + "peer": true, + "requires": { + "node-gyp-build": "^4.3.0" + } + }, + "utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true, + "peer": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "peer": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wasmbuilder": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/wasmbuilder/-/wasmbuilder-0.0.16.tgz", + "integrity": "sha512-Qx3lEFqaVvp1cEYW7Bfi+ebRJrOiwz2Ieu7ZG2l7YyeSJIok/reEQCQCuicj/Y32ITIJuGIM9xZQppGx5LrQdA==" + }, + "wasmcurves": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/wasmcurves/-/wasmcurves-0.2.2.tgz", + "integrity": "sha512-JRY908NkmKjFl4ytnTu5ED6AwPD+8VJ9oc94kdq7h5bIwbj0L4TDJ69mG+2aLs2SoCmGfqIesMWTEJjtYsoQXQ==", + "requires": { + "wasmbuilder": "0.0.16" + } + }, + "web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, + "web3-utils": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "dev": true, + "peer": true, + "requires": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "peer": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "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, + "peer": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "peer": true + }, + "which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "peer": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "peer": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "peer": true + }, + "wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "peer": true, + "requires": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "dependencies": { + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "peer": true + } + } + }, + "workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "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==" + }, + "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==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "dev": true, + "peer": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "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==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + } + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + } + } +} diff --git a/contracts/package.json b/contracts/package.json new file mode 100644 index 00000000..3d5a69db --- /dev/null +++ b/contracts/package.json @@ -0,0 +1,17 @@ +{ + "name": "hardhat-project", + "devDependencies": { + "@nomicfoundation/hardhat-toolbox": "^3.0.0", + "@types/snarkjs": "^0.7.7", + "hardhat": "^2.17.0", + "ts-node": "^10.9.1", + "typescript": "^5.1.6" + }, + "dependencies": { + "@openzeppelin/contracts": "^4.9.2", + "axios": "^1.6.2", + "dotenv": "^16.3.1", + "hardhat-contract-sizer": "^2.10.0", + "snarkjs": "^0.7.2" + } +} diff --git a/contracts/scripts/deploy.ts b/contracts/scripts/deploy.ts new file mode 100644 index 00000000..8a565b4a --- /dev/null +++ b/contracts/scripts/deploy.ts @@ -0,0 +1,51 @@ +import { ethers } from "hardhat"; +import { countryCodes } from "../../common/src/constants/constants"; +const fs = require('fs'); +const path = require('path'); + +async function main() { + const Verifier = await ethers.getContractFactory("Groth16Verifier"); + const verifier = await Verifier.deploy(); + await verifier.waitForDeployment(); + + console.log(`Verifier deployed to ${verifier.target}`); + + const Formatter = await ethers.getContractFactory("Formatter"); + const formatter = await Formatter.deploy(); + await formatter.waitForDeployment(); + await formatter.addCountryCodes(Object.entries(countryCodes)); + + console.log(`Formatter deployed to ${formatter.target}`); + + const ProofOfPassport = await ethers.getContractFactory("ProofOfPassport"); + const proofOfPassport = await ProofOfPassport.deploy(verifier.target, formatter.target); + await proofOfPassport.waitForDeployment(); + + console.log(`ProofOfPassport NFT deployed to ${proofOfPassport.target}`); + + fs.mkdirSync(path.join(__dirname, "../../app/deployments"), { recursive: true }); + + fs.copyFileSync( + path.join(__dirname, '../artifacts/contracts/ProofOfPassport.sol/ProofOfPassport.json'), + path.join(__dirname, '../../app/deployments/ProofOfPassport.json') + ); + fs.copyFileSync( + path.join(__dirname, '../artifacts/contracts/Verifier.sol/Groth16Verifier.json'), + path.join(__dirname, '../../app/deployments/Groth16Verifier.json') + ); + fs.writeFileSync( + path.join(__dirname, '../../app/deployments/addresses.json'), + JSON.stringify({ + ProofOfPassport: proofOfPassport.target, + Groth16Verifier: verifier.target, + }) + ); + console.log('Artifacts and addresses copied to ../app/deployments'); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); diff --git a/contracts/scripts/mint.ts b/contracts/scripts/mint.ts new file mode 100644 index 00000000..c12ed8b3 --- /dev/null +++ b/contracts/scripts/mint.ts @@ -0,0 +1,93 @@ +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { expect, assert } from "chai"; +import { ethers } from "hardhat"; +import { DataHash } from "../../common/src/utils/types"; +import { getPassportData } from "../../common/src/utils/passportData"; +import { attributeToPosition } from "../../common/src/constants/constants"; +import { formatMrz, splitToWords, formatAndConcatenateDataHashes, toUnsignedByte, hash, bytesToBigDecimal } from "../../common/src/utils/utils"; +import { groth16 } from 'snarkjs' +const fs = require('fs'); + +async function main() { + const proofOfPassportAddress = "0x64BfefF18335E3cac8cF8f8E37Ac921371d9c5aa" + const proofOfPassport = await ethers.getContractAt("ProofOfPassport", proofOfPassportAddress); + + const passportData = getPassportData(); + + const formattedMrz = formatMrz(passportData.mrz); + const mrzHash = hash(formatMrz(passportData.mrz)); + const concatenatedDataHashes = formatAndConcatenateDataHashes( + mrzHash, + passportData.dataGroupHashes as DataHash[], + ); + + const attributeToReveal = { + issuing_state: true, + name: true, + passport_number: true, + nationality: true, + date_of_birth: true, + gender: true, + expiry_date: true, + } + + const bitmap = Array(88).fill('0'); + + Object.entries(attributeToReveal).forEach(([attribute, reveal]) => { + if (reveal) { + const [start, end] = attributeToPosition[attribute as keyof typeof attributeToPosition]; + bitmap.fill('1', start, end + 1); + } + }); + + const inputs = { + mrz: formattedMrz.map(byte => String(byte)), + reveal_bitmap: bitmap.map(byte => String(byte)), + dataHashes: concatenatedDataHashes.map(toUnsignedByte).map(byte => String(byte)), + eContentBytes: passportData.eContent.map(toUnsignedByte).map(byte => String(byte)), + pubkey: splitToWords( + BigInt(passportData.pubKey.modulus as string), + BigInt(64), + BigInt(32) + ), + signature: splitToWords( + BigInt(bytesToBigDecimal(passportData.encryptedDigest)), + BigInt(64), + BigInt(32) + ), + address: "0x9D392187c08fc28A86e1354aD63C70897165b982", // goerli test account + } + + console.log('generating proof...'); + const { proof, publicSignals } = await groth16.fullProve( + inputs, + "../circuits/build/proof_of_passport_js/proof_of_passport.wasm", + "../circuits/build/proof_of_passport_final.zkey" + ) + + console.log('proof done'); + + const vKey = JSON.parse(fs.readFileSync("../circuits/build/verification_key.json")); + const verified = await groth16.verify( + vKey, + publicSignals, + proof + ) + + assert(verified == true, 'Should verifiable') + + const cd = await groth16.exportSolidityCallData(proof, publicSignals); + const callData = JSON.parse(`[${cd}]`); + console.log('callData', callData); + + const tx = await proofOfPassport.mint(...callData); + + const receipt = await tx.wait(); + console.log('receipt', receipt?.hash); + const tokenURI = await proofOfPassport.tokenURI(0); + console.log('tokenURI', tokenURI); + +} + + +main() \ No newline at end of file diff --git a/contracts/test/ProofOfPassport.ts b/contracts/test/ProofOfPassport.ts new file mode 100644 index 00000000..26afb58b --- /dev/null +++ b/contracts/test/ProofOfPassport.ts @@ -0,0 +1,274 @@ +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { expect, assert } from "chai"; +import { ethers } from "hardhat"; +import { DataHash } from "../../common/src/utils/types"; +import { getPassportData } from "../../common/src/utils/passportData"; +import { attributeToPosition } from "../../common/src/constants/constants"; +import { formatMrz, splitToWords, formatAndConcatenateDataHashes, toUnsignedByte, hash, bytesToBigDecimal } from "../../common/src/utils/utils"; +import { groth16 } from 'snarkjs' +import { countryCodes } from "../../common/src/constants/constants"; +import { time } from "@nomicfoundation/hardhat-toolbox/network-helpers"; +import axios from 'axios'; +const fs = require('fs'); + +describe("Proof of Passport", function () { + this.timeout(0); + + let passportData, inputs, proof, publicSignals, revealChars, callData: any; + + before(async function generateProof() { + passportData = getPassportData(); + + const formattedMrz = formatMrz(passportData.mrz); + const mrzHash = hash(formatMrz(passportData.mrz)); + const concatenatedDataHashes = formatAndConcatenateDataHashes( + mrzHash, + passportData.dataGroupHashes as DataHash[], + ); + + const attributeToReveal = { + issuing_state: true, + name: true, + passport_number: true, + nationality: true, + date_of_birth: true, + gender: true, + expiry_date: true, + } + + const bitmap = Array(88).fill('0'); + + Object.entries(attributeToReveal).forEach(([attribute, reveal]) => { + if (reveal) { + const [start, end] = attributeToPosition[attribute as keyof typeof attributeToPosition]; + bitmap.fill('1', start, end + 1); + } + }); + + inputs = { + mrz: formattedMrz.map(byte => String(byte)), + reveal_bitmap: bitmap.map(byte => String(byte)), + dataHashes: concatenatedDataHashes.map(toUnsignedByte).map(byte => String(byte)), + eContentBytes: passportData.eContent.map(toUnsignedByte).map(byte => String(byte)), + pubkey: splitToWords( + BigInt(passportData.pubKey.modulus as string), + BigInt(64), + BigInt(32) + ), + signature: splitToWords( + BigInt(bytesToBigDecimal(passportData.encryptedDigest)), + BigInt(64), + BigInt(32) + ), + address: "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", // hardhat account 1 + } + + console.log('generating proof...'); + ({ proof, publicSignals } = await groth16.fullProve( + inputs, + "../circuits/build/proof_of_passport_js/proof_of_passport.wasm", + "../circuits/build/proof_of_passport_final.zkey" + )) + + console.log('proof done'); + + revealChars = publicSignals.slice(0, 88).map((byte: string) => String.fromCharCode(parseInt(byte, 10))).join(''); + + const vKey = JSON.parse(fs.readFileSync("../circuits/build/verification_key.json")); + const verified = await groth16.verify( + vKey, + publicSignals, + proof + ) + + assert(verified == true, 'Should verifiable') + + const cd = await groth16.exportSolidityCallData(proof, publicSignals); + callData = JSON.parse(`[${cd}]`); + console.log('callData', callData); + }); + + describe("Proof of Passport SBT", function () { + async function deployHardhatFixture() { + const [owner, otherAccount, thirdAccount] = await ethers.getSigners(); + + const Verifier = await ethers.getContractFactory("Groth16Verifier"); + const verifier = await Verifier.deploy(); + await verifier.waitForDeployment(); + + console.log(`Verifier deployed to ${verifier.target}`); + + const Formatter = await ethers.getContractFactory("Formatter"); + const formatter = await Formatter.deploy(); + await formatter.waitForDeployment(); + await formatter.addCountryCodes(Object.entries(countryCodes)); + + console.log(`Formatter deployed to ${formatter.target}`); + + const ProofOfPassport = await ethers.getContractFactory("ProofOfPassport"); + const proofOfPassport = await ProofOfPassport.deploy(verifier.target, formatter.target); + await proofOfPassport.waitForDeployment(); + + console.log(`ProofOfPassport NFT deployed to ${proofOfPassport.target}`); + + return {verifier, proofOfPassport, formatter, owner, otherAccount, thirdAccount} + } + + it("Verifier verifies a correct proof", async () => { + const { verifier } = await loadFixture(deployHardhatFixture); + + expect( + await verifier.verifyProof(callData[0], callData[1], callData[2], callData[3]) + ).to.be.true; + }); + + it("Should allow SBT minting", async function () { + const { proofOfPassport, otherAccount, thirdAccount } = await loadFixture( + deployHardhatFixture + ); + + await proofOfPassport + .connect(thirdAccount) // fine that it's not the same account as address is taken from the proof + .mint(...callData); + + expect(await proofOfPassport.balanceOf(otherAccount.address)).to.equal(1); + }); + + it("Shouldn't allow minting with an invalid proof", async function () { + const { proofOfPassport, otherAccount } = await loadFixture( + deployHardhatFixture + ); + + const badCallData = JSON.parse(JSON.stringify(callData)); + + badCallData[0][1] = "0x1cdbaf59a0439d55f19162ee0be5a501f5b55c669a6e1f8d27b75d95ff31ff7b"; + + expect( + proofOfPassport + .connect(otherAccount) + .mint(...badCallData as any) + ).to.be.revertedWith("Invalid proof"); + }); + + it("Should have a correct tokenURI a user to mint a SBT", async function () { + const { proofOfPassport, otherAccount } = await loadFixture( + deployHardhatFixture + ); + + console.log('callData', callData) + + const tx = await proofOfPassport + .connect(otherAccount) + .mint(...callData); + + await tx.wait(); + + const tokenURI = await proofOfPassport.tokenURI(0); + + console.log('tokenURI', tokenURI); + + const decodedTokenURI = Buffer.from(tokenURI.split(',')[1], 'base64').toString(); + let parsedTokenURI; + + try { + parsedTokenURI = JSON.parse(decodedTokenURI); + } catch (e) { + assert(false, 'TokenURI is not a valid JSON'); + } + console.log('parsedTokenURI', parsedTokenURI); + }); + + it("Should convert ISO dates to unix timestamps correctly", async function () { + const { formatter } = await loadFixture( + deployHardhatFixture + ); + + const unix_timestamp = await formatter.dateToUnixTimestamp("230512") // 2023 05 12 + console.log('unix_timestamp', unix_timestamp.toString()); + + var date = new Date(Number(unix_timestamp) * 1000); + console.log("date:", date.toUTCString()); + + expect(date.getUTCFullYear()).to.equal(2023); + expect(date.getUTCMonth()).to.equal(4); + expect(date.getUTCDate()).to.equal(12); + }) + + it("Should support expiry", async function () { + const { proofOfPassport, otherAccount } = await loadFixture( + deployHardhatFixture + ); + + const tx = await proofOfPassport + .connect(otherAccount) + .mint(...callData); + + await tx.wait(); + + const tokenURI = await proofOfPassport.tokenURI(0); + const decodedTokenURI = Buffer.from(tokenURI.split(',')[1], 'base64').toString(); + const parsedTokenURI = JSON.parse(decodedTokenURI); + + const expired = parsedTokenURI.attributes.find((attribute: any) => attribute.trait_type === 'Expired'); + expect(expired.value).to.equal('No'); + + await time.increaseTo(2240161656); // 2040 + + const tokenURIAfter = await proofOfPassport.tokenURI(0); + const decodedTokenURIAfter = Buffer.from(tokenURIAfter.split(',')[1], 'base64').toString(); + const parsedTokenURIAfter = JSON.parse(decodedTokenURIAfter); + + const expiredAfter = parsedTokenURIAfter.attributes.find((attribute: any) => attribute.trait_type === 'Expired'); + + expect(expiredAfter.value).to.equal('Yes'); + }) + }); + + describe("Minting on mumbai", function () { + it.skip("Should allow minting using a proof generated by ark-circom", async function () { + const newCallDataFromArkCircom = [["0x089e5850e432d76f949cedc26527a7fb093194dd4026d5efb07c8ce6093fa977", "0x0154b01b5698e6249638be776d3641392cf89a5ad687beb2932c0ccf33f271d4"], [["0x2692dbce207361b048e6eff874fdc5d50433baa546fa754348a87373710044c0", "0x1db8ddab0dc204d41728efc05d2dae690bebb782b6088d92dda23a87b6bed0a2"], ["0x106be642690f0fe3562d139ed09498d979c8b35ecfb04e5a49422015cafa2705", "0x0b133e53cd0b4944ce2d34652488a16d1a020905dc1972ccc883d364dd3bb4ee"]], ["0x09eda5d551b150364ecb3efb432e4568b2be8f83c2db1dd1e1285c45a428b32b", "0x008ee9e870e5416849b3c94b8b9e4759580659f5a6535652d0a6634df23db2f5"], ["0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x000000000000000000000000000000006df9dd0914f215fafa1513e51ac9f1e2", "0x00000000000000000000000000000000000000000000093e703cd030e286890e", "0x0000000000000000000000000000000000000000000004770a914f3ae4e1288b", "0x000000000000000000000000000000000000000000000bf7e8ecb4e9609a489d", "0x00000000000000000000000000000000000000000000035762de41038bc2dcf1", "0x00000000000000000000000000000000000000000000050442c4055d62e9c4af", "0x0000000000000000000000000000000000000000000004db2bdc79a477a0fce0", "0x000000000000000000000000000000000000000000000acdbf649c76ec3df9ad", "0x000000000000000000000000000000000000000000000aaa0e6798ee3694f5ca", "0x000000000000000000000000000000000000000000000a1eaac37f80dd5e2879", "0x00000000000000000000000000000000000000000000033e063fba83c27efbce", "0x00000000000000000000000000000000000000000000045b9b05cab95025b000", "0x000000000000000000000000e6e4b6a802f2e0aee5676f6010e0af5c9cdd0a50"]]; + // const callDataFromArkCircomGeneratedInTest = [ [ '0x07a378ec2b5bafc15a21fb9c549ba2554a4ef22cfca3d835f44d270f547d0913', '0x089bb81fb68200ef64652ada5edf71a98dcc8a931a54162b03b61647acbae1fe' ], [ [ '0x2127ae75494aed0c384567cc890639d7609040373d0a549e665a26a39b264449', '0x2f0ea6c99648171b7e166086108131c9402f9c5ac4a3759705a9c9217852e328' ], [ '0x04efcb825be258573ffe8c9149dd2b040ea3b8a9fa3dfa1c57a87b11c20c21ec', '0x2b500aece0e5a5a64a5c7262ec379efc1a23f4e46d968aebd42337642ea2bd3e' ] ], [ '0x1964dc2231bcd1e0de363c3d2a790346b7e634b5878498ce6e8db0ac972b8125', '0x0d94cd74a89b0ed777bb309ce960191acd23d5e9c5f418722d03f80944c5e3ed' ], [ '0x000000000000000000544e45524f4c4600000000000000000000000000000000', '0x0000000000000000000000000000000000000000000000000000000000000000', '0x0000000000000000000000000000000000000000000000000000000000000000', '0x000000000000000000000000000000000df267467de87516584863641a75504b', '0x00000000000000000000000000000000000000000000084c754a8650038f4c82', '0x000000000000000000000000000000000000000000000d38447935bb72a5193c', '0x000000000000000000000000000000000000000000000cac133b01f78ab24970', '0x0000000000000000000000000000000000000000000006064295cda88310ce6e', '0x000000000000000000000000000000000000000000001026cd8776cbd52df4b0', '0x000000000000000000000000000000000000000000000d4748d254334ce92b36', '0x0000000000000000000000000000000000000000000005c1b0ba7159834b0bf1', '0x00000000000000000000000000000000000000000000029d91f03395b916792a', '0x000000000000000000000000000000000000000000000bcfbb30f8ea70a224df', '0x00000000000000000000000000000000000000000000003dcd943c93e565aa3e', '0x0000000000000000000000000000000000000000000009e8ce7916ab0fb0b000', '0x000000000000000000000000ede0fa5a7b196f512204f286666e5ec03e1005d2' ] ]; + + const proofOfPassportOnMumbaiAddress = '0x7D459347d092D35f043f73021f06c19f834f8c3E'; + const proofOfPassportOnMumbai = await ethers.getContractAt('ProofOfPassport', proofOfPassportOnMumbaiAddress); + try { + const tx = await proofOfPassportOnMumbai.mint(...newCallDataFromArkCircom as any); + console.log('txHash', tx.hash); + const receipt = await tx.wait(); + console.log('receipt', receipt) + expect(receipt?.status).to.equal(1); + } catch (error) { + console.error(error); + expect(true).to.equal(false); + } + }); + + it.skip("Should allow minting using lambda function", async function () { + const proofOfPassportOnMumbaiAddress = '0x0AAd39A080129763c8E1e2E9DC44E777DB0362a3'; + const provider = new ethers.JsonRpcProvider('https://polygon-mumbai-bor.publicnode.com'); + const proofOfPassportOnMumbai = await ethers.getContractAt('ProofOfPassport', proofOfPassportOnMumbaiAddress); + + try { + const transactionRequest = await proofOfPassportOnMumbai + .mint.populateTransaction(...callData); + + console.log('transactionRequest', transactionRequest); + + const apiEndpoint = process.env.AWS_ENDPOINT; + if (!apiEndpoint) { + throw new Error('AWS_ENDPOINT env variable is not set'); + } + const response = await axios.post(apiEndpoint, { + chain: "mumbai", + tx_data: transactionRequest + }); + console.log('response status', response.status) + console.log('response data', response.data) + const receipt = await provider.waitForTransaction(response.data.hash); + console.log('receipt', receipt) + } catch (err) { + console.log('err', err); + } + }); + }) +}); diff --git a/contracts/tsconfig.json b/contracts/tsconfig.json new file mode 100644 index 00000000..e5f1a640 --- /dev/null +++ b/contracts/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + } +} diff --git a/proof-of-passport b/proof-of-passport new file mode 160000 index 00000000..c168cdb7 --- /dev/null +++ b/proof-of-passport @@ -0,0 +1 @@ +Subproject commit c168cdb76f5ee7bd697e75ea08861dbb37cabd61