diff --git a/.github/ci.yml b/.github/ci.yml deleted file mode 100644 index f82af69..0000000 --- a/.github/ci.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: CI - -on: - - push - - pull_request - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: 'npm' - cache-dependency-path: lib/js/test/package-lock.json - - name: Install Flow CLI - run: sh -ci “$(curl -fsSL https://raw.githubusercontent.com/onflow/flow-cli/master/install.sh)” -- v0.43.0-cadence-attachments-2 - - name: Flow cli Version - run: flow version - - name: Update PATH - run: echo "/root/.local/bin" >> $GITHUB_PATH - - name: Install dependencies - run: cd lib/js/test && npm ci - - run: make ci - \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 041195b..9c6ba6c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,21 +6,18 @@ on: jobs: build: + name: Flow CLI Tests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 16 - cache: 'npm' - cache-dependency-path: lib/js/test/package-lock.json - - name: Install Flow CLI - run: sh -ci "$(curl -fsSL https://raw.githubusercontent.com/onflow/flow-cli/master/install.sh)" - - name: Flow cli Version - run: flow version - - name: Update PATH - run: echo "/root/.local/bin" >> $GITHUB_PATH - - name: Install dependencies - run: cd lib/js/test && npm ci - - run: make ci + - uses: actions/checkout@v3 + with: + submodules: "true" + - name: Set up Go + uses: actions/setup-go@v3 + with: + go-version: 1.18 + - name: Install Flow CLI + run: bash -ci "$(curl -fsSL https://raw.githubusercontent.com/onflow/flow-cli/master/install.sh)" -- v1.3.2 + - name: Run tests + run: make ci \ No newline at end of file diff --git a/.gitignore b/.gitignore index 91c2300..2092876 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .idea .DS_Store flowdb/ -lib/js/test/node_modules .vscode/ .env +coverage.json +*.pkey diff --git a/Makefile b/Makefile index 689aba7..1b56d38 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: test test: - $(MAKE) test -C lib/js/test + set -e + flow test --cover ./test/*_tests.cdc .PHONY: ci -ci: - $(MAKE) ci -C lib/js/test +ci: test diff --git a/README.md b/README.md index 6a2a690..ff0e0b3 100644 --- a/README.md +++ b/README.md @@ -213,12 +213,19 @@ To demo the functionality of this repo, clone it and follow the steps below by e - In one terminal window, run: ```sh - flow emulator start + flow emulator ``` - - In another terminal window deploy the contracts with: + - In another terminal window, run the setup script creating our accounts & deploying contracts: ```sh - flow deploy + sh setup.sh + ``` + + - Lastly, a HybridCustody pre-requisite includes setting up a Capability `Filter` and Capability Factory `Manager`. These ensure that parent account access is scoped to just the Capabilities they need to interact with the assets we as the developer want them to access. For more info on `CapabilityFilter` & `CapabilityFactory`, read [these docs](https://developers.flow.com/concepts/hybrid-custody/guides/linking-accounts#pre-requisites). + + ```sh + flow transactions send ./transactions/hybrid-custody/dev-setup/setup_filter_and_factory_manager.cdc \ + f8d6e0586b0a20c7 GamePieceNFT f8d6e0586b0a20c7 TicketToken ``` ## Walletless Demo Walkthrough diff --git a/contracts/ArcadePrize.cdc b/contracts/ArcadePrize.cdc index 09a9ca8..b9c12c2 100644 --- a/contracts/ArcadePrize.cdc +++ b/contracts/ArcadePrize.cdc @@ -1,7 +1,7 @@ -import NonFungibleToken from "./utility/NonFungibleToken.cdc" -import FungibleToken from "./utility/FungibleToken.cdc" -import MetadataViews from "./utility/MetadataViews.cdc" -import TicketToken from "./TicketToken.cdc" +import "NonFungibleToken" +import "FungibleToken" +import "MetadataViews" +import "TicketToken" pub contract ArcadePrize: NonFungibleToken { diff --git a/contracts/DynamicNFT.cdc b/contracts/DynamicNFT.cdc index e75e3aa..7eeb5fe 100644 --- a/contracts/DynamicNFT.cdc +++ b/contracts/DynamicNFT.cdc @@ -1,4 +1,4 @@ -import MetadataViews from "./utility/MetadataViews.cdc" +import "MetadataViews" /// DynamicNFT /// diff --git a/contracts/GamePieceNFT.cdc b/contracts/GamePieceNFT.cdc index d25d5c4..bf4c496 100644 --- a/contracts/GamePieceNFT.cdc +++ b/contracts/GamePieceNFT.cdc @@ -1,8 +1,10 @@ -import FungibleToken from "./utility/FungibleToken.cdc" -import NonFungibleToken from "./utility/NonFungibleToken.cdc" -import MetadataViews from "./utility/MetadataViews.cdc" -import GamingMetadataViews from "./GamingMetadataViews.cdc" -import DynamicNFT from "./DynamicNFT.cdc" +import "FungibleToken" +import "NonFungibleToken" +import "MetadataViews" +import "ViewResolver" + +import "GamingMetadataViews" +import "DynamicNFT" /// GamePieceNFT /// @@ -11,7 +13,7 @@ import DynamicNFT from "./DynamicNFT.cdc" /// heavily modeled on MonsterMaker, using images from that NFT collection /// as well as many values & methods from that collection. /// -pub contract GamePieceNFT: NonFungibleToken { +pub contract GamePieceNFT: NonFungibleToken, ViewResolver { /// Counter to track total circulating supply pub var totalSupply: UInt64 @@ -217,45 +219,13 @@ pub contract GamePieceNFT: NonFungibleToken { self.id ) case Type(): - return MetadataViews.ExternalURL("https://walletless-arcade-game.vercel.app/".concat(self.id.toString())) - // TODO: Confirm returned types + return MetadataViews.ExternalURL("https://walletless-arcade-game.vercel.app/") case Type(): - return MetadataViews.NFTCollectionData( - storagePath: GamePieceNFT.CollectionStoragePath, - publicPath: GamePieceNFT.CollectionPublicPath, - providerPath: GamePieceNFT.ProviderPrivatePath, - publicCollection: Type<&GamePieceNFT.Collection{GamePieceNFT.GamePieceNFTCollectionPublic}>(), - publicLinkedType: Type<&GamePieceNFT.Collection{GamePieceNFT.GamePieceNFTCollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Receiver, MetadataViews.ResolverCollection}>(), - providerLinkedType: Type<&GamePieceNFT.Collection{GamePieceNFT.GamePieceNFTCollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Provider, MetadataViews.ResolverCollection}>(), - createEmptyCollectionFunction: (fun (): @NonFungibleToken.Collection { - return <-GamePieceNFT.createEmptyCollection() - }) - ) + return GamePieceNFT.resolveView(view) case Type(): - let media = MetadataViews.Media( - file: MetadataViews.HTTPFile( - url: "https://i.imgur.com/UMXsEjt.png" - ), - mediaType: "image/png" - ) - - let bannerMedia = MetadataViews.Media( - file: MetadataViews.HTTPFile( - url: "https://i.imgur.com/NzV9cyo.png" - ), - mediaType: "image/png" - ) - return MetadataViews.NFTCollectionDisplay( - name: "The MonsterMaker GamePieceNFT Collection", - description: "This collection is used as an example to help you develop your next Flow NFT.", - externalURL: MetadataViews.ExternalURL("https://walletless-arcade-game.vercel.app/"), - squareImage: media, - bannerImage: bannerMedia, - socials: {} - ) + return GamePieceNFT.resolveView(view) case Type(): let traitsView = MetadataViews.dictToTraits(dict: self.metadata, excludedNames: []) - return traitsView default: return nil @@ -559,6 +529,63 @@ pub contract GamePieceNFT: NonFungibleToken { ) } + /// Function that resolves a metadata view for this contract. + /// + /// @param view: The Type of the desired view. + /// @return A structure representing the requested view. + /// + pub fun resolveView(_ view: Type): AnyStruct? { + switch view { + case Type(): + return MetadataViews.NFTCollectionData( + storagePath: GamePieceNFT.CollectionStoragePath, + publicPath: GamePieceNFT.CollectionPublicPath, + providerPath: GamePieceNFT.ProviderPrivatePath, + publicCollection: Type<&GamePieceNFT.Collection{GamePieceNFT.GamePieceNFTCollectionPublic}>(), + publicLinkedType: Type<&GamePieceNFT.Collection{GamePieceNFT.GamePieceNFTCollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Receiver, MetadataViews.ResolverCollection}>(), + providerLinkedType: Type<&GamePieceNFT.Collection{GamePieceNFT.GamePieceNFTCollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Provider, MetadataViews.ResolverCollection}>(), + createEmptyCollectionFunction: (fun (): @NonFungibleToken.Collection { + return <-GamePieceNFT.createEmptyCollection() + }) + ) + case Type(): + let media = MetadataViews.Media( + file: MetadataViews.HTTPFile( + url: "https://i.imgur.com/UMXsEjt.png" + ), + mediaType: "image/png" + ) + + let bannerMedia = MetadataViews.Media( + file: MetadataViews.HTTPFile( + url: "https://i.imgur.com/NzV9cyo.png" + ), + mediaType: "image/png" + ) + return MetadataViews.NFTCollectionDisplay( + name: "The MonsterMaker GamePieceNFT Collection", + description: "This collection is used as an example to help you develop your next Flow NFT.", + externalURL: MetadataViews.ExternalURL("https://walletless-arcade-game.vercel.app/"), + squareImage: media, + bannerImage: bannerMedia, + socials: {} + ) + } + return nil + } + + /// Function that returns all the Metadata Views implemented by a Non Fungible Token + /// + /// @return An array of Types defining the implemented views. This value will be used by + /// developers to know which parameter to pass to the resolveView() method. + /// + pub fun getViews(): [Type] { + return [ + Type(), + Type() + ] + } + init() { self.totalSupply = 0 diff --git a/contracts/GamingMetadataViews.cdc b/contracts/GamingMetadataViews.cdc index c4542f6..94c9d05 100644 --- a/contracts/GamingMetadataViews.cdc +++ b/contracts/GamingMetadataViews.cdc @@ -1,4 +1,4 @@ -import MetadataViews from "./utility/MetadataViews.cdc" +import "MetadataViews" /// GamingMetadataViews /// diff --git a/contracts/LinkedAccountMetadataViews.cdc b/contracts/LinkedAccountMetadataViews.cdc deleted file mode 100644 index 366d44b..0000000 --- a/contracts/LinkedAccountMetadataViews.cdc +++ /dev/null @@ -1,50 +0,0 @@ -import MetadataViews from "./utility/MetadataViews.cdc" - -/// Metadata views relevant to identifying information about linked accounts -/// designed for use in the standard LinkedAccounts contract -/// -pub contract LinkedAccountMetadataViews { - - /// Identifies information that could be used to determine the off-chain - /// associations of a child account - /// - pub struct interface AccountMetadata { - pub let name: String - pub let description: String - pub let creationTimestamp: UFix64 - pub let thumbnail: AnyStruct{MetadataViews.File} - pub let externalURL: MetadataViews.ExternalURL - } - - /// Simple metadata struct containing the most basic information about a - /// linked account - pub struct AccountInfo : AccountMetadata { - pub let name: String - pub let description: String - pub let creationTimestamp: UFix64 - pub let thumbnail: AnyStruct{MetadataViews.File} - pub let externalURL: MetadataViews.ExternalURL - - init( - name: String, - description: String, - thumbnail: AnyStruct{MetadataViews.File}, - externalURL: MetadataViews.ExternalURL - ) { - self.name = name - self.description = description - self.creationTimestamp = getCurrentBlock().timestamp - self.thumbnail = thumbnail - self.externalURL = externalURL - } - } - - /// A struct enabling LinkedAccount.Handler to maintain implementer defined metadata - /// resolver in conjunction with the default structs above - /// - pub struct interface MetadataResolver { - pub fun getViews(): [Type] - pub fun resolveView(_ view: Type): AnyStruct{AccountMetadata}? - } -} - \ No newline at end of file diff --git a/contracts/LinkedAccounts.cdc b/contracts/LinkedAccounts.cdc deleted file mode 100644 index be3a536..0000000 --- a/contracts/LinkedAccounts.cdc +++ /dev/null @@ -1,1082 +0,0 @@ -/*************************************************************************** - - For more info on this contract & associated transactions & scripts, see: - https://github.com/onflow/linked-accounts - - To provide feedback, check FLIP #72 - https://github.com/onflow/flips/pull/72 - -****************************************************************************/ - -import NonFungibleToken from "./utility/NonFungibleToken.cdc" -import ViewResolver from "./utility/ViewResolver.cdc" -import MetadataViews from "./utility/MetadataViews.cdc" -import LinkedAccountMetadataViews from "./LinkedAccountMetadataViews.cdc" - -/// This contract establishes a standard set of resources representing linked account associations, enabling -/// querying of either end of account links as well as management of linked accounts, the Capabilities they're -/// granted, as well as addition/removal of new/existing account delegations. By leveraging this contract, a new sort -/// of custody is unlocked - Hybrid Custody - enabling the mainstream-friendly walletless onboarding UX we're so -/// excited about on Flow. -/// -/// By leveraging existing metadata standards, builders can easily query a Collection's linked accounts, their -/// relevant metadata, etc. With implementation of the NFT standard, Collection owners can easily transfer delegation -/// they wish in a mental model that's familiar and easy to understand. -/// -/// The Collection allows a main account to add linked accounts, and An account is deemed a child of a -/// parent if the parent maintains delegated access on the child account by way of AuthAccount -/// Capability wrapped in an NFT and saved in a Collection. By -/// the constructs defined in this contract, a linked account can be identified by a stored -/// Handler. -/// -/// While one generally would not want to share account access with other parties, this can be helpful in a low-stakes -/// environment where the parent account's owner wants to delegate transaction signing to a secondary party. The idea -/// for this setup was born out of pursuit of a more seamless on-chain gameplay UX where a user could let a game client -/// submit transactions on their behalf without signing over the whole of their primary account, and do so in a way -/// that didn't require custom a Capability. -/// -/// With that said, users should bear in mind that any assets in a linked account incur obvious custodial risk, and -/// that it's generally an anti-pattern to pass around AuthAccounts. In this case, a user owns both accounts so they -/// are technically passing an AuthAccount to themselves in calls to resources that reside in their own account, so -/// it was deemed a valid application of the pattern. That said, a user should be cognizant of the party with key -/// access on the linked account as this pattern requires some degree of trust in the custodying party. -/// -pub contract LinkedAccounts : NonFungibleToken, ViewResolver { - - /// The number of NFTs in existence - pub var totalSupply: UInt64 - - // NFT conforming events - pub event ContractInitialized() - pub event Withdraw(id: UInt64, from: Address?) - pub event Deposit(id: UInt64, to: Address?) - - // LinkedAccounts Events - pub event MintedNFT(id: UInt64, parent: Address, child: Address) - pub event AddedLinkedAccount(parent: Address, child: Address, nftID: UInt64) - pub event UpdatedLinkedAccountParentAddress(previousParent: Address, newParent: Address, child: Address) - pub event UpdatedAuthAccountCapabilityForLinkedAccount(id: UInt64, parent: Address, child: Address) - pub event LinkedAccountGrantedCapability(parent: Address, child: Address, capabilityType: Type) - pub event RevokedCapabilitiesFromLinkedAccount(parent: Address, child: Address, capabilityTypes: [Type]) - pub event RemovedLinkedAccount(parent: Address, child: Address) - pub event CollectionCreated() - - // Canonical paths - pub let CollectionStoragePath: StoragePath - pub let CollectionPublicPath: PublicPath - pub let CollectionPrivatePath: PrivatePath - pub let HandlerStoragePath: StoragePath - pub let HandlerPublicPath: PublicPath - pub let HandlerPrivatePath: PrivatePath - - /** --- Handler --- */ - // - pub resource interface HandlerPublic { - pub fun getParentAddress(): Address - pub fun getGrantedCapabilityTypes(): [Type] - pub fun isCurrentlyActive(): Bool - } - - /// Identifies an account as a child account and maintains info about its parent & association as well as - /// Capabilities granted by its parent account's Collection - /// - pub resource Handler : HandlerPublic, MetadataViews.Resolver { - /// Pointer to this account's parent account - access(contract) var parentAddress: Address - /// The address of the account where the ccountHandler resource resides - access(contract) let address: Address - /// Metadata about the purpose of this child account guarantees standard minimum metadata is stored - /// about linked accounts - access(contract) let metadata: AnyStruct{LinkedAccountMetadataViews.AccountMetadata} - /// Resolver struct to increase the flexibility, allowing implementers to resolve their own structs - access(contract) let resolver: AnyStruct{LinkedAccountMetadataViews.MetadataResolver}? - /// Capabilities that have been granted by the parent account - access(contract) let grantedCapabilities: {Type: Capability} - /// Flag denoting whether link to parent is still active - access(contract) var isActive: Bool - - init( - parentAddress: Address, - address: Address, - metadata: AnyStruct{LinkedAccountMetadataViews.AccountMetadata}, - resolver: AnyStruct{LinkedAccountMetadataViews.MetadataResolver}? - ) { - self.parentAddress = parentAddress - self.address = address - self.metadata = metadata - self.grantedCapabilities = {} - self.resolver = resolver - self.isActive = true - } - - /// Returns the metadata view types supported by this Handler - /// - /// @return An array of metadata view types - /// - pub fun getViews(): [Type] { - let views: [Type] = [] - if self.resolver != nil { - views.appendAll(self.resolver!.getViews()) - } - views.appendAll([ - Type(), - Type() - ]) - if self.metadata.getType() != Type() { - views.append(self.metadata.getType()) - } - return views - } - - /// Returns the requested view if supported or nil otherwise - /// - /// @param view: The Type of metadata struct requests - /// - /// @return The metadata of requested Type if supported and nil otherwise - /// - pub fun resolveView(_ view: Type): AnyStruct? { - switch view { - case Type(): - return LinkedAccountMetadataViews.AccountInfo( - name: self.metadata.name, - description: self.metadata.description, - thumbnail: self.metadata.thumbnail, - externalURL: self.metadata.externalURL - ) - case Type(): - return MetadataViews.Display( - name: self.metadata.name, - description: self.metadata.description, - thumbnail: self.metadata.thumbnail - ) - case self.metadata.getType(): - return self.metadata - default: - if self.resolver != nil && self.resolver!.getViews().contains(view) { - return self.resolver!.resolveView(view) - } - return nil - } - } - - pub fun getAddress(): Address { - pre { - self.owner != nil: - "This Handler does not currently reside within an account!" - } - post { - result == self.owner!.address: - "This Handler is not located in the correct linked account!" - } - return self.address - } - - /// Returns the Address of this linked account's parent Collection - /// - pub fun getParentAddress(): Address { - return self.parentAddress - } - - /// Returns the metadata related to this account's association - /// - pub fun getAccountMetadata(): AnyStruct{LinkedAccountMetadataViews.AccountMetadata} { - return self.metadata - } - - /// Returns the optional resolver contained within this Handler - /// - pub fun getResolver(): AnyStruct{LinkedAccountMetadataViews.MetadataResolver}? { - return self.resolver - } - - /// Returns the types of Capabilities this Handler has been granted - /// - /// @return An array of the Types of Capabilities this resource has access to in its grantedCapabilities - /// mapping - /// - pub fun getGrantedCapabilityTypes(): [Type] { - return self.grantedCapabilities.keys - } - - /// Returns whether the link between this Handler and its associated Collection is still active - in - /// practice whether the linked Collection has removed this Handler's Capability - /// - pub fun isCurrentlyActive(): Bool { - return self.isActive - } - - /// Retrieves a granted Capability as a reference or nil if it does not exist. - /// - // **Note**: This is a temporary solution for Capability auditing & easy revocation - /// their way to Cadence, enabling a parent account to issue, audit and easily revoke Capabilities to linked - /// accounts. - /// - /// @param type: The Type of Capability being requested - /// - /// @return A reference to the Capability or nil if a Capability of given Type is not - /// available - /// - pub fun getGrantedCapabilityAsRef(_ type: Type): &Capability? { - pre { - self.isActive: "LinkedAccounts.Handler has been de-permissioned by parent!" - } - return &self.grantedCapabilities[type] as &Capability? - } - - /// Updates this Handler's parentAddress, occurring whenever a corresponding NFT transfer occurs - /// - /// @param newAddress: The Address of the new parent account - /// - access(contract) fun updateParentAddress(_ newAddress: Address) { - self.parentAddress = newAddress - } - - /// Inserts the given Capability into this Handler's grantedCapabilities mapping. - /// - /// @param cap: The Capability being granted - /// - access(contract) fun grantCapability(_ cap: Capability) { - pre { - !self.grantedCapabilities.containsKey(cap.getType()): - "Already granted Capability of given type!" - } - self.grantedCapabilities.insert(key: cap.getType(), cap) - } - - /// Removes the Capability of given Type from this Handler's grantedCapabilities mapping. - /// - /// @param type: The Type of Capability to be removed - /// - /// @return the removed Capability or nil if it did not exist - /// - access(contract) fun revokeCapabilities(_ types: [Type]): [Type] { - // return self.grantedCapabilities.remove(key: type) - let removedTypes: [Type] = [] - for capType in types { - if let removed = self.grantedCapabilities.remove(key: capType) { - removedTypes.append(removed.getType()) - } - } - return removedTypes - } - - /// Removes all granted Capabilities from this Handler's grantedCapabilities mapping. Helpful when removing - /// a Handler association from a Collection (AKA unlinking an account) as well as limiting the number of events - /// emitted compared to revoking one-by-one. - /// - /// @return An array containing the types of all Capabilities removed - /// - access(contract) fun revokeAllCapabilities(): [Type] { - return self.revokeCapabilities(self.grantedCapabilities.keys) - } - - /// Sets the isActive Bool flag to false - /// - access(contract) fun setInactive() { - self.isActive = false - } - } - - /** --- NFT --- */ - // - /// Publicly accessible Capability for linked account wrapping resource, protecting the wrapped Capabilities - /// from public access via reference as implemented in LinkedAccount.NFT - /// - pub resource interface NFTPublic { - pub let id: UInt64 - pub fun checkAuthAccountCapability(): Bool - pub fun checkHandlerCapability(): Bool - pub fun getChildAccountAddress(): Address - pub fun getParentAccountAddress(): Address - pub fun getHandlerPublicRef(): &Handler{HandlerPublic} - } - - /// Wrapper for the linked account's metadata, AuthAccount, and Handler Capabilities - /// implemented as an NFT - /// - pub resource NFT : NFTPublic, NonFungibleToken.INFT, MetadataViews.Resolver { - pub let id: UInt64 - access(self) var parentAddress: Address - access(self) let linkedAccountAddress: Address - /// The AuthAccount Capability for the linked account this NFT represents - access(self) var authAccountCapability: Capability<&AuthAccount> - /// Capability for the relevant Handler - access(self) var handlerCapability: Capability<&Handler> - - init( - authAccountCap: Capability<&AuthAccount>, - handlerCap: Capability<&Handler> - ) { - pre { - authAccountCap.borrow() != nil: - "Problem with provided AuthAccount Capability" - handlerCap.borrow() != nil: - "Problem with provided Handler Capability" - authAccountCap.borrow()!.address == handlerCap.address && - handlerCap.address == handlerCap.borrow()!.getAddress(): - "Addresses among both Capabilities do not match!" - } - self.id = self.uuid - self.parentAddress = handlerCap.borrow()!.getParentAddress() - self.linkedAccountAddress = authAccountCap.borrow()!.address - self.authAccountCapability = authAccountCap - self.handlerCapability = handlerCap - } - - /// Function that returns all the Metadata Views implemented by an NFT & by extension the relevant Handler - /// - /// @return An array of Types defining the implemented views. This value will be used by developers to know - /// which parameter to pass to the resolveView() method. - /// - pub fun getViews(): [Type] { - let handlerRef: &LinkedAccounts.Handler = self.getHandlerRef() - let views = handlerRef.getViews() - views.appendAll([ - Type(), - Type(), - Type(), - Type() - ]) - return views - } - - /// Function that resolves a metadata view for this ChildAccount. - /// - /// @param view: The Type of the desired view. - /// - /// @return A struct representing the requested view. - /// - pub fun resolveView(_ view: Type): AnyStruct? { - switch view { - case Type(): - return LinkedAccounts.resolveView(view) - case Type(): - return LinkedAccounts.resolveView(view) - case Type(): - let handlerRef = self.getHandlerRef() - let accountInfo = (handlerRef.resolveView( - Type()) as! LinkedAccountMetadataViews.AccountInfo? - )! - return MetadataViews.NFTView( - id: self.id, - uuid: self.uuid, - display: handlerRef.resolveView(Type()) as! MetadataViews.Display?, - externalURL: accountInfo.externalURL, - collectionData: LinkedAccounts.resolveView(Type()) as! MetadataViews.NFTCollectionData?, - collectionDisplay: LinkedAccounts.resolveView(Type()) as! MetadataViews.NFTCollectionDisplay?, - royalties: nil, - traits: MetadataViews.dictToTraits( - dict: { - "id": self.id, - "parentAddress": handlerRef.parentAddress, - "linkedAddress": handlerRef.address, - "creationTimestamp": accountInfo.creationTimestamp - }, - excludedNames: nil - ) - ) - case Type(): - return self.getHandlerRef().resolveView(Type()) - default: - let handlerRef: &LinkedAccounts.Handler = self.handlerCapability.borrow() - ?? panic("Problem with Handler Capability in this NFT") - return handlerRef.resolveView(view) - } - } - - /// Get a reference to the child AuthAccount object. - /// - pub fun getAuthAcctRef(): &AuthAccount { - return self.authAccountCapability.borrow() ?? panic("Problem with AuthAccount Capability in NFT!") - } - - /// Returns a reference to the Handler - /// - pub fun getHandlerRef(): &Handler { - return self.handlerCapability.borrow() ?? panic("Problem with LinkedAccounts.Handler Capability in NFT!") - } - - /// Returns whether AuthAccount Capability link is currently active - /// - /// @return True if the link is active, false otherwise - /// - pub fun checkAuthAccountCapability(): Bool { - return self.authAccountCapability.check() - } - - /// Returns whether Handler Capability link is currently active - /// - /// @return True if the link is active, false otherwise - /// - pub fun checkHandlerCapability(): Bool { - return self.handlerCapability.check() - } - - /// Returns the child account address this NFT manages a Capability for - /// - /// @return the address of the account this NFT has delegated access to - /// - pub fun getChildAccountAddress(): Address { - return self.getAuthAcctRef().address - } - - /// Returns the address on the parent side of the account link - /// - /// @return the address of the account that has been given delegated access - /// - pub fun getParentAccountAddress(): Address { - return self.parentAddress - } - - /// Returns a reference to the Handler as HandlerPublic - /// - /// @return a reference to the Handler as HandlerPublic - /// - pub fun getHandlerPublicRef(): &Handler{HandlerPublic} { - return self.handlerCapability.borrow() ?? panic("Problem with Handler Capability in NFT!") - } - - /// Updates this NFT's AuthAccount Capability to another for the same account. Useful in the event the - /// Capability needs to be retargeted - /// - /// @param new: The new AuthAccount Capability, but must be for the same account as the current Capability - /// - pub fun updateAuthAccountCapability(_ newCap: Capability<&AuthAccount>) { - pre { - newCap.check(): "Problem with provided Capability" - newCap.borrow()!.address == self.linkedAccountAddress: - "Provided AuthAccount is not for this NFT's associated account Address!" - } - self.authAccountCapability = newCap - emit UpdatedAuthAccountCapabilityForLinkedAccount(id: self.id, parent: self.parentAddress, child: self.linkedAccountAddress) - } - - /// Updates this NFT's AuthAccount Capability to another for the same account. Useful in the event the - /// Capability needs to be retargeted - /// - /// @param new: The new AuthAccount Capability, but must be for the same account as the current Capability - /// - pub fun updateHandlerCapability(_ newCap: Capability<&Handler>) { - pre { - newCap.check(): "Problem with provided Capability" - newCap.borrow()!.address == self.linkedAccountAddress && - newCap.address == self.linkedAccountAddress: - "Provided AuthAccount is not for this NFT's associated account Address!" - } - self.handlerCapability = newCap - } - - /// Updates this NFT's parent address & the parent address of the associated Handler - /// - /// @param newAddress: The address of the new parent account - /// - access(contract) fun updateParentAddress(_ newAddress: Address) { - // Check if new parent address differs from current - if newAddress != self.parentAddress { - // Get the existing parent address - let previousParent: Address = self.parentAddress - // Reassign to new address - self.parentAddress = newAddress - // Update in Handler as well & emit - self.getHandlerRef().updateParentAddress(newAddress) - emit UpdatedLinkedAccountParentAddress(previousParent: previousParent, newParent: newAddress, child: self.linkedAccountAddress) - } - } - } - - /** --- Collection --- */ - // - /// Interface that allows one to view information about the owning account's - /// child accounts including the addresses for all child accounts and information - /// about specific child accounts by Address - /// - pub resource interface CollectionPublic { - pub fun getAddressToID(): {Address: UInt64} - pub fun getLinkedAccountAddresses(): [Address] - pub fun getIDOfNFTByAddress(address: Address): UInt64? - pub fun getIDs(): [UInt64] - pub fun isLinkActive(onAddress: Address): Bool - pub fun borrowNFT(id: UInt64): &NonFungibleToken.NFT { - post { - result.id == id: "The returned reference's ID does not match the requested ID" - } - } - pub fun borrowNFTSafe(id: UInt64): &NonFungibleToken.NFT? { - post { - result == nil || result!.id == id: "The returned reference's ID does not match the requested ID" - } - } - pub fun borrowLinkedAccountsNFTPublic(id: UInt64): &LinkedAccounts.NFT{LinkedAccounts.NFTPublic}? { - post { - (result == nil) || (result?.id == id): - "Cannot borrow ExampleNFT reference: the ID of the returned reference is incorrect" - } - } - pub fun borrowViewResolverFromAddress(address: Address): &{MetadataViews.Resolver} - } - - /// A Collection of LinkedAccounts.NFTs, maintaining all delegated AuthAccount & Handler Capabilities in NFTs. - /// One NFT (representing delegated account access) per linked account can be maintained in this Collection, - /// enabling public view Capabilities and owner-related management methods, including removing linked accounts, as - /// well as granting & revoking Capabilities. - /// - pub resource Collection : CollectionPublic, NonFungibleToken.Provider, NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, MetadataViews.ResolverCollection { - /// Mapping of contained LinkedAccount.NFTs as NonFungibleToken.NFTs - pub var ownedNFTs: @{UInt64: NonFungibleToken.NFT} - /// Mapping linked account Address to relevant NFT.id - pub let addressToID: {Address: UInt64} - - init() { - self.ownedNFTs <-{} - self.addressToID = {} - } - - /// Returns the NFT as a Resolver for the specified ID - /// - /// @param id: The id of the NFT - /// - /// @return A reference to the NFT as a Resolver - /// - pub fun borrowViewResolver(id: UInt64): &{MetadataViews.Resolver} { - let nft = &self.ownedNFTs[id] as auth &NonFungibleToken.NFT? - ?? panic("Collection does not have NFT with specified ID") - let castNFT = nft as! &LinkedAccounts.NFT - return castNFT as &AnyResource{MetadataViews.Resolver} - } - - /// Returns the IDs of the NFTs in this Collection - /// - /// @return an array of the contained NFT resources - /// - pub fun getIDs(): [UInt64] { - return self.ownedNFTs.keys - } - - /// Returns a reference to the specified NonFungibleToken.NFT with given ID - /// - /// @param id: The id of the requested NonFungibleToken.NFT - /// - /// @return The requested NonFungibleToken.NFT, panicking if there is not an NFT with requested id in this - /// Collection - /// - pub fun borrowNFT(id: UInt64): &NonFungibleToken.NFT { - return &self.ownedNFTs[id] as &NonFungibleToken.NFT? ?? panic("Collection does not have NFT with specified ID") - } - - /// Returns a reference to the specified NonFungibleToken.NFT with given ID or nil - /// - /// @param id: The id of the requested NonFungibleToken.NFT - /// - /// @return The requested NonFungibleToken.NFT or nil if there is not an NFT with requested id in this - /// Collection - /// - pub fun borrowNFTSafe(id: UInt64): &NonFungibleToken.NFT? { - return &self.ownedNFTs[id] as &NonFungibleToken.NFT? - } - - /// Returns a reference to the specified LinkedAccounts.NFT as NFTPublic with given ID or nil - /// - /// @param id: The id of the requested LinkedAccounts.NFT as NFTPublic - /// - /// @return The requested LinkedAccounts.NFTublic or nil if there is not an NFT with requested id in this - /// Collection - /// - pub fun borrowLinkedAccountsNFTPublic(id: UInt64): &LinkedAccounts.NFT{LinkedAccounts.NFTPublic}? { - if let nft = &self.ownedNFTs[id] as auth &NonFungibleToken.NFT? { - let castNFT = nft as! &LinkedAccounts.NFT - return castNFT as &LinkedAccounts.NFT{LinkedAccounts.NFTPublic}? - } - return nil - } - - /// Returns whether this Collection has an active link for the given address. - /// - /// @return True if there is an NFT in this collection associated with the given address that has active - /// AuthAccount & Handler Capabilities and a Handler in the linked account that is set as active - /// - pub fun isLinkActive(onAddress: Address): Bool { - if let nftRef = self.borrowLinkedAccountNFT(address: onAddress) { - return nftRef.checkAuthAccountCapability() && - nftRef.checkHandlerCapability() && - nftRef.getHandlerRef().isCurrentlyActive() - } - return false - } - - /// Takes a given NonFungibleToken.NFT and adds it to this Collection's mapping of ownedNFTs, emitting both - /// Deposit and AddedLinkedAccount since depositing LinkedAccounts.NFT is effectively giving a Collection owner - /// delegated access to an account - /// - /// @param token: NonFungibleToken.NFT to be deposited to this Collection - /// - pub fun deposit(token: @NonFungibleToken.NFT) { - pre { - !self.ownedNFTs.containsKey(token.id): - "Collection already contains NFT with id: ".concat(token.id.toString()) - self.owner!.address != nil: - "Cannot transfer LinkedAccount.NFT to unknown party!" - } - // Assign scoped variables from LinkedAccounts.NFT - let token <- token as! @LinkedAccounts.NFT - let ownerAddress: Address = self.owner!.address - let linkedAccountAddress: Address = token.getChildAccountAddress() - let id: UInt64 = token.id - - // Ensure this Collection does not already have a LinkedAccounts.NFT for this token's account - assert( - !self.addressToID.containsKey(linkedAccountAddress), - message: "Already have delegated access to account address: ".concat(linkedAccountAddress.toString()) - ) - - // Update the NFT's parentAddress if needed - token.updateParentAddress(ownerAddress) - - // Add the new token to the ownedNFTs & addressToID mappings - let oldToken <- self.ownedNFTs[id] <- token - self.addressToID.insert(key: linkedAccountAddress, id) - destroy oldToken - - // Ensure both sides of account link have been properly labeled in the deposited NFT - let depositedNFTRef: &NFT = self.borrowLinkedAccountNFT(address: linkedAccountAddress)! - assert( - depositedNFTRef.getParentAccountAddress() == self.owner!.address, - message: "Problem assigning parent/child addresses to NFT while depositing!" - ) - assert( - self.addressToID[linkedAccountAddress] == id, - message: "Problem associating LinkedAccounts.NFT account Address to NFT.id" - ) - - // Emit events - emit Deposit(id: id, to: ownerAddress) - emit AddedLinkedAccount(parent: ownerAddress, child: linkedAccountAddress, nftID: id) - } - - /// Withdraws the LinkedAccounts.NFT with the given id as a NonFungibleToken.NFT, emitting standard Withdraw - /// event along with RemovedLinkedAccount event, denoting the delegated access for the account associated with - /// the NFT has been removed from this Collection - /// - /// @param withdrawID: The id of the requested NFT - /// - /// @return The requested LinkedAccounts.NFT as a NonFungibleToken.NFT - /// - pub fun withdraw(withdrawID: UInt64): @NonFungibleToken.NFT { - pre { - self.ownedNFTs.containsKey(withdrawID): - "Collection does not contain NFT with given id: ".concat(withdrawID.toString()) - self.owner!.address != nil: - "Cannot withdraw LinkedAccount.NFT from unknown party!" - } - post { - result.id == withdrawID: - "Incorrect NFT withdrawn from Collection!" - !self.ownedNFTs.containsKey(withdrawID): - "Collection still contains NFT with requested ID!" - } - // Get the token from the ownedNFTs mapping - let token: @NonFungibleToken.NFT <- self.ownedNFTs.remove(key: withdrawID)! - - // Get the Address associated with the withdrawing token id - let childAddress: Address = self.addressToID.keys[ - self.addressToID.values.firstIndex(of: withdrawID)! - ] - // Remove the address entry in our secondary mapping - self.addressToID.remove(key: childAddress)! - - // Emit events & return - emit Withdraw(id: token.id, from: self.owner?.address) - emit RemovedLinkedAccount(parent: self.owner!.address, child: childAddress) - return <-token - } - - /// Withdraws the LinkedAccounts.NFT with the given Address as a NonFungibleToken.NFT, emitting standard - /// Withdraw event along with RemovedLinkedAccount event, denoting the delegated access for the account - /// associated with the NFT has been removed from this Collection - /// - /// @param address: The Address associated with the requested NFT - /// - /// @return The requested LinkedAccounts.NFT as a NonFungibleToken.NFT - /// - pub fun withdrawByAddress(address: Address): @NonFungibleToken.NFT { - // Get the id of the assocated NFT - let id: UInt64 = self.getIDOfNFTByAddress(address: address) - ?? panic("This Collection does not contain an NFT associated with the given address ".concat(address.toString())) - // Withdraw & return the NFT - return <- self.withdraw(withdrawID: id) - } - - /// Getter method to make indexing linked account Addresses to relevant NFT.ids easy - /// - /// @return This collection's addressToID mapping, identifying a linked account's associated NFT.id - /// - pub fun getAddressToID(): {Address: UInt64} { - return self.addressToID - } - - /// Returns an array of all child account addresses - /// - /// @return an array containing the Addresses of the linked accounts - /// - pub fun getLinkedAccountAddresses(): [Address] { - let addressToIDRef = &self.addressToID as &{Address: UInt64} - return addressToIDRef.keys - } - - /// Returns the id of the associated NFT wrapping the AuthAccount Capability for the given - /// address - /// - /// @param ofAddress: Address associated with the desired LinkedAccounts.NFT - /// - /// @return The id of the associated LinkedAccounts.NFT or nil if it does not exist in this Collection - /// - pub fun getIDOfNFTByAddress(address: Address): UInt64? { - let addressToIDRef = &self.addressToID as &{Address: UInt64} - return addressToIDRef[address] - } - - /// Returns a reference to the NFT as a Resolver based on the given address - /// - /// @param address: The address of the linked account - /// - /// @return A reference to the NFT as a Resolver - /// - pub fun borrowViewResolverFromAddress(address: Address): &{MetadataViews.Resolver} { - return self.borrowViewResolver( - id: self.addressToID[address] ?? panic("No LinkedAccounts.NFT with given Address") - ) - } - - /// Allows the Collection to retrieve a reference to the NFT for a specified child account address - /// - /// @param address: The Address of the child account - /// - /// @return the reference to the child account's Handler - /// - pub fun borrowLinkedAccountNFT(address: Address): &LinkedAccounts.NFT? { - let addressToIDRef = &self.addressToID as &{Address: UInt64} - if let id: UInt64 = addressToIDRef[address] { - // Create an authorized reference to allow downcasting - let ref = (&self.ownedNFTs[id] as auth &NonFungibleToken.NFT?)! - return ref as! &LinkedAccounts.NFT - } - return nil - } - - /// Returns a reference to the specified linked account's AuthAccount - /// - /// @param address: The address of the relevant linked account - /// - /// @return the linked account's AuthAccount as ephemeral reference or nil if the - /// address is not of a linked account - /// - pub fun getChildAccountRef(address: Address): &AuthAccount? { - if let ref = self.borrowLinkedAccountNFT(address: address) { - return ref.getAuthAcctRef() - } - return nil - } - - /// Returns a reference to the specified linked account's Handler - /// - /// @param address: The address of the relevant linked account - /// - /// @return the child account's Handler as ephemeral reference or nil if the - /// address is not of a linked account - /// - pub fun getHandlerRef(address: Address): &Handler? { - if let ref = self.borrowLinkedAccountNFT(address: address) { - return ref.getHandlerRef() - } - return nil - } - - /// Add an existing account as a linked account to this Collection. This would be done in either a multisig - /// transaction or by the linking account linking & publishing its AuthAccount Capability for the Collection's - /// owner. - /// - /// @param childAccountCap: AuthAccount Capability for the account to be added as a child account - /// @param childAccountInfo: Metadata struct containing relevant data about the account being linked - /// - pub fun addAsChildAccount( - linkedAccountCap: Capability<&AuthAccount>, - linkedAccountMetadata: AnyStruct{LinkedAccountMetadataViews.AccountMetadata}, - linkedAccountMetadataResolver: AnyStruct{LinkedAccountMetadataViews.MetadataResolver}?, - handlerPathSuffix: String - ) { - pre { - linkedAccountCap.check(): - "Problem with given AuthAccount Capability!" - !self.addressToID.containsKey(linkedAccountCap.borrow()!.address): - "Collection already has LinkedAccount.NFT for given account!" - self.owner != nil: - "Cannot add a linked account without an owner for this Collection!" - } - - /** --- Assign account variables --- */ - // - // Get a &AuthAccount reference from the the given AuthAccount Capability - let linkedAccountRef: &AuthAccount = linkedAccountCap.borrow()! - // Assign parent & child address to identify sides of the link - let childAddress: Address = linkedAccountRef.address - let parentAddress: Address = self.owner!.address - - /** --- Path construction & validation --- */ - // - // Construct paths for the Handler & its Capabilities - let handlerStoragePath: StoragePath = StoragePath(identifier: handlerPathSuffix) - ?? panic("Could not construct StoragePath for Handler with given suffix") - let handlerPublicPath: PublicPath = PublicPath(identifier: handlerPathSuffix) - ?? panic("Could not construct PublicPath for Handler with given suffix") - let handlerPrivatePath: PrivatePath = PrivatePath(identifier: handlerPathSuffix) - ?? panic("Could not construct PrivatePath for Handler with given suffix") - // Ensure nothing saved at expected paths - assert( - linkedAccountRef.type(at: handlerStoragePath) == nil, - message: "Linked account already has stored object at: ".concat(handlerStoragePath.toString()) - ) - assert( - linkedAccountRef.getLinkTarget(handlerPublicPath) == nil, - message: "Linked account already has public Capability at: ".concat(handlerPublicPath.toString()) - ) - assert( - linkedAccountRef.getLinkTarget(handlerPrivatePath) == nil, - message: "Linked account already has private Capability at: ".concat(handlerPrivatePath.toString()) - ) - - /** --- Configure newly linked account with Handler & get Capability --- */ - // - // Create a Handler - let handler: @LinkedAccounts.Handler <-create Handler( - parentAddress: parentAddress, - address: childAddress, - metadata: linkedAccountMetadata, - resolver: linkedAccountMetadataResolver - ) - // Save the Handler in the child account's storage & link - linkedAccountRef.save(<-handler, to: handlerStoragePath) - // Ensure public Capability linked - linkedAccountRef.link<&Handler{HandlerPublic}>( - handlerPublicPath, - target: handlerStoragePath - ) - // Ensure private Capability linked - linkedAccountRef.link<&Handler>( - handlerPrivatePath, - target: handlerStoragePath - ) - // Get a Capability to the linked Handler Cap in linked account's private storage - let handlerCap: Capability<&LinkedAccounts.Handler> = linkedAccountRef.getCapability<&Handler>( - handlerPrivatePath - ) - // Ensure the capability is valid before inserting it in collection's linkedAccounts mapping - assert(handlerCap.check(), message: "Problem linking Handler Capability in new child account at PrivatePath!") - - /** --- Wrap caps in newly minted NFT & deposit --- */ - // - // Create an NFT, increment supply, & deposit to this Collection before emitting MintedNFT - let nft <-LinkedAccounts.mintNFT( - authAccountCap: linkedAccountCap, - handlerCap: handlerCap - ) - let nftID: UInt64 = nft.id - LinkedAccounts.totalSupply = LinkedAccounts.totalSupply + 1 - emit MintedNFT(id: nftID, parent: parentAddress, child: childAddress) - self.deposit(token: <-nft) - } - - /// Adds the given Capability to the Handler at the provided Address - /// - /// @param to: Address which is the key for the Handler Cap - /// @param cap: Capability to be added to the Handler - /// - pub fun addCapability(to: Address, _ cap: Capability) { - pre { - self.addressToID.containsKey(to): - "No linked account NFT with given Address!" - } - // Get ref to handler - let handlerRef = self.getHandlerRef( - address: to - ) ?? panic("Problem with Handler Capability for given address: ".concat(to.toString())) - let capType: Type = cap.getType() - - // Pass the Capability to the linked account via the handler & emit - handlerRef.grantCapability(cap) - emit LinkedAccountGrantedCapability(parent: self.owner!.address, child: to, capabilityType: capType) - } - - /// Removes the capability of the given type from the Handler with the given Address - /// - /// @param from: Address indexing the Handler Capability - /// @param type: The Type of Capability to be removed from the Handler - /// - pub fun removeCapabilities(from: Address, types: [Type]): [Type] { - pre { - self.addressToID.containsKey(from): - "No linked account with given Address!" - } - // Get ref to handler and remove - let handlerRef: &LinkedAccounts.Handler = self.getHandlerRef( - address: from - ) ?? panic("Problem with Handler Capability for given address: ".concat(from.toString())) - // Revoke Capability & emit - let removedTypes: [Type] = handlerRef.revokeCapabilities(types) - emit RevokedCapabilitiesFromLinkedAccount(parent: self.owner!.address, child: from, capabilityTypes: types) - return removedTypes - } - - /// Remove Handler, returning its Address if it exists. - /// Note, removing a Handler does not revoke key access linked account if it has been added. This should be - /// done in the same transaction in which this method is called. - /// - /// @param withAddress: The Address of the linked account to remove from the mapping - /// - /// @return the Address of the account removed or nil if it wasn't linked to begin with - /// - pub fun removeLinkedAccount(withAddress: Address): [Type] { - pre { - self.addressToID.containsKey(withAddress): - "This Collection does not have NFT with given Address: ".concat(withAddress.toString()) - } - // Withdraw the NFT - let nft: @LinkedAccounts.NFT <-self.withdrawByAddress(address: withAddress) as! @NFT - let nftID: UInt64 = nft.id - - // Get a reference to the Handler from the NFT - let handlerRef: &LinkedAccounts.Handler = nft.getHandlerRef() - // Set the handler as inactive - handlerRef.setInactive() - // Remove all capabilities from the Handler - let removedCapTypes: [Type] = handlerRef.revokeAllCapabilities() - - // Emit RemovedLinkedAccount & destroy NFT - emit RemovedLinkedAccount(parent: self.owner!.address, child: withAddress) - destroy nft - return removedCapTypes - } - - destroy () { - pre { - // Prevent destruction while account delegations remain in NFTs - self.ownedNFTs.length == 0: - "Attempting to destroy Colleciton with remaining NFTs!" - } - destroy self.ownedNFTs - } - - } - - /// Helper method to determine if a public key is active on an account by comparing the given key against all keys - /// active on the given account. - /// - /// @param publicKey: A public key as a string - /// @param address: The address of the - /// - /// @return True if the key is active on the account, false otherwise (including if the given public key string was - /// invalid) - /// - pub fun isKeyActiveOnAccount(publicKey: String, address: Address): Bool { - // Public key strings must have even length - if publicKey.length % 2 == 0 { - var keyIndex = 0 - var keysRemain = true - // Iterate over keys on given account address - while keysRemain { - // Get the key as byte array - if let keyArray = getAccount(address).keys.get(keyIndex: keyIndex)?.publicKey?.publicKey { - // Encode the key as a string and compare - if publicKey == String.encodeHex(keyArray) { - return !getAccount(address).keys.get(keyIndex: keyIndex)!.isRevoked - } - keyIndex = keyIndex + 1 - } else { - keysRemain = false - } - } - } - return false - } - - /// Returns a new Collection - /// - pub fun createEmptyCollection(): @NonFungibleToken.Collection { - emit CollectionCreated() - return <-create Collection() - } - - /// Function that returns all the Metadata Views implemented by a Non Fungible Token - /// - /// @return An array of Types defining the implemented views. This value will be used by - /// developers to know which parameter to pass to the resolveView() method. - /// - pub fun getViews(): [Type] { - return [ - Type(), - Type() - ] - } - - /// Function that resolves a metadata view for this contract. - /// - /// @param view: The Type of the desired view. - /// @return A structure representing the requested view. - /// - pub fun resolveView(_ view: Type): AnyStruct? { - switch view { - case Type(): - return MetadataViews.NFTCollectionData( - storagePath: LinkedAccounts.CollectionStoragePath, - publicPath: LinkedAccounts.CollectionPublicPath, - providerPath: LinkedAccounts.CollectionPrivatePath, - publicCollection: Type<&LinkedAccounts.Collection{LinkedAccounts.CollectionPublic}>(), - publicLinkedType: Type<&LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, MetadataViews.ResolverCollection}>(), - providerLinkedType: Type<&LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.Provider, MetadataViews.ResolverCollection}>(), - createEmptyCollectionFunction: (fun (): @NonFungibleToken.Collection { - return <-LinkedAccounts.createEmptyCollection() - }) - ) - case Type(): - let media = MetadataViews.Media( - file: MetadataViews.HTTPFile( - url: "https://assets.website-files.com/5f6294c0c7a8cdd643b1c820/5f6294c0c7a8cda55cb1c936_Flow_Wordmark.svg" - ), - mediaType: "image/svg+xml" - ) - } - return nil - } - - /// Contract mint method enabling caller to mint an NFT, wrapping the provided Capabilities - /// - /// @param authAccountCap: The AuthAccount Capability that will be wrapped in the minted NFT - /// @param handlerCap: The Handler Capability that will be wrapped in the minted NFT - /// - /// @return the newly created NFT - /// - access(contract) fun mintNFT( - authAccountCap: Capability<&AuthAccount>, - handlerCap: Capability<&Handler> - ): @NFT { - return <-create NFT( - authAccountCap: authAccountCap, - handlerCap: handlerCap - ) - } - - init() { - - self.totalSupply = 0 - - // Assign Collection paths - self.CollectionStoragePath = /storage/LinkedAccountCollection - self.CollectionPublicPath = /public/LinkedAccountCollection - self.CollectionPrivatePath = /private/LinkedAccountCollection - // Assign Handler paths - self.HandlerStoragePath = /storage/LinkedAccountHandler - self.HandlerPublicPath = /public/LinkedAccountHandler - self.HandlerPrivatePath = /private/LinkedAccountHandler - - emit ContractInitialized() - } -} - \ No newline at end of file diff --git a/contracts/RockPaperScissorsGame.cdc b/contracts/RockPaperScissorsGame.cdc index 3295ca0..1a41135 100644 --- a/contracts/RockPaperScissorsGame.cdc +++ b/contracts/RockPaperScissorsGame.cdc @@ -1,8 +1,8 @@ -import MetadataViews from "./utility/MetadataViews.cdc" -import GamingMetadataViews from "./GamingMetadataViews.cdc" -import NonFungibleToken from "./utility/NonFungibleToken.cdc" -import GamePieceNFT from "./GamePieceNFT.cdc" -import DynamicNFT from "./DynamicNFT.cdc" +import "MetadataViews" +import "GamingMetadataViews" +import "NonFungibleToken" +import "GamePieceNFT" +import "DynamicNFT" /// RockPaperScissorsGame /// @@ -772,7 +772,7 @@ pub contract RockPaperScissorsGame { pub let id: UInt64 pub let gameContractInfo: GamingMetadataViews.GameContractMetadata pub fun getGamePlayerIDRef(): &{GamePlayerID} - pub fun getAvailableMoves(matchID: UInt64): [Moves] + pub fun getAvailableMoves(matchID: UInt64): [Moves]? pub fun getMatchesInLobby(): [UInt64] pub fun getMatchesInPlay(): [UInt64] pub fun getMatchLobbyCaps(): {UInt64: Capability<&{MatchLobbyActions}>} @@ -782,7 +782,7 @@ pub contract RockPaperScissorsGame { pub fun createMatch( multiPlayer: Bool, matchTimeLimit: UFix64, - nft: @AnyResource{NonFungibleToken.INFT}, + nft: @AnyResource{NonFungibleToken.INFT, DynamicNFT.Dynamic}, receiverCap: Capability<&{NonFungibleToken.Receiver}> ): UInt64 pub fun signUpForMatch(matchID: UInt64) @@ -803,13 +803,15 @@ pub contract RockPaperScissorsGame { /// Players can add themselves to games or be added if they expose GamePlayerPublic /// capability /// - pub resource GamePlayer : GamePlayerID, GamePlayerPublic { + pub resource GamePlayer : GamePlayerID, GamePlayerPublic, DelegatedGamePlayer { pub let id: UInt64 + pub let gameContractInfo: GamingMetadataViews.GameContractMetadata access(self) let matchLobbyCapabilities: {UInt64: Capability<&{MatchLobbyActions}>} access(self) let matchPlayerCapabilities: {UInt64: Capability<&{MatchPlayerActions}>} init() { self.id = self.uuid + self.gameContractInfo = RockPaperScissorsGame.info self.matchPlayerCapabilities = {} self.matchLobbyCapabilities = {} } @@ -1360,7 +1362,7 @@ pub contract RockPaperScissorsGame { init() { // Initialize variables self.name = "RockPaperScissors" - // TODO: Replace with actual values + // TODO: Replace images with actual values self.info = GamingMetadataViews.GameContractMetadata( name: self.name, description: "Rock, Paper, Scissors on-chain!", diff --git a/contracts/TicketToken.cdc b/contracts/TicketToken.cdc index 87da9e5..5b4f40b 100644 --- a/contracts/TicketToken.cdc +++ b/contracts/TicketToken.cdc @@ -1,8 +1,9 @@ -import FungibleToken from "./utility/FungibleToken.cdc" -import MetadataViews from "./utility/MetadataViews.cdc" -import FungibleTokenMetadataViews from "./utility/FungibleTokenMetadataViews.cdc" +import "FungibleToken" +import "MetadataViews" +import "FungibleTokenMetadataViews" +import "ViewResolver" -pub contract TicketToken : FungibleToken { +pub contract TicketToken : FungibleToken, ViewResolver { /// Total supply of TicketTokens in existence pub var totalSupply: UFix64 diff --git a/contracts/flow-utils/AddressUtils.cdc b/contracts/flow-utils/AddressUtils.cdc new file mode 100644 index 0000000..6714983 --- /dev/null +++ b/contracts/flow-utils/AddressUtils.cdc @@ -0,0 +1,109 @@ +import "StringUtils" + +pub contract AddressUtils { + + priv fun withoutPrefix(_ input: String): String{ + var address=input + + //get rid of 0x + if address.length>1 && address.utf8[1] == 120 { + address = address.slice(from: 2, upTo: address.length) + } + + //ensure even length + if address.length%2==1{ + address="0".concat(address) + } + return address + } + + priv fun parseUInt64(_ input: AnyStruct): UInt64?{ + var stringValue:String = "" + + if input.getType().isSubtype(of: Type()){ + stringValue = input as! String + } + else if input.getType().isSubtype(of: Type()){ + stringValue = (input as! Int).toString() + } + else if input.getType().isSubtype(of: Type
()){ + stringValue = (input as! Address).toString() + } + else if input.getType().isSubtype(of: Type()){ + stringValue = StringUtils.split((input as! Type).identifier, ".")[1] + } + + var address=self.withoutPrefix(stringValue) + var r:UInt64 = 0 + var bytes = address.decodeHex() + while bytes.length>0{ + r = r + (UInt64(bytes.removeFirst()) << UInt64(bytes.length * 8 )) + } + return r + + } + + pub fun parseAddress(_ input: AnyStruct): Address?{ + if let parsed = self.parseUInt64(input){ + return Address(parsed) + } + return nil + } + + pub fun isValidAddress(_ input: AnyStruct, forNetwork: String) : Bool{ + + if let address = self.parseUInt64(input) { + + var codeWords: {String:UInt64} = { + "MAINNET" : 0, + "TESTNET" : 0x6834ba37b3980209, + "EMULATOR": 0x1cb159857af02018 + } + + var parityCheckMatrixColumns: [UInt64] = [ + 0x00001, 0x00002, 0x00004, 0x00008, 0x00010, 0x00020, 0x00040, 0x00080, + 0x00100, 0x00200, 0x00400, 0x00800, 0x01000, 0x02000, 0x04000, 0x08000, + 0x10000, 0x20000, 0x40000, 0x7328d, 0x6689a, 0x6112f, 0x6084b, 0x433fd, + 0x42aab, 0x41951, 0x233ce, 0x22a81, 0x21948, 0x1ef60, 0x1deca, 0x1c639, + 0x1bdd8, 0x1a535, 0x194ac, 0x18c46, 0x1632b, 0x1529b, 0x14a43, 0x13184, + 0x12942, 0x118c1, 0x0f812, 0x0e027, 0x0d00e, 0x0c83c, 0x0b01d, 0x0a831, + 0x0982b, 0x07034, 0x0682a, 0x05819, 0x03807, 0x007d2, 0x00727, 0x0068e, + 0x0067c, 0x0059d, 0x004eb, 0x003b4, 0x0036a, 0x002d9, 0x001c7, 0x0003f + ] + + var parity: UInt64 = 0 + var codeWord: UInt64 = codeWords[forNetwork]! //0 for mainnet + codeWord = codeWord ^ address + + if codeWord==0{ + return false + } + + for column in parityCheckMatrixColumns{ + if codeWord & 1 == 1{ + parity = parity ^ column + } + codeWord = codeWord >> 1 + } + + return parity==0 && codeWord==0 + + } + return false + } + + pub fun getNetworkFromAddress(_ input: AnyStruct): String? { + for network in ["MAINNET", "TESTNET", "EMULATOR"]{ + if self.isValidAddress(input, forNetwork: network){ + return network + } + } + return nil + } + + pub fun currentNetwork(): String{ + return self.getNetworkFromAddress(self.account.address)! + } + +} + \ No newline at end of file diff --git a/contracts/flow-utils/ArrayUtils.cdc b/contracts/flow-utils/ArrayUtils.cdc new file mode 100644 index 0000000..2ddc104 --- /dev/null +++ b/contracts/flow-utils/ArrayUtils.cdc @@ -0,0 +1,59 @@ +// Copied from https://github.com/bluesign/flow-utils/blob/dnz/cadence/contracts/ArrayUtils.cdc with minor adjustments + +pub contract ArrayUtils { + + pub fun rangeFunc(_ start: Int, _ end: Int, _ f : ((Int):Void) ) { + var current = start + while current < end{ + f(current) + current = current + 1 + } + } + + pub fun range(_ start: Int, _ end: Int): [Int]{ + var res:[Int] = [] + self.rangeFunc(start, end, fun (i:Int){ + res.append(i) + }) + return res + } + + pub fun transform(_ array: &[AnyStruct], _ f : ((AnyStruct): AnyStruct)){ + for i in self.range(0, array.length){ + array[i] = f(array[i]) + } + } + + pub fun iterate(_ array: [AnyStruct], _ f : ((AnyStruct): Bool)){ + for item in array{ + if !f(item){ + break + } + } + } + + pub fun map(_ array: [AnyStruct], _ f : ((AnyStruct): AnyStruct)) : [AnyStruct] { + var res : [AnyStruct] = [] + for item in array{ + res.append(f(item)) + } + return res + } + + pub fun mapStrings(_ array: [String], _ f: ((String) : String) ) : [String] { + var res : [String] = [] + for item in array{ + res.append(f(item)) + } + return res + } + + pub fun reduce(_ array: [AnyStruct], _ initial: AnyStruct, _ f : ((AnyStruct, AnyStruct): AnyStruct)) : AnyStruct{ + var res: AnyStruct = f(initial, array[0]) + for i in self.range(1, array.length){ + res = f(res, array[i]) + } + return res + } + +} \ No newline at end of file diff --git a/contracts/flow-utils/StringUtils.cdc b/contracts/flow-utils/StringUtils.cdc new file mode 100644 index 0000000..9a97673 --- /dev/null +++ b/contracts/flow-utils/StringUtils.cdc @@ -0,0 +1,97 @@ +import "ArrayUtils" + +pub contract StringUtils { + + pub fun format(_ s: String, _ args: {String:String}): String{ + var formatted = s + for key in args.keys{ + formatted = StringUtils.replaceAll(formatted, "{".concat(key).concat("}"), args[key]!) + } + return formatted + } + + pub fun explode(_ s: String): [String]{ + var chars : [String] = [] + for i in ArrayUtils.range(0, s.length){ + chars.append(s[i].toString()) + } + return chars + } + + pub fun trimLeft(_ s: String): String{ + for i in ArrayUtils.range(0, s.length){ + if s[i] != " "{ + return s.slice(from: i, upTo: s.length) + } + } + return "" + } + + pub fun trim(_ s: String): String{ + return self.trimLeft(s) + } + + pub fun replaceAll(_ s: String, _ search: String, _ replace: String): String{ + return self.join(self.split(s, search), replace) + } + + pub fun hasPrefix(_ s: String, _ prefix: String) : Bool{ + return s.length >= prefix.length && s.slice(from:0, upTo: prefix.length)==prefix + } + + pub fun hasSuffix(_ s: String, _ suffix: String) : Bool{ + return s.length >= suffix.length && s.slice(from:s.length-suffix.length, upTo: s.length)==suffix + } + + pub fun index(_ s : String, _ substr : String, _ startIndex: Int): Int?{ + for i in ArrayUtils.range(startIndex,s.length-substr.length+1){ + if s[i]==substr[0] && s.slice(from:i, upTo:i+substr.length) == substr{ + return i + } + } + return nil + } + + pub fun count(_ s: String, _ substr: String): Int{ + var pos = [self.index(s, substr, 0)] + while pos[0]!=nil { + pos.insert(at:0, self.index(s, substr, pos[0]!+pos.length*substr.length+1)) + } + return pos.length-1 + } + + pub fun contains(_ s: String, _ substr: String): Bool { + if let index = self.index(s, substr, 0) { + return true + } + return false + } + + pub fun substringUntil(_ s: String, _ until: String, _ startIndex: Int): String{ + if let index = self.index( s, until, startIndex){ + return s.slice(from:startIndex, upTo: index) + } + return s.slice(from:startIndex, upTo:s.length) + } + + pub fun split(_ s: String, _ delimiter: String): [String] { + let segments: [String] = [] + var p = 0 + while p<=s.length{ + var preDelimiter = self.substringUntil(s, delimiter, p) + segments.append(preDelimiter) + p = p + preDelimiter.length + delimiter.length + } + return segments + } + + pub fun join(_ strs: [String], _ separator: String): String { + var joinedStr = "" + for s in strs { + joinedStr = joinedStr.concat(s).concat(separator) + } + return joinedStr.slice(from: 0, upTo: joinedStr.length - separator.length) + } + + +} diff --git a/contracts/hybrid-custody/CapabilityDelegator.cdc b/contracts/hybrid-custody/CapabilityDelegator.cdc new file mode 100644 index 0000000..f342aaf --- /dev/null +++ b/contracts/hybrid-custody/CapabilityDelegator.cdc @@ -0,0 +1,174 @@ +/// CapabilityDelegator is a contract used to share Capabiltities to other accounts. It is used by the +/// HybridCustody contract to allow more flexible sharing of Capabilities when an app wants to share things +/// that aren't the NFT-standard interface types. +/// +/// Inside of CapabilityDelegator is a resource called `Delegator` which maintains a mapping of public and private +/// Capabilities. They cannot and should not be mixed. A public `Delegator` is able to be borrowed by anyone, whereas a +/// private `Delegator` can only be borrowed from the child account when you have access to the full `ChildAccount` +/// resource. +/// +pub contract CapabilityDelegator { + + /* --- Canonical Paths --- */ + // + pub let StoragePath: StoragePath + pub let PrivatePath: PrivatePath + pub let PublicPath: PublicPath + + /* --- Events --- */ + // + pub event DelegatorCreated(id: UInt64) + pub event DelegatorUpdated(id: UInt64, capabilityType: Type, isPublic: Bool, active: Bool) + + /// Private interface for Capability retrieval + /// + pub resource interface GetterPrivate { + pub fun getPrivateCapability(_ type: Type): Capability? { + post { + result == nil || type.isSubtype(of: result.getType()): "incorrect returned capability type" + } + } + pub fun findFirstPrivateType(_ type: Type): Type? + pub fun getAllPrivate(): [Capability] + } + + /// Exposes public Capability retrieval + /// + pub resource interface GetterPublic { + pub fun getPublicCapability(_ type: Type): Capability? { + post { + result == nil || type.isSubtype(of: result.getType()): "incorrect returned capability type " + } + } + + pub fun findFirstPublicType(_ type: Type): Type? + pub fun getAllPublic(): [Capability] + } + + /// This Delegator is used to store Capabilities, partitioned by public and private access with corresponding + /// GetterPublic and GetterPrivate conformances.AccountCapabilityController + /// + pub resource Delegator: GetterPublic, GetterPrivate { + access(self) let privateCapabilities: {Type: Capability} + access(self) let publicCapabilities: {Type: Capability} + + // ------ Begin Getter methods + // + /// Returns the public Capability of the given Type if it exists + /// + pub fun getPublicCapability(_ type: Type): Capability? { + return self.publicCapabilities[type] + } + + /// Returns the private Capability of the given Type if it exists + /// + /// + /// @param type: Type of the Capability to retrieve + /// @return Capability of the given Type if it exists, nil otherwise + /// + pub fun getPrivateCapability(_ type: Type): Capability? { + return self.privateCapabilities[type] + } + + /// Returns all public Capabilities + /// + /// @return List of all public Capabilities + /// + pub fun getAllPublic(): [Capability] { + return self.publicCapabilities.values + } + + /// Returns all private Capabilities + /// + /// @return List of all private Capabilities + /// + pub fun getAllPrivate(): [Capability] { + return self.privateCapabilities.values + } + + /// Returns the first public Type that is a subtype of the given Type + /// + /// @param type: Type to check for subtypes + /// @return First public Type that is a subtype of the given Type, nil otherwise + /// + pub fun findFirstPublicType(_ type: Type): Type? { + for t in self.publicCapabilities.keys { + if t.isSubtype(of: type) { + return t + } + } + + return nil + } + + /// Returns the first private Type that is a subtype of the given Type + /// + /// @param type: Type to check for subtypes + /// @return First private Type that is a subtype of the given Type, nil otherwise + /// + pub fun findFirstPrivateType(_ type: Type): Type? { + for t in self.privateCapabilities.keys { + if t.isSubtype(of: type) { + return t + } + } + + return nil + } + // ------- End Getter methods + + /// Adds a Capability to the Delegator + /// + /// @param cap: Capability to add + /// @param isPublic: Whether the Capability should be public or private + /// + pub fun addCapability(cap: Capability, isPublic: Bool) { + pre { + cap.check<&AnyResource>(): "Invalid Capability provided" + } + if isPublic { + self.publicCapabilities.insert(key: cap.getType(), cap) + } else { + self.privateCapabilities.insert(key: cap.getType(), cap) + } + emit DelegatorUpdated(id: self.uuid, capabilityType: cap.getType(), isPublic: isPublic, active: true) + } + + /// Removes a Capability from the Delegator + /// + /// @param cap: Capability to remove + /// + pub fun removeCapability(cap: Capability) { + if let removedPublic = self.publicCapabilities.remove(key: cap.getType()) { + emit DelegatorUpdated(id: self.uuid, capabilityType: cap.getType(), isPublic: true, active: false) + } + + if let removedPrivate = self.privateCapabilities.remove(key: cap.getType()) { + emit DelegatorUpdated(id: self.uuid, capabilityType: cap.getType(), isPublic: false, active: false) + } + } + + init() { + self.privateCapabilities = {} + self.publicCapabilities = {} + } + } + + /// Creates a new Delegator and returns it + /// + /// @return Newly created Delegator + /// + pub fun createDelegator(): @Delegator { + let delegator <- create Delegator() + emit DelegatorCreated(id: delegator.uuid) + return <- delegator + } + + init() { + let identifier = "CapabilityDelegator_".concat(self.account.address.toString()) + self.StoragePath = StoragePath(identifier: identifier)! + self.PrivatePath = PrivatePath(identifier: identifier)! + self.PublicPath = PublicPath(identifier: identifier)! + } +} + \ No newline at end of file diff --git a/contracts/hybrid-custody/CapabilityFactory.cdc b/contracts/hybrid-custody/CapabilityFactory.cdc new file mode 100644 index 0000000..ee777f4 --- /dev/null +++ b/contracts/hybrid-custody/CapabilityFactory.cdc @@ -0,0 +1,105 @@ +/// # Capability Factory +/// +/// This contract defines a Factory interface and a Manager resource to contain Factory implementations, as well as a +/// Getter interface for retrieval of contained Factories. +/// +/// A Factory is defines a method getCapability() which defines the retrieval pattern of a Capability from a given +/// account at the specified path. This pattern arose out of a need to retrieve arbitrary & castable Capabilities from +/// an account under the static typing constraints inherent to Cadence. +/// +/// The Manager resource is a container for Factories, and implements the Getter interface. +/// +/// **Note:** It's generally an anti-pattern to pass around AuthAccount references; however, the need for castable +/// Capabilities is critical to the use case of Hybrid Custody. It's advised to use Factories sparingly and only for +/// cases where Capabilities must be castable by the caller. +/// +pub contract CapabilityFactory { + + pub let StoragePath: StoragePath + pub let PrivatePath: PrivatePath + pub let PublicPath: PublicPath + + /// Factory structures a common interface for Capability retrieval from a given account at a specified path + /// + pub struct interface Factory { + pub fun getCapability(acct: &AuthAccount, path: CapabilityPath): Capability + } + + /// Getter defines an interface for retrieval of a Factory if contained within the implementing resource + /// + pub resource interface Getter { + pub fun getSupportedTypes(): [Type] + pub fun getFactory(_ t: Type): {CapabilityFactory.Factory}? + } + + /// Manager is a resource that contains Factories and implements the Getter interface for retrieval of contained + /// Factories + /// + pub resource Manager: Getter { + /// Mapping of Factories indexed on Type of Capability they retrieve + pub let factories: {Type: {CapabilityFactory.Factory}} + + /// Retrieves a list of Types supported by contained Factories + /// + /// @return List of Types supported by the Manager + /// + pub fun getSupportedTypes(): [Type] { + return self.factories.keys + } + + /// Retrieves a Factory from the Manager, returning it or nil if it doesn't exist + /// + /// @param t: Type the Factory is indexed on + /// + pub fun getFactory(_ t: Type): {CapabilityFactory.Factory}? { + return self.factories[t] + } + + /// Adds a Factory to the Manager, conditioned on the Factory not already existing + /// + /// @param t: Type of Capability the Factory retrieves + /// @param f: Factory to add + /// + pub fun addFactory(_ t: Type, _ f: {CapabilityFactory.Factory}) { + pre { + !self.factories.containsKey(t): "Factory of given type already exists" + } + self.factories[t] = f + } + + /// Updates a Factory in the Manager, adding if it didn't already exist + /// + /// @param t: Type of Capability the Factory retrieves + /// @param f: Factory to replace existing Factory + /// + pub fun updateFactory(_ t: Type, _ f: {CapabilityFactory.Factory}) { + self.factories[t] = f + } + + /// Removes a Factory from the Manager, returning it or nil if it didn't exist + /// + /// @param t: Type the Factory is indexed on + /// + pub fun removeFactory(_ t: Type): {CapabilityFactory.Factory}? { + return self.factories.remove(key: t) + } + + init () { + self.factories = {} + } + } + + /// Creates a Manager resource + /// + /// @return Manager resource + pub fun createFactoryManager(): @Manager { + return <- create Manager() + } + + init() { + let identifier = "CapabilityFactory_".concat(self.account.address.toString()) + self.StoragePath = StoragePath(identifier: identifier)! + self.PrivatePath = PrivatePath(identifier: identifier)! + self.PublicPath = PublicPath(identifier: identifier)! + } +} \ No newline at end of file diff --git a/contracts/hybrid-custody/CapabilityFilter.cdc b/contracts/hybrid-custody/CapabilityFilter.cdc new file mode 100644 index 0000000..5c97dd2 --- /dev/null +++ b/contracts/hybrid-custody/CapabilityFilter.cdc @@ -0,0 +1,199 @@ +/// CapabilityFilter defines `Filter`, an interface to sit on top of a ChildAccount's capabilities. Requested +/// capabilities will only return if the filter's `allowed` method returns true. +/// +/// Along with the `Filter` interface are three implementations: +/// - `DenylistFilter` - A filter which contains a mapping of denied Types +/// - `AllowlistFilter` - A filter which contains a mapping of allowed Types +/// - `AllowAllFilter` - A passthrough, all requested capabilities are allowed +/// +pub contract CapabilityFilter { + + /* --- Canonical Paths --- */ + // + pub let StoragePath: StoragePath + pub let PublicPath: PublicPath + pub let PrivatePath: PrivatePath + + /* --- Events --- */ + // + pub event FilterUpdated(id: UInt64, filterType: Type, type: Type, active: Bool) + + /// `Filter` is a simple interface with methods to determine if a Capability is allowed and retrieve details about + /// the Filter itself + /// + pub resource interface Filter { + pub fun allowed(cap: Capability): Bool + pub fun getDetails(): AnyStruct + } + + /// `DenylistFilter` is a `Filter` which contains a mapping of denied Types + /// + pub resource DenylistFilter: Filter { + + /// Represents the underlying types which should not ever be returned by a RestrictedChildAccount. The filter + /// will borrow a requested capability, and make sure that the type it gets back is not in the list of denied + /// types + access(self) let deniedTypes: {Type: Bool} + + /// Adds a type to the mapping of denied types with a value of true + /// + /// @param type: The type to add to the denied types mapping + /// + pub fun addType(_ type: Type) { + self.deniedTypes.insert(key: type, true) + emit FilterUpdated(id: self.uuid, filterType: self.getType(), type: type, active: true) + } + + /// Removes a type from the mapping of denied types + /// + /// @param type: The type to remove from the denied types mapping + /// + pub fun removeType(_ type: Type) { + if let removed = self.deniedTypes.remove(key: type) { + emit FilterUpdated(id: self.uuid, filterType: self.getType(), type: type, active: false) + } + } + + /// Determines if a requested capability is allowed by this `Filter` + /// + /// @param cap: The capability to check + /// @return: true if the capability is allowed, false otherwise + /// + pub fun allowed(cap: Capability): Bool { + if let item = cap.borrow<&AnyResource>() { + return !self.deniedTypes.containsKey(item.getType()) + } + + return false + } + + /// Returns details about this filter + /// + /// @return A struct containing details about this filter including this Filter's Type indexed on the `type` + /// key as well as types denied indexed on the `deniedTypes` key + /// + pub fun getDetails(): AnyStruct { + return { + "type": self.getType(), + "deniedTypes": self.deniedTypes.keys + } + } + + init() { + self.deniedTypes = {} + } + } + + /// `AllowlistFilter` is a `Filter` which contains a mapping of allowed Types + /// + pub resource AllowlistFilter: Filter { + // allowedTypes + // Represents the set of underlying types which are allowed to be + // returned by a RestrictedChildAccount. The filter will borrow + // a requested capability, and make sure that the type it gets back is + // in the list of allowed types + access(self) let allowedTypes: {Type: Bool} + + /// Adds a type to the mapping of allowed types with a value of true + /// + /// @param type: The type to add to the allowed types mapping + /// + pub fun addType(_ type: Type) { + self.allowedTypes.insert(key: type, true) + emit FilterUpdated(id: self.uuid, filterType: self.getType(), type: type, active: true) + } + + /// Removes a type from the mapping of allowed types + /// + /// @param type: The type to remove from the denied types mapping + /// + pub fun removeType(_ type: Type) { + if let removed = self.allowedTypes.remove(key: type) { + emit FilterUpdated(id: self.uuid, filterType: self.getType(), type: type, active: false) + } + } + + /// Determines if a requested capability is allowed by this `Filter` + /// + /// @param cap: The capability to check + /// @return: true if the capability is allowed, false otherwise + /// + pub fun allowed(cap: Capability): Bool { + if let item = cap.borrow<&AnyResource>() { + return self.allowedTypes.containsKey(item.getType()) + } + + return false + } + + /// Returns details about this filter + /// + /// @return A struct containing details about this filter including this Filter's Type indexed on the `type` + /// key as well as types allowed indexed on the `allowedTypes` key + /// + pub fun getDetails(): AnyStruct { + return { + "type": self.getType(), + "allowedTypes": self.allowedTypes.keys + } + } + + init() { + self.allowedTypes = {} + } + } + + /// AllowAllFilter is a passthrough, all requested capabilities are allowed + /// + pub resource AllowAllFilter: Filter { + /// Determines if a requested capability is allowed by this `Filter` + /// + /// @param cap: The capability to check + /// @return: true since this filter is a passthrough + /// + pub fun allowed(cap: Capability): Bool { + return true + } + + /// Returns details about this filter + /// + /// @return A struct containing details about this filter including this Filter's Type indexed on the `type` + /// key + /// + pub fun getDetails(): AnyStruct { + return { + "type": self.getType() + } + } + } + + /// Creates a new `Filter` of the given type + /// + /// @param t: The type of `Filter` to create + /// @return: A new instance of the given `Filter` type + /// + pub fun create(_ t: Type): @AnyResource{Filter} { + post { + result.getType() == t + } + + switch t { + case Type<@AllowAllFilter>(): + return <- create AllowAllFilter() + case Type<@AllowlistFilter>(): + return <- create AllowlistFilter() + case Type<@DenylistFilter>(): + return <- create DenylistFilter() + } + + panic("unsupported type requested: ".concat(t.identifier)) + } + + init() { + let identifier = "CapabilityFilter_".concat(self.account.address.toString()) + + self.StoragePath = StoragePath(identifier: identifier)! + self.PublicPath = PublicPath(identifier: identifier)! + self.PrivatePath = PrivatePath(identifier: identifier)! + } +} diff --git a/contracts/hybrid-custody/HybridCustody.cdc b/contracts/hybrid-custody/HybridCustody.cdc new file mode 100644 index 0000000..193c87b --- /dev/null +++ b/contracts/hybrid-custody/HybridCustody.cdc @@ -0,0 +1,1184 @@ +// Third-party imports +import "MetadataViews" + +// HC-owned imports +import "CapabilityFactory" +import "CapabilityDelegator" +import "CapabilityFilter" + +/// HybridCustody defines a framework for sharing accounts via account linking. +/// In the contract, there are three main resources: +/// +/// 1. OwnedAccount - A resource which maintains an AuthAccount Capability, and handles publishing and revoking access +/// of that account via another resource called a ChildAccount +/// 2. ChildAccount - A second resource which exists on the same account as the OwnedAccount and contains the filters +/// and retrieval patterns governing the scope of parent account access. A Capability on this resource is shared to +/// the parent account, enabling Hybrid Custody access to the underlying account. +/// 3. Manager - A resource setup by the parent which manages all child accounts shared with it. The Manager resource +/// also maintains a set of accounts that it "owns", meaning it has a capability to the full OwnedAccount resource +/// and would then also be able to manage the child account's links as it sees fit. +/// +/// Contributors (please add to this list if you contribute!): +/// - Austin Kline - https://twitter.com/austin_flowty +/// - Deniz Edincik - https://twitter.com/bluesign +/// - Giovanni Sanchez - https://twitter.com/gio_incognito +/// - Ashley Daffin - https://twitter.com/web3ashlee +/// - Felipe Ribeiro - https://twitter.com/Frlabs33 +/// +/// Repo reference: https://github.com/onflow/hybrid-custody +/// +pub contract HybridCustody { + + /* --- Canonical Paths --- */ + // + // Note: Paths for ChildAccount & Delegator are derived from the parent's address + // + pub let OwnedAccountStoragePath: StoragePath + pub let OwnedAccountPublicPath: PublicPath + pub let OwnedAccountPrivatePath: PrivatePath + + pub let ManagerStoragePath: StoragePath + pub let ManagerPublicPath: PublicPath + pub let ManagerPrivatePath: PrivatePath + + pub let LinkedAccountPrivatePath: PrivatePath + pub let BorrowableAccountPrivatePath: PrivatePath + + /* --- Events --- */ + // + /// Manager creation event + pub event CreatedManager(id: UInt64) + /// OwnedAccount creation event + pub event CreatedOwnedAccount(id: UInt64, child: Address) + /// ChildAccount added/removed from Manager + /// active : added to Manager + /// !active : removed from Manager + pub event AccountUpdated(id: UInt64?, child: Address, parent: Address, active: Bool) + /// OwnedAccount added/removed or sealed + /// active && owner != nil : added to Manager + /// !active && owner == nil : removed from Manager + pub event OwnershipUpdated(id: UInt64, child: Address, previousOwner: Address?, owner: Address?, active: Bool) + /// ChildAccount ready to be redeemed by emitted pendingParent + pub event ChildAccountPublished( + ownedAcctID: UInt64, + childAcctID: UInt64, + capDelegatorID: UInt64, + factoryID: UInt64, + filterID: UInt64, + filterType: Type, + child: Address, + pendingParent: Address + ) + /// OwnedAccount granted ownership to a new address, publishing a Capability for the pendingOwner + pub event OwnershipGranted(ownedAcctID: UInt64, child: Address, previousOwner: Address?, pendingOwner: Address) + /// Account has been sealed - keys revoked, new AuthAccount Capability generated + pub event AccountSealed(id: UInt64, address: Address, parents: [Address]) + + /// An OwnedAccount shares the BorrowableAccount capability to itelf with ChildAccount resources + /// + pub resource interface BorrowableAccount { + access(contract) fun borrowAccount(): &AuthAccount + pub fun check(): Bool + } + + /// Public methods anyone can call on an OwnedAccount + /// + pub resource interface OwnedAccountPublic { + /// Returns the addresses of all parent accounts + pub fun getParentAddresses(): [Address] + + /// Returns associated parent addresses and their redeemed status - true if redeemed, false if pending + pub fun getParentStatuses(): {Address: Bool} + + /// Returns true if the given address is a parent of this child and has redeemed it. Returns false if the given + /// address is a parent of this child and has NOT redeemed it. Returns nil if the given address it not a parent + /// of this child account. + pub fun getRedeemedStatus(addr: Address): Bool? + + /// A callback function to mark a parent as redeemed on the child account. + access(contract) fun setRedeemed(_ addr: Address) + } + + /// Private interface accessible to the owner of the OwnedAccount + /// + pub resource interface OwnedAccountPrivate { + /// Deletes the ChildAccount resource being used to share access to this OwnedAccount with the supplied parent + /// address, and unlinks the paths it was using to reach the underlying account. + pub fun removeParent(parent: Address): Bool + + /// Sets up a new ChildAccount resource for the given parentAddress to redeem. This child account uses the + /// supplied factory and filter to manage what can be obtained from the child account, and a new + /// CapabilityDelegator resource is created for the sharing of one-off capabilities. Each of these pieces of + /// access control are managed through the child account. + pub fun publishToParent( + parentAddress: Address, + factory: Capability<&CapabilityFactory.Manager{CapabilityFactory.Getter}>, + filter: Capability<&{CapabilityFilter.Filter}> + ) { + pre { + factory.check(): "Invalid CapabilityFactory.Getter Capability provided" + filter.check(): "Invalid CapabilityFilter Capability provided" + } + } + + /// Passes ownership of this child account to the given address. Once executed, all active keys on the child + /// account will be revoked, and the active AuthAccount Capability being used by to obtain capabilities will be + /// rotated, preventing anyone without the newly generated Capability from gaining access to the account. + pub fun giveOwnership(to: Address) + + /// Revokes all keys on an account, unlinks all currently active AuthAccount capabilities, then makes a new one + /// and replaces the OwnedAccount's underlying AuthAccount Capability with the new one to ensure that all + /// parent accounts can still operate normally. + /// Unless this method is executed via the giveOwnership function, this will leave an account **without** an + /// owner. + /// USE WITH EXTREME CAUTION. + pub fun seal() + + // setCapabilityFactoryForParent + // Override the existing CapabilityFactory Capability for a given parent. This will allow the owner of the + // account to start managing their own factory of capabilities to be able to retrieve + pub fun setCapabilityFactoryForParent(parent: Address, cap: Capability<&CapabilityFactory.Manager{CapabilityFactory.Getter}>) { + pre { + cap.check(): "Invalid CapabilityFactory.Getter Capability provided" + } + } + + /// Override the existing CapabilityFilter Capability for a given parent. This will allow the owner of the + /// account to start managing their own filter for retrieving Capabilities on Private Paths + pub fun setCapabilityFilterForParent(parent: Address, cap: Capability<&{CapabilityFilter.Filter}>) { + pre { + cap.check(): "Invalid CapabilityFilter Capability provided" + } + } + + /// Adds a capability to a parent's managed @ChildAccount resource. The Capability can be made public, + /// permitting anyone to borrow it. + pub fun addCapabilityToDelegator(parent: Address, cap: Capability, isPublic: Bool) { + pre { + cap.check<&AnyResource>(): "Invalid Capability provided" + } + } + + /// Removes a Capability from the CapabilityDelegator used by the specified parent address + pub fun removeCapabilityFromDelegator(parent: Address, cap: Capability) + + /// Returns the address of this OwnedAccount + pub fun getAddress(): Address + + /// Checks if this OwnedAccount is a child of the specified address + pub fun isChildOf(_ addr: Address): Bool + + /// Returns all addresses which are parents of this OwnedAccount + pub fun getParentAddresses(): [Address] + + /// Borrows this OwnedAccount's AuthAccount Capability + pub fun borrowAccount(): &AuthAccount? + + /// Returns the current owner of this account, if there is one + pub fun getOwner(): Address? + + /// Returns the pending owner of this account, if there is one + pub fun getPendingOwner(): Address? + + /// A callback which is invoked when a parent redeems an owned account + access(contract) fun setOwnerCallback(_ addr: Address) + + /// Destroys all outstanding AuthAccount capabilities on this owned account, and creates a new one for the + /// OwnedAccount to use + pub fun rotateAuthAccount() + + /// Revokes all keys on this account + pub fun revokeAllKeys() + } + + /// Public methods exposed on a ChildAccount resource. OwnedAccountPublic will share some methods here, but isn't + /// necessarily the same. + /// + pub resource interface AccountPublic { + pub fun getPublicCapability(path: PublicPath, type: Type): Capability? + pub fun getPublicCapFromDelegator(type: Type): Capability? + pub fun getAddress(): Address + } + + /// Methods accessible to the designated parent of a ChildAccount + /// + pub resource interface AccountPrivate { + pub fun getCapability(path: CapabilityPath, type: Type): Capability? { + post { + result == nil || [true, nil].contains(self.getManagerCapabilityFilter()?.allowed(cap: result!)): + "Capability is not allowed by this account's Parent" + } + } + pub fun getPublicCapability(path: PublicPath, type: Type): Capability? + pub fun getManagerCapabilityFilter(): &{CapabilityFilter.Filter}? + pub fun getPublicCapFromDelegator(type: Type): Capability? + pub fun getPrivateCapFromDelegator(type: Type): Capability? { + post { + result == nil || [true, nil].contains(self.getManagerCapabilityFilter()?.allowed(cap: result!)): + "Capability is not allowed by this account's Parent" + } + } + access(contract) fun redeemedCallback(_ addr: Address) + access(contract) fun setManagerCapabilityFilter(_ managerCapabilityFilter: Capability<&{CapabilityFilter.Filter}>?) { + pre { + managerCapabilityFilter == nil || managerCapabilityFilter!.check(): "Invalid Manager Capability Filter" + } + } + access(contract) fun parentRemoveChildCallback(parent: Address) + } + + /// Entry point for a parent to obtain, maintain and access Capabilities or perform other actions on child accounts + /// + pub resource interface ManagerPrivate { + pub fun addAccount(cap: Capability<&{AccountPrivate, AccountPublic, MetadataViews.Resolver}>) + pub fun borrowAccount(addr: Address): &{AccountPrivate, AccountPublic, MetadataViews.Resolver}? + pub fun removeChild(addr: Address) + pub fun addOwnedAccount(cap: Capability<&{OwnedAccountPrivate, OwnedAccountPublic, MetadataViews.Resolver}>) + pub fun borrowOwnedAccount(addr: Address): &{OwnedAccountPrivate, OwnedAccountPublic, MetadataViews.Resolver}? + pub fun removeOwned(addr: Address) + pub fun setManagerCapabilityFilter(cap: Capability<&{CapabilityFilter.Filter}>?, childAddress: Address) { + pre { + cap == nil || cap!.check(): "Invalid Manager Capability Filter" + } + } + } + + /// Functions anyone can call on a manager to get information about an account such as What child accounts it has + /// Functions anyone can call on a manager to get information about an account such as what child accounts it has + pub resource interface ManagerPublic { + pub fun borrowAccountPublic(addr: Address): &{AccountPublic, MetadataViews.Resolver}? + pub fun getChildAddresses(): [Address] + pub fun getOwnedAddresses(): [Address] + pub fun getChildAccountDisplay(address: Address): MetadataViews.Display? + access(contract) fun removeParentCallback(child: Address) + } + + /// A resource for an account which fills the Parent role of the Child-Parent account management Model. A Manager + /// can redeem or remove child accounts, and obtain any capabilities exposed by the child account to them. + /// + pub resource Manager: ManagerPrivate, ManagerPublic, MetadataViews.Resolver { + + /// Mapping of restricted access child account Capabilities indexed by their address + pub let childAccounts: {Address: Capability<&{AccountPrivate, AccountPublic, MetadataViews.Resolver}>} + /// Mapping of unrestricted owned account Capabilities indexed by their address + pub let ownedAccounts: {Address: Capability<&{OwnedAccountPrivate, OwnedAccountPublic, MetadataViews.Resolver}>} + + /// A bucket of structs so that the Manager resource can be easily extended with new functionality. + pub let data: {String: AnyStruct} + /// A bucket of resources so that the Manager resource can be easily extended with new functionality. + pub let resources: @{String: AnyResource} + + /// An optional filter to gate what capabilities are permitted to be returned from a child account For example, + /// Dapper Wallet parent account's should not be able to retrieve any FungibleToken Provider capabilities. + pub var filter: Capability<&{CapabilityFilter.Filter}>? + + // display metadata for a child account exists on its parent + pub let childAccountDisplays: {Address: MetadataViews.Display} + + /// Sets the Display on the ChildAccount. If nil, the display is removed. + /// + pub fun setChildAccountDisplay(address: Address, _ d: MetadataViews.Display?) { + pre { + self.childAccounts[address] != nil: "There is no child account with this address" + } + + if d == nil { + self.childAccountDisplays.remove(key: address) + return + } + + self.childAccountDisplays[address] = d + } + + /// Adds a ChildAccount Capability to this Manager. If a default Filter is set in the manager, it will also be + /// added to the ChildAccount + /// + pub fun addAccount(cap: Capability<&{AccountPrivate, AccountPublic, MetadataViews.Resolver}>) { + pre { + self.childAccounts[cap.address] == nil: "There is already a child account with this address" + } + + let acct = cap.borrow() + ?? panic("child account capability could not be borrowed") + + self.childAccounts[cap.address] = cap + + emit AccountUpdated(id: acct.uuid, child: cap.address, parent: self.owner!.address, active: true) + + acct.redeemedCallback(self.owner!.address) + acct.setManagerCapabilityFilter(self.filter) + } + + /// Sets the default Filter Capability for this Manager. Does not propagate to child accounts. + /// + pub fun setDefaultManagerCapabilityFilter(cap: Capability<&{CapabilityFilter.Filter}>?) { + pre { + cap == nil || cap!.check(): "supplied capability must be nil or check must pass" + } + + self.filter = cap + } + + /// Sets the Filter Capability for this Manager, propagating to the specified child account + /// + pub fun setManagerCapabilityFilter(cap: Capability<&{CapabilityFilter.Filter}>?, childAddress: Address) { + let acct = self.borrowAccount(addr: childAddress) + ?? panic("child account not found") + + acct.setManagerCapabilityFilter(cap) + } + + /// Removes specified child account from the Manager's child accounts. Callbacks to the child account remove + /// any associated resources and Capabilities + /// + pub fun removeChild(addr: Address) { + let cap = self.childAccounts.remove(key: addr) + ?? panic("child account not found") + + self.childAccountDisplays.remove(key: addr) + + if !cap.check() { + // Emit event if invalid capability + emit AccountUpdated(id: nil, child: cap.address, parent: self.owner!.address, active: false) + return + } + + let acct = cap.borrow()! + // Get the child account id before removing capability + let id: UInt64 = acct.uuid + + acct.parentRemoveChildCallback(parent: self.owner!.address) + + emit AccountUpdated(id: id, child: cap.address, parent: self.owner!.address, active: false) + } + + /// Contract callback that removes a child account from the Manager's child accounts in the event a child + /// account initiates unlinking parent from child + /// + access(contract) fun removeParentCallback(child: Address) { + self.childAccounts.remove(key: child) + self.childAccountDisplays.remove(key: child) + } + + /// Adds an owned account to the Manager's list of owned accounts, setting the Manager account as the owner of + /// the given account + /// + pub fun addOwnedAccount(cap: Capability<&{OwnedAccountPrivate, OwnedAccountPublic, MetadataViews.Resolver}>) { + pre { + self.ownedAccounts[cap.address] == nil: "There is already an owned account with this address" + } + + let acct = cap.borrow() + ?? panic("owned account capability could not be borrowed") + + // for safety, rotate the auth account capability to prevent any outstanding capabilities from the previous owner + // and revoke all outstanding keys. + acct.rotateAuthAccount() + acct.revokeAllKeys() + + self.ownedAccounts[cap.address] = cap + + emit OwnershipUpdated(id: acct.uuid, child: cap.address, previousOwner: acct.getOwner(), owner: self.owner!.address, active: true) + acct.setOwnerCallback(self.owner!.address) + } + + /// Returns a reference to a child account + /// + pub fun borrowAccount(addr: Address): &{AccountPrivate, AccountPublic, MetadataViews.Resolver}? { + let cap = self.childAccounts[addr] + if cap == nil { + return nil + } + + return cap!.borrow() + } + + /// Returns a reference to a child account's public AccountPublic interface + /// + pub fun borrowAccountPublic(addr: Address): &{AccountPublic, MetadataViews.Resolver}? { + let cap = self.childAccounts[addr] + if cap == nil { + return nil + } + + return cap!.borrow() + } + + /// Returns a reference to an owned account + /// + pub fun borrowOwnedAccount(addr: Address): &{OwnedAccountPrivate, OwnedAccountPublic, MetadataViews.Resolver}? { + if let cap = self.ownedAccounts[addr] { + return cap.borrow() + } + + return nil + } + + /// Removes specified child account from the Manager's child accounts. Callbacks to the child account remove + /// any associated resources and Capabilities + /// + pub fun removeOwned(addr: Address) { + if let acct = self.ownedAccounts.remove(key: addr) { + if acct.check() { + acct.borrow()!.seal() + } + let id: UInt64? = acct.borrow()?.uuid ?? nil + + emit OwnershipUpdated(id: id!, child: addr, previousOwner: self.owner!.address, owner: nil, active: false) + } + // Don't emit an event if nothing was removed + } + + pub fun giveOwnership(addr: Address, to: Address) { + let acct = self.ownedAccounts.remove(key: addr) + ?? panic("account not found") + + acct.borrow()!.giveOwnership(to: to) + } + + /// Returns an array of child account addresses + /// + pub fun getChildAddresses(): [Address] { + return self.childAccounts.keys + } + + /// Returns an array of owned account addresses + /// + pub fun getOwnedAddresses(): [Address] { + return self.ownedAccounts.keys + } + + /// Retrieves the parent-defined display for the given child account + /// + pub fun getChildAccountDisplay(address: Address): MetadataViews.Display? { + return self.childAccountDisplays[address] + } + + /// Returns the types of supported views - none at this time + /// + pub fun getViews(): [Type] { + return [] + } + + /// Resolves the given view if supported - none at this time + /// + pub fun resolveView(_ view: Type): AnyStruct? { + return nil + } + + init(filter: Capability<&{CapabilityFilter.Filter}>?) { + pre { + filter == nil || filter!.check(): "Invalid CapabilityFilter Filter capability provided" + } + self.childAccounts = {} + self.ownedAccounts = {} + self.childAccountDisplays = {} + self.filter = filter + + self.data = {} + self.resources <- {} + } + + destroy () { + destroy self.resources + } + } + + /// The ChildAccount resource sits between a child account and a parent and is stored on the same account as the + /// child account. Once created, a private capability to the child account is shared with the intended parent. The + /// parent account will accept this child capability into its own manager resource and use it to interact with the + /// child account. + /// + /// Because the ChildAccount resource exists on the child account itself, whoever owns the child account will be + /// able to manage all ChildAccount resources it shares, without worrying about whether the upstream parent can do + /// anything to prevent it. + /// + pub resource ChildAccount: AccountPrivate, AccountPublic, MetadataViews.Resolver { + /// A Capability providing access to the underlying child account + access(self) let childCap: Capability<&{BorrowableAccount, OwnedAccountPublic, MetadataViews.Resolver}> + + /// The CapabilityFactory Manager is a ChildAccount's way of limiting what types can be asked for by its parent + /// account. The CapabilityFactory returns Capabilities which can be casted to their appropriate types once + /// obtained, but only if the child account has configured their factory to allow it. For instance, a + /// ChildAccount might choose to expose NonFungibleToken.Provider, but not FungibleToken.Provider + pub var factory: Capability<&CapabilityFactory.Manager{CapabilityFactory.Getter}> + + /// The CapabilityFilter is a restriction put at the front of obtaining any non-public Capability. Some wallets + /// might want to give access to NonFungibleToken.Provider, but only to **some** of the collections it manages, + /// not all of them. + pub var filter: Capability<&{CapabilityFilter.Filter}> + + /// The CapabilityDelegator is a way to share one-off capabilities from the child account. These capabilities + /// can be public OR private and are separate from the factory which returns a capability at a given path as a + /// certain type. When using the CapabilityDelegator, you do not have the ability to specify which path a + /// capability came from. For instance, Dapper Wallet might choose to expose a Capability to their Full TopShot + /// collection, but only to the path that the collection exists in. + pub let delegator: Capability<&CapabilityDelegator.Delegator{CapabilityDelegator.GetterPublic, CapabilityDelegator.GetterPrivate}> + + /// managerCapabilityFilter is a component optionally given to a child account when a manager redeems it. If + /// this filter is not nil, any Capability returned through the `getCapability` function checks that the + /// manager allows access first. + access(self) var managerCapabilityFilter: Capability<&{CapabilityFilter.Filter}>? + + /// A bucket of structs so that the ChildAccount resource can be easily extended with new functionality. + access(self) let data: {String: AnyStruct} + + /// A bucket of resources so that the ChildAccount resource can be easily extended with new functionality. + access(self) let resources: @{String: AnyResource} + + /// ChildAccount resources have a 1:1 association with parent accounts, the named parent Address here is the + /// one with a Capability on this resource. + pub let parent: Address + + /// Returns the Address of the underlying child account + /// + pub fun getAddress(): Address { + return self.childCap.address + } + + /// Callback setting the child account as redeemed by the provided parent Address + /// + access(contract) fun redeemedCallback(_ addr: Address) { + self.childCap.borrow()!.setRedeemed(addr) + } + + /// Sets the given filter as the managerCapabilityFilter for this ChildAccount + /// + access(contract) fun setManagerCapabilityFilter( + _ managerCapabilityFilter: Capability<&{CapabilityFilter.Filter}>? + ) { + self.managerCapabilityFilter = managerCapabilityFilter + } + + /// Sets the CapabiltyFactory.Manager Capability + /// + pub fun setCapabilityFactory(cap: Capability<&CapabilityFactory.Manager{CapabilityFactory.Getter}>) { + self.factory = cap + } + + /// Sets the Filter Capability as the one provided + /// + pub fun setCapabilityFilter(cap: Capability<&{CapabilityFilter.Filter}>) { + self.filter = cap + } + + // The main function to a child account's capabilities from a parent account. When a PrivatePath type is used, + // the CapabilityFilter will be borrowed and the Capability being returned will be checked against it to ensure + // that borrowing is permitted + pub fun getCapability(path: CapabilityPath, type: Type): Capability? { + let child = self.childCap.borrow() ?? panic("failed to borrow child account") + + let f = self.factory.borrow()!.getFactory(type) + if f == nil { + return nil + } + + let acct = child.borrowAccount() + + let cap = f!.getCapability(acct: acct, path: path) + + if path.getType() == Type() { + assert(self.filter.borrow()!.allowed(cap: cap), message: "requested capability is not allowed") + } + + return cap + } + + /// Retrieves a private Capability from the Delegator or nil none is found of the given type + /// + pub fun getPrivateCapFromDelegator(type: Type): Capability? { + if let p = self.delegator.borrow() { + return p.getPrivateCapability(type) + } + + return nil + } + + /// Retrieves a public Capability from the Delegator or nil none is found of the given type + /// + pub fun getPublicCapFromDelegator(type: Type): Capability? { + if let p = self.delegator.borrow() { + return p.getPublicCapability(type) + } + return nil + } + + /// Enables retrieval of public Capabilities of the given type from the specified path or nil if none is found + /// + pub fun getPublicCapability(path: PublicPath, type: Type): Capability? { + return self.getCapability(path: path, type: type) + } + + /// Returns a reference to the stored managerCapabilityFilter if one exists + /// + pub fun getManagerCapabilityFilter(): &{CapabilityFilter.Filter}? { + return self.managerCapabilityFilter != nil ? self.managerCapabilityFilter!.borrow() : nil + } + + /// Sets the child account as redeemed by the given Address + /// + access(contract) fun setRedeemed(_ addr: Address) { + let acct = self.childCap.borrow()!.borrowAccount() + if let o = acct.borrow<&OwnedAccount>(from: HybridCustody.OwnedAccountStoragePath) { + o.setRedeemed(addr) + } + } + + /// Returns a reference to the stored delegator + /// + pub fun borrowCapabilityDelegator(): &CapabilityDelegator.Delegator? { + let path = HybridCustody.getCapabilityDelegatorIdentifier(self.parent) + return self.childCap.borrow()!.borrowAccount().borrow<&CapabilityDelegator.Delegator>( + from: StoragePath(identifier: path)! + ) + } + + /// Returns a list of supported metadata views + /// + pub fun getViews(): [Type] { + return [ + Type() + ] + } + + /// Resolves a view of the given type if supported + /// + pub fun resolveView(_ view: Type): AnyStruct? { + switch view { + case Type(): + let childAddress = self.getAddress() + let manager = getAccount(self.parent).getCapability<&HybridCustody.Manager{HybridCustody.ManagerPublic}>(HybridCustody.ManagerPublicPath) + + if !manager.check() { + return nil + } + + return manager!.borrow()!.getChildAccountDisplay(address: childAddress) + } + return nil + } + + /// Callback to enable parent-initiated removal all the child account and its associated resources & + /// Capabilities + access(contract) fun parentRemoveChildCallback(parent: Address) { + if !self.childCap.check() { + return + } + + let child: &AnyResource{HybridCustody.BorrowableAccount} = self.childCap.borrow()! + if !child.check() { + return + } + + let acct = child.borrowAccount() + if let ownedAcct = acct.borrow<&OwnedAccount>(from: HybridCustody.OwnedAccountStoragePath) { + ownedAcct.removeParent(parent: parent) + } + } + + init( + _ childCap: Capability<&{BorrowableAccount, OwnedAccountPublic, MetadataViews.Resolver}>, + _ factory: Capability<&CapabilityFactory.Manager{CapabilityFactory.Getter}>, + _ filter: Capability<&{CapabilityFilter.Filter}>, + _ delegator: Capability<&CapabilityDelegator.Delegator{CapabilityDelegator.GetterPublic, CapabilityDelegator.GetterPrivate}>, + _ parent: Address + ) { + pre { + childCap.check(): "Provided childCap Capability is invalid" + factory.check(): "Provided factory Capability is invalid" + filter.check(): "Provided filter Capability is invalid" + delegator.check(): "Provided delegator Capability is invalid" + } + self.childCap = childCap + self.factory = factory + self.filter = filter + self.delegator = delegator + self.managerCapabilityFilter = nil // this will get set when a parent account redeems + self.parent = parent + + self.data = {} + self.resources <- {} + } + + destroy () { + destroy <- self.resources + } + } + + /// A resource which sits on the account it manages to make it easier for apps to configure the behavior they want + /// to permit. An OwnedAccount can be used to create ChildAccount resources and share them, publishing them to + /// other addresses. + /// + /// The OwnedAccount can also be used to pass ownership of an account off to another address, or to relinquish + /// ownership entirely, marking the account as owned by no one. Note that even if there isn't an owner, the parent + /// accounts would still exist, allowing a form of Hybrid Custody which has no true owner over an account, but + /// shared partial ownership. + /// + pub resource OwnedAccount: OwnedAccountPrivate, BorrowableAccount, OwnedAccountPublic, MetadataViews.Resolver { + /// Capability on the underlying account object + access(self) var acct: Capability<&AuthAccount> + + /// Mapping of current and pending parents, true and false respectively + pub let parents: {Address: Bool} + /// Address of the pending owner, if one exists + pub var pendingOwner: Address? + /// Address of the current owner, if one exists + pub var acctOwner: Address? + /// Owned status of this account + pub var currentlyOwned: Bool + + /// A bucket of structs so that the OwnedAccount resource can be easily extended with new functionality. + access(self) let data: {String: AnyStruct} + + /// A bucket of resources so that the OwnedAccount resource can be easily extended with new functionality. + access(self) let resources: @{String: AnyResource} + + /// display is its own field on the OwnedAccount resource because only the owner of the child account should be + /// able to set this field. + access(self) var display: MetadataViews.Display? + + /// Callback that sets this OwnedAccount as redeemed by the parent + /// + access(contract) fun setRedeemed(_ addr: Address) { + pre { + self.parents[addr] != nil: "address is not waiting to be redeemed" + } + + self.parents[addr] = true + } + + /// Callback that sets the owner once redeemed + /// + access(contract) fun setOwnerCallback(_ addr: Address) { + pre { + self.pendingOwner == addr: "Address does not match pending owner!" + } + self.pendingOwner = nil + self.acctOwner = addr + } + + + /// A helper method to make it easier to manage what parents an account has configured. The steps to sharing this + /// OwnedAccount with a new parent are: + /// + /// 1. Create a new CapabilityDelegator for the ChildAccount resource being created. We make a new one here because + /// CapabilityDelegator types are meant to be shared explicitly. Making one shared base-line of capabilities might + /// introduce unforseen behavior where an app accidentally shared something to all accounts when it only meant + /// to go to one of them. It is better for parent accounts to have less access than they might have anticipated, + /// than for a child to have given out access it did not intend to. + /// 2. Create a new Capability<&{BorrowableAccount}> which has its own unique path for the parent to share this + /// child account with. We make new ones each time so that you can revoke access from one parent, without + /// destroying them all. A new link is made each time based on the address being shared to allow this + /// fine-grained control, but it is all managed by the OwnedAccount resource itself. + /// 3. A new @ChildAccount resource is created and saved, using the CapabilityDelegator made in step one, and our + /// CapabilityFactory and CapabilityFilter Capabilities. Once saved, public and private links are configured for + /// the ChildAccount. + /// 4. Publish the newly made private link to the designated parent's inbox for them to claim on their @Manager + /// resource. + /// + pub fun publishToParent( + parentAddress: Address, + factory: Capability<&CapabilityFactory.Manager{CapabilityFactory.Getter}>, + filter: Capability<&{CapabilityFilter.Filter}> + ) { + pre{ + self.parents[parentAddress] == nil: "Address pending or already redeemed as parent" + } + let capDelegatorIdentifier = HybridCustody.getCapabilityDelegatorIdentifier(parentAddress) + + let identifier = HybridCustody.getChildAccountIdentifier(parentAddress) + let childAccountStorage = StoragePath(identifier: identifier)! + + let capDelegatorStorage = StoragePath(identifier: capDelegatorIdentifier)! + let acct = self.borrowAccount() + + assert(acct.borrow<&AnyResource>(from: capDelegatorStorage) == nil, message: "conflicting resource found in capability delegator storage slot for parentAddress") + assert(acct.borrow<&AnyResource>(from: childAccountStorage) == nil, message: "conflicting resource found in child account storage slot for parentAddress") + + if acct.borrow<&CapabilityDelegator.Delegator>(from: capDelegatorStorage) == nil { + let delegator <- CapabilityDelegator.createDelegator() + acct.save(<-delegator, to: capDelegatorStorage) + } + + let capDelegatorPublic = PublicPath(identifier: capDelegatorIdentifier)! + let capDelegatorPrivate = PrivatePath(identifier: capDelegatorIdentifier)! + + acct.link<&CapabilityDelegator.Delegator{CapabilityDelegator.GetterPublic}>( + capDelegatorPublic, + target: capDelegatorStorage + ) + acct.link<&CapabilityDelegator.Delegator{CapabilityDelegator.GetterPublic, CapabilityDelegator.GetterPrivate}>( + capDelegatorPrivate, + target: capDelegatorStorage + ) + let delegator = acct.getCapability<&CapabilityDelegator.Delegator{CapabilityDelegator.GetterPublic, CapabilityDelegator.GetterPrivate}>( + capDelegatorPrivate + ) + assert(delegator.check(), message: "failed to setup capability delegator for parent address") + + let borrowableCap = self.borrowAccount().getCapability<&{BorrowableAccount, OwnedAccountPublic, MetadataViews.Resolver}>( + HybridCustody.OwnedAccountPrivatePath + ) + let childAcct <- create ChildAccount(borrowableCap, factory, filter, delegator, parentAddress) + + let childAccountPrivatePath = PrivatePath(identifier: identifier)! + + acct.save(<-childAcct, to: childAccountStorage) + acct.link<&ChildAccount{AccountPrivate, AccountPublic, MetadataViews.Resolver}>(childAccountPrivatePath, target: childAccountStorage) + + let delegatorCap = acct.getCapability<&ChildAccount{AccountPrivate, AccountPublic, MetadataViews.Resolver}>(childAccountPrivatePath) + assert(delegatorCap.check(), message: "Delegator capability check failed") + + acct.inbox.publish(delegatorCap, name: identifier, recipient: parentAddress) + self.parents[parentAddress] = false + + emit ChildAccountPublished( + ownedAcctID: self.uuid, + childAcctID: delegatorCap.borrow()!.uuid, + capDelegatorID: delegator.borrow()!.uuid, + factoryID: factory.borrow()!.uuid, + filterID: filter.borrow()!.uuid, + filterType: filter.borrow()!.getType(), + child: self.getAddress(), + pendingParent: parentAddress + ) + } + + /// Checks the validity of the encapsulated account Capability + /// + pub fun check(): Bool { + return self.acct.check() + } + + /// Returns a reference to the encapsulated account object + /// + pub fun borrowAccount(): &AuthAccount { + return self.acct.borrow()! + } + + /// Returns the addresses of all associated parents pending and active + /// + pub fun getParentAddresses(): [Address] { + return self.parents.keys + } + + /// Returns whether the given address is a parent of this account + /// + pub fun isChildOf(_ addr: Address): Bool { + return self.parents[addr] != nil + } + + /// Returns nil if the given address is not a parent, false if the parent has not redeemed the child account + /// yet, and true if they have + /// + pub fun getRedeemedStatus(addr: Address): Bool? { + return self.parents[addr] + } + + /// Returns associated parent addresses and their redeemed status + /// + pub fun getParentStatuses(): {Address: Bool} { + return self.parents + } + + /// Unlinks all paths configured when publishing an account, and destroy's the @ChildAccount resource + /// configured for the provided parent address. Once done, the parent will not have any valid capabilities with + /// which to access the child account. + /// + pub fun removeParent(parent: Address): Bool { + if self.parents[parent] == nil { + return false + } + let identifier = HybridCustody.getChildAccountIdentifier(parent) + let capDelegatorIdentifier = HybridCustody.getCapabilityDelegatorIdentifier(parent) + + let acct = self.borrowAccount() + acct.unlink(PrivatePath(identifier: identifier)!) + acct.unlink(PublicPath(identifier: identifier)!) + + acct.unlink(PrivatePath(identifier: capDelegatorIdentifier)!) + acct.unlink(PublicPath(identifier: capDelegatorIdentifier)!) + + destroy <- acct.load<@AnyResource>(from: StoragePath(identifier: identifier)!) + destroy <- acct.load<@AnyResource>(from: StoragePath(identifier: capDelegatorIdentifier)!) + + self.parents.remove(key: parent) + emit AccountUpdated(id: self.uuid, child: self.acct.address, parent: parent, active: false) + + let parentManager = getAccount(parent).getCapability<&Manager{ManagerPublic}>(HybridCustody.ManagerPublicPath) + if parentManager.check() { + parentManager.borrow()?.removeParentCallback(child: self.owner!.address) + } + + return true + } + + /// Returns the address of the encapsulated account + /// + pub fun getAddress(): Address { + return self.acct.address + } + + /// Returns the address of the pending owner if one is assigned. Pending owners are assigned when ownership has + /// been granted, but has not yet been redeemed. + /// + pub fun getPendingOwner(): Address? { + return self.pendingOwner + } + + /// Returns the address of the current owner if one is assigned. Current owners are assigned when ownership has + /// been redeemed. + /// + pub fun getOwner(): Address? { + if !self.currentlyOwned { + return nil + } + return self.acctOwner != nil ? self.acctOwner! : self.owner!.address + } + + /// This method is used to transfer ownership of the child account to a new address. + /// Ownership here means that one has unrestricted access on this OwnedAccount resource, giving them full + /// access to the account. + /// + /// **NOTE:** The existence of this method does not imply that it is the only way to receive access to a + /// OwnedAccount Capability or that only the labeled 'acctOwner' has said access. Rather, this is a convenient + /// mechanism intended to easily transfer 'root' access on this account to another account and an attempt to + /// minimize access vectors. + /// + pub fun giveOwnership(to: Address) { + self.seal() + + let acct = self.borrowAccount() + // Unlink existing owner's Capability if owner exists + if self.acctOwner != nil { + acct.unlink( + PrivatePath(identifier: HybridCustody.getOwnerIdentifier(self.acctOwner!))! + ) + } + // Link a Capability for the new owner, retrieve & publish + let identifier = HybridCustody.getOwnerIdentifier(to) + let cap = acct.link<&{OwnedAccountPrivate, OwnedAccountPublic, MetadataViews.Resolver}>( + PrivatePath(identifier: identifier)!, + target: HybridCustody.OwnedAccountStoragePath + ) ?? panic("failed to link child account capability") + + acct.inbox.publish(cap, name: identifier, recipient: to) + + self.pendingOwner = to + self.currentlyOwned = true + + emit OwnershipGranted(ownedAcctID: self.uuid, child: self.acct.address, previousOwner: self.getOwner(), pendingOwner: to) + } + + pub fun revokeAllKeys() { + let acct = self.borrowAccount() + + // Revoke all keys + acct.keys.forEach(fun (key: AccountKey): Bool { + if !key.isRevoked { + acct.keys.revoke(keyIndex: key.keyIndex) + } + return true + }) + } + + /// Cancels all existing AuthAccount capabilities, and creates a new one. The newly created capability will + /// then be used by the child account for accessing its AuthAccount going forward. + /// + /// This is used when altering ownership of an account, and can also be used as a safeguard for anyone who + /// assumes ownership of an account to guarantee that the previous owner doesn't maintain admin access to the + /// account via other AuthAccount Capabilities. + /// + pub fun rotateAuthAccount() { + let acct = self.borrowAccount() + + // Find all active AuthAccount capabilities so they can be removed after we make the new auth account cap + let pathsToUnlink: [PrivatePath] = [] + acct.forEachPrivate(fun (path: PrivatePath, type: Type): Bool { + if type.identifier == "Capability<&AuthAccount>" { + pathsToUnlink.append(path) + } + return true + }) + + // Link a new AuthAccount Capability + // NOTE: This path cannot be sufficiently randomly generated, an app calling this function could build a + // capability to this path before it is made, thus maintaining ownership despite making it look like they + // gave it away. Until capability controllers, this method should not be fully trusted. + let authAcctPath = "HybridCustodyRelinquished".concat(HybridCustody.account.address.toString()).concat(getCurrentBlock().height.toString()) + let acctCap = acct.linkAccount(PrivatePath(identifier: authAcctPath)!)! + + self.acct = acctCap + let newAcct = self.acct.borrow()! + + // cleanup, remove all previously found paths. We had to do it in this order because we will be unlinking + // the existing path which will cause a deference issue with the originally borrowed auth account + for p in pathsToUnlink { + newAcct.unlink(p) + } + } + + /// Revokes all keys on an account, unlinks all currently active AuthAccount capabilities, then makes a new one + /// and replaces the @OwnedAccount's underlying AuthAccount Capability with the new one to ensure that all parent + /// accounts can still operate normally. + /// Unless this method is executed via the giveOwnership function, this will leave an account **without** an owner. + /// + /// USE WITH EXTREME CAUTION. + /// + pub fun seal() { + self.rotateAuthAccount() + self.revokeAllKeys() // There needs to be a path to giving ownership that doesn't revoke keys + emit AccountSealed(id: self.uuid, address: self.acct.address, parents: self.parents.keys) + self.currentlyOwned = false + } + + /// Retrieves a reference to the ChildAccount associated with the given parent account if one exists. + /// + pub fun borrowChildAccount(parent: Address): &ChildAccount? { + let identifier = HybridCustody.getChildAccountIdentifier(parent) + return self.borrowAccount().borrow<&ChildAccount>(from: StoragePath(identifier: identifier)!) + } + + /// Sets the CapabilityFactory Manager for the specified parent in the associated ChildAccount. + /// + pub fun setCapabilityFactoryForParent( + parent: Address, + cap: Capability<&CapabilityFactory.Manager{CapabilityFactory.Getter}> + ) { + let p = self.borrowChildAccount(parent: parent) ?? panic("could not find parent address") + p.setCapabilityFactory(cap: cap) + } + + /// Sets the Filter for the specified parent in the associated ChildAccount. + /// + pub fun setCapabilityFilterForParent(parent: Address, cap: Capability<&{CapabilityFilter.Filter}>) { + let p = self.borrowChildAccount(parent: parent) ?? panic("could not find parent address") + p.setCapabilityFilter(cap: cap) + } + + /// Retrieves a reference to the Delegator associated with the given parent account if one exists. + /// + pub fun borrowCapabilityDelegatorForParent(parent: Address): &CapabilityDelegator.Delegator? { + let identifier = HybridCustody.getCapabilityDelegatorIdentifier(parent) + return self.borrowAccount().borrow<&CapabilityDelegator.Delegator>(from: StoragePath(identifier: identifier)!) + } + + /// Adds the provided Capability to the Delegator associated with the given parent account. + /// + pub fun addCapabilityToDelegator(parent: Address, cap: Capability, isPublic: Bool) { + let p = self.borrowChildAccount(parent: parent) ?? panic("could not find parent address") + let delegator = self.borrowCapabilityDelegatorForParent(parent: parent) + ?? panic("could not borrow capability delegator resource for parent address") + delegator.addCapability(cap: cap, isPublic: isPublic) + } + + /// Removes the provided Capability from the Delegator associated with the given parent account. + /// + pub fun removeCapabilityFromDelegator(parent: Address, cap: Capability) { + let p = self.borrowChildAccount(parent: parent) ?? panic("could not find parent address") + let delegator = self.borrowCapabilityDelegatorForParent(parent: parent) + ?? panic("could not borrow capability delegator resource for parent address") + delegator.removeCapability(cap: cap) + } + + pub fun getViews(): [Type] { + return [ + Type() + ] + } + + pub fun resolveView(_ view: Type): AnyStruct? { + switch view { + case Type(): + return self.display + } + return nil + } + + /// Sets this OwnedAccount's display to the one provided + /// + pub fun setDisplay(_ d: MetadataViews.Display) { + self.display = d + } + + init( + _ acct: Capability<&AuthAccount> + ) { + self.acct = acct + + self.parents = {} + self.pendingOwner = nil + self.acctOwner = nil + self.currentlyOwned = true + + self.data = {} + self.resources <- {} + self.display = nil + } + + destroy () { + destroy <- self.resources + } + } + + /// Utility function to get the path identifier for a parent address when interacting with a ChildAccount and its + /// parents + /// + pub fun getChildAccountIdentifier(_ addr: Address): String { + return "ChildAccount_".concat(addr.toString()) + } + + /// Utility function to get the path identifier for a parent address when interacting with a Delegator and its + /// parents + /// + pub fun getCapabilityDelegatorIdentifier(_ addr: Address): String { + return "ChildCapabilityDelegator_".concat(addr.toString()) + } + + /// Utility function to get the path identifier for a parent address when interacting with an OwnedAccount and its + /// owners + /// + pub fun getOwnerIdentifier(_ addr: Address): String { + return "HybridCustodyOwnedAccount_".concat(HybridCustody.account.address.toString()).concat(addr.toString()) + } + + /// Returns an OwnedAccount wrapping the provided AuthAccount Capability. + /// + pub fun createOwnedAccount( + acct: Capability<&AuthAccount> + ): @OwnedAccount { + pre { + acct.check(): "invalid auth account capability" + } + + let ownedAcct <- create OwnedAccount(acct) + emit CreatedOwnedAccount(id: ownedAcct.uuid, child: acct.borrow()!.address) + return <- ownedAcct + } + + /// Returns a new Manager with the provided Filter as default (if not nil). + /// + pub fun createManager(filter: Capability<&{CapabilityFilter.Filter}>?): @Manager { + pre { + filter == nil || filter!.check(): "Invalid CapabilityFilter Filter capability provided" + } + let manager <- create Manager(filter: filter) + emit CreatedManager(id: manager.uuid) + return <- manager + } + + init() { + let identifier = "HybridCustodyChild_".concat(self.account.address.toString()) + self.OwnedAccountStoragePath = StoragePath(identifier: identifier)! + self.OwnedAccountPrivatePath = PrivatePath(identifier: identifier)! + self.OwnedAccountPublicPath = PublicPath(identifier: identifier)! + + self.LinkedAccountPrivatePath = PrivatePath(identifier: "LinkedAccountPrivatePath_".concat(identifier))! + self.BorrowableAccountPrivatePath = PrivatePath(identifier: "BorrowableAccountPrivatePath_".concat(identifier))! + + let managerIdentifier = "HybridCustodyManager_".concat(self.account.address.toString()) + self.ManagerStoragePath = StoragePath(identifier: managerIdentifier)! + self.ManagerPublicPath = PublicPath(identifier: managerIdentifier)! + self.ManagerPrivatePath = PrivatePath(identifier: managerIdentifier)! + } +} diff --git a/contracts/hybrid-custody/factories/FTAllFactory.cdc b/contracts/hybrid-custody/factories/FTAllFactory.cdc new file mode 100644 index 0000000..46f506b --- /dev/null +++ b/contracts/hybrid-custody/factories/FTAllFactory.cdc @@ -0,0 +1,10 @@ +import "CapabilityFactory" +import "FungibleToken" + +pub contract FTAllFactory { + pub struct Factory: CapabilityFactory.Factory { + pub fun getCapability(acct: &AuthAccount, path: CapabilityPath): Capability { + return acct.getCapability<&{FungibleToken.Provider, FungibleToken.Receiver, FungibleToken.Balance}>(path) + } + } +} \ No newline at end of file diff --git a/contracts/hybrid-custody/factories/FTProviderFactory.cdc b/contracts/hybrid-custody/factories/FTProviderFactory.cdc new file mode 100644 index 0000000..e27dd0a --- /dev/null +++ b/contracts/hybrid-custody/factories/FTProviderFactory.cdc @@ -0,0 +1,10 @@ +import "CapabilityFactory" +import "FungibleToken" + +pub contract FTProviderFactory { + pub struct Factory: CapabilityFactory.Factory { + pub fun getCapability(acct: &AuthAccount, path: CapabilityPath): Capability { + return acct.getCapability<&{FungibleToken.Provider}>(path) + } + } +} \ No newline at end of file diff --git a/contracts/hybrid-custody/factories/NFTCollectionPublicFactory.cdc b/contracts/hybrid-custody/factories/NFTCollectionPublicFactory.cdc new file mode 100644 index 0000000..0e9df83 --- /dev/null +++ b/contracts/hybrid-custody/factories/NFTCollectionPublicFactory.cdc @@ -0,0 +1,10 @@ +import "CapabilityFactory" +import "NonFungibleToken" + +pub contract NFTCollectionPublicFactory { + pub struct Factory: CapabilityFactory.Factory { + pub fun getCapability(acct: &AuthAccount, path: CapabilityPath): Capability { + return acct.getCapability<&{NonFungibleToken.CollectionPublic}>(path) + } + } +} \ No newline at end of file diff --git a/contracts/hybrid-custody/factories/NFTProviderAndCollectionFactory.cdc b/contracts/hybrid-custody/factories/NFTProviderAndCollectionFactory.cdc new file mode 100644 index 0000000..a79755e --- /dev/null +++ b/contracts/hybrid-custody/factories/NFTProviderAndCollectionFactory.cdc @@ -0,0 +1,10 @@ +import "CapabilityFactory" +import "NonFungibleToken" + +pub contract NFTProviderAndCollectionFactory { + pub struct Factory: CapabilityFactory.Factory { + pub fun getCapability(acct: &AuthAccount, path: CapabilityPath): Capability { + return acct.getCapability<&{NonFungibleToken.Provider, NonFungibleToken.CollectionPublic}>(path) + } + } +} \ No newline at end of file diff --git a/contracts/hybrid-custody/factories/NFTProviderFactory.cdc b/contracts/hybrid-custody/factories/NFTProviderFactory.cdc new file mode 100644 index 0000000..7bf547e --- /dev/null +++ b/contracts/hybrid-custody/factories/NFTProviderFactory.cdc @@ -0,0 +1,10 @@ +import "CapabilityFactory" +import "NonFungibleToken" + +pub contract NFTProviderFactory { + pub struct Factory: CapabilityFactory.Factory { + pub fun getCapability(acct: &AuthAccount, path: CapabilityPath): Capability { + return acct.getCapability<&{NonFungibleToken.Provider}>(path) + } + } +} \ No newline at end of file diff --git a/contracts/utility/AccountCreator.cdc b/contracts/utility/AccountCreator.cdc index faca5fc..4433ea5 100644 --- a/contracts/utility/AccountCreator.cdc +++ b/contracts/utility/AccountCreator.cdc @@ -1,11 +1,11 @@ -import FungibleToken from "./FungibleToken.cdc" -import FlowToken from "./FlowToken.cdc" +import "FungibleToken" +import "FlowToken" /// This contract defines a resource enabling easy account creation and querying of created addresses by their /// originating public key strings. Note that this contract serves as a utility for prototyping, and its use isn't -/// suggested for production environments for a number of reasons, namely that the resource's mapping isn't -/// scalable for a large number of accounts, passing AuthAccounts is an anti-pattern in Cadence, and this approach is -/// is more inflexible than account creation handled at the transaction level. +/// suggested for production environments for a number of reasons, namely that the resource's mapping isn't scalable +/// for a large number of accounts, passing AuthAccounts is an anti-pattern in Cadence, and this approach is is more +/// inflexible than account creation handled at the transaction level. /// pub contract AccountCreator { @@ -88,9 +88,7 @@ pub contract AccountCreator { newAccount.getCapability<&FlowToken.Vault{FungibleToken.Receiver}>(/public/flowTokenReceiver) .borrow()! .deposit( - from: <- signer.borrow<&{ - FungibleToken.Provider - }>( + from: <- signer.borrow<&{FungibleToken.Provider}>( from: /storage/flowTokenVault )!.withdraw(amount: initialFundingAmount) ) @@ -101,6 +99,34 @@ pub contract AccountCreator { } } + /// Helper method to determine if a public key is active on an account by comparing the given key against all keys + /// active on the given account. + /// + /// @param publicKey: A public key as a string + /// @param address: The address of the account to query against + /// + /// @return Key index if the key is active on the account, nil otherwise (including if the given public key string + /// was invalid) + /// + pub fun isKeyActiveOnAccount(publicKey: String, address: Address): Int? { + // Public key strings must have even length + if publicKey.length % 2 != 0 { + return nil + } + + var keyIndex = 0 + var matchingKeyIndex: Int? = nil + getAccount(address).keys.forEach(fun (key: AccountKey): Bool { + // Encode the key as a string and compare + if publicKey == String.encodeHex(key.publicKey.publicKey) && !key.isRevoked { + matchingKeyIndex = keyIndex + } + keyIndex = keyIndex + 1 + return true + }) + return matchingKeyIndex + } + pub fun createNewCreator(): @Creator { return <-create Creator() } diff --git a/contracts/utility/FlowToken.cdc b/contracts/utility/FlowToken.cdc index 6745023..3995e1a 100644 --- a/contracts/utility/FlowToken.cdc +++ b/contracts/utility/FlowToken.cdc @@ -1,4 +1,4 @@ -import FungibleToken from "./FungibleToken.cdc" +import "FungibleToken" pub contract FlowToken: FungibleToken { diff --git a/contracts/utility/FungibleTokenMetadataViews.cdc b/contracts/utility/FungibleTokenMetadataViews.cdc index aaea0f8..f2b470b 100644 --- a/contracts/utility/FungibleTokenMetadataViews.cdc +++ b/contracts/utility/FungibleTokenMetadataViews.cdc @@ -1,5 +1,5 @@ -import FungibleToken from "./FungibleToken.cdc" -import MetadataViews from "./MetadataViews.cdc" +import "FungibleToken" +import "MetadataViews" /// This contract implements the metadata standard proposed /// in FLIP-1087. diff --git a/contracts/utility/MetadataViews.cdc b/contracts/utility/MetadataViews.cdc index 98f00b7..31654c1 100644 --- a/contracts/utility/MetadataViews.cdc +++ b/contracts/utility/MetadataViews.cdc @@ -1,5 +1,5 @@ -import FungibleToken from "./FungibleToken.cdc" -import NonFungibleToken from "./NonFungibleToken.cdc" +import "FungibleToken" +import "NonFungibleToken" /// This contract implements the metadata standard proposed /// in FLIP-0636. diff --git a/contracts/utility/NonFungibleToken.cdc b/contracts/utility/NonFungibleToken.cdc index b6a4494..5ebd8fc 100644 --- a/contracts/utility/NonFungibleToken.cdc +++ b/contracts/utility/NonFungibleToken.cdc @@ -41,48 +41,75 @@ Collection to complete the transfer. */ -// The main NFT contract interface. Other NFT contracts will -// import and implement this interface -// +/// The main NFT contract interface. Other NFT contracts will +/// import and implement this interface +/// pub contract interface NonFungibleToken { - // The total number of tokens of this type in existence + /// The total number of tokens of this type in existence pub var totalSupply: UInt64 - // Event that emitted when the NFT contract is initialized - // + /// Event that emitted when the NFT contract is initialized + /// pub event ContractInitialized() - // Event that is emitted when a token is withdrawn, - // indicating the owner of the collection that it was withdrawn from. - // - // If the collection is not in an account's storage, `from` will be `nil`. - // + /// Event that is emitted when a token is withdrawn, + /// indicating the owner of the collection that it was withdrawn from. + /// + /// If the collection is not in an account's storage, `from` will be `nil`. + /// pub event Withdraw(id: UInt64, from: Address?) - // Event that emitted when a token is deposited to a collection. - // - // It indicates the owner of the collection that it was deposited to. - // + /// Event that emitted when a token is deposited to a collection. + /// + /// It indicates the owner of the collection that it was deposited to. + /// pub event Deposit(id: UInt64, to: Address?) - // Interface that the NFTs have to conform to - // + /// Interface that the NFTs have to conform to + /// The metadata views methods are included here temporarily + /// because enforcing the metadata interfaces in the standard + /// would break many contracts in an upgrade. Those breaking changes + /// are being saved for the stable cadence milestone + /// pub resource interface INFT { - // The unique ID that each NFT has + /// The unique ID that each NFT has pub let id: UInt64 + + /// Function that returns all the Metadata Views implemented by a Non Fungible Token + /// + /// @return An array of Types defining the implemented views. This value will be used by + /// developers to know which parameter to pass to the resolveView() method. + /// + pub fun getViews(): [Type] { + return [] + } + + /// Function that resolves a metadata view for this token. + /// + /// @param view: The Type of the desired view. + /// @return A structure representing the requested view. + /// + pub fun resolveView(_ view: Type): AnyStruct? { + return nil + } } - // Requirement that all conforming NFT smart contracts have - // to define a resource called NFT that conforms to INFT + /// Requirement that all conforming NFT smart contracts have + /// to define a resource called NFT that conforms to INFT + /// pub resource NFT: INFT { pub let id: UInt64 } - // Interface to mediate withdraws from the Collection - // + /// Interface to mediate withdraws from the Collection + /// pub resource interface Provider { - // withdraw removes an NFT from the collection and moves it to the caller + /// Removes an NFT from the resource implementing it and moves it to the caller + /// + /// @param withdrawID: The ID of the NFT that will be removed + /// @return The NFT resource removed from the implementing resource + /// pub fun withdraw(withdrawID: UInt64): @NFT { post { result.id == withdrawID: "The ID of the withdrawn token must be the same as the requested ID" @@ -90,17 +117,20 @@ pub contract interface NonFungibleToken { } } - // Interface to mediate deposits to the Collection - // + /// Interface to mediate deposits to the Collection + /// pub resource interface Receiver { - // deposit takes an NFT as an argument and adds it to the Collection - // + /// Adds an NFT to the resource implementing it + /// + /// @param token: The NFT resource that will be deposited + /// pub fun deposit(token: @NFT) } - // Interface that an account would commonly - // publish for their collection + /// Interface that an account would commonly + /// publish for their collection + /// pub resource interface CollectionPublic { pub fun deposit(token: @NFT) pub fun getIDs(): [UInt64] @@ -118,26 +148,40 @@ pub contract interface NonFungibleToken { } } - // Requirement for the concrete resource type - // to be declared in the implementing contract - // + /// Requirement for the concrete resource type + /// to be declared in the implementing contract + /// pub resource Collection: Provider, Receiver, CollectionPublic { - // Dictionary to hold the NFTs in the Collection + /// Dictionary to hold the NFTs in the Collection pub var ownedNFTs: @{UInt64: NFT} - // withdraw removes an NFT from the collection and moves it to the caller + /// Removes an NFT from the collection and moves it to the caller + /// + /// @param withdrawID: The ID of the NFT that will be withdrawn + /// @return The resource containing the desired NFT + /// pub fun withdraw(withdrawID: UInt64): @NFT - // deposit takes a NFT and adds it to the collections dictionary - // and adds the ID to the id array + /// Takes a NFT and adds it to the collections dictionary + /// and adds the ID to the ID array + /// + /// @param token: An NFT resource + /// pub fun deposit(token: @NFT) - // getIDs returns an array of the IDs that are in the collection + /// Returns an array of the IDs that are in the collection + /// + /// @return An array containing all the IDs on the collection + /// pub fun getIDs(): [UInt64] - // Returns a borrowed reference to an NFT in the collection - // so that the caller can read data and call methods from it + /// Returns a borrowed reference to an NFT in the collection + /// so that the caller can read data and call methods from it + /// + /// @param id: The ID of the NFT that want to be borrowed + /// @return A reference to the NFT + /// pub fun borrowNFT(id: UInt64): &NFT { pre { self.ownedNFTs[id] != nil: "NFT does not exist in the collection!" @@ -145,8 +189,10 @@ pub contract interface NonFungibleToken { } } - // createEmptyCollection creates an empty Collection - // and returns it to the caller so that they can own NFTs + /// Creates an empty Collection and returns it to the caller so that they can own NFTs + /// + /// @return A new Collection resource + /// pub fun createEmptyCollection(): @Collection { post { result.getIDs().length == 0: "The created collection must be empty!" diff --git a/flow.json b/flow.json index 69b8471..f63598e 100644 --- a/flow.json +++ b/flow.json @@ -3,110 +3,183 @@ "AccountCreator": { "source": "./contracts/utility/AccountCreator.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "testnet": "0x917b2b1dafdcfa58" + "emulator": "045a1763c93006ca", + "testnet": "a60698727837eccf" + } + }, + "AddressUtils": { + "source": "./contracts/flow-utils/AddressUtils.cdc", + "aliases": { + "emulator": "e03daebed8ca0615", + "mainnet": "a340dc0a4ec828ab", + "testnet": "31ad40c07a2a9788" } }, "ArcadePrize": { "source": "./contracts/ArcadePrize.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "testnet": "0x917b2b1dafdcfa58" + "emulator": "045a1763c93006ca", + "testnet": "a60698727837eccf" + } + }, + "ArrayUtils": { + "source": "./contracts/flow-utils/ArrayUtils.cdc", + "aliases": { + "emulator": "e03daebed8ca0615", + "mainnet": "a340dc0a4ec828ab", + "testnet": "31ad40c07a2a9788" + } + }, + "CapabilityDelegator": { + "source": "./contracts/hybrid-custody/CapabilityDelegator.cdc", + "aliases": { + "emulator": "120e725050340cab", + "testnet": "294e44e1ec6993c6" + } + }, + "CapabilityFactory": { + "source": "./contracts/hybrid-custody/CapabilityFactory.cdc", + "aliases": { + "emulator": "120e725050340cab", + "testnet": "294e44e1ec6993c6" + } + }, + "CapabilityFilter": { + "source": "./contracts/hybrid-custody/CapabilityFilter.cdc", + "aliases": { + "emulator": "120e725050340cab", + "testnet": "294e44e1ec6993c6" } }, "DynamicNFT": { "source": "./contracts/DynamicNFT.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "testnet": "0x917b2b1dafdcfa58" + "emulator": "045a1763c93006ca", + "testnet": "a60698727837eccf" + } + }, + "FTAllFactory": { + "source": "./contracts/hybrid-custody/factories/FTAllFactory.cdc", + "aliases": { + "emulator": "120e725050340cab", + "testnet": "294e44e1ec6993c6" + } + }, + "FTProviderFactory": { + "source": "./contracts/hybrid-custody/factories/FTProviderFactory.cdc", + "aliases": { + "emulator": "120e725050340cab", + "testnet": "294e44e1ec6993c6" } }, "FlowToken": { "source": "./contracts/utility/FlowToken.cdc", "aliases": { - "emulator": "0x0ae53cb6e3f42a79", - "testnet": "0x7e60df042a9c0868" + "emulator": "0ae53cb6e3f42a79", + "testnet": "7e60df042a9c0868" } }, "FungibleToken": { "source": "./contracts/utility/FungibleToken.cdc", "aliases": { - "emulator": "0xee82856bf20e2aa6", - "mainnet": "0xf233dcee88fe0abe", - "testnet": "0x9a0766d93b6608b7" + "emulator": "ee82856bf20e2aa6", + "mainnet": "f233dcee88fe0abe", + "testnet": "9a0766d93b6608b7" } }, "FungibleTokenMetadataViews": { "source": "./contracts/utility/FungibleTokenMetadataViews.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "mainnet": "0xf233dcee88fe0abe", - "testnet": "0x9a0766d93b6608b7" + "emulator": "f8d6e0586b0a20c7", + "mainnet": "f233dcee88fe0abe", + "testnet": "9a0766d93b6608b7" } }, "GamePieceNFT": { "source": "./contracts/GamePieceNFT.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "testnet": "0x917b2b1dafdcfa58" + "emulator": "045a1763c93006ca", + "testnet": "a60698727837eccf" } }, "GamingMetadataViews": { "source": "./contracts/GamingMetadataViews.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "testnet": "0x917b2b1dafdcfa58" + "emulator": "045a1763c93006ca", + "testnet": "a60698727837eccf" + } + }, + "HybridCustody": { + "source": "./contracts/hybrid-custody/HybridCustody.cdc", + "aliases": { + "emulator": "120e725050340cab", + "testnet": "294e44e1ec6993c6" } }, - "LinkedAccountMetadataViews": { - "source": "./contracts/LinkedAccountMetadataViews.cdc", + "MetadataViews": { + "source": "./contracts/utility/MetadataViews.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "testnet": "0x1b655847a90e644a" + "emulator": "f8d6e0586b0a20c7", + "mainnet": "1d7e57aa55817448", + "testnet": "631e88ae7f1d7c20" } }, - "LinkedAccounts": { - "source": "./contracts/LinkedAccounts.cdc", + "NFTCollectionPublicFactory": { + "source": "./contracts/hybrid-custody/factories/NFTCollectionPublicFactory.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "testnet": "0x1b655847a90e644a" + "emulator": "120e725050340cab", + "testnet": "294e44e1ec6993c6" } }, - "MetadataViews": { - "source": "./contracts/utility/MetadataViews.cdc", + "NFTProviderAndCollectionFactory": { + "source": "./contracts/hybrid-custody/factories/NFTProviderAndCollectionFactory.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "mainnet": "0x1d7e57aa55817448", - "testnet": "0x631e88ae7f1d7c20" + "emulator": "120e725050340cab", + "testnet": "294e44e1ec6993c6" + } + }, + "NFTProviderFactory": { + "source": "./contracts/hybrid-custody/factories/NFTProviderFactory.cdc", + "aliases": { + "emulator": "120e725050340cab", + "testnet": "294e44e1ec6993c6" } }, "NonFungibleToken": { "source": "./contracts/utility/NonFungibleToken.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "mainnet": "0x1d7e57aa55817448", - "testnet": "0x631e88ae7f1d7c20" + "emulator": "f8d6e0586b0a20c7", + "mainnet": "1d7e57aa55817448", + "testnet": "631e88ae7f1d7c20" } }, "RockPaperScissorsGame": { "source": "./contracts/RockPaperScissorsGame.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "testnet": "0x917b2b1dafdcfa58" + "emulator": "045a1763c93006ca", + "testnet": "a60698727837eccf" + } + }, + "StringUtils": { + "source": "./contracts/flow-utils/StringUtils.cdc", + "aliases": { + "emulator": "e03daebed8ca0615", + "mainnet": "a340dc0a4ec828ab", + "testnet": "31ad40c07a2a9788" } }, "TicketToken": { "source": "./contracts/TicketToken.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "testnet": "0x917b2b1dafdcfa58" + "emulator": "045a1763c93006ca", + "testnet": "a60698727837eccf" } }, "ViewResolver": { "source": "./contracts/utility/ViewResolver.cdc", "aliases": { - "emulator": "0xf8d6e0586b0a20c7", - "testnet": "0x631e88ae7f1d7c20" + "emulator": "f8d6e0586b0a20c7", + "testnet": "631e88ae7f1d7c20" } } }, @@ -120,13 +193,24 @@ "address": "f8d6e0586b0a20c7", "key": "83c4da8100a5bb0086fd0835e0b48dbdf507ca4aa15dab56edccee06c82eb110" }, - "game-account": { - "address": "917b2b1dafdcfa58", - "key": "$GAME_ACCOUNT" + "emulator-flow-utils": { + "address": "e03daebed8ca0615", + "key": "f84d8acb8a1efa87e316df886825e0b6acfa795f2599cbb306727084aa45b80d" + }, + "emulator-game": { + "address": "045a1763c93006ca", + "key": "884bf6b10358c23a35d272123eabb509be0e7bc895c9bfbaaeccae1b1f9204d3" + }, + "emulator-hybrid-custody": { + "address": "120e725050340cab", + "key": "9219adbbe5caca4f2753fbd4fd22f50d5d5f6a8fe7096bbf381cbd55c2f46aab" }, - "linked-accounts": { - "address": "1b655847a90e644a", - "key": "$LINKED_ACCOUNTS" + "testnet-game": { + "address": "a60698727837eccf", + "key": { + "type": "file", + "location": "testnet-game.pkey" + } } }, "deployments": { @@ -135,17 +219,44 @@ "NonFungibleToken", "MetadataViews", "FungibleTokenMetadataViews", - "LinkedAccountMetadataViews", - "ViewResolver", - "LinkedAccounts", + "ViewResolver" + ], + "emulator-flow-utils": [ + "AddressUtils", + "StringUtils", + "ArrayUtils" + ], + "emulator-game": [ + "AccountCreator", + "GamingMetadataViews", + "DynamicNFT", + "GamePieceNFT", + "TicketToken", + "ArcadePrize", + "RockPaperScissorsGame" + ], + "emulator-hybrid-custody": [ + "CapabilityDelegator", + "CapabilityFactory", + "CapabilityFilter", + "HybridCustody", + "NFTProviderFactory", + "NFTProviderAndCollectionFactory", + "NFTCollectionPublicFactory", + "FTProviderFactory", + "FTAllFactory" + ] + }, + "testnet": { + "testnet-game": [ + "AccountCreator", "GamingMetadataViews", "DynamicNFT", "GamePieceNFT", "TicketToken", "ArcadePrize", - "RockPaperScissorsGame", - "AccountCreator" + "RockPaperScissorsGame" ] } } -} +} \ No newline at end of file diff --git a/lib/js/test/Makefile b/lib/js/test/Makefile deleted file mode 100644 index b746ae7..0000000 --- a/lib/js/test/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -.PHONY: test -test: - npm test -- walletless_onboarding.test.js - npm test -- rps.test.js - -.PHONY: ci -ci: test \ No newline at end of file diff --git a/lib/js/test/babel.config.json b/lib/js/test/babel.config.json deleted file mode 100644 index 394c543..0000000 --- a/lib/js/test/babel.config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "presets": [ - [ - "@babel/preset-env", - { - "targets": { - "node": "current" - } - } - ] - ] -} diff --git a/lib/js/test/flow.json b/lib/js/test/flow.json deleted file mode 100644 index 6beda40..0000000 --- a/lib/js/test/flow.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "emulators": { - "default": { - "port": 3569, - "serviceAccount": "emulator-account" - } - }, - "contracts": { - "AccountCreator": "../../../contracts/utility/AccountCreator.cdc", - "ArcadePrize": "../../../contracts/ArcadePrize.cdc", - "DynamicNFT": "../../../contracts/DynamicNFT.cdc", - "FlowToken": "../../../contracts/utility/FlowToken.cdc", - "FungibleToken": "../../../contracts/utility/FungibleToken.cdc", - "FungibleTokenMetadataViews": "../../../contracts/utility/FungibleTokenMetadataViews.cdc", - "GamePieceNFT": "../../../contracts/GamePieceNFT.cdc", - "GamingMetadataViews": "../../../contracts/GamingMetadataViews.cdc", - "LinkedAccountMetadataViews": "../../../contracts/LinkedAccountMetadataViews.cdc", - "LinkedAccounts": "../../../contracts/LinkedAccounts.cdc", - "MetadataViews": "../../../contracts/utility/MetadataViews.cdc", - "NonFungibleToken": "../../../contracts/utility/NonFungibleToken.cdc", - "RockPaperScissorsGame": "../../../contracts/RockPaperScissorsGame.cdc", - "TicketToken": "../../../contracts/TicketToken.cdc", - "ViewResolver": "../../../contracts/utility/ViewResolver.cdc" - }, - "networks": { - "emulator": "127.0.0.1:3569", - "mainnet": "access.mainnet.nodes.onflow.org:9000", - "testnet": "access.devnet.nodes.onflow.org:9000" - }, - "accounts": { - "emulator-account": { - "address": "f8d6e0586b0a20c7", - "key": "cf0c8a744e68368b1ddca6892ab593a6f7f2dc0ccc006567b5fce5d0d0717630" - } - }, - "deployments": {} -} diff --git a/lib/js/test/jest.config.json b/lib/js/test/jest.config.json deleted file mode 100644 index bbbc3ff..0000000 --- a/lib/js/test/jest.config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "testEnvironment": "node", - "verbose": true, - "coveragePathIgnorePatterns": ["/node_modules/"], - "testTimeout": 100000 -} \ No newline at end of file diff --git a/lib/js/test/package-lock.json b/lib/js/test/package-lock.json deleted file mode 100644 index 8e6d617..0000000 --- a/lib/js/test/package-lock.json +++ /dev/null @@ -1,17920 +0,0 @@ -{ - "name": "test", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "test", - "version": "1.0.0", - "license": "ISC", - "devDependencies": { - "@babel/core": "^7.18.0", - "@babel/preset-env": "^7.18.0", - "@onflow/flow-js-testing": "0.3.0-alpha.17", - "babel-jest": "^28.1.0", - "jest": "^28.1.0", - "jest-environment-node": "^28.1.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", - "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", - "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", - "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", - "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", - "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", - "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", - "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", - "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.14.tgz", - "integrity": "sha512-sMPepQtsOs5fM1bwNvuJJHvaCfOEQfmc01FGw0ELlTpTJj5Ql/zuNRRldYhAPys4ghXdBIQJbRVYi44/7QflQQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", - "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", - "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", - "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", - "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@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.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", - "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.13", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "dependencies": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - }, - "bin": { - "watch": "cli.js" - }, - "engines": { - "node": ">=0.1.95" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", - "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", - "dev": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/reporters": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@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": "^28.1.3", - "jest-config": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-resolve-dependencies": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "jest-watcher": "^28.1.3", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", - "dev": true, - "dependencies": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "dependencies": { - "jest-get-type": "^28.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", - "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "@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": "^28.1.3", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", - "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1" - } - }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "dev": true - }, - "node_modules/@onflow/config": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@onflow/config/-/config-1.0.5.tgz", - "integrity": "sha512-r2IUyY4SJgAY6YCzKL0cOOertHETp9BgVfCjTIq236WAHr7aMS1oNyqcVPPR++zjDK8n64lRgrxlcYSZB/LrFg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6", - "@onflow/util-actor": "^1.1.2" - } - }, - "node_modules/@onflow/fcl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@onflow/fcl/-/fcl-1.3.2.tgz", - "integrity": "sha512-H2YduE8JUMqjUBR9R3YOFgWrT/yMg+aE5w8uwrMD3YJ/wGpF6iKo0XJGRa7kPVn5pP0HjKQnOlmCLvHwEGEhQQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6", - "@onflow/config": "^1.0.5", - "@onflow/interaction": "0.0.11", - "@onflow/rlp": "^1.0.2", - "@onflow/sdk": "^1.1.2", - "@onflow/types": "^1.0.5", - "@onflow/util-actor": "^1.1.1", - "@onflow/util-address": "^1.0.2", - "@onflow/util-invariant": "^1.0.2", - "@onflow/util-logger": "^1.1.1", - "@onflow/util-template": "^1.0.3", - "@onflow/util-uid": "^1.0.2", - "node-fetch": "^2.6.7" - } - }, - "node_modules/@onflow/fcl-config": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@onflow/fcl-config/-/fcl-config-0.0.1.tgz", - "integrity": "sha512-umvYsAwejX2yGJ5OFxM1dEaKmFEXf+34f4rJfVkfEYztgJqLkUbBkEB8HQsI8M78QUpWkWuNArqwbFvFerBbHA==", - "dev": true - }, - "node_modules/@onflow/flow-cadut": { - "version": "0.2.0-alpha.8", - "resolved": "https://registry.npmjs.org/@onflow/flow-cadut/-/flow-cadut-0.2.0-alpha.8.tgz", - "integrity": "sha512-gKVhHXhlE46zM16BueaK4ysIxzqXWC2/Tar5vJPwsh2KptnDeNCL4yQ3RM56GSEWElxBLNCARJB7UuChgPfzKQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6", - "@onflow/config": "0.0.2", - "@onflow/fcl": "^1.1.1-alpha.2", - "elliptic": "^6.5.4", - "esm": "^3.2.25", - "rimraf": "^3.0.2", - "rlp": "^3.0.0", - "sha3": "^2.1.4", - "simple-git": "^2.40.0", - "yargs": "^15.4.1" - } - }, - "node_modules/@onflow/flow-cadut/node_modules/@onflow/config": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@onflow/config/-/config-0.0.2.tgz", - "integrity": "sha512-H/+yrAalzEnMWkubiWsDdWytKSzd+OfRCddTlaRUelxfXhcfw2QWegH9N8EzeKfKXcQ6PLzvu9vQwhFxCZTE8Q==", - "dev": true, - "dependencies": { - "@onflow/util-actor": "0.0.2" - } - }, - "node_modules/@onflow/flow-cadut/node_modules/@onflow/util-actor": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@onflow/util-actor/-/util-actor-0.0.2.tgz", - "integrity": "sha512-NV3zPXQue3FqVgcIIMo6ifJOiP3hVSQTaR4ZrWLFU5iAZ/L73cTtBMbCB4BUFOe20ALtF2c9PFmpNVowCYV+nw==", - "dev": true, - "dependencies": { - "queue-microtask": "1.1.2" - } - }, - "node_modules/@onflow/flow-cadut/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@onflow/flow-cadut/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/@onflow/flow-cadut/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@onflow/flow-cadut/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@onflow/flow-cadut/node_modules/rlp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-3.0.0.tgz", - "integrity": "sha512-PD6U2PGk6Vq2spfgiWZdomLvRGDreBLxi5jv5M8EpRo3pU6VEm31KO+HFxE18Q3vgqfDrQ9pZA3FP95rkijNKw==", - "dev": true, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/@onflow/flow-cadut/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@onflow/flow-cadut/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 - }, - "node_modules/@onflow/flow-cadut/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@onflow/flow-cadut/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@onflow/flow-js-testing": { - "version": "0.3.0-alpha.17", - "resolved": "https://registry.npmjs.org/@onflow/flow-js-testing/-/flow-js-testing-0.3.0-alpha.17.tgz", - "integrity": "sha512-c+8lAXEwuQqII4RgvO4vCyoRnXSVeGxxWpYtAaPmih/iP593H2LFCbDyGNA0jy63yfJuTtmDjvvsj9pUDt2y1g==", - "dev": true, - "dependencies": { - "@onflow/fcl": "^1.2.1-alpha.0", - "@onflow/fcl-config": "^0.0.1", - "@onflow/flow-cadut": "0.2.0-alpha.8", - "@onflow/types": "^1.0.3-alpha.0", - "elliptic": "^6.5.4", - "esm": "^3.2.25", - "jest-environment-uint8array": "^1.0.0", - "js-sha256": "^0.9.0", - "js-sha3": "^0.8.0", - "rimraf": "^3.0.2", - "rlp": "^2.2.6", - "yargs": "^17.0.1" - }, - "bin": { - "flow-js-testing": "bin/index.js" - } - }, - "node_modules/@onflow/interaction": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@onflow/interaction/-/interaction-0.0.11.tgz", - "integrity": "sha512-Xuq1Mmx6Wyba/F/L+QLQs0yJeQDsIDwy5SKk5vrCuVgIj0yD8k506g5L8ODrbM1LWll8i0tQsoOi0F85vNl5sA==", - "dev": true - }, - "node_modules/@onflow/rlp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@onflow/rlp/-/rlp-1.0.4.tgz", - "integrity": "sha512-/4jSoh9eXPoN9iUCsbI+PAuTRJyYgT+XR4NdZYmxILRwOtIsSd2I9XatA4rrSzk9DJ0h8l9SmYx1y0XLnD+ohQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6", - "buffer": "^6.0.3" - } - }, - "node_modules/@onflow/sdk": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@onflow/sdk/-/sdk-1.1.2.tgz", - "integrity": "sha512-HNfQ6Q91FfFwd2g1wa/YHvmv6BYeXGONkEJyfOaoPRIbp3lG9W35HYX7Yvgtn7fvcQG+TRL8n386mzJ6Vn4dmA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6", - "@onflow/config": "^1.0.3", - "@onflow/rlp": "^1.0.2", - "@onflow/transport-http": "^1.5.0", - "@onflow/util-actor": "^1.1.1", - "@onflow/util-address": "^1.0.2", - "@onflow/util-invariant": "^1.0.2", - "@onflow/util-logger": "^1.1.1", - "@onflow/util-template": "^1.0.3", - "deepmerge": "^4.2.2", - "sha3": "^2.1.4" - } - }, - "node_modules/@onflow/transport-http": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@onflow/transport-http/-/transport-http-1.5.0.tgz", - "integrity": "sha512-CGgfPC1kI+ssqDgFXxGgKHLVtu1tCGtyGJiS/fplyVun9RC7AwEp2KkjTP2dxRlto3HmntoaBkOw7z38UCxRZw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6", - "@onflow/util-address": "^1.0.2", - "@onflow/util-invariant": "^1.0.2", - "@onflow/util-logger": "^1.1.1", - "@onflow/util-template": "^1.0.3", - "node-fetch": "^2.6.7" - } - }, - "node_modules/@onflow/types": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@onflow/types/-/types-1.0.5.tgz", - "integrity": "sha512-Uf6APOwgkxPwgonQ8JRrOB0KZ5eJpNBVXlEiZIv5ddzsfM6qd9p3csEE5YmuLhAooAcisG3ROTzw2hT/zUNGbw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6" - } - }, - "node_modules/@onflow/util-actor": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@onflow/util-actor/-/util-actor-1.1.2.tgz", - "integrity": "sha512-fsRGw5c2idlG5T0u48tzah1iE0OIc4WmgrNYN0gQ1NHX+Ue8iySoQdCIcdSxJCHOXwpHWe68fWTonCzbRJOssQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6", - "queue-microtask": "1.1.2" - } - }, - "node_modules/@onflow/util-address": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@onflow/util-address/-/util-address-1.0.3.tgz", - "integrity": "sha512-w8DPYSvYm5h0hhZ0hZwiCwu9UgJBtIv2KyhDiH3TZG8srT+9GxtTPX4NzZtAVuxqWTNVlTGePD/Upxusiwnk6g==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6" - } - }, - "node_modules/@onflow/util-invariant": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@onflow/util-invariant/-/util-invariant-1.0.3.tgz", - "integrity": "sha512-+Hk93W9JwACLkM5/oOILqI9L55o5QxETBV5Du/2dLgNbjXDElMmQzURFXx6fTmODTLZ6Ri+d1nvb7AxapYFe0Q==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6" - } - }, - "node_modules/@onflow/util-logger": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@onflow/util-logger/-/util-logger-1.1.2.tgz", - "integrity": "sha512-BcVDzKNGv/j3gqnq1lc0fpJV7LCHWPJyzYR588/keiY90mFHwLe8ahXYG1UYPu02KymlVqlInfISKWlNwk4aug==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6", - "@onflow/config": "^1.0.4" - } - }, - "node_modules/@onflow/util-template": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@onflow/util-template/-/util-template-1.0.4.tgz", - "integrity": "sha512-syTJzhFn+CaW/FAqVLJJ3Oq9pTuxS5Wk0+g9AkSKWJ8PCY+FLr7UC2mGr/5pO//L13Elz7cv/djXVxNA1ULQmw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6" - } - }, - "node_modules/@onflow/util-uid": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@onflow/util-uid/-/util-uid-1.0.3.tgz", - "integrity": "sha512-hBdfV+0BSDphcvLvL8KFivyV5ZhpVyRcrOn0fuSD4is/hN5d1mLFBev9gur9gdmQUUwgFt0v+aA/Tc/7mRDctQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.18.6" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", - "dev": true - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.3.0" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true - }, - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "node_modules/@types/yargs": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.20.tgz", - "integrity": "sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": 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, - "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/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/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, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/babel-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", - "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", - "dev": true, - "dependencies": { - "@jest/transform": "^28.1.3", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.1.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", - "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", - "dev": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", - "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", - "dev": true, - "dependencies": { - "babel-plugin-jest-hoist": "^28.1.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.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==", - "dev": true - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001449", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz", - "integrity": "sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "dependencies": { - "rsvp": "^4.8.4" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-js-compat": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz", - "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==", - "dev": true, - "dependencies": { - "browserslist": "^4.21.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "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, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": 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/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "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==", - "dev": true, - "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/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "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.4", - "is-array-buffer": "^3.0.1", - "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.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "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 - }, - "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, - "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, - "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==", - "dev": true, - "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==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/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, - "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/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, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-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, - "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==", - "dev": true, - "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, - "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, - "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, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "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==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "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, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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, - "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": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "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, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-ci/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==", - "dev": true - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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, - "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==", - "dev": true, - "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, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-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, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": 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, - "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.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": 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/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, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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 - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", - "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", - "dev": true, - "dependencies": { - "@jest/core": "^28.1.3", - "@jest/types": "^28.1.3", - "import-local": "^3.0.2", - "jest-cli": "^28.1.3" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", - "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", - "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", - "dev": true, - "dependencies": { - "@jest/core": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", - "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.3", - "@jest/types": "^28.1.3", - "babel-jest": "^28.1.3", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.3", - "jest-environment-node": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-environment-uint8array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jest-environment-uint8array/-/jest-environment-uint8array-1.0.0.tgz", - "integrity": "sha512-PhZFy1N9AyuAs4Mr25/I+oiHEF25t7e74UTL9oTCmasfy8HGAKvPL6Wc43zgF0sV05dLLPS9yplxHfgxMw1E0w==", - "dev": true, - "dependencies": { - "jest-environment-node": "^24.8.0" - } - }, - "node_modules/jest-environment-uint8array/node_modules/@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, - "dependencies": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "dev": true, - "dependencies": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, - "dependencies": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/jest-environment-uint8array/node_modules/@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", - "dev": true - }, - "node_modules/jest-environment-uint8array/node_modules/@types/yargs": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", - "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-environment-uint8array/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/jest-environment-uint8array/node_modules/babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-environment-uint8array/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-environment-uint8array/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-uint8array/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-environment-uint8array/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-environment-uint8array/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/jest-environment-uint8array/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-environment-uint8array/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-environment-uint8array/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-environment-uint8array/node_modules/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "dependencies": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dev": true, - "dependencies": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "dependencies": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - }, - "engines": { - "node": ">= 6" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/jest-environment-uint8array/node_modules/jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "dev": true, - "dependencies": { - "@jest/types": "^24.9.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "dev": true, - "dependencies": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "dependencies": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-environment-uint8array/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-environment-uint8array/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-environment-uint8array/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-environment-uint8array/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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/jest-environment-uint8array/node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/stack-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", - "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-uint8array/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "dependencies": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jest-environment-uint8array/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-environment-uint8array/node_modules/write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@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": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", - "dev": true, - "dependencies": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", - "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", - "dev": true, - "dependencies": { - "jest-regex-util": "^28.0.2", - "jest-snapshot": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", - "dev": true, - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "dependencies": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "dependencies": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dev": true, - "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-sha256": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", - "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", - "dev": true - }, - "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==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/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==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "dev": true, - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "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, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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, - "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/object.getownpropertydescriptors": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", - "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", - "dev": true, - "dependencies": { - "array.prototype.reduce": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dev": true, - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/queue-microtask": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.1.2.tgz", - "integrity": "sha512-F9wwNePtXrzZenAB3ax0Y8TSKGvuB7Qw16J30hspEUTbfUM+H827XyN3rlpwhVmtm5wuZtbKIHjOnwDn7MUxWQ==", - "dev": true - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "dev": true, - "dependencies": { - "util.promisify": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", - "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "dev": true, - "dependencies": { - "bn.js": "^5.2.0" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/rlp/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==", - "dev": true - }, - "node_modules/rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true, - "engines": { - "node": "6.* || >= 7.*" - } - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "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, - "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/sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "deprecated": "some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added", - "dev": true, - "dependencies": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "bin": { - "sane": "src/cli.js" - }, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/sane/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/sane/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/sane/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/sane/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/sane/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/sane/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sane/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/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 - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sha3": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", - "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", - "dev": true, - "dependencies": { - "buffer": "6.0.3" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-git": { - "version": "2.48.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.48.0.tgz", - "integrity": "sha512-z4qtrRuaAFJS4PUd0g+xy7aN4y+RvEt/QTJpR184lhJguBA1S/LsVlvE/CM95RsYMOFJG3NGGDjqFCzKU19S/A==", - "dev": true, - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/steveukx/" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "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 - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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, - "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, - "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": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": 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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "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/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, - "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/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util.promisify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", - "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": 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", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.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==", - "dev": true, - "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==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "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" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", - "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", - "dev": true - }, - "@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", - "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7", - "@jridgewell/gen-mapping": "^0.3.2", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", - "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz", - "integrity": "sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.2.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", - "dev": true, - "requires": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", - "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", - "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "requires": { - "@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": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.20.7.tgz", - "integrity": "sha512-AveGOoi9DAjUYYuUAG//Ig69GlazLnoyzMw68VCDux+c1tsnnH/OkYcpz/5xzMkEFC6UxjR5Gw1c+iY2wOGVeQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "requires": { - "@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": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.20.7.tgz", - "integrity": "sha512-T+A7b1kfjtRM51ssoOfS1+wbyCVqorfyZhT99TvxxLMirPShD8CzKMRepMlCBGM5RpHMbn8s+5MMHnPstJH6mQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz", - "integrity": "sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-typescript": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", - "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.14.tgz", - "integrity": "sha512-sMPepQtsOs5fM1bwNvuJJHvaCfOEQfmc01FGw0ELlTpTJj5Ql/zuNRRldYhAPys4ghXdBIQJbRVYi44/7QflQQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.7.tgz", - "integrity": "sha512-LWYbsiXTPKl+oBlXUGlwNlJZetXD5Am+CyBdqhPsDVjM9Jc8jwBJFrKhHf900Kfk2eZG1y9MAG3UNajol7A4VQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.7.tgz", - "integrity": "sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.20.11.tgz", - "integrity": "sha512-S8e1f7WQ7cimJQ51JkAaDrEtohVEitXjgCGAS2N8S31Y42E+kWwfSz83LYz57QdBm7q9diARVqanIaH2oVgQnw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.7.tgz", - "integrity": "sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@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.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", - "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.13", - "@babel/types": "^7.20.7", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, - "@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/core": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz", - "integrity": "sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA==", - "dev": true, - "requires": { - "@jest/console": "^28.1.3", - "@jest/reporters": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@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": "^28.1.3", - "jest-config": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-resolve-dependencies": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "jest-watcher": "^28.1.3", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/environment": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz", - "integrity": "sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA==", - "dev": true, - "requires": { - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3" - } - }, - "@jest/expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw==", - "dev": true, - "requires": { - "expect": "^28.1.3", - "jest-snapshot": "^28.1.3" - } - }, - "@jest/expect-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", - "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", - "dev": true, - "requires": { - "jest-get-type": "^28.0.2" - } - }, - "@jest/fake-timers": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz", - "integrity": "sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@sinonjs/fake-timers": "^9.1.2", - "@types/node": "*", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - } - }, - "@jest/globals": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz", - "integrity": "sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA==", - "dev": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/types": "^28.1.3" - } - }, - "@jest/reporters": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz", - "integrity": "sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "@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": "^28.1.3", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.24.1" - } - }, - "@jest/source-map": { - "version": "28.1.2", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz", - "integrity": "sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.13", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - } - }, - "@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dev": true, - "requires": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - } - }, - "@jest/test-sequencer": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz", - "integrity": "sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw==", - "dev": true, - "requires": { - "@jest/test-result": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "slash": "^3.0.0" - } - }, - "@jest/transform": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz", - "integrity": "sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/types": "^28.1.3", - "@jridgewell/trace-mapping": "^0.3.13", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "dev": true, - "requires": { - "debug": "^4.1.1" - } - }, - "@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", - "dev": true - }, - "@onflow/config": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@onflow/config/-/config-1.0.5.tgz", - "integrity": "sha512-r2IUyY4SJgAY6YCzKL0cOOertHETp9BgVfCjTIq236WAHr7aMS1oNyqcVPPR++zjDK8n64lRgrxlcYSZB/LrFg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6", - "@onflow/util-actor": "^1.1.2" - } - }, - "@onflow/fcl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@onflow/fcl/-/fcl-1.3.2.tgz", - "integrity": "sha512-H2YduE8JUMqjUBR9R3YOFgWrT/yMg+aE5w8uwrMD3YJ/wGpF6iKo0XJGRa7kPVn5pP0HjKQnOlmCLvHwEGEhQQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6", - "@onflow/config": "^1.0.5", - "@onflow/interaction": "0.0.11", - "@onflow/rlp": "^1.0.2", - "@onflow/sdk": "^1.1.2", - "@onflow/types": "^1.0.5", - "@onflow/util-actor": "^1.1.1", - "@onflow/util-address": "^1.0.2", - "@onflow/util-invariant": "^1.0.2", - "@onflow/util-logger": "^1.1.1", - "@onflow/util-template": "^1.0.3", - "@onflow/util-uid": "^1.0.2", - "node-fetch": "^2.6.7" - } - }, - "@onflow/fcl-config": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@onflow/fcl-config/-/fcl-config-0.0.1.tgz", - "integrity": "sha512-umvYsAwejX2yGJ5OFxM1dEaKmFEXf+34f4rJfVkfEYztgJqLkUbBkEB8HQsI8M78QUpWkWuNArqwbFvFerBbHA==", - "dev": true - }, - "@onflow/flow-cadut": { - "version": "0.2.0-alpha.8", - "resolved": "https://registry.npmjs.org/@onflow/flow-cadut/-/flow-cadut-0.2.0-alpha.8.tgz", - "integrity": "sha512-gKVhHXhlE46zM16BueaK4ysIxzqXWC2/Tar5vJPwsh2KptnDeNCL4yQ3RM56GSEWElxBLNCARJB7UuChgPfzKQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6", - "@onflow/config": "0.0.2", - "@onflow/fcl": "^1.1.1-alpha.2", - "elliptic": "^6.5.4", - "esm": "^3.2.25", - "rimraf": "^3.0.2", - "rlp": "^3.0.0", - "sha3": "^2.1.4", - "simple-git": "^2.40.0", - "yargs": "^15.4.1" - }, - "dependencies": { - "@onflow/config": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@onflow/config/-/config-0.0.2.tgz", - "integrity": "sha512-H/+yrAalzEnMWkubiWsDdWytKSzd+OfRCddTlaRUelxfXhcfw2QWegH9N8EzeKfKXcQ6PLzvu9vQwhFxCZTE8Q==", - "dev": true, - "requires": { - "@onflow/util-actor": "0.0.2" - } - }, - "@onflow/util-actor": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@onflow/util-actor/-/util-actor-0.0.2.tgz", - "integrity": "sha512-NV3zPXQue3FqVgcIIMo6ifJOiP3hVSQTaR4ZrWLFU5iAZ/L73cTtBMbCB4BUFOe20ALtF2c9PFmpNVowCYV+nw==", - "dev": true, - "requires": { - "queue-microtask": "1.1.2" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.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==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "rlp": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-3.0.0.tgz", - "integrity": "sha512-PD6U2PGk6Vq2spfgiWZdomLvRGDreBLxi5jv5M8EpRo3pU6VEm31KO+HFxE18Q3vgqfDrQ9pZA3FP95rkijNKw==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.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 - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "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-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "@onflow/flow-js-testing": { - "version": "0.3.0-alpha.17", - "resolved": "https://registry.npmjs.org/@onflow/flow-js-testing/-/flow-js-testing-0.3.0-alpha.17.tgz", - "integrity": "sha512-c+8lAXEwuQqII4RgvO4vCyoRnXSVeGxxWpYtAaPmih/iP593H2LFCbDyGNA0jy63yfJuTtmDjvvsj9pUDt2y1g==", - "dev": true, - "requires": { - "@onflow/fcl": "^1.2.1-alpha.0", - "@onflow/fcl-config": "^0.0.1", - "@onflow/flow-cadut": "0.2.0-alpha.8", - "@onflow/types": "^1.0.3-alpha.0", - "elliptic": "^6.5.4", - "esm": "^3.2.25", - "jest-environment-uint8array": "^1.0.0", - "js-sha256": "^0.9.0", - "js-sha3": "^0.8.0", - "rimraf": "^3.0.2", - "rlp": "^2.2.6", - "yargs": "^17.0.1" - } - }, - "@onflow/interaction": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@onflow/interaction/-/interaction-0.0.11.tgz", - "integrity": "sha512-Xuq1Mmx6Wyba/F/L+QLQs0yJeQDsIDwy5SKk5vrCuVgIj0yD8k506g5L8ODrbM1LWll8i0tQsoOi0F85vNl5sA==", - "dev": true - }, - "@onflow/rlp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@onflow/rlp/-/rlp-1.0.4.tgz", - "integrity": "sha512-/4jSoh9eXPoN9iUCsbI+PAuTRJyYgT+XR4NdZYmxILRwOtIsSd2I9XatA4rrSzk9DJ0h8l9SmYx1y0XLnD+ohQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6", - "buffer": "^6.0.3" - } - }, - "@onflow/sdk": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@onflow/sdk/-/sdk-1.1.2.tgz", - "integrity": "sha512-HNfQ6Q91FfFwd2g1wa/YHvmv6BYeXGONkEJyfOaoPRIbp3lG9W35HYX7Yvgtn7fvcQG+TRL8n386mzJ6Vn4dmA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6", - "@onflow/config": "^1.0.3", - "@onflow/rlp": "^1.0.2", - "@onflow/transport-http": "^1.5.0", - "@onflow/util-actor": "^1.1.1", - "@onflow/util-address": "^1.0.2", - "@onflow/util-invariant": "^1.0.2", - "@onflow/util-logger": "^1.1.1", - "@onflow/util-template": "^1.0.3", - "deepmerge": "^4.2.2", - "sha3": "^2.1.4" - } - }, - "@onflow/transport-http": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@onflow/transport-http/-/transport-http-1.5.0.tgz", - "integrity": "sha512-CGgfPC1kI+ssqDgFXxGgKHLVtu1tCGtyGJiS/fplyVun9RC7AwEp2KkjTP2dxRlto3HmntoaBkOw7z38UCxRZw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6", - "@onflow/util-address": "^1.0.2", - "@onflow/util-invariant": "^1.0.2", - "@onflow/util-logger": "^1.1.1", - "@onflow/util-template": "^1.0.3", - "node-fetch": "^2.6.7" - } - }, - "@onflow/types": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@onflow/types/-/types-1.0.5.tgz", - "integrity": "sha512-Uf6APOwgkxPwgonQ8JRrOB0KZ5eJpNBVXlEiZIv5ddzsfM6qd9p3csEE5YmuLhAooAcisG3ROTzw2hT/zUNGbw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6" - } - }, - "@onflow/util-actor": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@onflow/util-actor/-/util-actor-1.1.2.tgz", - "integrity": "sha512-fsRGw5c2idlG5T0u48tzah1iE0OIc4WmgrNYN0gQ1NHX+Ue8iySoQdCIcdSxJCHOXwpHWe68fWTonCzbRJOssQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6", - "queue-microtask": "1.1.2" - } - }, - "@onflow/util-address": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@onflow/util-address/-/util-address-1.0.3.tgz", - "integrity": "sha512-w8DPYSvYm5h0hhZ0hZwiCwu9UgJBtIv2KyhDiH3TZG8srT+9GxtTPX4NzZtAVuxqWTNVlTGePD/Upxusiwnk6g==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6" - } - }, - "@onflow/util-invariant": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@onflow/util-invariant/-/util-invariant-1.0.3.tgz", - "integrity": "sha512-+Hk93W9JwACLkM5/oOILqI9L55o5QxETBV5Du/2dLgNbjXDElMmQzURFXx6fTmODTLZ6Ri+d1nvb7AxapYFe0Q==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6" - } - }, - "@onflow/util-logger": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@onflow/util-logger/-/util-logger-1.1.2.tgz", - "integrity": "sha512-BcVDzKNGv/j3gqnq1lc0fpJV7LCHWPJyzYR588/keiY90mFHwLe8ahXYG1UYPu02KymlVqlInfISKWlNwk4aug==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6", - "@onflow/config": "^1.0.4" - } - }, - "@onflow/util-template": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@onflow/util-template/-/util-template-1.0.4.tgz", - "integrity": "sha512-syTJzhFn+CaW/FAqVLJJ3Oq9pTuxS5Wk0+g9AkSKWJ8PCY+FLr7UC2mGr/5pO//L13Elz7cv/djXVxNA1ULQmw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6" - } - }, - "@onflow/util-uid": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@onflow/util-uid/-/util-uid-1.0.3.tgz", - "integrity": "sha512-hBdfV+0BSDphcvLvL8KFivyV5ZhpVyRcrOn0fuSD4is/hN5d1mLFBev9gur9gdmQUUwgFt0v+aA/Tc/7mRDctQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.18.6" - } - }, - "@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", - "dev": true - }, - "@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", - "dev": true, - "requires": { - "@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.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz", - "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==", - "dev": true, - "requires": { - "@babel/types": "^7.3.0" - } - }, - "@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/node": { - "version": "18.11.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "dev": true - }, - "@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true - }, - "@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", - "dev": true - }, - "@types/yargs": { - "version": "17.0.20", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.20.tgz", - "integrity": "sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "dev": 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, - "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" - } - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": 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 - }, - "babel-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz", - "integrity": "sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q==", - "dev": true, - "requires": { - "@jest/transform": "^28.1.3", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^28.1.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - } - }, - "babel-plugin-jest-hoist": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz", - "integrity": "sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q==", - "dev": true, - "requires": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - } - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - } - }, - "babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dev": true, - "requires": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - } - }, - "babel-preset-jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz", - "integrity": "sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A==", - "dev": true, - "requires": { - "babel-plugin-jest-hoist": "^28.1.3", - "babel-preset-current-node-syntax": "^1.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "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 - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", - "dev": true - }, - "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "requires": { - "node-int64": "^0.4.0" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "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==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001449", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz", - "integrity": "sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw==", - "dev": true - }, - "capture-exit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", - "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", - "dev": true, - "requires": { - "rsvp": "^4.8.4" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true - }, - "ci-info": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.1.tgz", - "integrity": "sha512-4jYS4MOAaCIStSRwiuxc4B8MYhIe676yO1sYGzARnjXkWpmzZMMYxY6zu8WYWDhSuth5zhrQ1rhNSibyyvv4/w==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true - }, - "core-js-compat": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.27.2.tgz", - "integrity": "sha512-welaYuF7ZtbYKGrIy7y3eb40d37rG1FvzEOfe7hSLd2iD6duMDqUhRfSvCGyC46HhR6Y8JXXdZ2lnRUMkPBpvg==", - "dev": true, - "requires": { - "browserslist": "^4.21.4" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "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 - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "dev": true - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true - }, - "deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "diff-sequences": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", - "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", - "dev": true - }, - "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "requires": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "dev": true - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "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.4", - "is-array-buffer": "^3.0.1", - "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.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - } - }, - "es-array-method-boxes-properly": { - "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 - }, - "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, - "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, - "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==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": 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 - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "exec-sh": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.6.tgz", - "integrity": "sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "expect": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", - "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", - "dev": true, - "requires": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "requires": { - "bser": "2.1.1" - } - }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "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, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "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 - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "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" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-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 - }, - "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==", - "dev": true - }, - "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, - "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 - }, - "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 - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "internal-slot": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", - "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "requires": { - "loose-envify": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "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, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "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 - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - }, - "dependencies": { - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - } - } - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true - }, - "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 - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-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, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-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, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": 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" - } - }, - "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, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dev": true, - "requires": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - } - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jest": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz", - "integrity": "sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA==", - "dev": true, - "requires": { - "@jest/core": "^28.1.3", - "@jest/types": "^28.1.3", - "import-local": "^3.0.2", - "jest-cli": "^28.1.3" - } - }, - "jest-changed-files": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz", - "integrity": "sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "p-limit": "^3.1.0" - } - }, - "jest-circus": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz", - "integrity": "sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow==", - "dev": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/expect": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "is-generator-fn": "^2.0.0", - "jest-each": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "p-limit": "^3.1.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-cli": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz", - "integrity": "sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ==", - "dev": true, - "requires": { - "@jest/core": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "prompts": "^2.0.1", - "yargs": "^17.3.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-config": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz", - "integrity": "sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^28.1.3", - "@jest/types": "^28.1.3", - "babel-jest": "^28.1.3", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-circus": "^28.1.3", - "jest-environment-node": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-runner": "^28.1.3", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-diff": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", - "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-docblock": { - "version": "28.1.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz", - "integrity": "sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA==", - "dev": true, - "requires": { - "detect-newline": "^3.0.0" - } - }, - "jest-each": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz", - "integrity": "sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "jest-util": "^28.1.3", - "pretty-format": "^28.1.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-environment-node": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz", - "integrity": "sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A==", - "dev": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "jest-mock": "^28.1.3", - "jest-util": "^28.1.3" - } - }, - "jest-environment-uint8array": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jest-environment-uint8array/-/jest-environment-uint8array-1.0.0.tgz", - "integrity": "sha512-PhZFy1N9AyuAs4Mr25/I+oiHEF25t7e74UTL9oTCmasfy8HGAKvPL6Wc43zgF0sV05dLLPS9yplxHfgxMw1E0w==", - "dev": true, - "requires": { - "jest-environment-node": "^24.8.0" - }, - "dependencies": { - "@jest/console": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", - "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", - "dev": true, - "requires": { - "@jest/source-map": "^24.9.0", - "chalk": "^2.0.1", - "slash": "^2.0.0" - } - }, - "@jest/environment": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.9.0.tgz", - "integrity": "sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==", - "dev": true, - "requires": { - "@jest/fake-timers": "^24.9.0", - "@jest/transform": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/fake-timers": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", - "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "jest-message-util": "^24.9.0", - "jest-mock": "^24.9.0" - } - }, - "@jest/source-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", - "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", - "dev": true, - "requires": { - "callsites": "^3.0.0", - "graceful-fs": "^4.1.15", - "source-map": "^0.6.0" - } - }, - "@jest/test-result": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", - "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/istanbul-lib-coverage": "^2.0.0" - } - }, - "@jest/transform": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", - "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", - "dev": true, - "requires": { - "@babel/core": "^7.1.0", - "@jest/types": "^24.9.0", - "babel-plugin-istanbul": "^5.1.0", - "chalk": "^2.0.1", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.1.15", - "jest-haste-map": "^24.9.0", - "jest-regex-util": "^24.9.0", - "jest-util": "^24.9.0", - "micromatch": "^3.1.10", - "pirates": "^4.0.1", - "realpath-native": "^1.1.0", - "slash": "^2.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "2.4.1" - } - }, - "@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - } - }, - "@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, - "@types/stack-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", - "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", - "dev": true - }, - "@types/yargs": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", - "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", - "dev": true, - "requires": { - "@types/yargs-parser": "*" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "babel-plugin-istanbul": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", - "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "find-up": "^3.0.0", - "istanbul-lib-instrument": "^3.3.0", - "test-exclude": "^5.2.3" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.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, - "requires": { - "locate-path": "^3.0.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - } - }, - "jest-environment-node": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.9.0.tgz", - "integrity": "sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==", - "dev": true, - "requires": { - "@jest/environment": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/types": "^24.9.0", - "jest-mock": "^24.9.0", - "jest-util": "^24.9.0" - } - }, - "jest-haste-map": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", - "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0", - "anymatch": "^2.0.0", - "fb-watchman": "^2.0.0", - "fsevents": "^1.2.7", - "graceful-fs": "^4.1.15", - "invariant": "^2.2.4", - "jest-serializer": "^24.9.0", - "jest-util": "^24.9.0", - "jest-worker": "^24.9.0", - "micromatch": "^3.1.10", - "sane": "^4.0.3", - "walker": "^1.0.7" - } - }, - "jest-message-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", - "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "@types/stack-utils": "^1.0.1", - "chalk": "^2.0.1", - "micromatch": "^3.1.10", - "slash": "^2.0.0", - "stack-utils": "^1.0.1" - } - }, - "jest-mock": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", - "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", - "dev": true, - "requires": { - "@jest/types": "^24.9.0" - } - }, - "jest-regex-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", - "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==", - "dev": true - }, - "jest-util": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", - "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", - "dev": true, - "requires": { - "@jest/console": "^24.9.0", - "@jest/fake-timers": "^24.9.0", - "@jest/source-map": "^24.9.0", - "@jest/test-result": "^24.9.0", - "@jest/types": "^24.9.0", - "callsites": "^3.0.0", - "chalk": "^2.0.1", - "graceful-fs": "^4.1.15", - "is-ci": "^2.0.0", - "mkdirp": "^0.5.1", - "slash": "^2.0.0", - "source-map": "^0.6.0" - } - }, - "jest-worker": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", - "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", - "dev": true, - "requires": { - "merge-stream": "^2.0.0", - "supports-color": "^6.1.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, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "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, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "stack-utils": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", - "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "write-file-atomic": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", - "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - } - } - }, - "jest-get-type": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", - "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", - "dev": true - }, - "jest-haste-map": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz", - "integrity": "sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "fsevents": "^2.3.2", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^28.0.2", - "jest-util": "^28.1.3", - "jest-worker": "^28.1.3", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - } - }, - "jest-leak-detector": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz", - "integrity": "sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA==", - "dev": true, - "requires": { - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - } - }, - "jest-matcher-utils": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", - "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-mock": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz", - "integrity": "sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*" - } - }, - "jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} - }, - "jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "dev": true - }, - "jest-resolve": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz", - "integrity": "sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^28.1.3", - "jest-validate": "^28.1.3", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-resolve-dependencies": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz", - "integrity": "sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA==", - "dev": true, - "requires": { - "jest-regex-util": "^28.0.2", - "jest-snapshot": "^28.1.3" - } - }, - "jest-runner": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz", - "integrity": "sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA==", - "dev": true, - "requires": { - "@jest/console": "^28.1.3", - "@jest/environment": "^28.1.3", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "graceful-fs": "^4.2.9", - "jest-docblock": "^28.1.1", - "jest-environment-node": "^28.1.3", - "jest-haste-map": "^28.1.3", - "jest-leak-detector": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-resolve": "^28.1.3", - "jest-runtime": "^28.1.3", - "jest-util": "^28.1.3", - "jest-watcher": "^28.1.3", - "jest-worker": "^28.1.3", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-runtime": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz", - "integrity": "sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw==", - "dev": true, - "requires": { - "@jest/environment": "^28.1.3", - "@jest/fake-timers": "^28.1.3", - "@jest/globals": "^28.1.3", - "@jest/source-map": "^28.1.2", - "@jest/test-result": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-mock": "^28.1.3", - "jest-regex-util": "^28.0.2", - "jest-resolve": "^28.1.3", - "jest-snapshot": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-serializer": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", - "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", - "dev": true - }, - "jest-snapshot": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz", - "integrity": "sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg==", - "dev": true, - "requires": { - "@babel/core": "^7.11.6", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.3.3", - "@jest/expect-utils": "^28.1.3", - "@jest/transform": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^28.1.3", - "graceful-fs": "^4.2.9", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-haste-map": "^28.1.3", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "natural-compare": "^1.4.0", - "pretty-format": "^28.1.3", - "semver": "^7.3.5" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-validate": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz", - "integrity": "sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA==", - "dev": true, - "requires": { - "@jest/types": "^28.1.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^28.0.2", - "leven": "^3.1.0", - "pretty-format": "^28.1.3" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dev": true, - "requires": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-sha256": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", - "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", - "dev": true - }, - "js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "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 - }, - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "requires": { - "tmpl": "1.0.5" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "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==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "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, - "requires": { - "minimist": "^1.2.6" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true - }, - "node-releases": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", - "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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 - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "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, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", - "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", - "dev": true, - "requires": { - "array.prototype.reduce": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - }, - "dependencies": { - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - } - } - }, - "p-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 - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true - }, - "pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dev": true, - "requires": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dev": true, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "queue-microtask": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.1.2.tgz", - "integrity": "sha512-F9wwNePtXrzZenAB3ax0Y8TSKGvuB7Qw16J30hspEUTbfUM+H827XyN3rlpwhVmtm5wuZtbKIHjOnwDn7MUxWQ==", - "dev": true - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - }, - "dependencies": { - "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, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "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, - "requires": { - "p-limit": "^2.0.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } - } - }, - "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "dev": true, - "requires": { - "util.promisify": "^1.0.0" - } - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpu-core": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.2.tgz", - "integrity": "sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw==", - "dev": true, - "requires": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true - }, - "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==", - "dev": true - }, - "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 - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "dev": true - }, - "resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "dev": true, - "requires": { - "bn.js": "^5.2.0" - }, - "dependencies": { - "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==", - "dev": true - } - } - }, - "rsvp": { - "version": "4.8.5", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", - "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "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, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "sane": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", - "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", - "dev": true, - "requires": { - "@cnakazawa/watch": "^1.0.3", - "anymatch": "^2.0.0", - "capture-exit": "^2.0.0", - "exec-sh": "^0.3.2", - "execa": "^1.0.0", - "fb-watchman": "^2.0.0", - "micromatch": "^3.1.4", - "minimist": "^1.1.1", - "walker": "~1.0.5" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "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 - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "sha3": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", - "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", - "dev": true, - "requires": { - "buffer": "6.0.3" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-git": { - "version": "2.48.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-2.48.0.tgz", - "integrity": "sha512-z4qtrRuaAFJS4PUd0g+xy7aN4y+RvEt/QTJpR184lhJguBA1S/LsVlvE/CM95RsYMOFJG3NGGDjqFCzKU19S/A==", - "dev": true, - "requires": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.2" - } - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "requires": { - "escape-string-regexp": "^2.0.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true - } - } - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "requires": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "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, - "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, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "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 - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "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, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "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, - "requires": { - "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": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true - } - } - }, - "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util.promisify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", - "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" - } - }, - "v8-to-istanbul": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", - "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "requires": { - "makeerror": "1.0.12" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "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, - "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 - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": 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", - "is-typed-array": "^1.1.10" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", - "dev": true, - "requires": { - "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" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": 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==", - "dev": true - } - } -} diff --git a/lib/js/test/package.json b/lib/js/test/package.json deleted file mode 100644 index 3f56a28..0000000 --- a/lib/js/test/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "name": "test", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "jest" - }, - "files": [ - "../../../contracts/*", - "../../../transactions/*", - "../../../scripts/*" - ], - "keywords": [], - "author": "", - "license": "ISC", - "devDependencies": { - "@babel/core": "^7.18.0", - "@babel/preset-env": "^7.18.0", - "babel-jest": "^28.1.0", - "@onflow/flow-js-testing": "0.3.0-alpha.17", - "jest": "^28.1.0", - "jest-environment-node": "^28.1.0" - } -} diff --git a/lib/js/test/rps.test.js b/lib/js/test/rps.test.js deleted file mode 100644 index 97e412b..0000000 --- a/lib/js/test/rps.test.js +++ /dev/null @@ -1,495 +0,0 @@ -import path from "path"; -import { - emulator, - init, - getAccountAddress, - deployContractByName, - sendTransaction, - shallPass, - shallRevert, - executeScript, - mintFlow -} from "@onflow/flow-js-testing"; -import fs from "fs"; -import { - assertCollectionLength, - assertNFTInCollection -} from "./templates/assertion_templates"; -import { - setupAccountNFTCollection, - mintNFT, - accessProviderPasses, - accessProviderReverts, - setupGamePlayer, - accessGamePlayerIDFromPrivatePasses, - accessGamePlayerIDFromPrivateReverts, - onboardPlayer, - setupNewSingleplayerMatch, - setupNewMultiplayerMatch, - submitMovePasses, - submitMoveReverts, - submitAutomatedPlayerMovePasses, - submitAutomatedPlayerMoveReverts, - submitBothSingleplayerMovesPasses, - submitBothSingleplayerMovesReverts, - escrowNFTToExistingMatch, - resolveMatchPasses, - resolveMatchReverts, - returnNFTsFromEscrowPasses, - returnNFTsFromEscrowReverts, - resolveMatchAndReturnNFTsPasses, - cheatSingleplayerSubmissionReverts, - cheatMultiplayerSubmissionReverts, - blockResolutionReverts, - removeAllRPSAttachmentsPasses -} from "./templates/transaction_templates"; -import { - getAssignedMovesFromNFT, - getCollectionIDs, getGamePlayerID, getMatchesInLobby, getMatchesInPlay, getMatchMoveHistory, getRPSWinLoss -} from "./templates/script_templates"; - -// Auxiliary function for deploying the cadence contracts -async function deployContract(param) { - const [result, error] = await deployContractByName(param); - if (error != null) { - console.log(`Error in deployment - ${error}`); - emulator.stop(); - process.exit(1); - } -} - -const MATCH_TIME_LIMIT = 10; -const ROCK = 0; -const PAPER = 0; -const SCISSORS = 0; -//const get_collection_ids = fs.readFileSync(path.resolve(__dirname, "./../../../scripts/game_piece_nft/get_collection_ids.cdc"), {encoding:'utf8', flag:'r'}); -//const get_matches_in_play = fs.readFileSync(path.resolve(__dirname, "./../../../scripts/rock_paper_scissors_game/get_matches_in_play.cdc"), {encoding:'utf8', flag:'r'}); -//const get_match_move_history = fs.readFileSync(path.resolve(__dirname, "./../../../scripts/rock_paper_scissors_game/get_match_move_history.cdc"), {encoding:'utf8', flag:'r'}); -//const get_rps_win_loss = fs.readFileSync(path.resolve(__dirname, "./../../../scripts/game_piece_nft/get_rps_win_loss.cdc"), {encoding:'utf8', flag:'r'}); - -// Defining the test suite for the fungible token switchboard -describe("rockpaperscissorsgame", ()=>{ - - // Variables for holding the account address - let serviceAccount; - let gameAdmin; - let playerOne; - let playerTwo; - - // Before each test... - beforeEach(async () => { - // We do some scafolding... - - // Getting the base path of the project - const basePath = path.resolve(__dirname, "./../../../"); - // You can specify different port to parallelize execution of describe blocks - const port = 8080; - // Setting logging flag to true will pipe emulator output to console - const logging = false; - - await init(basePath); - await emulator.start({ logging }); - - // ...then we deploy the ft and example token contracts using the getAccountAddress function - // from the flow-js-testing library... - - // Create a service account and deploy contracts to it - serviceAccount = await getAccountAddress("ServiceAccount") - gameAdmin = await getAccountAddress("GameAdmin"); - - await mintFlow(serviceAccount, 10000.0); - await deployContract({ to: serviceAccount, name: "utility/FungibleToken"}); - await deployContract({ to: serviceAccount, name: "utility/NonFungibleToken"}); - await deployContract({ to: serviceAccount, name: "utility/MetadataViews"}); - await deployContract({ to: serviceAccount, name: "utility/FungibleTokenMetadataViews" }); - await deployContract({ to: serviceAccount, name: "GamingMetadataViews" }); - await deployContract({ to: serviceAccount, name: "DynamicNFT" }); - await deployContract({ to: serviceAccount, name: "GamePieceNFT" }); - await deployContract({ to: serviceAccount, name: "TicketToken" }); - await deployContract({ to: serviceAccount, name: "ArcadePrize" }); - await mintFlow(gameAdmin, 10000.0); - await deployContract({ to: gameAdmin, name: "RockPaperScissorsGame"}); - - playerOne = await getAccountAddress("PlayerOne"); - playerTwo = await getAccountAddress("PlayerTwo"); - - }); - - // After each test we stop the emulator, so it could be restarted - afterEach(async () => { - return emulator.stop(); - }); - - /************ - * Setup - ************/ - - // First test checks if a user can get a GamePieceNFT - test("player should be able to mint GamePieceNFT", async () => { - // First step: create a collection - await setupAccountNFTCollection(playerOne); - // Second step: mint NFT - await mintNFT(playerOne, serviceAccount); - // Third step: assert collection length - await assertCollectionLength(playerOne, 1); - }); - - // Second test checks if a player is able to create a GamePlayer & is configured correctly - test("player should be able to create a GamePlayer", async () => { - // First step: create, save & link a GamePlayer resource - await setupGamePlayer(playerOne); - // Second step: ensure GamePlayerPublic capability is accessible to all - const gamePlayerID = await getGamePlayerID(playerOne); - expect(gamePlayerID).not.toBe(null); - // Third step: ensure GamePlayerID private capability is accessible to signer - await accessGamePlayerIDFromPrivatePasses(playerOne); - // Fourth step: ensure GamePlayerID private capabilitiy is not accessible to public - await accessGamePlayerIDFromPrivateReverts(serviceAccount); - }); - - // Third test checks if single onboarding transaction creates GamePlayer, Collection & NFT - // and configures them correctly - test("player should have all resources configured with single onboarding transaction", async () => { - // First step: create, save & link GamePlayer & Collection resources & mint NFT - await onboardPlayer(playerOne, serviceAccount); - // Second step: ensure GamePlayerPublic capability is accessible - const gamePlayerID = await getGamePlayerID(playerOne); - expect(gamePlayerID).not.toBe(null); - // Third step: ensure GamePlayerID private capability is accessible to signer - await accessGamePlayerIDFromPrivatePasses(playerOne); - // Fourth step: ensure GamePlayerID private capabilitiy is not accessible to public - await accessGamePlayerIDFromPrivateReverts(serviceAccount); - // Fifth step: ensure CollectionPublic capability is accessible to all by checking Collection length - await assertCollectionLength(playerOne, 1); - // Sixth step: ensure Provider capability is accessible to signer - await accessProviderPasses(playerOne); - // Seventh step: ensure Provider capability is not accessible to all - await accessProviderReverts(serviceAccount); - }); - - /***************** - * Singleplayer - *****************/ - - // Fourth test checks if a player is able to create a single player Match, escrowing its GamePieceNFT - test("player should be able to create a single player Match", async () => { - // First step: create, save & link GamePlayer & Collection resources & mint NFT - await onboardPlayer(playerOne, serviceAccount); - // Second step: get the GamePieceNFT id - const nftIDs = await getCollectionIDs(playerOne); - // Third step: create a Match resource for a single player - await setupNewSingleplayerMatch(playerOne, parseInt(nftIDs[0]), MATCH_TIME_LIMIT); - }); - - // Fifth test checks if a player is able to submit moves to a single player match - test("player should be able to submit Move to a single player Match", async () => { - // First step: create, save & link GamePlayer & Collection resources & mint NFT - await onboardPlayer(playerOne, serviceAccount); - // Second step: get the GamePieceNFT id - const nftIDs = await getCollectionIDs(playerOne); - // Third step: create a Match resource for a single player - await setupNewSingleplayerMatch(playerOne, parseInt(nftIDs[0]), MATCH_TIME_LIMIT); - // Fourth step: get the Match id - const matchIDs = await getMatchesInPlay(playerOne); - // Fifth step: submit move to match - await submitMovePasses(playerOne, parseInt(matchIDs[0]), ROCK); - // Sixth step: try to submit another move & fail - await submitMoveReverts(playerOne, parseInt(matchIDs[0]), ROCK); - // Seventh step: submit automated player's move - await submitAutomatedPlayerMovePasses(parseInt(matchIDs[0])) - // Eighth step: try to submit automated player's move again & fail - await submitAutomatedPlayerMoveReverts(parseInt(matchIDs[0])) - }); - - // Sixth test checks if a player is able to submit autoplayer move to a single player Match - test("player should be able to submit autoplayer Move to a single player Match", async () => { - // First step: create, save & link GamePlayer & Collection resources & mint NFT - await onboardPlayer(playerOne, serviceAccount); - // Second step: get the GamePieceNFT id - const nftIDs = await getCollectionIDs(playerOne); - // Third step: create a Match resource for a single player - await setupNewSingleplayerMatch(playerOne, parseInt(nftIDs[0]), MATCH_TIME_LIMIT); - // Fourth step: get the Match id - const matchIDs = await getMatchesInPlay(playerOne); - // Fifth step: submit player and autoplayer moves to match - await submitBothSingleplayerMovesPasses(playerOne, parseInt(matchIDs[0]), ROCK); // Any decent RPS player will always play rock on the first round - }); - - // Eighth test checks if a player is able to submit auto player moves to the match it is playing - test("player should be able to complete SinglePlayer match", async () => { - // First step: create, save & link GamePlayer & Collection resources & mint NFT - await onboardPlayer(playerOne, serviceAccount); - // Second step: get the GamePieceNFT id - const nftIDs = await getCollectionIDs(playerOne); - // Third step: create a Match resource for a single player - await setupNewSingleplayerMatch(playerOne, parseInt(nftIDs[0]), MATCH_TIME_LIMIT); - - // Validate: NFT has been escrowed to Match & is not in player's collection - let emptyCollectionIDs = await getCollectionIDs(playerOne); - expect(emptyCollectionIDs).toEqual([]); - - // Fourth step: get the Match id - const matchIDs = await getMatchesInPlay(playerOne); - - // Validate: Automated player's move cannot be played first - await submitAutomatedPlayerMoveReverts(parseInt(matchIDs[0])); - - // Seventh step: submit move to match - await submitMovePasses(playerOne, parseInt(matchIDs[0]), ROCK); - // Eighth step: submit autoplayer move - await submitAutomatedPlayerMovePasses(parseInt(matchIDs[0])); - - // Ninth step: resolve match & return NFT - await resolveMatchAndReturnNFTsPasses(playerOne, parseInt(matchIDs[0])); - // Validate: Check NFT returned is the NFT that was escrowed - await assertNFTInCollection(playerOne, nftIDs[0]); - - // TODO: Add equals value check - need to navigate ResponseObject to relevant value - // Validate: get match outcome - const history = await getMatchMoveHistory(parseInt(matchIDs[0])); - expect(history).not.toBe(null); - // Validate: Win/loss record attached & accessible on NFT - const winLoss = await getRPSWinLoss(playerOne, parseInt(nftIDs[0])); - expect(winLoss).not.toBe(null); - // Validate: Check the assigned moves on the NFT - const assignedMoves = await getAssignedMovesFromNFT(playerOne, parseInt(nftIDs[0])); - expect(assignedMoves).not.toBe(null); - // Validate: Removing all game-related attachments passes - await removeAllRPSAttachmentsPasses(playerOne, parseInt(nftIDs[0])); - }); - - // Check that cheating end-to-end is not possible - test("player should not be able to condition a transaction on match outcome", async () => { - // First step: create, save & link GamePlayer & Collection resources & mint NFT - await onboardPlayer(playerOne, serviceAccount); - // Second step: get the GamePieceNFT id - const nftIDs = await getCollectionIDs(playerOne); - // Third step: create a Match resource for a single player - await setupNewSingleplayerMatch(playerOne, parseInt(nftIDs[0]), MATCH_TIME_LIMIT); - // Fourth step: get the Match id - const matchIDs = await getMatchesInPlay(playerOne); - // Fifth step: attempt to cheat & fail - await cheatSingleplayerSubmissionReverts(playerOne, parseInt(nftIDs[0]), ROCK); - }); - - /***************** - * Multiplayer - *****************/ - - // Seventh test checks if a player is able to join an already existing match - test("player should be able to join an existing Match", async () => { - // First step: create, save & link GamePlayer & Collection resources & mint NFT - await onboardPlayer(playerOne, serviceAccount); - await onboardPlayer(playerTwo, serviceAccount); - // Fourth step: get the GamePieceNFT ids - const playerOneNFTIDs = await getCollectionIDs(playerOne); - const playerTwoNFTIDs = await getCollectionIDs(playerTwo); - // Fifth step: create a Match resource for a multi player match - await setupNewMultiplayerMatch(playerOne, parseInt(playerOneNFTIDs[0]), playerTwo, 10); - // Sixth step: get the Match id - const matchIDs = await getMatchesInLobby(playerTwo); - // Seventh step: signup player 2 to match - await escrowNFTToExistingMatch(playerTwo, parseInt(matchIDs[0]), parseInt(playerTwoNFTIDs[0])); - }); - - // Ninth test checks if a player is able to join an already existing match - test("Two players should be able to complete a Match", async () => { - // First step: create, save & link GamePlayer & Collection resources & mint NFT - await onboardPlayer(playerOne, serviceAccount); - await onboardPlayer(playerTwo, serviceAccount); - - // Second step: get the GamePieceNFT ids - const playerOneNFTIDs = await getCollectionIDs(playerOne); - const playerTwoNFTIDs = await getCollectionIDs(playerTwo); - - // Validate: win/loss records aren't yet attached to NFT - let playerOneWinLoss = await getRPSWinLoss(playerOne, parseInt(playerOneNFTIDs[0])); - let playerTwoWinLoss = await getRPSWinLoss(playerTwo, parseInt(playerTwoNFTIDs[0])); - expect(playerOneWinLoss).toBe(null); - expect(playerTwoWinLoss).toBe(null); - // Validate: assigned moves aren't yet attached to NFT - let playerOneAssignedMoves = await getAssignedMovesFromNFT(playerOne, parseInt(playerOneNFTIDs[0])); - let playerTwoAssignedMoves = await getAssignedMovesFromNFT(playerTwo, parseInt(playerTwoNFTIDs[0])); - expect(playerOneAssignedMoves).toBe(null); - expect(playerTwoAssignedMoves).toBe(null); - - // Third step: create a Match resource for a multi player match - await setupNewMultiplayerMatch(playerOne, parseInt(playerOneNFTIDs[0]), playerTwo, 10); - - // Fourth step: get the Match id - const playerOneInPlayMatchIDs = await getMatchesInPlay(playerOne); - let playerTwoInLobbyMatchIDs = await getMatchesInLobby(playerTwo); - // Validate: playerOne has MatchPlayerActions for same Match playerTwo has MatchLobbyActions - expect(playerOneInPlayMatchIDs).toEqual(playerTwoInLobbyMatchIDs); - - // Fifth step: signup player 2 to match by escrowing their NFT - await escrowNFTToExistingMatch(playerTwo, parseInt(playerTwoInLobbyMatchIDs[0]), parseInt(playerTwoNFTIDs[0])); - - // Validate: playerTwo now has ability to play Match - const playerTwoInPlayMatchIDs = await getMatchesInPlay(playerTwo); - expect(playerTwoInPlayMatchIDs).toEqual(playerOneInPlayMatchIDs); - // Validate: MatchLobbyActions has been removed from playerTwo's GamePlayer - playerTwoInLobbyMatchIDs = await getMatchesInLobby(playerTwo); - expect(playerTwoInLobbyMatchIDs).toEqual([]); - - // Validate: Someone tries to submit an automated player's move & fails - await submitAutomatedPlayerMoveReverts(parseInt(playerOneInPlayMatchIDs[0])); - - // Sixth step: Player one submits their move - rock - await submitMovePasses(playerOne, parseInt(playerOneInPlayMatchIDs[0]), ROCK); - - // Validate: playerOne tries to cheat auto move and fails - await submitAutomatedPlayerMoveReverts(parseInt(playerOneInPlayMatchIDs[0])); - // Validate: playerOne attempts to resolve match early & fails - await resolveMatchReverts(playerOne, parseInt(playerOneInPlayMatchIDs[0])); - // Validate: playerOne attempts to return NFTs before Match is over & fails - await returnNFTsFromEscrowReverts(playerOne, parseInt(playerOneInPlayMatchIDs[0])); - - // Seventh step: playerTwo submits their move - rock - await submitMovePasses(playerTwo, parseInt(playerTwoInPlayMatchIDs[0]), ROCK); - - // Eight step: Resolve match - await resolveMatchPasses(playerOne, parseInt(playerOneInPlayMatchIDs[0])); - - // Ninth step: Return NFTs from Match escrow - await returnNFTsFromEscrowPasses(playerOne, parseInt(playerOneInPlayMatchIDs[0])); - - // Validate: Assert the original NFTs are back in the players' collections - await assertNFTInCollection(playerOne, playerOneNFTIDs[0]); - await assertNFTInCollection(playerTwo, playerTwoNFTIDs[0]); - - // Tenth step: get match outcome - const history = await getMatchMoveHistory(parseInt(playerOneInPlayMatchIDs[0])); - playerOneWinLoss = await getRPSWinLoss(playerOne, parseInt(playerOneNFTIDs[0])); - playerTwoWinLoss = await getRPSWinLoss(playerTwo, parseInt(playerTwoNFTIDs[0])); - // Validate: both player NFTs have win/loss records attached & accessible - // TODO: Add equals value check - need to navigate ResponseObject to relevant value - expect(history).not.toBe(null); - expect(playerOneWinLoss).not.toBe(null); - expect(playerTwoWinLoss).not.toBe(null); - // Validate: assigned moves have been attached to NFTs & are accessible - playerOneAssignedMoves = await getAssignedMovesFromNFT(playerOne, parseInt(playerOneNFTIDs[0])); - playerTwoAssignedMoves = await getAssignedMovesFromNFT(playerTwo, parseInt(playerTwoNFTIDs[0])); - expect(playerOneAssignedMoves).not.toBe(null); - expect(playerTwoAssignedMoves).not.toBe(null); - }); - - // Ninth test checks if a player is able to join an already existing match - test("Second player tries to condition move submission on winning - fails", async () => { - // First step: create, save & link GamePlayer & Collection resources & mint NFT - await onboardPlayer(playerOne, serviceAccount); - await onboardPlayer(playerTwo, serviceAccount); - - // Second step: get the GamePieceNFT ids - const playerOneNFTIDs = await getCollectionIDs(playerOne); - const playerTwoNFTIDs = await getCollectionIDs(playerTwo); - - // Validate: win/loss records aren't yet attached to NFT - let playerOneWinLoss = await getRPSWinLoss(playerOne, parseInt(playerOneNFTIDs[0])); - let playerTwoWinLoss = await getRPSWinLoss(playerTwo, parseInt(playerTwoNFTIDs[0])); - expect(playerOneWinLoss).toBe(null); - expect(playerTwoWinLoss).toBe(null); - // Validate: assigned moves aren't yet attached to NFT - let playerOneAssignedMoves = await getAssignedMovesFromNFT(playerOne, parseInt(playerOneNFTIDs[0])); - let playerTwoAssignedMoves = await getAssignedMovesFromNFT(playerTwo, parseInt(playerTwoNFTIDs[0])); - expect(playerOneAssignedMoves).toBe(null); - expect(playerTwoAssignedMoves).toBe(null); - - // Third step: create a Match resource for a multi player match - await setupNewMultiplayerMatch(playerOne, parseInt(playerOneNFTIDs[0]), playerTwo, 10); - - // Fourth step: get the Match id - const playerOneInPlayMatchIDs = await getMatchesInPlay(playerOne); - let playerTwoInLobbyMatchIDs = await getMatchesInLobby(playerTwo); - // Validate: playerOne has MatchPlayerActions for same Match playerTwo has MatchLobbyActions - expect(playerOneInPlayMatchIDs).toEqual(playerTwoInLobbyMatchIDs); - - // Fifth step: signup player 2 to match by escrowing their NFT - await escrowNFTToExistingMatch(playerTwo, parseInt(playerTwoInLobbyMatchIDs[0]), parseInt(playerTwoNFTIDs[0])); - - // Validate: playerTwo now has ability to play Match - const playerTwoInPlayMatchIDs = await getMatchesInPlay(playerTwo); - expect(playerTwoInPlayMatchIDs).toEqual(playerOneInPlayMatchIDs); - // Validate: MatchLobbyActions has been removed from playerTwo's GamePlayer - playerTwoInLobbyMatchIDs = await getMatchesInLobby(playerTwo); - expect(playerTwoInLobbyMatchIDs).toEqual([]); - - // Sixth step: Player one submits their move - rock - await submitMovePasses(playerOne, parseInt(playerOneInPlayMatchIDs[0]), ROCK); - - // Seventh step: Player two attempts to cheat, conditioning their move on their winning - await cheatMultiplayerSubmissionReverts(playerTwo, parseInt(playerTwoInPlayMatchIDs[0]), PAPER); - }); - - // Ninth test checks if a player is able to join an already existing match - test("Second player tries to condition resolution on winning & fails, other player completes resolution", async () => { - // First step: create, save & link GamePlayer & Collection resources & mint NFT - await onboardPlayer(playerOne, serviceAccount); - await onboardPlayer(playerTwo, serviceAccount); - - // Second step: get the GamePieceNFT ids - const playerOneNFTIDs = await getCollectionIDs(playerOne); - const playerTwoNFTIDs = await getCollectionIDs(playerTwo); - - // Validate: win/loss records aren't yet attached to NFT - let playerOneWinLoss = await getRPSWinLoss(playerOne, parseInt(playerOneNFTIDs[0])); - let playerTwoWinLoss = await getRPSWinLoss(playerTwo, parseInt(playerTwoNFTIDs[0])); - expect(playerOneWinLoss).toBe(null); - expect(playerTwoWinLoss).toBe(null); - // Validate: assigned moves aren't yet attached to NFT - let playerOneAssignedMoves = await getAssignedMovesFromNFT(playerOne, parseInt(playerOneNFTIDs[0])); - let playerTwoAssignedMoves = await getAssignedMovesFromNFT(playerTwo, parseInt(playerTwoNFTIDs[0])); - expect(playerOneAssignedMoves).toBe(null); - expect(playerTwoAssignedMoves).toBe(null); - - // Third step: create a Match resource for a multi player match - await setupNewMultiplayerMatch(playerOne, parseInt(playerOneNFTIDs[0]), playerTwo, 10); - - // Fourth step: get the Match id - const playerOneInPlayMatchIDs = await getMatchesInPlay(playerOne); - let playerTwoInLobbyMatchIDs = await getMatchesInLobby(playerTwo); - // Validate: playerOne has MatchPlayerActions for same Match playerTwo has MatchLobbyActions - expect(playerOneInPlayMatchIDs).toEqual(playerTwoInLobbyMatchIDs); - - // Fifth step: signup player 2 to match by escrowing their NFT - await escrowNFTToExistingMatch(playerTwo, parseInt(playerTwoInLobbyMatchIDs[0]), parseInt(playerTwoNFTIDs[0])); - - // Validate: playerTwo now has ability to play Match - const playerTwoInPlayMatchIDs = await getMatchesInPlay(playerTwo); - expect(playerTwoInPlayMatchIDs).toEqual(playerOneInPlayMatchIDs); - // Validate: MatchLobbyActions has been removed from playerTwo's GamePlayer - playerTwoInLobbyMatchIDs = await getMatchesInLobby(playerTwo); - expect(playerTwoInLobbyMatchIDs).toEqual([]); - - // Sixth step: Player one submits their move - await submitMovePasses(playerOne, parseInt(playerOneInPlayMatchIDs[0]), ROCK); - // Seventh step: Player two submits their move - await submitMovePasses(playerTwo, parseInt(playerTwoInPlayMatchIDs[0]), PAPER); - - // Eighth step: Player two attempts to cheat, conditioning resolution on their winning - await blockResolutionReverts(playerTwo, parseInt(playerTwoInPlayMatchIDs[0])); - - // Ninth step: Player one can resolve the match and return their NFT despite player two's failed attempt to cheat - // and prevent Match resolution - await resolveMatchAndReturnNFTsPasses(playerOne, parseInt(playerOneInPlayMatchIDs[0])); - - // Validate: Assert the original NFTs are back in the players' collections - await assertNFTInCollection(playerOne, playerOneNFTIDs[0]); - await assertNFTInCollection(playerTwo, playerTwoNFTIDs[0]); - - // Tenth step: get match outcome - const history = await getMatchMoveHistory(parseInt(playerOneInPlayMatchIDs[0])); - playerOneWinLoss = await getRPSWinLoss(playerOne, parseInt(playerOneNFTIDs[0])); - playerTwoWinLoss = await getRPSWinLoss(playerTwo, parseInt(playerTwoNFTIDs[0])); - // Validate: both player NFTs have win/loss records attached & accessible - // TODO: Add equals value check - need to navigate ResponseObject to relevant value - expect(history).not.toBe(null); - expect(playerOneWinLoss).not.toBe(null); - expect(playerTwoWinLoss).not.toBe(null); - // Validate: assigned moves have been attached to NFTs & are accessible - playerOneAssignedMoves = await getAssignedMovesFromNFT(playerOne, parseInt(playerOneNFTIDs[0])); - playerTwoAssignedMoves = await getAssignedMovesFromNFT(playerTwo, parseInt(playerTwoNFTIDs[0])); - expect(playerOneAssignedMoves).not.toBe(null); - expect(playerTwoAssignedMoves).not.toBe(null); - }); -}); diff --git a/lib/js/test/templates/assertion_templates.js b/lib/js/test/templates/assertion_templates.js deleted file mode 100644 index ca96acc..0000000 --- a/lib/js/test/templates/assertion_templates.js +++ /dev/null @@ -1,29 +0,0 @@ -import { expect } from "@jest/globals"; -import { executeScript } from "@onflow/flow-js-testing"; -import { getCollectionIDs } from "./script_templates"; - -// Asserts whether length of account's collection matches -// the expected collection length -export async function assertCollectionLength(account, expectedCollectionLength) { - const [collectionIDs, e] = await executeScript( - "game_piece_nft/get_collection_ids", - [account] - ); - expect(e).toBeNull(); - expect(collectionIDs.length).toBe(expectedCollectionLength); -}; - -// Asserts that total supply of ExampleNFT matches passed expected total supply -export async function assertTotalSupply(expectedTotalSupply) { - const [actualTotalSupply, e] = await executeScript( - "get_total_supply" - ); - expect(e).toBeNull(); - expect(actualTotalSupply).toBe(expectedTotalSupply.toString()); -}; - -// Asserts whether the NFT corresponding to the id is in address's collection -export async function assertNFTInCollection(address, id) { - const ids = await getCollectionIDs(address); - expect(ids.includes(id.toString())).toBe(true); -}; diff --git a/lib/js/test/templates/script_templates.js b/lib/js/test/templates/script_templates.js deleted file mode 100644 index e79741a..0000000 --- a/lib/js/test/templates/script_templates.js +++ /dev/null @@ -1,67 +0,0 @@ -import { expect } from "@jest/globals"; -import { executeScript } from "@onflow/flow-js-testing"; - -// Executes get_collection_ids script with passed params, -// returning array of NFT IDs contained in the address's collection -export async function getCollectionIDs(address) { - const [result, err] = await executeScript( - "game_piece_nft/get_collection_ids", - [address] - ); - expect(err).toBeNull(); - return result; -}; - -export async function getGamePlayerID(address) { - const [result, err] = await executeScript( - "rock_paper_scissors_game/get_game_player_id", - [address] - ); - expect(err).toBeNull(); - return result; -}; - -export async function getMatchesInPlay(address) { - const [result, err] = await executeScript( - "rock_paper_scissors_game/get_matches_in_play", - [address] - ); - expect(err).toBeNull(); - return result; -}; - -export async function getMatchesInLobby(address) { - const [result, err] = await executeScript( - "rock_paper_scissors_game/get_matches_in_lobby", - [address] - ); - expect(err).toBeNull(); - return result; -}; - -export async function getMatchMoveHistory(matchID) { - const [result, err] = await executeScript( - "rock_paper_scissors_game/get_match_move_history", - [matchID] - ); - expect(err).toBeNull(); - return result; -}; - -export async function getRPSWinLoss(playerAddress, nftID) { - const [result, err] = await executeScript( - "game_piece_nft/get_rps_win_loss", - [playerAddress, nftID] - ); - expect(err).toBeNull(); - return result; -}; - -export async function getAssignedMovesFromNFT(playerAddress, nftID) { - const [result, err] = await executeScript( - "game_piece_nft/get_available_moves_from_nft", - [playerAddress, nftID] - ); - expect(err).toBeNull(); - return result; -}; diff --git a/lib/js/test/templates/transaction_templates.js b/lib/js/test/templates/transaction_templates.js deleted file mode 100644 index 24911b7..0000000 --- a/lib/js/test/templates/transaction_templates.js +++ /dev/null @@ -1,310 +0,0 @@ -import { - sendTransaction, - shallPass, - shallRevert -} from "@onflow/flow-js-testing"; - -// Sets up each account in passed array with an NFT Collection resource, -// reading the transaction code relative to the passed base path -export async function setupAccountNFTCollection(signer) { - const [txn, e] = await shallPass( - sendTransaction("game_piece_nft/setup_account", [signer], []) - ); -}; - -// Mints an NFT to nftRecipient, signed by signer, -// reading the transaction code relative to the passed base path -export async function mintNFT(signer, minterAddress) { - // Mint a token to nftRecipient's collection - const [mintTxn, e] = await shallPass( - sendTransaction( - "game_piece_nft/mint_nft_random_component_public", - [signer], - [minterAddress] - ) - ); -}; - -// Passes if NonFungibleToken.Provider is accessible in signer's account -// at expected PrivatePath -export async function accessProviderPasses(signer) { - await shallPass( - sendTransaction( - "test/access_provider_or_panic", - [signer], - [] - ) - ); -}; - -// Expects NonFungibleToken.Provider is not accessible in signer's account -// at expected PrivatePath -export async function accessProviderReverts(signer) { - await shallRevert( - sendTransaction( - "test/access_provider_or_panic", - [signer], - [] - ) - ); -}; - -// Sets up a GamePlayer resource in the signer's account -export async function setupGamePlayer(signer) { - const [onboardingTxn, e] = await shallPass( - sendTransaction( - "rock_paper_scissors_game/game_player/setup_game_player", - [signer], - [] - ) - ); -}; - -// Passes if RockPaperScissorsGame.GamePlayerID is accessible in signer's account -// at expected PrivatePath -export async function accessGamePlayerIDFromPrivatePasses(signer) { - await shallPass( - sendTransaction( - "test/access_game_player_id_or_panic", - [signer], - [] - ) - ); -}; - -// Expects RockPaperScissorsGame.GamePlayerID is not accessible in signer's account -// at expected PrivatePath -export async function accessGamePlayerIDFromPrivateReverts(signer) { - await shallRevert( - sendTransaction( - "test/access_game_player_id_or_panic", - [signer], - [] - ) - ); -}; - -// Configures an account with everything they need to play RockPaperScissorsGame -// Matches -export async function onboardPlayer(signer, minterAddress) { - const [onboardingTxn, e] = await shallPass( - sendTransaction( - "onboarding/self_custody_onboarding", - [signer], - [minterAddress] - ) - ); -}; - -// Sets up a new singleplayer RockPaperScissorsGame.Match, escrowing the desired NFT & setting -// the time limit as given -export async function setupNewSingleplayerMatch(signer, nftID, matchTimeLimit) { - await shallPass( - sendTransaction( - "rock_paper_scissors_game/game_player/setup_new_singleplayer_match", - [signer], - [nftID, matchTimeLimit] - ) - ); -}; - -// Sets up a new multiplayer RockPaperScissorsGame.Match, escrowing the desired NFT & setting -// the time limit as given -export async function setupNewMultiplayerMatch(signer, nftID, secondPlayerAddress, matchTimeLimit) { - await shallPass( - sendTransaction( - "rock_paper_scissors_game/game_player/setup_new_multiplayer_match", - [signer], - [nftID, secondPlayerAddress, matchTimeLimit] - ) - ); -}; - -// Withdraws the specified NFT from the signer's Collection and escrows it into the specified Match -export async function escrowNFTToExistingMatch(signer, matchID, nftID) { - await shallPass( - sendTransaction( - "rock_paper_scissors_game/game_player/escrow_nft_to_existing_match", - [signer], - [matchID, nftID] - ) - ); -}; - -// Submitting given move to specified Match passes -export async function submitMovePasses(signer, matchID, move) { - await shallPass( - sendTransaction( - "rock_paper_scissors_game/game_player/submit_move", - [signer], - [matchID, move] - ) - ); -}; - -// Submitting given move to specified Match reverts -export async function submitMoveReverts(signer, matchID, move) { - await shallRevert( - sendTransaction( - "rock_paper_scissors_game/game_player/submit_move", - [signer], - [matchID, move] - ) - ); -}; - -// Submitting automated player's move for the specified Match passes -export async function submitAutomatedPlayerMovePasses(matchID) { - await shallPass( - sendTransaction( - "rock_paper_scissors_game/submit_automated_player_move", - [], - [matchID] - ) - ); -}; - -// Submitting automated player's move for the specified Match reverts -export async function submitAutomatedPlayerMoveReverts(matchID) { - await shallRevert( - sendTransaction( - "rock_paper_scissors_game/submit_automated_player_move", - [], - [matchID] - ) - ); -}; - -// Submitting both the user's and automated player's move for a singleplayer Match passes -export async function submitBothSingleplayerMovesPasses(signer, matchID, move) { - await shallPass( - sendTransaction( - "rock_paper_scissors_game/game_player/submit_both_singleplayer_moves", - [signer], - [matchID, move] - ) - ); -}; - -// Submitting both the user's and automated player's move for a singleplayer Match reverts -export async function submitBothSingleplayerMovesReverts(signer, matchID, move) { - await shallRevert( - sendTransaction( - "rock_paper_scissors_game/game_player/submit_both_singleplayer_moves", - [signer], - [matchID, move] - ) - ); -}; - -// Failed attempt to cheat a singleplayer Match by submitting a move, attempting to resolve, -// and return NFTs with a post-condition that the signer is the winner -export async function cheatSingleplayerSubmissionReverts(signer, matchID, move) { - await shallRevert( - sendTransaction( - "test/cheat_singleplayer_submission", - [signer], - [matchID, move] - ) - ); -}; - -// Failed attempt to cheat a multiplayer Match by submitting a move, attempting to resolve, -// and return NFTs with a post-condition that the signer is the winner -export async function cheatMultiplayerSubmissionReverts(signer, matchID, move) { - await shallRevert( - sendTransaction( - "test/cheat_multiplayer_submission", - [signer], - [matchID, move] - ) - ); -}; - -// Resolving the specified match passes -export async function resolveMatchPasses(signer, matchID) { - await shallPass( - sendTransaction( - "rock_paper_scissors_game/game_player/resolve_match", - [signer], - [matchID] - ) - ); -}; - -// Resolving the specified match reverts -export async function resolveMatchReverts(signer, matchID) { - await shallRevert( - sendTransaction( - "rock_paper_scissors_game/game_player/resolve_match", - [signer], - [matchID] - ) - ); -}; - -// Failed attempt to block Match resultion by setting post-condition on signer winning the Match -export async function blockResolutionReverts(signer, matchID) { - await shallRevert( - sendTransaction( - "test/cheat_resolution", - [signer], - [matchID] - ) - ); -}; - -// Resolving Match & returning escrowed NFTs passes -export async function resolveMatchAndReturnNFTsPasses(signer, matchID) { - await shallPass( - sendTransaction( - "rock_paper_scissors_game/game_player/resolve_match_and_return_nfts", - [signer], - [matchID] - ) - ); -}; - -// Resolving Match & returning escrowed NFTs reverts -export async function resolveMatchAndReturnNFTsReverts(signer, matchID) { - await shallRevert( - sendTransaction( - "rock_paper_scissors_game/game_player/resolve_match_and_return_nfts", - [signer], - [matchID] - ) - ); -}; - -// Calling for players' escrowed NFTs to be returned from Match escrow passes -export async function returnNFTsFromEscrowPasses(signer, matchID) { - await shallPass( - sendTransaction( - "rock_paper_scissors_game/game_player/return_nfts_from_escrow", - [signer], - [matchID] - ) - ); -}; - -// Calling for players' escrowed NFTs to be returned from Match escrow reverts -export async function returnNFTsFromEscrowReverts(signer, matchID) { - await shallRevert( - sendTransaction( - "rock_paper_scissors_game/game_player/return_nfts_from_escrow", - [signer], - [matchID] - ) - ); -}; - -// Removes RPSAssignedMoves and RPSWinLossRetriever from the specified NFT successfully -export async function removeAllRPSAttachmentsPasses(signer, fromNFT) { - await shallRevert( - sendTransaction( - "game_piece_nft/remove_all_rps_game_attachments", - [signer], - [fromNFT] - ) - ); -}; diff --git a/lib/js/test/walletless_onboarding.test.js b/lib/js/test/walletless_onboarding.test.js deleted file mode 100644 index a9b53b8..0000000 --- a/lib/js/test/walletless_onboarding.test.js +++ /dev/null @@ -1,159 +0,0 @@ -import path from "path"; -import { - emulator, - init, - getAccountAddress, - deployContractByName, - sendTransaction, - shallPass, - shallRevert, - executeScript, - mintFlow -} from "@onflow/flow-js-testing"; -import fs from "fs"; - - -// Auxiliary function for deploying the cadence contracts -async function deployContract(param) { - const [result, error] = await deployContractByName(param); - if (error != null) { - console.log(`Error in deployment - ${error}`); - emulator.stop(); - process.exit(1); - } -} - -const get_child_address_from_creator = fs.readFileSync(path.resolve(__dirname, "./../../../scripts/account_creator/get_child_address_from_public_key_on_creator.cdc"), {encoding:'utf8', flag:'r'}); - -describe("Walletless onboarding", ()=>{ - - // Variables for holding the account address - let serviceAccount; - let gameAccount; - let parentAccount; - - // Before each test... - beforeEach(async () => { - // We do some scaffolding... - - // Getting the base path of the project - const basePath = path.resolve(__dirname, "./../../../"); - // Setting logging flag to true will pipe emulator output to console - const logging = false; - - await init(basePath); - await emulator.start({ logging }); - - // ...then we deploy the ft and example token contracts using the getAccountAddress function - // from the flow-js-testing library... - - // Create a service account and deploy contracts to it - serviceAccount = await getAccountAddress("ServiceAccount"); - await mintFlow(serviceAccount, 10000000.0); - - await deployContract({ to: serviceAccount, name: "utility/FungibleToken" }); - await deployContract({ to: serviceAccount, name: "utility/NonFungibleToken" }); - await deployContract({ to: serviceAccount, name: "utility/MetadataViews" }); - await deployContract({ to: serviceAccount, name: "utility/FungibleTokenMetadataViews" }); - await deployContract({ to: serviceAccount, name: "utility/ViewResolver" }); - await deployContract({ to: serviceAccount, name: "LinkedAccountMetadataViews" }); - await deployContract({ to: serviceAccount, name: "GamingMetadataViews" }); - await deployContract({ to: serviceAccount, name: "LinkedAccounts" }); - - // Create a game admin account and deploy contracts to it - gameAccount = await getAccountAddress("gameAccount"); - await mintFlow(gameAccount, 10000000.0); - - await deployContract({ to: gameAccount, name: "utility/AccountCreator" }); - await deployContract({ to: gameAccount, name: "DynamicNFT" }); - await deployContract({ to: gameAccount, name: "GamePieceNFT" }); - await deployContract({ to: gameAccount, name: "TicketToken" }); - await deployContract({ to: gameAccount, name: "ArcadePrize" }); - await deployContract({ to: gameAccount, name: "RockPaperScissorsGame" }); - - // Create a parent account that will emulate the wallet-connected account - parentAccount = await getAccountAddress("ParentAccount"); - await mintFlow(parentAccount, 100.0); - - }); - - // After each test we stop the emulator, so it could be restarted - afterEach(async () => { - return emulator.stop(); - }); - - // First test checks if service account can create a orphan child account - test("Game should be able to create and setup a child account", async () => { - // First step: create a child creator - await shallPass( - sendTransaction({ - name: "linked_accounts/setup_account_creator", - args: [], - signers: [gameAccount] - }) - ); - // Second step: create a child account - let pubKey = "eb986126679b4b718208c9d1d92f5b357f46137fe8de2f5bc589b0c5dfc3e8812f256faea8c6719d1ee014e1b08c62d2243af1413dfb6c2cbf36aca229eb5d05" - await shallPass( - sendTransaction({ - name: "onboarding/walletless_onboarding", - args: [ - pubKey, - "10.0", - "1", - "1", - "1", - "1" - ], - signers: [gameAccount] - }) - ); - }); - - - // Second test checks if a parent can adopt a child account from the minter - test("Game should be able to associate child to parent", async () => { // parent should accept child! - // First step: admin create a child creator - await shallPass( - sendTransaction({ - name: "linked_accounts/setup_account_creator", - args: [], - signers: [gameAccount] - }) - ); - // Second step: create a child account - let pubKey = "eb986126679b4b718208c9d1d92f5b357f46137fe8de2f5bc589b0c5dfc3e8812f256faea8c6719d1ee014e1b08c62d2243af1413dfb6c2cbf36aca229eb5d05" - await shallPass( - sendTransaction({ - name: "onboarding/walletless_onboarding", - args: [ - pubKey, - "10.0", - "1", - "1", - "1", - "1" - ], - signers: [gameAccount] - }) - ); - // Third step: get the child account address - const childAccount = await executeScript({ - code: get_child_address_from_creator, - args: [gameAccount, pubKey] - }); - // Fourth step: Link parent & child - await shallPass( - sendTransaction({ - name: "linked_accounts/add_as_child_multisig", - args: [ - "ACCOUNT_NAME", - "ACCOUNT_DESCRIPTION", - "THUMBNAIL_URL", - "EXTERNAL_URL" - ], - signers: [parentAccount, childAccount] - }) - ); - }); -}); \ No newline at end of file diff --git a/scripts/account_creator/get_address_from_pub_key.cdc b/scripts/account_creator/get_address_from_pub_key.cdc new file mode 100644 index 0000000..aab3ac7 --- /dev/null +++ b/scripts/account_creator/get_address_from_pub_key.cdc @@ -0,0 +1,9 @@ +import "AccountCreator" + +pub fun main(creatorAddress: Address, pubKey: String): Address? { + return getAccount(creatorAddress).getCapability<&{AccountCreator.CreatorPublic}>( + AccountCreator.CreatorPublicPath + ).borrow() + ?.getAddressFromPublicKey(publicKey: pubKey) + ?? panic("Could not borrow reference to CreatorPublic") +} \ No newline at end of file diff --git a/scripts/account_creator/get_all_created_addresses.cdc b/scripts/account_creator/get_all_created_addresses.cdc deleted file mode 100644 index 79f0ace..0000000 --- a/scripts/account_creator/get_all_created_addresses.cdc +++ /dev/null @@ -1,12 +0,0 @@ -import AccountCreator from "../../contracts/utility/AccountCreator.cdc" - -/// Returns the addresses created by the AccountCreator.Creator at the given address or nil if such a Creator is not -/// accessible. -/// -pub fun main(creatorAddress: Address, publicKey: String): Address? { - // Get a reference to the CreatorPublic Capability from creatorAddress & return the created address or nil - return getAccount(creatorAddress).getCapability<&AccountCreator.Creator{AccountCreator.CreatorPublic}>( - AccountCreator.CreatorPublicPath - ).borrow()?.getAddressFromPublicKey(publicKey: publicKey) ?? nil -} - \ No newline at end of file diff --git a/scripts/linked_accounts/get_child_address_from_public_key_on_creator.cdc b/scripts/account_creator/get_child_address_from_pub_key_on_creator.cdc similarity index 86% rename from scripts/linked_accounts/get_child_address_from_public_key_on_creator.cdc rename to scripts/account_creator/get_child_address_from_pub_key_on_creator.cdc index 0db3dbb..4dac4e4 100644 --- a/scripts/linked_accounts/get_child_address_from_public_key_on_creator.cdc +++ b/scripts/account_creator/get_child_address_from_pub_key_on_creator.cdc @@ -1,5 +1,5 @@ -import AccountCreator from "../../contracts/utility/AccountCreator.cdc" -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" +import "AccountCreator from "../../contracts/utility/AccountCreator.cdc" +import "LinkedAccounts from "../../contracts/LinkedAccounts.cdc" /// Returns the child address associated with a public key if account was created by the AccountCreator.Creator at the /// specified Address and the provided public key is still active on the account. diff --git a/scripts/account_creator/get_child_address_from_public_key_on_creator.cdc b/scripts/account_creator/get_child_address_from_public_key_on_creator.cdc deleted file mode 100644 index 35adb38..0000000 --- a/scripts/account_creator/get_child_address_from_public_key_on_creator.cdc +++ /dev/null @@ -1,11 +0,0 @@ -import AccountCreator from "../../contracts/utility/AccountCreator.cdc" - -/// Returns the address created by the AccountCreator.Creator with the given public key -/// -pub fun main(creatorAddress: Address,): [Address]? { - // Get a reference to the CreatorPublic Capability from creatorAddress & return its created addresses - return getAccount(creatorAddress).getCapability<&AccountCreator.Creator{AccountCreator.CreatorPublic}>( - AccountCreator.CreatorPublicPath - ).borrow()?.getAllCreatedAddresses() ?? nil -} - \ No newline at end of file diff --git a/scripts/account_creator/is_key_active_on_account.cdc b/scripts/account_creator/is_key_active_on_account.cdc new file mode 100644 index 0000000..8545af7 --- /dev/null +++ b/scripts/account_creator/is_key_active_on_account.cdc @@ -0,0 +1,5 @@ +import "AccountCreator" + +pub fun main(publicKey: String, address: Address): Int? { + return AccountCreator.isKeyActiveOnAccount(publicKey: publicKey, address: address) +} \ No newline at end of file diff --git a/scripts/account_creator/pub_key_connects_to_child_of.cdc b/scripts/account_creator/pub_key_connects_to_child_of.cdc index e1c9724..21004ae 100644 --- a/scripts/account_creator/pub_key_connects_to_child_of.cdc +++ b/scripts/account_creator/pub_key_connects_to_child_of.cdc @@ -1,8 +1,8 @@ -import AccountCreator from "../../contracts/utility/AccountCreator.cdc" -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" +import "AccountCreator" +import "HybridCustody" /// Takes the address where a AccountCreator.CreatorPublic Capability lives, a public key as a String, and the address -/// where a LinkedAccounts.CollectionPublic Capability lives and return whether the given public key is tied to an +/// where a HybridCustody.ManagerPublic Capability lives and return whether the given public key is tied to an /// account that is an active child account of the specified parent address and the given public key is active on the /// account. /// @@ -11,17 +11,17 @@ import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" /// pub fun main(creatorAddress: Address, pubKey: String, parentAddress: Address): Bool { // Get a reference to the CreatorPublic Capability from creatorAddress - if let creatorRef = getAccount(creatorAddress).getCapability<&AccountCreator.Creator{AccountCreator.CreatorPublic}>( + if let creator = getAccount(creatorAddress).getCapability<&AccountCreator.Creator{AccountCreator.CreatorPublic}>( AccountCreator.CreatorPublicPath ).borrow() { // Get the child address if it exists - if let childAddress = creatorRef.getAddressFromPublicKey(publicKey: pubKey) { - // Get a reference to the LinkedAccounts.CollectionPublic Capability from parentAddress - if let collectionRef = getAccount(parentAddress).getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic} - >(LinkedAccounts.CollectionPublicPath).borrow() { - return collectionRef.isLinkActive(onAddress: childAddress) && - LinkedAccounts.isKeyActiveOnAccount(publicKey: pubKey, address: childAddress) + if let childAddress = creator.getAddressFromPublicKey(publicKey: pubKey) { + // Get a reference to the HybridCustody.ManagerPublic Capability from parentAddress + if let manager = getAccount(parentAddress).getCapability<&HybridCustody.Manager{HybridCustody.ManagerPublic}>( + HybridCustody.ManagerPublicPath + ).borrow() { + return manager.isLinkActive(onAddress: childAddress) && + AccountCreator.isKeyActiveOnAccount(publicKey: pubKey, address: childAddress) } } } diff --git a/scripts/arcade_prize/get_all_nft_display_views.cdc b/scripts/arcade_prize/get_all_nft_display_views.cdc index cca0edc..afd972a 100644 --- a/scripts/arcade_prize/get_all_nft_display_views.cdc +++ b/scripts/arcade_prize/get_all_nft_display_views.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import ArcadePrize from "../../contracts/ArcadePrize.cdc" +import "NonFungibleToken" +import "MetadataViews" +import "ArcadePrize" /// Returns an array of Display structs containing NFT metadata /// for all NFTs in the specified Address's collections diff --git a/scripts/arcade_prize/get_collection_ids.cdc b/scripts/arcade_prize/get_collection_ids.cdc index 0fca453..c0f5019 100644 --- a/scripts/arcade_prize/get_collection_ids.cdc +++ b/scripts/arcade_prize/get_collection_ids.cdc @@ -1,5 +1,5 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import ArcadePrize from "../../contracts/ArcadePrize.cdc" +import "NonFungibleToken" +import "ArcadePrize" /// Script to get NFT IDs in an account's collection /// diff --git a/scripts/arcade_prize/get_prize_type_display_from_contract.cdc b/scripts/arcade_prize/get_prize_type_display_from_contract.cdc index 5cd8fc3..f3ef37f 100644 --- a/scripts/arcade_prize/get_prize_type_display_from_contract.cdc +++ b/scripts/arcade_prize/get_prize_type_display_from_contract.cdc @@ -1,5 +1,5 @@ -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import ArcadePrize from "../../contracts/ArcadePrize.cdc" +import "MetadataViews" +import "ArcadePrize" /// Returns an array of MetadataViews.Display structs /// diff --git a/scripts/arcade_prize/get_prize_type_price.cdc b/scripts/arcade_prize/get_prize_type_price.cdc index 6171049..8c9b850 100644 --- a/scripts/arcade_prize/get_prize_type_price.cdc +++ b/scripts/arcade_prize/get_prize_type_price.cdc @@ -1,4 +1,4 @@ -import ArcadePrize from "../../contracts/ArcadePrize.cdc" +import "ArcadePrize" /// Returns an array of MetadataViews.Display structs /// diff --git a/scripts/game_piece_nft/get_all_display_views.cdc b/scripts/game_piece_nft/get_all_display_views.cdc index 4e1214d..6cfbdda 100644 --- a/scripts/game_piece_nft/get_all_display_views.cdc +++ b/scripts/game_piece_nft/get_all_display_views.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" +import "NonFungibleToken" +import "MetadataViews" +import "GamePieceNFT" /// Returns an array of Display structs containing GamePieceNFT.NFT metadata /// for all NFTs in the specified Address's collection diff --git a/scripts/game_piece_nft/get_available_moves_from_nft.cdc b/scripts/game_piece_nft/get_available_moves_from_nft.cdc index 5f7f088..88e9888 100644 --- a/scripts/game_piece_nft/get_available_moves_from_nft.cdc +++ b/scripts/game_piece_nft/get_available_moves_from_nft.cdc @@ -1,6 +1,6 @@ -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" -import GamingMetadataViews from "../../contracts/GamingMetadataViews.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "GamePieceNFT" +import "GamingMetadataViews" +import "RockPaperScissorsGame" /// Script to get the RockPaperScissors BasicWinLoss data from a given address's NFT /// diff --git a/scripts/game_piece_nft/get_collection_ids.cdc b/scripts/game_piece_nft/get_collection_ids.cdc index bc8bd48..d520b01 100644 --- a/scripts/game_piece_nft/get_collection_ids.cdc +++ b/scripts/game_piece_nft/get_collection_ids.cdc @@ -1,5 +1,5 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" +import "NonFungibleToken" +import "GamePieceNFT" /// Script to get NFT IDs in an account's collection /// diff --git a/scripts/game_piece_nft/get_rps_win_loss.cdc b/scripts/game_piece_nft/get_rps_win_loss.cdc index e924be8..4230a86 100644 --- a/scripts/game_piece_nft/get_rps_win_loss.cdc +++ b/scripts/game_piece_nft/get_rps_win_loss.cdc @@ -1,6 +1,6 @@ -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" -import GamingMetadataViews from "../../contracts/GamingMetadataViews.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "GamePieceNFT" +import "GamingMetadataViews" +import "RockPaperScissorsGame" /// Script to get the RockPaperScissors BasicWinLoss data from a given address's NFT /// diff --git a/scripts/game_piece_nft/is_collection_configured.cdc b/scripts/game_piece_nft/is_collection_configured.cdc index 1a1980d..f337dfb 100644 --- a/scripts/game_piece_nft/is_collection_configured.cdc +++ b/scripts/game_piece_nft/is_collection_configured.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" +import "NonFungibleToken" +import "MetadataViews" +import "GamePieceNFT" /// Script to check if GamePieceNFTCollectionPublic is configured at /// a given address diff --git a/scripts/hybrid_custody/get_accessible_child_account_nfts.cdc b/scripts/hybrid_custody/get_accessible_child_account_nfts.cdc new file mode 100644 index 0000000..5d1c54a --- /dev/null +++ b/scripts/hybrid_custody/get_accessible_child_account_nfts.cdc @@ -0,0 +1,80 @@ +import "HybridCustody" +import "NonFungibleToken" +import "MetadataViews" + + +// This script iterates through a parent's child accounts, +// identifies private paths with an accessible NonFungibleToken.Provider, and returns the corresponding typeIds +pub fun main(addr: Address): AnyStruct { + let manager = getAuthAccount(addr).borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) ?? panic ("manager does not exist") + + var typeIdsWithProvider = {} as {Address: [String]} + + // Address -> nft UUID -> Display + var nftViews = {} as {Address: {UInt64: MetadataViews.Display}} + + + let providerType = Type>() + let collectionType: Type = Type<@{NonFungibleToken.CollectionPublic}>() + + // Iterate through child accounts + for address in manager.getChildAddresses() { + let acct = getAuthAccount(address) + let foundTypes: [String] = [] + let views: {UInt64: MetadataViews.Display} = {} + let childAcct = manager.borrowAccount(addr: address) ?? panic("child account not found") + // get all private paths + acct.forEachPrivate(fun (path: PrivatePath, type: Type): Bool { + // Check which private paths have NFT Provider AND can be borrowed + if !type.isSubtype(of: providerType){ + return true + } + if let cap = childAcct.getCapability(path: path, type: Type<&{NonFungibleToken.Provider}>()) { + let providerCap = cap as! Capability<&{NonFungibleToken.Provider}> + + if !providerCap.check(){ + // if this isn't a provider capability, exit the account iteration function for this path + return true + } + foundTypes.append(cap.borrow<&AnyResource>()!.getType().identifier) + } + return true + }) + typeIdsWithProvider[address] = foundTypes + + // iterate storage, check if typeIdsWithProvider contains the typeId, if so, add to views + acct.forEachStored(fun (path: StoragePath, type: Type): Bool { + + if typeIdsWithProvider[address] == nil { + return true + } + + for key in typeIdsWithProvider.keys { + for idx, value in typeIdsWithProvider[key]! { + let value = typeIdsWithProvider[key]! + + if value[idx] != type.identifier { + continue + } else { + if type.isInstance(collectionType) { + continue + } + if let collection = acct.borrow<&{NonFungibleToken.CollectionPublic}>(from: path) { + // Iterate over IDs & resolve the view + for id in collection.getIDs() { + let nft = collection.borrowNFT(id: id) + if let display = nft.resolveView(Type())! as? MetadataViews.Display { + views.insert(key: nft.uuid, display) + } + } + } + continue + } + } + } + return true + }) + nftViews[address] = views + } + return nftViews +} \ No newline at end of file diff --git a/scripts/hybrid_custody/get_all_flow_balances.cdc b/scripts/hybrid_custody/get_all_flow_balances.cdc new file mode 100644 index 0000000..fb93613 --- /dev/null +++ b/scripts/hybrid_custody/get_all_flow_balances.cdc @@ -0,0 +1,31 @@ +import "FungibleToken" +import "HybridCustody" + +/// Queries for $FLOW balance of a given Address and all its associated accounts +/// +pub fun main(address: Address): {Address: UFix64} { + + // Get the balance for the given address + let balances: {Address: UFix64} = { address: getAccount(address).balance } + // Tracking Addresses we've come across to prevent overwriting balances more efficiently than checking return mapping + let seen: [Address] = [address] + + /* Iterate over any associated accounts */ + // + if let managerRef = getAuthAccount(address).borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) { + + for childAccount in managerRef.getChildAddresses() { + balances.insert(key: childAccount, getAccount(childAccount).balance) + seen.append(childAccount) + } + + for ownedAccount in managerRef.getOwnedAddresses() { + if seen.contains(ownedAccount) == false { + balances.insert(key: ownedAccount, getAccount(ownedAccount).balance) + seen.append(ownedAccount) + } + } + } + + return balances +} \ No newline at end of file diff --git a/scripts/linked_accounts/get_all_nft_display_views_from_storage.cdc b/scripts/hybrid_custody/get_all_nft_display_views_from_storage.cdc similarity index 76% rename from scripts/linked_accounts/get_all_nft_display_views_from_storage.cdc rename to scripts/hybrid_custody/get_all_nft_display_views_from_storage.cdc index 0568fcb..c23fd69 100644 --- a/scripts/linked_accounts/get_all_nft_display_views_from_storage.cdc +++ b/scripts/hybrid_custody/get_all_nft_display_views_from_storage.cdc @@ -1,6 +1,7 @@ -import NonFungibleToken from "../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../contracts/utility/MetadataViews.cdc" -import LinkedAccounts from "../contracts/LinkedAccounts.cdc" +import "NonFungibleToken" +import "MetadataViews" + +import "HybridCustody" /// Custom struct to make interpretation of NFT & Collection data easy client side pub struct NFTData { @@ -56,8 +57,7 @@ pub fun getAllViewsFromAddress(_ address: Address): [NFTData] { // Iterate over each public path account.forEachStored(fun (path: StoragePath, type: Type): Bool { // Check if it's a Collection we're interested in, if so, get a reference - // TODO: Will need to fix how LinkedAccounts contract resolves Collection Metadata since NFT.CollectionPublic is not public atm - if type.isSubtype(of: collectionType) && !type.isSubtype(of: Type<@LinkedAccounts.Collection>()) { + if type.isSubtype(of: collectionType) { if let collectionRef = account.borrow< &{NonFungibleToken.CollectionPublic, MetadataViews.ResolverCollection} >(from: path) { @@ -91,36 +91,30 @@ pub fun getAllViewsFromAddress(_ address: Address): [NFTData] { return data } -/// Script that retrieve data about all publicly accessible NFTs in an account and any of its -/// child accounts +/// Script that retrieve data about all publicly accessible NFTs in an account and any of its child accounts /// -/// Note that this script does not consider accounts with exceptionally large collections -/// which would result in memory errors. To compose a script that does cover accounts with -/// a large number of sub-accounts and/or NFTs within those accounts, see example 5 in -/// the NFT Catalog's README: https://github.com/dapperlabs/nft-catalog and adapt for use -/// with LinkedAccounts.Collection +/// Note that this script does not consider accounts with exceptionally large collections which would result in memory +/// errors. To compose a script that does cover accounts with a large number of sub-accounts and/or NFTs within those +/// accounts, see example 5 in the NFT Catalog's README: https://github.com/dapperlabs/nft-catalog and adapt for use with +/// HybridCustody.Manager /// pub fun main(address: Address): {Address: [NFTData]} { let allNFTData: {Address: [NFTData]} = {} // Add all retrieved views to the running mapping indexed on address - let data: [NFTData] = getAllViewsFromAddress(address) - allNFTData.insert(key: address, data) + allNFTData.insert(key: address, getAllViewsFromAddress(address)) /* Iterate over any child accounts */ // - // Get reference to LinkedAccounts.Collection if it exists - if let collectionRef = getAccount(address).getCapability<&LinkedAccounts.Collection{LinkedAccounts.CollectionPublic}>( - LinkedAccounts.CollectionPublicPath - ).borrow() { - // Iterate over each linked account in LinkedAccounts.Collection - for childAddress in collectionRef.getLinkedAccountAddresses() { + // Get reference to HybridCustody.Manager if it exists + if let manager = getAuthAccount(address).borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) { + // Iterate over each child account + for childAddress in manager.getChildAddresses() { if !allNFTData.containsKey(childAddress) { - // Insert the NFT metadata for those NFTs in each child account - // indexing on the account's address + // Insert the NFT metadata for those NFTs in each child account indexing on the account's address allNFTData.insert(key: childAddress, getAllViewsFromAddress(childAddress)) } } } return allNFTData -} \ No newline at end of file +} diff --git a/scripts/hybrid_custody/get_all_vault_bal_from_storage.cdc b/scripts/hybrid_custody/get_all_vault_bal_from_storage.cdc new file mode 100644 index 0000000..8516ba6 --- /dev/null +++ b/scripts/hybrid_custody/get_all_vault_bal_from_storage.cdc @@ -0,0 +1,64 @@ +import "FungibleToken" +import "MetadataViews" +import "HybridCustody" + +/// Returns a mapping of balances indexed on the Type of resource containing the balance +/// +pub fun getAllBalancesInStorage(_ address: Address): {Type: UFix64} { + // Get the account + let account: AuthAccount = getAuthAccount(address) + // Init for return value + let balances: {Type: UFix64} = {} + // Track seen Types in array + let seen: [Type] = [] + // Assign the type we'll need + let balanceType: Type = Type<@{FungibleToken.Balance}>() + // Iterate over all stored items & get the path if the type is what we're looking for + account.forEachStored(fun (path: StoragePath, type: Type): Bool { + if type.isInstance(balanceType) || type.isSubtype(of: balanceType) { + // Get a reference to the resource & its balance + let vaultRef = account.borrow<&{FungibleToken.Balance}>(from: path)! + // Insert a new values if it's the first time we've seen the type + if !seen.contains(type) { + balances.insert(key: type, vaultRef.balance) + } else { + // Otherwise just update the balance of the vault (unlikely we'll see the same type twice in + // the same account, but we want to cover the case) + balances[type] = balances[type]! + vaultRef.balance + } + } + return true + }) + return balances +} + +/// Queries for FT.Vault balance of all FT.Vaults in the specified account and all of its associated accounts +/// +pub fun main(address: Address): {Address: {Type: UFix64}} { + + // Get the balance for the given address + let balances: {Address: {Type: UFix64}} = { address: getAllBalancesInStorage(address) } + // Tracking Addresses we've come across to prevent overwriting balances (more efficient than checking dict entries (?)) + let seen: [Address] = [address] + + /* Iterate over any associated accounts */ + // + if let managerRef = getAuthAccount(address) + .borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) { + + for childAccount in managerRef.getChildAddresses() { + balances.insert(key: childAccount, getAllBalancesInStorage(address)) + seen.append(childAccount) + } + + for ownedAccount in managerRef.getOwnedAddresses() { + if seen.contains(ownedAccount) == false { + balances.insert(key: ownedAccount, getAllBalancesInStorage(address)) + seen.append(ownedAccount) + } + } + } + + return balances +} + \ No newline at end of file diff --git a/scripts/hybrid_custody/get_child_addresses.cdc b/scripts/hybrid_custody/get_child_addresses.cdc new file mode 100644 index 0000000..daea862 --- /dev/null +++ b/scripts/hybrid_custody/get_child_addresses.cdc @@ -0,0 +1,8 @@ +import "HybridCustody" + +pub fun main(parent: Address): [Address] { + let acct = getAuthAccount(parent) + let manager = acct.borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) + ?? panic("manager not found") + return manager.getChildAddresses() +} \ No newline at end of file diff --git a/scripts/hybrid_custody/get_parents_from_child.cdc b/scripts/hybrid_custody/get_parents_from_child.cdc new file mode 100644 index 0000000..91bff85 --- /dev/null +++ b/scripts/hybrid_custody/get_parents_from_child.cdc @@ -0,0 +1,9 @@ +import "HybridCustody" + +pub fun main(child: Address): {Address: Bool} { + let acct = getAuthAccount(child) + let o = acct.borrow<&HybridCustody.OwnedAccount>(from: HybridCustody.OwnedAccountStoragePath) + ?? panic("owned account not found") + + return o.getParentStatuses() +} \ No newline at end of file diff --git a/scripts/hybrid_custody/has_address_as_child.cdc b/scripts/hybrid_custody/has_address_as_child.cdc new file mode 100644 index 0000000..0d8ab13 --- /dev/null +++ b/scripts/hybrid_custody/has_address_as_child.cdc @@ -0,0 +1,9 @@ +import "HybridCustody" + +pub fun main(parent: Address, child: Address): Bool { + let acct = getAuthAccount(parent) + let m = acct.borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) + ?? panic("manager not found") + + return m.borrowAccount(addr: child) != nil +} \ No newline at end of file diff --git a/scripts/hybrid_custody/is_parent.cdc b/scripts/hybrid_custody/is_parent.cdc new file mode 100644 index 0000000..ae82d71 --- /dev/null +++ b/scripts/hybrid_custody/is_parent.cdc @@ -0,0 +1,9 @@ +import "HybridCustody" + +pub fun main(child: Address, parent: Address): Bool { + let acct = getAuthAccount(child) + let owned = acct.borrow<&HybridCustody.OwnedAccount>(from: HybridCustody.OwnedAccountStoragePath) + ?? panic("owned account not found") + + return owned.isChildOf(parent) +} \ No newline at end of file diff --git a/scripts/hybrid_custody/is_redeemed.cdc b/scripts/hybrid_custody/is_redeemed.cdc new file mode 100644 index 0000000..aecdedb --- /dev/null +++ b/scripts/hybrid_custody/is_redeemed.cdc @@ -0,0 +1,9 @@ +import "HybridCustody" + +pub fun main(child: Address, parent: Address): Bool { + let acct = getAuthAccount(child) + let owned = acct.borrow<&HybridCustody.OwnedAccount>(from: HybridCustody.OwnedAccountStoragePath) + ?? panic("owned account not found") + + return owned.getRedeemedStatus(addr: parent) ?? panic("no status found") +} \ No newline at end of file diff --git a/scripts/hybrid_custody/metadata/resolve_all_child_displays.cdc b/scripts/hybrid_custody/metadata/resolve_all_child_displays.cdc new file mode 100644 index 0000000..e8c4b3a --- /dev/null +++ b/scripts/hybrid_custody/metadata/resolve_all_child_displays.cdc @@ -0,0 +1,18 @@ +import "HybridCustody" +import "MetadataViews" + +pub fun main(parent: Address): {Address: MetadataViews.Display?} { + let displays: {Address: MetadataViews.Display?} = {} + + let m = getAuthAccount(parent).borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) + ?? panic("manager not found") + + let childAddresses = m.getChildAddresses() + for address in childAddresses { + let c = m.borrowAccount(addr: address) ?? panic("child not found") + + let d = c.resolveView(Type()) as! MetadataViews.Display? + displays.insert(key: c.getAddress(), d) + } + return displays +} \ No newline at end of file diff --git a/scripts/hybrid_custody/metadata/resolve_child_display.cdc b/scripts/hybrid_custody/metadata/resolve_child_display.cdc new file mode 100644 index 0000000..e27624c --- /dev/null +++ b/scripts/hybrid_custody/metadata/resolve_child_display.cdc @@ -0,0 +1,12 @@ +import "HybridCustody" +import "MetadataViews" + +pub fun main(parent: Address, child: Address): MetadataViews.Display? { + let acct = getAuthAccount(parent) + let m = acct.borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) + ?? panic("manager not found") + + let c = m.borrowAccount(addr: child) ?? panic("child not found") + + return c.resolveView(Type()) as! MetadataViews.Display? +} \ No newline at end of file diff --git a/scripts/linked_accounts/get_all_account_balances_from_storage.cdc b/scripts/linked_accounts/get_all_account_balances_from_storage.cdc deleted file mode 100644 index 34ba5c2..0000000 --- a/scripts/linked_accounts/get_all_account_balances_from_storage.cdc +++ /dev/null @@ -1,121 +0,0 @@ -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import FungibleTokenMetadataViews from "../../contracts/utility/FungibleTokenMetadataViews.cdc" -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" - -/// Custom struct to easily communicate vault data to a client -pub struct VaultInfo { - pub let name: String? - pub let symbol: String? - pub var balance: UFix64 - pub let description: String? - pub let externalURL: String? - pub let logos: MetadataViews.Medias? - pub let storagePathIdentifier: String - pub let receiverPathIdentifier: String? - pub let providerPathIdentifier: String? - - init( - name: String?, - symbol: String?, - balance: UFix64, - description: String?, - externalURL: String?, - logos: MetadataViews.Medias?, - storagePathIdentifier: String, - receiverPathIdentifier: String?, - providerPathIdentifier: String? - ) { - self.name = name - self.symbol = symbol - self.balance = balance - self.description = description - self.externalURL = externalURL - self.logos = logos - self.storagePathIdentifier = storagePathIdentifier - self.receiverPathIdentifier = receiverPathIdentifier - self.providerPathIdentifier = providerPathIdentifier - } - - pub fun addBalance(_ addition: UFix64) { - self.balance = self.balance + addition - } -} - -/// Returns a dictionary of VaultInfo indexed on the Type of Vault -pub fun getAllVaultInfoInAddressStorage(_ address: Address): {Type: VaultInfo} { - // Get the account - let account: AuthAccount = getAuthAccount(address) - // Init for return value - let balances: {Type: VaultInfo} = {} - // Assign the type we'll need - let vaultType: Type = Type<@{FungibleToken.Balance, MetadataViews.Resolver}>() - let ftViewType: Type= Type() - // Iterate over all stored items & get the path if the type is what we're looking for - account.forEachStored(fun (path: StoragePath, type: Type): Bool { - if type.isSubtype(of: vaultType) { - // Get a reference to the vault & its balance - if let vaultRef = account.borrow<&{FungibleToken.Balance, MetadataViews.Resolver}>(from: path) { - let balance = vaultRef.balance - // Attempt to resolve metadata on the vault - if let ftView = vaultRef.resolveView(ftViewType) as! FungibleTokenMetadataViews.FTView? { - // Insert a new info struct if it's the first time we've seen the vault type - if !balances.containsKey(type) { - let vaultInfo = VaultInfo( - name: ftView.ftDisplay?.name ?? vaultRef.getType().identifier, - symbol: ftView.ftDisplay?.symbol, - balance: balance, - description: ftView.ftDisplay?.description, - externalURL: ftView.ftDisplay?.externalURL?.url, - logos: ftView.ftDisplay?.logos, - storagePathIdentifier: path.toString(), - receiverPathIdentifier: ftView.ftVaultData?.receiverPath?.toString(), - providerPathIdentifier: ftView.ftVaultData?.providerPath?.toString() - ) - balances.insert(key: type, vaultInfo) - } else { - // Otherwise just update the balance of the vault (unlikely we'll see the same type twice in - // the same account, but we want to cover the case) - balances[type]!.addBalance(balance) - } - } - } - } - return true - }) - return balances -} - -/// Takes two dictionaries containing VaultInfo structs indexed on the type of vault they represent & -/// returns a single dictionary containg the summed balance of each respective vault type -pub fun merge(_ d1: {Type: VaultInfo}, _ d2: {Type: VaultInfo}): {Type: VaultInfo} { - for type in d1.keys { - if d2.containsKey(type) { - d1[type]!.addBalance(d2[type]!.balance) - } - } - - return d1 -} - -pub fun main(address: Address): {Type: VaultInfo} { - // Get the balance info for the given address - var balances: {Type: VaultInfo} = getAllVaultInfoInAddressStorage(address) - - /* Iterate over any child accounts */ - // - // Get reference to LinkedAccounts.CollectionPublic if it exists - if let collectionRef = getAccount(address).getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic} - >( - LinkedAccounts.CollectionPublicPath - ).borrow() { - // Iterate over each linked child account in Collection - for childAddress in collectionRef.getLinkedAccountAddresses() { - // Ensure all vault type balances are pooled across all addresses - balances = merge(balances, getAllVaultInfoInAddressStorage(childAddress)) - } - } - return balances -} - \ No newline at end of file diff --git a/scripts/linked_accounts/get_all_linked_accounts_metadata.cdc b/scripts/linked_accounts/get_all_linked_accounts_metadata.cdc deleted file mode 100644 index 41c19da..0000000 --- a/scripts/linked_accounts/get_all_linked_accounts_metadata.cdc +++ /dev/null @@ -1,61 +0,0 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import LinkedAccountMetadataViews from "../../contracts/LinkedAccountMetadataViews.cdc" -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" - -pub struct LinkedAccountData { - pub let address: Address - pub let name: String - pub let description: String - pub let creationTimestamp: UFix64 - pub let thumbnail: AnyStruct{MetadataViews.File} - pub let externalURL: MetadataViews.ExternalURL - - init( - address: Address, - accountInfo: LinkedAccountMetadataViews.AccountInfo - ) { - self.address = address - self.name = accountInfo.name - self.description = accountInfo.description - self.creationTimestamp = accountInfo.creationTimestamp - self.thumbnail = accountInfo.thumbnail - self.externalURL = accountInfo.externalURL - } -} - -/// Returns a mapping of metadata about linked accounts indexed on the account's Address -/// -/// @param address: The main account to query against -/// -/// @return A mapping of metadata about all the given account's linked accounts, indexed on each linked account's address -/// -pub fun main(address: Address): {Address: LinkedAccountData} { - let linkedAccountData: {Address: LinkedAccountData} = {} - - // Get reference to LinkedAccounts.Collection if it exists - if let collectionRef = getAccount(address).getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, MetadataViews.ResolverCollection} - >( - LinkedAccounts.CollectionPublicPath - ).borrow() { - let addressToID: {Address: UInt64} = collectionRef.getAddressToID() - // Iterate over each linked account in LinkedAccounts.Collection - for linkedAccountAddress in addressToID.keys { - let accountInfo: LinkedAccountMetadataViews.AccountInfo = (collectionRef.borrowViewResolver( - id: addressToID[linkedAccountAddress]! - ).resolveView( - Type() - ) as! LinkedAccountMetadataViews.AccountInfo?)! - // Insert the linked account's metadata in each child account indexing on the account's address - linkedAccountData.insert( - key: linkedAccountAddress, - LinkedAccountData( - address: linkedAccountAddress, - accountInfo: accountInfo - ) - ) - } - } - return linkedAccountData -} diff --git a/scripts/linked_accounts/get_all_nft_display_views_from_storage_MTDTVWS.cdc b/scripts/linked_accounts/get_all_nft_display_views_from_storage_MTDTVWS.cdc deleted file mode 100644 index e7fa2b7..0000000 --- a/scripts/linked_accounts/get_all_nft_display_views_from_storage_MTDTVWS.cdc +++ /dev/null @@ -1,71 +0,0 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" - -/// Helper function that retrieves data about all publicly accessible NFTs in an account -/// -pub fun getAllViewsFromAddress(_ address: Address): [MetadataViews.NFTView] { - // Get the account - let account: AuthAccount = getAuthAccount(address) - // Init for return value - let data: [MetadataViews.NFTView] = [] - // Assign the types we'll need - let collectionType: Type = Type<@{NonFungibleToken.CollectionPublic, MetadataViews.ResolverCollection}>() - let displayType: Type = Type() - let collectionDisplayType: Type = Type() - let collectionDataType: Type = Type() - - // Iterate over each public path - account.forEachStored(fun (path: StoragePath, type: Type): Bool { - // Check if it's a Collection we're interested in, if so, get a reference - // TODO: Will need to fix how LinkedAccounts contract resolves Collection Metadata since NFT.CollectionPublic is not public atm - if type.isSubtype(of: collectionType) && !type.isSubtype(of: Type<@LinkedAccounts.Collection>()) { - if let collectionRef = account.borrow< - &{NonFungibleToken.CollectionPublic, MetadataViews.ResolverCollection} - >(from: path) { - // Iterate over the Collection's NFTs, continuing if the NFT resolves the views we want - for id in collectionRef.getIDs() { - let resolverRef: &{MetadataViews.Resolver} = collectionRef.borrowViewResolver(id: id) - data.append(MetadataViews.getNFTView(id: id, viewResolver: resolverRef)) - } - } - } - return true - }) - return data -} - -/// Script that retrieve data about all publicly accessible NFTs in an account and any of its -/// child accounts -/// -/// Note that this script does not consider accounts with exceptionally large collections -/// which would result in memory errors. To compose a script that does cover accounts with -/// a large number of sub-accounts and/or NFTs within those accounts, see example 5 in -/// the NFT Catalog's README: https://github.com/dapperlabs/nft-catalog and adapt for use -/// with LinkedAccounts.Collection -/// -pub fun main(address: Address): {Address: [MetadataViews.NFTView]} { - let allNFTData: {Address: [MetadataViews.NFTView]} = {} - - // Add all retrieved views to the running mapping indexed on address - allNFTData.insert(key: address, getAllViewsFromAddress(address)) - - /* Iterate over any child accounts */ - // - // Get reference to LinkedAccounts.Collection if it exists - if let collectionRef = getAccount(address).getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic} - >( - LinkedAccounts.CollectionPublicPath - ).borrow() { - // Iterate over each linked account in LinkedAccounts.Collection - for childAddress in collectionRef.getLinkedAccountAddresses() { - if !allNFTData.containsKey(childAddress) { - // Insert the NFT metadata for those NFTs in each child account - // indexing on the account's address - allNFTData.insert(key: childAddress, getAllViewsFromAddress(childAddress)) - } - } - } - return allNFTData -} diff --git a/scripts/linked_accounts/get_linked_account_addresses.cdc b/scripts/linked_accounts/get_linked_account_addresses.cdc deleted file mode 100644 index 0384cf1..0000000 --- a/scripts/linked_accounts/get_linked_account_addresses.cdc +++ /dev/null @@ -1,19 +0,0 @@ -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" - -/// Returns the an account's linked account addresses -/// -pub fun main(parentAddress: Address): [Address] { - - // Get a ref to the parentAddress's LinkedAccounts.Collection - let collectionRef = parentAccount.getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic} - >( - LinkedAccounts.CollectionPublicPath - ).borrow() - ?? panic( - "Could not get a reference to the LinkedAccounts.Collection at address " - .concat(parentAddress.toString()) - ) - // Return the linked accounts managed by the Collection - return collectionRef.getLinkedAccountAddresses() -} diff --git a/scripts/linked_accounts/get_linked_account_metadata.cdc b/scripts/linked_accounts/get_linked_account_metadata.cdc deleted file mode 100644 index 74bb77c..0000000 --- a/scripts/linked_accounts/get_linked_account_metadata.cdc +++ /dev/null @@ -1,56 +0,0 @@ -import NonFungibleToken from "../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../contracts/utility/MetadataViews.cdc" -import LinkedAccountMetadataViews from "../contracts/LinkedAccountMetadataViews.cdc" -import LinkedAccounts from "../contracts/LinkedAccounts.cdc" - -pub struct LinkedAccountData { - pub let address: Address - pub let name: String - pub let description: String - pub let creationTimestamp: UFix64 - pub let thumbnail: AnyStruct{MetadataViews.File} - pub let externalURL: MetadataViews.ExternalURL - - init( - address: Address, - accountInfo: LinkedAccountMetadataViews.AccountInfo - ) { - self.address = address - self.name = accountInfo.name - self.description = accountInfo.description - self.creationTimestamp = accountInfo.creationTimestamp - self.thumbnail = accountInfo.thumbnail - self.externalURL = accountInfo.externalURL - } -} - -/// Returns a mapping of metadata about linked accounts indexed on the account's Address -/// -/// @param address: The main account to query against -/// -/// @return A mapping of metadata about all the given account's linked accounts, indexed on each linked account's address -/// -pub fun main(parent: Address, child: Address): LinkedAccountData? { - - // Get reference to LinkedAccounts.Collection if it exists - if let collectionRef = getAccount(parent).getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, MetadataViews.ResolverCollection} - >( - LinkedAccounts.CollectionPublicPath - ).borrow() { - let addressToID: {Address: UInt64} = collectionRef.getAddressToID() - // Iterate over each linked account in LinkedAccounts.Collection - let accountInfo: LinkedAccountMetadataViews.AccountInfo = (collectionRef.borrowViewResolverFromAddress( - address: child - ).resolveView( - Type() - ) as! LinkedAccountMetadataViews.AccountInfo?)! - // Unwrap AccountInfo into LinkedAccountData & add address - return LinkedAccountData( - address: child, - accountInfo: accountInfo - ) - } - return nil -} - \ No newline at end of file diff --git a/scripts/linked_accounts/is_child_account_of.cdc b/scripts/linked_accounts/is_child_account_of.cdc deleted file mode 100644 index ee88f41..0000000 --- a/scripts/linked_accounts/is_child_account_of.cdc +++ /dev/null @@ -1,18 +0,0 @@ -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" - -/// This script allows one to determine if a given account is a child account of the specified parent account as the -/// parent-child account relationship is defined in the LinkedAccounts contract. -/// -pub fun main(parent: Address, child: Address): Bool { - - // Get a reference to the LinkedAccounts.CollectionPublic in parent's account - if let collectionRef = getAccount(parent).getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic}>( - LinkedAccounts.CollectionPublicPath - ).borrow() { - // Return whether the link between given accounts is active - return collectionRef.isLinkActive(onAddress: child) - } - return false -} - \ No newline at end of file diff --git a/scripts/linked_accounts/is_linked_accounts_collection_configured.cdc b/scripts/linked_accounts/is_linked_accounts_collection_configured.cdc deleted file mode 100644 index 2d6a917..0000000 --- a/scripts/linked_accounts/is_linked_accounts_collection_configured.cdc +++ /dev/null @@ -1,13 +0,0 @@ -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" - -/// This script allows one to determine if a given account has a LinkedAccounts.Collection configured -/// -pub fun main(address: Address): Bool { - - // Return whether the LinkedAccounts.Collection is configured as expected at the given address - return getAuthAccount(address).type(at: LinkedAccounts.CollectionStoragePath) == Type<@LinkedAccounts.Collection>() && - getAccount(address).getCapability<&LinkedAccounts.Collection{LinkedAccounts.CollectionPublic}>( - LinkedAccounts.CollectionPublicPath - ).check() -} - \ No newline at end of file diff --git a/scripts/rock_paper_scissors_game/get_available_moves_while_in_gameplay.cdc b/scripts/rock_paper_scissors_game/get_available_moves_while_in_gameplay.cdc index a3e408a..22149b5 100644 --- a/scripts/rock_paper_scissors_game/get_available_moves_while_in_gameplay.cdc +++ b/scripts/rock_paper_scissors_game/get_available_moves_while_in_gameplay.cdc @@ -1,5 +1,5 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "NonFungibleToken" +import "RockPaperScissorsGame" /// Returns an array with the moves available for a GamePlayer in the given Match.id pub fun main(playerAddr: Address, matchID: UInt64): [RockPaperScissorsGame.Moves]? { diff --git a/scripts/rock_paper_scissors_game/get_game_player_id.cdc b/scripts/rock_paper_scissors_game/get_game_player_id.cdc index a106c68..fdc0c7a 100644 --- a/scripts/rock_paper_scissors_game/get_game_player_id.cdc +++ b/scripts/rock_paper_scissors_game/get_game_player_id.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Returns the GamePlayer.id of the GamePlayer resource /// configured at the provided address if it exists diff --git a/scripts/rock_paper_scissors_game/get_match_move_history.cdc b/scripts/rock_paper_scissors_game/get_match_move_history.cdc index 93aeaf6..2cc3583 100644 --- a/scripts/rock_paper_scissors_game/get_match_move_history.cdc +++ b/scripts/rock_paper_scissors_game/get_match_move_history.cdc @@ -1,5 +1,5 @@ -import GamingMetadataViews from "../../contracts/GamingMetadataViews.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "GamingMetadataViews" +import "RockPaperScissorsGame" /// This script returns the winLossRecords stored in RockPaperScissors contract /// diff --git a/scripts/rock_paper_scissors_game/get_match_move_history_as_raw_values.cdc b/scripts/rock_paper_scissors_game/get_match_move_history_as_raw_values.cdc index 9b38218..838f5df 100644 --- a/scripts/rock_paper_scissors_game/get_match_move_history_as_raw_values.cdc +++ b/scripts/rock_paper_scissors_game/get_match_move_history_as_raw_values.cdc @@ -1,5 +1,5 @@ -import GamingMetadataViews from "../../contracts/GamingMetadataViews.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "GamingMetadataViews" +import "RockPaperScissorsGame" /// This script returns the winLossRecords stored in RockPaperScissors contract /// in a simplified format diff --git a/scripts/rock_paper_scissors_game/get_matches_in_lobby.cdc b/scripts/rock_paper_scissors_game/get_matches_in_lobby.cdc index 48b2485..3b774e2 100644 --- a/scripts/rock_paper_scissors_game/get_matches_in_lobby.cdc +++ b/scripts/rock_paper_scissors_game/get_matches_in_lobby.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Script to get match IDs of matches for which player /// has MatchLobbyActions Capabilities diff --git a/scripts/rock_paper_scissors_game/get_matches_in_play.cdc b/scripts/rock_paper_scissors_game/get_matches_in_play.cdc index 1265a74..f364ea0 100644 --- a/scripts/rock_paper_scissors_game/get_matches_in_play.cdc +++ b/scripts/rock_paper_scissors_game/get_matches_in_play.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Script to get match IDs of matches for which player /// has MatchLobbyActions Capabilities diff --git a/scripts/rock_paper_scissors_game/get_rps_game_info.cdc b/scripts/rock_paper_scissors_game/get_rps_game_info.cdc index 3ffb035..a4202e0 100644 --- a/scripts/rock_paper_scissors_game/get_rps_game_info.cdc +++ b/scripts/rock_paper_scissors_game/get_rps_game_info.cdc @@ -1,5 +1,5 @@ -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" -import GamingMetadataViews from "../../contracts/GamingMetadataViews.cdc" +import "RockPaperScissorsGame" +import "GamingMetadataViews" /// Returns RockPaperScissorsGame metadata stored as GamingMetadataViews.GameContractMetadata /// diff --git a/scripts/rock_paper_scissors_game/get_total_win_loss_records.cdc b/scripts/rock_paper_scissors_game/get_total_win_loss_records.cdc index 63fdc7f..933c89b 100644 --- a/scripts/rock_paper_scissors_game/get_total_win_loss_records.cdc +++ b/scripts/rock_paper_scissors_game/get_total_win_loss_records.cdc @@ -1,5 +1,5 @@ -import GamingMetadataViews from "../../contracts/GamingMetadataViews.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "GamingMetadataViews" +import "RockPaperScissorsGame" /// This script returns the winLossRecords stored in RockPaperScissors contract /// diff --git a/scripts/rock_paper_scissors_game/is_game_player_configured.cdc b/scripts/rock_paper_scissors_game/is_game_player_configured.cdc index 3c9afaa..65150eb 100644 --- a/scripts/rock_paper_scissors_game/is_game_player_configured.cdc +++ b/scripts/rock_paper_scissors_game/is_game_player_configured.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Returns true if the given address has a GamePlayerPublic Capability /// configured at the expected path. A player would run this script diff --git a/scripts/test/get_ft_provider_from_factory_allowed.cdc b/scripts/test/get_ft_provider_from_factory_allowed.cdc new file mode 100644 index 0000000..e3b9172 --- /dev/null +++ b/scripts/test/get_ft_provider_from_factory_allowed.cdc @@ -0,0 +1,25 @@ +import "MetadataViews" +import "FungibleToken" + +import "CapabilityFilter" +import "CapabilityFactory" + +import "TicketToken" + +pub fun main(address: Address, providerPath: PrivatePath): Bool { + let acct = getAuthAccount(address) + let ref = &acct as &AuthAccount + + let factoryManager = acct.borrow<&CapabilityFactory.Manager>(from: CapabilityFactory.StoragePath) + ?? panic("Problem borrowing CapabilityFactory Manager") + let factory = factoryManager.getFactory(Type<&{FungibleToken.Provider}>()) + ?? panic("No factory for FungibleToken Provider Factory found") + + let provider = factory.getCapability(acct: ref, path: providerPath) as! Capability<&{FungibleToken.Provider}> + assert(provider.borrow() != nil, message: "Invalid FungibleToken Provider Capability retrieved") + + let filter = acct.borrow<&CapabilityFilter.AllowlistFilter>(from: CapabilityFilter.StoragePath) + ?? panic("Problem borrowing CapabilityFilter AllowlistFilter") + + return filter.allowed(cap: provider) +} \ No newline at end of file diff --git a/scripts/test/get_nft_provider_from_factory_allowed.cdc b/scripts/test/get_nft_provider_from_factory_allowed.cdc new file mode 100644 index 0000000..7e473b5 --- /dev/null +++ b/scripts/test/get_nft_provider_from_factory_allowed.cdc @@ -0,0 +1,30 @@ +import "MetadataViews" +import "NonFungibleToken" + +import "CapabilityFilter" +import "CapabilityFactory" +import "NFTProviderFactory" + +import "GamePieceNFT" + +/// Determines if GamePieceNFT Provider both has a Factory at the ruleAddr and is allowed by the AllowlistFilter found in +/// the given account housing the CapabilityFactory Manager and the CapabilityFilter AllowlistFilter. +/// +pub fun main(address: Address): Bool { + let acct = getAuthAccount(address) + let ref = &acct as &AuthAccount + + let factoryManager = acct.borrow<&CapabilityFactory.Manager>(from: CapabilityFactory.StoragePath) + ?? panic("Problem borrowing CapabilityFactory Manager") + let factory = factoryManager.getFactory(Type<&{NonFungibleToken.Provider}>()) + ?? panic("No factory for NFT Provider Factory found") + + let d = GamePieceNFT.resolveView(Type())! as! MetadataViews.NFTCollectionData + let provider = factory.getCapability(acct: ref, path: d.providerPath) as! Capability<&{NonFungibleToken.Provider}> + assert(provider.borrow() != nil, message: "Invalid NonFungibleToken Provider Capability retrieved") + + let filter = acct.borrow<&CapabilityFilter.AllowlistFilter>(from: CapabilityFilter.StoragePath) + ?? panic("Problem borrowing CapabilityFilter AllowlistFilter") + + return filter.allowed(cap: provider) +} \ No newline at end of file diff --git a/scripts/test/test_arcade_prize_configuration copy.cdc b/scripts/test/test_arcade_prize_configuration copy.cdc new file mode 100644 index 0000000..5090eed --- /dev/null +++ b/scripts/test/test_arcade_prize_configuration copy.cdc @@ -0,0 +1,18 @@ +import "NonFungibleToken" +import "MetadataViews" + +import "ArcadePrize" + +/// Validates correct configuration of GamePieceNFT resource & Capabilities +/// +pub fun main(address: Address): Bool { + + let public = getAccount(address).getCapability<&ArcadePrize.Collection{NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, ArcadePrize.GamePieceNFTCollectionPublic, MetadataViews.ResolverCollection}>( + ArcadePrize.CollectionPublicPath + ) + let private = getAuthAccount(address).getCapability<&ArcadePrize.Collection{NonFungibleToken.Provider}>( + ArcadePrize.ProviderPrivatePath + ) + + return public.check() && private.check() +} \ No newline at end of file diff --git a/scripts/test/test_game_piece_nft_configuration.cdc b/scripts/test/test_game_piece_nft_configuration.cdc new file mode 100644 index 0000000..c8d3c1e --- /dev/null +++ b/scripts/test/test_game_piece_nft_configuration.cdc @@ -0,0 +1,18 @@ +import "NonFungibleToken" +import "MetadataViews" + +import "GamePieceNFT" + +/// Validates correct configuration of GamePieceNFT resource & Capabilities +/// +pub fun main(address: Address): Bool { + + let public = getAccount(address).getCapability<&GamePieceNFT.Collection{NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, GamePieceNFT.GamePieceNFTCollectionPublic, MetadataViews.ResolverCollection}>( + GamePieceNFT.CollectionPublicPath + ) + let private = getAuthAccount(address).getCapability<&GamePieceNFT.Collection{NonFungibleToken.Provider}>( + GamePieceNFT.ProviderPrivatePath + ) + + return public.check() && private.check() +} \ No newline at end of file diff --git a/scripts/test/test_game_player_configuration.cdc b/scripts/test/test_game_player_configuration.cdc new file mode 100644 index 0000000..effdd0a --- /dev/null +++ b/scripts/test/test_game_player_configuration.cdc @@ -0,0 +1,15 @@ +import "RockPaperScissorsGame" + +/// Validates correct configuration of GamePlayer resource & Capabilities +/// +pub fun main(address: Address): Bool { + + let public = getAccount(address).getCapability<&{RockPaperScissorsGame.GamePlayerPublic}>( + RockPaperScissorsGame.GamePlayerPublicPath + ) + let private = getAuthAccount(address).getCapability<&{RockPaperScissorsGame.DelegatedGamePlayer, RockPaperScissorsGame.GamePlayerID}>( + RockPaperScissorsGame.GamePlayerPrivatePath + ) + + return public.check() && private.check() +} \ No newline at end of file diff --git a/scripts/test/test_get_accessible_child_nfts.cdc b/scripts/test/test_get_accessible_child_nfts.cdc new file mode 100644 index 0000000..e960457 --- /dev/null +++ b/scripts/test/test_get_accessible_child_nfts.cdc @@ -0,0 +1,98 @@ +import "HybridCustody" +import "NonFungibleToken" +import "MetadataViews" +import "StringUtils" + +/* + * TEST SCRIPT + * This script is a replication of that found in hybrid-custody/get_accessible_child_account_nfts.cdc as it's the best as + * as can be done without accessing the script's return type in the Cadence testing framework + */ + +/// Assertion method to ensure passing test +/// +pub fun assertPassing(result: {Address: {UInt64: MetadataViews.Display}}, expectedAddressToIDs: {Address: [UInt64]}) { + for address in expectedAddressToIDs.keys { + let expectedIDs: [UInt64] = expectedAddressToIDs[address]! + + for i, id in expectedAddressToIDs[address]! { + if result[address]![id] == nil { + panic("Resulting ID does not match expected ID!") + } + } + } +} + +pub fun main(addr: Address, expectedAddressToIDs: {Address: [UInt64]}){ + let manager = getAuthAccount(addr).borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) ?? panic ("manager does not exist") + + var typeIdsWithProvider = {} as {Address: [String]} + var nftViews = {} as {Address: {UInt64: MetadataViews.Display}} + + let providerType = Type>() + let collectionType: Type = Type<@{NonFungibleToken.CollectionPublic}>() + + for address in manager.getChildAddresses() { + let acct = getAuthAccount(address) + let foundTypes: [String] = [] + let views: {UInt64: MetadataViews.Display} = {} + let childAcct = manager.borrowAccount(addr: address) ?? panic("child account not found") + // get all private paths + acct.forEachPrivate(fun (path: PrivatePath, type: Type): Bool { + // Check which private paths have NFT Provider AND can be borrowed + if !type.isSubtype(of: providerType){ + return true + } + + if let cap: Capability = childAcct.getCapability(path: path, type: Type<&{NonFungibleToken.Provider}>()) { + let providerCap = cap as! Capability<&{NonFungibleToken.Provider}> + + if !providerCap.check(){ + return true + } + + foundTypes.append(cap.borrow<&AnyResource>()!.getType().identifier) + } + return true + }) + typeIdsWithProvider[address] = foundTypes + + // iterate storage, check if typeIdsWithProvider contains the typeId, if so, add to views + acct.forEachStored(fun (path: StoragePath, type: Type): Bool { + + if typeIdsWithProvider[address] == nil { + return true + } + + for key in typeIdsWithProvider.keys { + for idx, value in typeIdsWithProvider[key]! { + let value = typeIdsWithProvider[key]! + + if value[idx] != type.identifier { + continue + } else { + if type.isInstance(collectionType) { + continue + } + if let collection = acct.borrow<&{NonFungibleToken.CollectionPublic}>(from: path) { + // Iterate over IDs & resolve the view + for id in collection.getIDs() { + let nft = collection.borrowNFT(id: id) + if let display = nft.resolveView(Type())! as? MetadataViews.Display { + views.insert(key: id, display) + } + } + } + continue + } + } + } + return true + }) + nftViews[address] = views + } + // Assert instead of return for testing purposes here + + assertPassing(result: nftViews, expectedAddressToIDs: expectedAddressToIDs) + // return nftViews +} \ No newline at end of file diff --git a/scripts/test/test_ticket_token_configuration.cdc b/scripts/test/test_ticket_token_configuration.cdc new file mode 100644 index 0000000..ab3d751 --- /dev/null +++ b/scripts/test/test_ticket_token_configuration.cdc @@ -0,0 +1,18 @@ +import "FungibleToken" +import "MetadataViews" + +import "TicketToken" + +/// Validates correct configuration of TicketToken resource & Capabilities +/// +pub fun main(address: Address): Bool { + + let public = getAccount(address).getCapability<&TicketToken.Vault{FungibleToken.Receiver, FungibleToken.Balance, MetadataViews.Resolver}>( + TicketToken.ReceiverPublicPath + ) + let private = getAuthAccount(address).getCapability<&TicketToken.Vault{FungibleToken.Provider}>( + TicketToken.ProviderPrivatePath + ) + + return public.check() && private.check() +} \ No newline at end of file diff --git a/scripts/ticket_token/get_balance.cdc b/scripts/ticket_token/get_balance.cdc index 500719d..6aab4c8 100644 --- a/scripts/ticket_token/get_balance.cdc +++ b/scripts/ticket_token/get_balance.cdc @@ -1,5 +1,5 @@ -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" -import TicketToken from "../../contracts/TicketToken.cdc" +import "FungibleToken" +import "TicketToken" /// Returns the balance of TicketToken in the Vault at the standar path /// in the specified address diff --git a/scripts/ticket_token/get_balance_of_all_child_accounts.cdc b/scripts/ticket_token/get_balance_of_all_child_accounts.cdc index 6815c3f..e16fd8d 100644 --- a/scripts/ticket_token/get_balance_of_all_child_accounts.cdc +++ b/scripts/ticket_token/get_balance_of_all_child_accounts.cdc @@ -1,6 +1,8 @@ -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" -import TicketToken from "../../contracts/TicketToken.cdc" +import "FungibleToken" + +import "HybridCustody" + +import "TicketToken" /// Helper method that returns the TicketToken balance for the specified address. A balance of 0.0 could mean the /// balance is 0.0 or a Vault is not configured. @@ -34,12 +36,13 @@ pub fun main(parentAddress: Address): {Address: UFix64} { let accountBalances: {Address: UFix64} = { parentAddress: getTicketTokenBalance(from: parentAddress) } - // Get a ref to the parentAddress's LinkedAccounts.Collection if possible - if let viewerRef = getAccount(parentAddress).getCapability<&LinkedAccounts.Collection{LinkedAccounts.CollectionPublic}>( - LinkedAccounts.CollectionPublicPath).borrow() { - // Iterate over the linked accounts, adding their balance to the ongoing return mapping - let linkedAccounts: [Address] = viewerRef.getLinkedAccountAddresses() - for address in linkedAccounts { + // Get a ref to the parentAddress's HybridCustody.Manager if possible + if let manager = getAuthAccount(parentAddress).borrow<&HybridCustody.Manager>( + from: HybridCustody.ManagerStoragePath + ) { + // Iterate over the child accounts, adding their balance to the ongoing return mapping + let childAccounts: [Address] = manager.getChildAddresses() + for address in childAccounts { if let balance = getTicketTokenBalanceSafe(from: address) { accountBalances.insert(key: address, balance) } diff --git a/setup.sh b/setup.sh new file mode 100644 index 0000000..3883e4a --- /dev/null +++ b/setup.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Create emulator-flow-utils account e03daebed8ca0615 with private key f84d8acb8a1efa87e316df886825e0b6acfa795f2599cbb306727084aa45b80d +flow accounts create --key "a45b0c0d88f7408a19cd86feef67105509aad31f5986c676cf3010fbe001e3a7b20d90d1f5bdfcb3218a6204d87dd910bc52ec32a37c1888725429d808262a1e" + +# Create emulator-game account 045a1763c93006ca with private key 884bf6b10358c23a35d272123eabb509be0e7bc895c9bfbaaeccae1b1f9204d3 +flow accounts create --key "921375073cd516a5c33804ca577086501a9772f2991f9b2e28b81b62fee72f54f0ed1b7e7d4a333885dfa7de8aabc094e14bbec3aaa41895e9fe6d6f7fdb4041" + +# Create emulator-hybrid-custody account 0x120e725050340cab with private key 9219adbbe5caca4f2753fbd4fd22f50d5d5f6a8fe7096bbf381cbd55c2f46aab +flow accounts create --key "1dc63a08035b6c99ba1f94e2bdfa0d65c8afab71734dceb05c53cc50c6e84418258e11c9009f7983bb65bbb361150def006a4f1e14c3a032d2e4cbd0c0d19cbd" + +# Transfer the game developer some $FLOW for storage fees +flow transactions send ./transactions/flow_token/transfer_flow.cdc 1000.0 045a1763c93006ca + +# Deploy contracts +flow deploy \ No newline at end of file diff --git a/test/rps_hybrid_custody_tests.cdc b/test/rps_hybrid_custody_tests.cdc new file mode 100644 index 0000000..88dca8e --- /dev/null +++ b/test/rps_hybrid_custody_tests.cdc @@ -0,0 +1,798 @@ +import Test + +pub var accounts: {String: Test.Account} = {} +pub var blockchain = Test.newEmulatorBlockchain() +pub let fungibleTokenAddress: Address = 0xee82856bf20e2aa6 +pub let flowTokenAddress: Address = 0x0ae53cb6e3f42a79 + +pub let app = "app" +pub let child = "child" +pub let nftFactory = "nftFactory" + +pub let dynamicNFT = "DynamicNFT" +pub let gamingMetadataViews = "GamingMetadataViews" +pub let gamePieceNFT = "GamePieceNFT" +pub let ticketToken = "TicketToken" +pub let rockPaperScissorsGame = "RockPaperScissorsGame" +pub let arcadePrize = "ArcadePrize" + +pub let capabilityFilter = "CapabilityFilter" + +pub let FilterKindAllowList = "allowlist" + +pub let gamePieceNFTPublicIdentifier = "GamePieceNFTCollection" +pub let arcadePrizePublicIdentifier = "ArcadePrizeCollection" + +pub let pubKey = "af45946342ac9fcc3f909c6f710d3a0c05be903fead0edf77da0bffa572c7a47bfce69218dc54998cdb86f3996fdbfb360be30854f462783188372861549409f" + +// --------------- Test cases --------------- + +pub fun testSetupFilterAndFactory() { + let tmp = blockchain.createAccount() + + setupFilterAndFactoryManager(tmp) + setupNFTCollection(tmp, collection: gamePieceNFT) + setupTicketTokenVault(tmp) + + let nftProviderAllowed = scriptExecutor("test/get_nft_provider_from_factory_allowed.cdc", [tmp.address])! as! Bool + let ftProviderAllowed: Bool = scriptExecutor("test/get_ft_provider_from_factory_allowed.cdc", [tmp.address, PrivatePath(identifier: "TicketTokenProvider")!])! as! Bool + + Test.assertEqual(true, nftProviderAllowed) + Test.assertEqual(true, ftProviderAllowed) +} + +pub fun testWalletlessOnboarding() { + walletlessOnboarding(accounts["GamePieceNFT"]!, pubKey: pubKey, fundingAmout: 1.0) + + let address = scriptExecutor("account_creator/get_address_from_pub_key.cdc", [accounts["GamePieceNFT"]!.address, pubKey])! as! Address + let actualKeyIndex = scriptExecutor("account_creator/is_key_active_on_account.cdc", [pubKey, address])! as! Int + + Test.assertEqual(0, actualKeyIndex) +} + +pub fun testSelfCustodyOnboarding() { + // Onboard the player - must do self-custody for testing reasons - can't detect walletless address + let player = blockchain.createAccount() + selfCustodyOnboarding(player) + + // Query NFT ID + let nftIDs = scriptExecutor("game_piece_nft/get_collection_ids.cdc", [player.address]) as! [UInt64]? + ?? panic("Problem getting GamePiece NFT IDs!") + Test.assertEqual(1, nftIDs.length) + + // Make sure GamePlayer was configured + let playerID = scriptExecutor("rock_paper_scissors_game/get_game_player_id.cdc", [player.address]) as! UInt64? + ?? panic("GamePlayer was not configured correctly!") + + // Make sure TicketToken Vault was configured + let balance = scriptExecutor("ticket_token/get_balance.cdc", [player.address]) as! UFix64? + ?? panic("TicketToken Vault was not configured correctly!") + Test.assertEqual(0.0, balance) +} + +pub fun testSetupOwnedAccountAndPublish() { + // Dev sets up Filter and Factory Manager (one-time setup pre-req for Hybrid Custody) + let dev = blockchain.createAccount() + setupFilterAndFactoryManager(dev) + + // Onboard the player - must do self-custody for testing reasons - can't detect walletless address + let child = blockchain.createAccount() + selfCustodyOnboarding(child) + + // Player creates their own wallet-managed account + let parent = blockchain.createAccount() + // Publish the player account for parent account + setupOwnedAccountAndPublish(child, parent: parent.address, factoryAddress: dev.address, filterAddress: dev.address) + + // Validate ChildAccount & OwnedAccount configured at publishing child account but not yet redeemed by parent + let isParent = scriptExecutor("hybrid_custody/is_parent.cdc", [child.address, parent.address]) as! Bool? + ?? panic("Problem configuring HybridCustody resources in publishing child account!") + let isRedeemed = scriptExecutor("hybrid_custody/is_redeemed.cdc", [child.address, parent.address]) as! Bool? + ?? panic("Problem configuring HybridCustody resources in publishing child account!") + Test.assertEqual(true, isParent) + Test.assertEqual(false, isRedeemed) +} + +pub fun testRedeemPublishedAccount() { + // Dev sets up Filter and Factory Manager (one-time setup pre-req for Hybrid Custody) + let dev = blockchain.createAccount() + setupFilterAndFactoryManager(dev) + + // Onboard the player - must do self-custody for testing reasons - can't detect walletless address + let child = blockchain.createAccount() + selfCustodyOnboarding(child) + + // Player creates their own wallet-managed account + let parent = blockchain.createAccount() + // Publish the player account for parent account + setupOwnedAccountAndPublish(child, parent: parent.address, factoryAddress: dev.address, filterAddress: dev.address) + + // Redeem the published account + redeemPublishedAccount(parent, childAddress: child.address) + + // Validate ChildAccount & OwnedAccount configured at publishing child account but not yet redeemed by parent + let isParent = scriptExecutor("hybrid_custody/is_parent.cdc", [child.address, parent.address]) as! Bool? + ?? panic("Problem configuring HybridCustody resources in publishing child account!") + let isRedeemed = scriptExecutor("hybrid_custody/is_redeemed.cdc", [child.address, parent.address]) as! Bool? + ?? panic("Problem configuring HybridCustody resources in publishing child account!") + Test.assertEqual(true, isParent) + Test.assertEqual(true, isRedeemed) + + // Validate the parent has the child account added to its Manager + let isChild = scriptExecutor("hybrid_custody/has_address_as_child.cdc", [parent.address, child.address]) as! Bool? + ?? panic("Problem configuring HybridCustody Manager in parent account!") + Test.assertEqual(true, isChild) + + // Validate child NFT IDs are accessible from parent + let expectedChildIDs = (scriptExecutor("game_piece_nft/get_collection_ids.cdc", [child.address]) as! [UInt64]?)! + let expectedParentIDs: [UInt64] = [] + let expectedAddressToIDs: {Address: [UInt64]} = {child.address: expectedChildIDs, parent.address: expectedParentIDs} + + // Test we have capabilities to access the minted NFTs + scriptExecutor("test/test_get_accessible_child_nfts.cdc", [ + parent.address, + {child.address: expectedChildIDs} + ]) + + // Validate parent account configured with TicketToken Vault + let parentTicketTokenBalanace = scriptExecutor("ticket_token/get_balance.cdc", [parent.address]) as! UFix64? + ?? panic("Problem setting up parent's TicketToken Vault!") + Test.assertEqual(0.0, parentTicketTokenBalanace) +} + +pub fun testBlockchainNativeOnboarding() { + // Dev sets up Filter and Factory Manager (one-time setup pre-req for Hybrid Custody) + let filterAndFactory = blockchain.createAccount() + setupFilterAndFactoryManager(filterAndFactory) + + let dev = blockchain.createAccount() + let parent = blockchain.createAccount() + + blockchainNativeOnboarding( + parent: parent, + dev: dev, + fundingAmout: 0.0, + factoryAddress: filterAndFactory.address, + filterAddress: filterAndFactory.address + ) + let address = scriptExecutor("account_creator/get_address_from_pub_key.cdc", [accounts["GamePieceNFT"]!.address, pubKey])! as! Address + let actualKeyIndex = scriptExecutor("account_creator/is_key_active_on_account.cdc", [pubKey, address])! as! Int + Test.assertEqual(0, actualKeyIndex) + + // Get child account address created in blockchain-native onboarding flow + let childAddresses = getChildAccountAddresses(parent: parent) + let childAddress = childAddresses[0] + + // Validate ChildAccount & OwnedAccount configured at publishing child account but not yet redeemed by parent + let isParent = scriptExecutor("hybrid_custody/is_parent.cdc", [childAddress, parent.address]) as! Bool? + ?? panic("Problem configuring HybridCustody resources in publishing child account!") + let isRedeemed = scriptExecutor("hybrid_custody/is_redeemed.cdc", [childAddress, parent.address]) as! Bool? + ?? panic("Problem configuring HybridCustody resources in publishing child account!") + Test.assertEqual(true, isParent) + Test.assertEqual(true, isRedeemed) + + // Validate the parent has the child account added to its Manager + let isChild = scriptExecutor("hybrid_custody/has_address_as_child.cdc", [parent.address, childAddress]) as! Bool? + ?? panic("Problem configuring HybridCustody Manager in parent account!") + Test.assertEqual(true, isChild) + + // Validate child NFT IDs are accessible from parent + let expectedChildIDs = (scriptExecutor("game_piece_nft/get_collection_ids.cdc", [childAddress]) as! [UInt64]?)! + let expectedParentIDs: [UInt64] = [] + let expectedAddressToIDs: {Address: [UInt64]} = {childAddress: expectedChildIDs, parent.address: expectedParentIDs} + + // Test we have capabilities to access the minted NFTs + scriptExecutor("test/test_get_accessible_child_nfts.cdc", [ + parent.address, + {childAddress: expectedChildIDs} + ]) + + // Validate parent account configured with TicketToken Vault + let parentTicketTokenBalanace = scriptExecutor("ticket_token/get_balance.cdc", [parent.address]) as! UFix64? + ?? panic("Problem setting up parent's TicketToken Vault!") + Test.assertEqual(0.0, parentTicketTokenBalanace) +} + +pub fun testAddAccountMultiSign() { + // Dev sets up Filter and Factory Manager (one-time setup pre-req for Hybrid Custody) + let filterAndFactory = blockchain.createAccount() + setupFilterAndFactoryManager(filterAndFactory) + + // Setup child account + let child = blockchain.createAccount() + selfCustodyOnboarding(child) + + let parent = blockchain.createAccount() + + addAccountMultiSign( + parent: parent, + child: child, + childAccountFactoryAddress: filterAndFactory.address, + childAccountFilterAddress: filterAndFactory.address + ) + + // Get child account address created in blockchain-native onboarding flow + let childAddresses = getChildAccountAddresses(parent: parent) + let childAddress = childAddresses[0] + + // Validate ChildAccount & OwnedAccount configured at publishing child account but not yet redeemed by parent + let isParent = scriptExecutor("hybrid_custody/is_parent.cdc", [childAddress, parent.address]) as! Bool? + ?? panic("Problem configuring HybridCustody resources in publishing child account!") + let isRedeemed = scriptExecutor("hybrid_custody/is_redeemed.cdc", [childAddress, parent.address]) as! Bool? + ?? panic("Problem configuring HybridCustody resources in publishing child account!") + Test.assertEqual(true, isParent) + Test.assertEqual(true, isRedeemed) + + // Validate the parent has the child account added to its Manager + let isChild = scriptExecutor("hybrid_custody/has_address_as_child.cdc", [parent.address, childAddress]) as! Bool? + ?? panic("Problem configuring HybridCustody Manager in parent account!") + Test.assertEqual(true, isChild) + + // Validate child NFT IDs are accessible from parent + let expectedChildIDs = (scriptExecutor("game_piece_nft/get_collection_ids.cdc", [childAddress]) as! [UInt64]?)! + let expectedParentIDs: [UInt64] = [] + let expectedAddressToIDs: {Address: [UInt64]} = {childAddress: expectedChildIDs, parent.address: expectedParentIDs} + + // Test we have capabilities to access the minted NFTs + scriptExecutor("test/test_get_accessible_child_nfts.cdc", [ + parent.address, + {childAddress: expectedChildIDs} + ]) + + // Validate parent account configured with TicketToken Vault + let parentTicketTokenBalanace = scriptExecutor("ticket_token/get_balance.cdc", [parent.address]) as! UFix64? + ?? panic("Problem setting up parent's TicketToken Vault!") + Test.assertEqual(0.0, parentTicketTokenBalanace) +} + +pub fun testCrossAccountArcadePrizeNFTMinting() { + // Dev sets up Filter and Factory Manager (one-time setup pre-req for Hybrid Custody) + let dev = blockchain.createAccount() + setupFilterAndFactoryManager(dev) + + // Onboard the player - must do self-custody for testing reasons - can't detect walletless address + let child = blockchain.createAccount() + selfCustodyOnboarding(child) + + // Player creates their own wallet-managed account + let parent = blockchain.createAccount() + // Publish the player account for parent account + setupOwnedAccountAndPublish(child, parent: parent.address, factoryAddress: dev.address, filterAddress: dev.address) + + // Redeem the published account + redeemPublishedAccount(parent, childAddress: child.address) + + // Validate ChildAccount & OwnedAccount configured at publishing child account but not yet redeemed by parent + let isParent = scriptExecutor("hybrid_custody/is_parent.cdc", [child.address, parent.address]) as! Bool? + ?? panic("Problem configuring HybridCustody resources in publishing child account!") + let isRedeemed = scriptExecutor("hybrid_custody/is_redeemed.cdc", [child.address, parent.address]) as! Bool? + ?? panic("Problem configuring HybridCustody resources in publishing child account!") + Test.assertEqual(true, isParent) + Test.assertEqual(true, isRedeemed) + + // Validate the parent has the child account added to its Manager + let isChild = scriptExecutor("hybrid_custody/has_address_as_child.cdc", [parent.address, child.address]) as! Bool? + ?? panic("Problem configuring HybridCustody Manager in parent account!") + Test.assertEqual(true, isChild) + + // Validate child NFT IDs are accessible from parent + let expectedChildIDs = (scriptExecutor("game_piece_nft/get_collection_ids.cdc", [child.address]) as! [UInt64]?)! + let expectedParentIDs: [UInt64] = [] + let expectedAddressToIDs: {Address: [UInt64]} = {child.address: expectedChildIDs, parent.address: expectedParentIDs} + + // Test we have capabilities to access the minted NFTs + scriptExecutor("test/test_get_accessible_child_nfts.cdc", [ + parent.address, + {child.address: expectedChildIDs} + ]) + + // Validate parent account configured with TicketToken Vault + let parentTicketTokenBalanace = scriptExecutor("ticket_token/get_balance.cdc", [parent.address]) as! UFix64? + ?? panic("Problem setting up parent's TicketToken Vault!") + Test.assertEqual(0.0, parentTicketTokenBalanace) + + // Mint TicketToken to child account + let mintedAmount = 10.0 + txExecutor("ticket_token/mint_tokens.cdc", [accounts["TicketToken"]!], [child.address, mintedAmount], nil, nil) + + // Validate child account balance increase by minted amount + let childTicketTokenBalanace = scriptExecutor("ticket_token/get_balance.cdc", [child.address]) as! UFix64? + ?? panic("Problem minting TicketToken to child account!") + Test.assertEqual(mintedAmount, childTicketTokenBalanace) + + // Mint ArcadePrizeNFT to parent, paying with child account's TicketToken balance + txExecutor("arcade_prize/mint_rainbow_duck_paying_with_child_vault.cdc", [parent], [child.address, accounts["ArcadePrize"]!.address], nil, nil) + + // Validate parent account has ArcadePrize NFT in its Collection + let parentArcadePrizeIDs = scriptExecutor("arcade_prize/get_collection_ids.cdc", [parent.address]) as! [UInt64]? + ?? panic("Problem getting parent's ArcadePrize NFT IDs!") + Test.assertEqual(1, parentArcadePrizeIDs.length) +} + +// --------------- Transaction wrapper functions --------------- + +pub fun setupFilterAndFactoryManager(_ acct: Test.Account) { + txExecutor( + "hybrid_custody/dev_setup/setup_filter_and_factory_manager.cdc", + [acct], + [accounts[gamePieceNFT]!.address, gamePieceNFT, accounts[ticketToken]!.address, ticketToken], + nil, + nil + ) +} + +pub fun transferFlow(amount: UFix64, to: Test.Account) { + let account = blockchain.serviceAccount() + + let code = loadCode("flow_token/transfer_flow.cdc", "transactions") + let tx = Test.Transaction( + code: code, + authorizers: [account.address], + signers: [], + arguments: [to.address, amount] + ) + + // Act + let result = blockchain.executeTransaction(tx) + Test.assert(result.status == Test.ResultStatus.succeeded) +} + +pub fun walletlessOnboarding(_ acct: Test.Account, pubKey: String, fundingAmout: UFix64) { + txExecutor( + "onboarding/walletless_onboarding.cdc", + [acct], + [pubKey, 0.0, 1, 1, 1, 1], + nil, + nil + ) +} + +pub fun blockchainNativeOnboarding( + parent: Test.Account, + dev: Test.Account, + fundingAmout: UFix64, + factoryAddress: Address, + filterAddress: Address +) { + txExecutor( + "onboarding/blockchain_native_onboarding.cdc", + [parent, dev], + [pubKey, 0.0, factoryAddress, filterAddress, accounts["GamePieceNFT"]!.address], + nil, + nil + ) +} + +pub fun addAccountMultiSign ( + parent: Test.Account, + child: Test.Account, + childAccountFactoryAddress: Address, + childAccountFilterAddress: Address +) { + txExecutor( + "hybrid_custody/add_account_multi_sign.cdc", + [parent, child], + [childAccountFactoryAddress, childAccountFilterAddress], + nil, + nil + ) +} + +pub fun selfCustodyOnboarding(_ acct: Test.Account) { + txExecutor( + "onboarding/self_custody_onboarding.cdc", + [acct], + [accounts[gamePieceNFT]!.address], + nil, + nil + ) +} + +pub fun setupOwnedAccountAndPublish( + _ acct: Test.Account, + parent: Address, + factoryAddress: Address, + filterAddress: Address +) { + txExecutor( + "hybrid_custody/setup_owned_account_and_publish_to_parent.cdc", + [acct], + [parent, factoryAddress, filterAddress], + nil, + nil + ) +} + +pub fun redeemPublishedAccount(_ acct: Test.Account, childAddress: Address) { + txExecutor( + "hybrid_custody/redeem_account.cdc", + [acct], + [childAddress], + nil, + nil + ) +} + +pub fun setupNFTCollection(_ acct: Test.Account, collection: String) { + var success: Bool = false + switch collection { + case gamePieceNFT: + success = txExecutor("game_piece_nft/setup_account.cdc", [acct], [], nil, nil) + case ticketToken: + success = txExecutor("ticket_token/setup_account.cdc", [acct], [], nil, nil) + } + if !success { + panic("Failed to setup NFT collection!") + } +} + +pub fun setupTicketTokenVault(_ acct: Test.Account) { + let success = txExecutor("ticket_token/setup_account.cdc", [acct], [], nil, nil) + if !success { + panic("Failed to setup TicketToken Vault!") + } +} + +pub fun mintNFTRandomPublic(_ acct: Test.Account) { + let filepath: String = "game_piece_nft/mint_nft_random_component_public.cdc" + txExecutor(filepath, [acct], [accounts[gamePieceNFT]!.address], nil, nil) +} + +// ---------------- End Transaction wrapper functions + +// ---------------- Begin script wrapper functions + +pub fun getFTProviderAllowed(forAddress: Address, identifier: String): Bool { + let privatePath = PrivatePath(identifier: identifier) ?? panic("Invalid private path identifier provided!") + return scriptExecutor("test/get_ft_provider_from_factory_allowed.cdc", [forAddress, privatePath])! as! Bool +} + +pub fun getParentStatusesForChild(_ child: Test.Account): {Address: Bool} { + return scriptExecutor("hybrid_custody/get_parents_from_child.cdc", [child.address])! as! {Address: Bool} +} + +pub fun isParent(child: Test.Account, parent: Test.Account): Bool { + return scriptExecutor("hybrid_custody/is_parent.cdc", [child.address, parent.address])! as! Bool +} + +pub fun getChildAccountAddresses(parent: Test.Account): [Address] { + return scriptExecutor("hybrid_custody/get_child_addresses.cdc", [parent.address])! as! [Address] +} + +pub fun checkIsRedeemed(child: Test.Account, parent: Test.Account): Bool { + return scriptExecutor("hybrid_custody/is_redeemed.cdc", [child.address, parent.address])! as! Bool +} + +pub fun checkAuthAccountDefaultCap(account: Test.Account): Bool { + return scriptExecutor("hybrid_custody/check_default_auth_acct_linked_path.cdc", [account.address])! as! Bool +} + +pub fun getOwner(child: Test.Account): Address? { + let res = scriptExecutor("hybrid_custody/get_owner_of_child.cdc", [child.address]) + if res == nil { + return nil + } + + return res! as! Address +} + +pub fun getPendingOwner(child: Test.Account): Address? { + let res = scriptExecutor("hybrid_custody/get_pending_owner_of_child.cdc", [child.address]) + + return res as! Address? +} + +pub fun checkForAddresses(child: Test.Account, parent: Test.Account): Bool { + let childAddressResult: [Address]? = (scriptExecutor("hybrid_custody/get_child_addresses.cdc", [parent.address])) as! [Address]? + assert(childAddressResult?.contains(child.address) == true, message: "child address not found") + + let parentAddressResult: [Address]? = (scriptExecutor("hybrid_custody/get_parent_addresses.cdc", [child.address])) as! [Address]? + assert(parentAddressResult?.contains(parent.address) == true, message: "parent address not found") + return true +} + +pub fun getBalance(_ acct: Test.Account): UFix64 { + let balance: UFix64? = (scriptExecutor("ticket_token/get_balance.cdc", [acct.address])! as! UFix64) + return balance! +} + +// ---------------- End script wrapper functions + +// ---------------- BEGIN General-purpose helper functions + +pub fun buildTypeIdentifier(_ acct: Test.Account, _ contractName: String, _ suffix: String): String { + let addrString = (acct.address as! Address).toString() + return "A.".concat(addrString.slice(from: 2, upTo: addrString.length)).concat(".").concat(contractName).concat(".").concat(suffix) +} + +pub fun getCapabilityFilterPath(): String { + let filterAcct = getTestAccount(capabilityFilter) + + return "CapabilityFilter".concat(filterAcct.address.toString()) +} + +// ---------------- END General-purpose helper functions + +pub fun getTestAccount(_ name: String): Test.Account { + if accounts[name] == nil { + accounts[name] = blockchain.createAccount() + } + + return accounts[name]! +} + +pub fun loadCode(_ fileName: String, _ baseDirectory: String): String { + return Test.readFile("../".concat(baseDirectory).concat("/").concat(fileName)) +} + +pub fun scriptExecutor(_ scriptName: String, _ arguments: [AnyStruct]): AnyStruct? { + let scriptCode = loadCode(scriptName, "scripts") + let scriptResult = blockchain.executeScript(scriptCode, arguments) + var failureMessage = "" + if let failureError = scriptResult.error { + failureMessage = "Failed to execute the script because -: ".concat(failureError.message) + } + + assert(scriptResult.status == Test.ResultStatus.succeeded, message: failureMessage) + return scriptResult.returnValue +} + +pub fun expectScriptFailure(_ scriptName: String, _ arguments: [AnyStruct]): String { + let scriptCode = loadCode(scriptName, "scripts") + let scriptResult = blockchain.executeScript(scriptCode, arguments) + + assert(scriptResult.error != nil, message: "script error was expected but there is no error message") + return scriptResult.error!.message +} + +pub fun txExecutor(_ filePath: String, _ signers: [Test.Account], _ arguments: [AnyStruct], _ expectedError: String?, _ expectedErrorType: ErrorType?): Bool { + let txCode = loadCode(filePath, "transactions") + + let authorizers: [Address] = [] + for s in signers { + authorizers.append(s.address) + } + + let tx = Test.Transaction( + code: txCode, + authorizers: authorizers, + signers: signers, + arguments: arguments, + ) + + let txResult = blockchain.executeTransaction(tx) + if let err = txResult.error { + if let expectedErrorMessage = expectedError { + let ptr = getErrorMessagePointer(errorType: expectedErrorType!) + let errMessage = err.message + let hasEmittedCorrectMessage = contains(errMessage, expectedErrorMessage) + let failureMessage = "Expecting - " + .concat(expectedErrorMessage) + .concat("\n") + .concat("But received - ") + .concat(err.message) + assert(hasEmittedCorrectMessage, message: failureMessage) + return true + } + panic(err.message) + } else { + if let expectedErrorMessage = expectedError { + panic("Expecting error - ".concat(expectedErrorMessage).concat(". While no error triggered")) + } + } + + return txResult.status == Test.ResultStatus.succeeded +} + +pub fun setup() { + // main contract account being tested + let linkedAccount: Test.Account = blockchain.createAccount() + let hybridCustodyAccount = blockchain.createAccount() + let capabilityDelegatorAccount = blockchain.createAccount() + let capabilityFilterAccount = blockchain.createAccount() + let capabilityFactoryAccount = blockchain.createAccount() + + // factory accounts + let cpFactory = blockchain.createAccount() + let providerFactory = blockchain.createAccount() + let cpAndProviderFactory = blockchain.createAccount() + let ftProviderFactory = blockchain.createAccount() + let ftAllFactory = blockchain.createAccount() + + // flow-utils lib contracts + let arrayUtils = blockchain.createAccount() + let stringUtils = blockchain.createAccount() + let addressUtils = blockchain.createAccount() + + // standard contracts + let nonFungibleToken = blockchain.createAccount() + let metadataViews = blockchain.createAccount() + let fungibleTokenMetadataViews = blockchain.createAccount() + let viewResolver = blockchain.createAccount() + + // other contracts used in tests + let accountCreator = blockchain.createAccount() + let gamingMetadataViews = blockchain.createAccount() + let dynamicNFT = blockchain.createAccount() + let gamePieceNFT = blockchain.createAccount() + let ticketToken = blockchain.createAccount() + let rockPaperScissorsGame = blockchain.createAccount() + let arcadePrize = blockchain.createAccount() + + accounts = { + "NonFungibleToken": nonFungibleToken, + "MetadataViews": metadataViews, + "FungibleTokenMetadataViews": fungibleTokenMetadataViews, + "ViewResolver": viewResolver, + "HybridCustody": hybridCustodyAccount, + "CapabilityDelegator": capabilityDelegatorAccount, + "CapabilityFilter": capabilityFilterAccount, + "CapabilityFactory": capabilityFactoryAccount, + "NFTCollectionPublicFactory": cpFactory, + "NFTProviderAndCollectionFactory": providerFactory, + "NFTProviderFactory": cpAndProviderFactory, + "FTProviderFactory": ftProviderFactory, + "FTAllFactory": ftAllFactory, + "ArrayUtils": arrayUtils, + "StringUtils": stringUtils, + "AddressUtils": addressUtils, + "AccountCreator": accountCreator, + "GamingMetadataViews": gamingMetadataViews, + "DynamicNFT": dynamicNFT, + "GamePieceNFT": gamePieceNFT, + "TicketToken": ticketToken, + "RockPaperScissorsGame": rockPaperScissorsGame, + "ArcadePrize": arcadePrize + } + + blockchain.useConfiguration(Test.Configuration({ + "FungibleToken": fungibleTokenAddress, + "NonFungibleToken": accounts["NonFungibleToken"]!.address, + "FlowToken": flowTokenAddress, + "FungibleTokenMetadataViews": accounts["FungibleTokenMetadataViews"]!.address, + "MetadataViews": accounts["MetadataViews"]!.address, + "ViewResolver": accounts["ViewResolver"]!.address, + "ArrayUtils": accounts["ArrayUtils"]!.address, + "StringUtils": accounts["StringUtils"]!.address, + "AddressUtils": accounts["AddressUtils"]!.address, + "HybridCustody": accounts["HybridCustody"]!.address, + "CapabilityDelegator": accounts["CapabilityDelegator"]!.address, + "CapabilityFilter": accounts["CapabilityFilter"]!.address, + "CapabilityFactory": accounts["CapabilityFactory"]!.address, + "NFTCollectionPublicFactory": accounts["NFTCollectionPublicFactory"]!.address, + "NFTProviderAndCollectionFactory": accounts["NFTProviderAndCollectionFactory"]!.address, + "NFTProviderFactory": accounts["NFTProviderFactory"]!.address, + "FTProviderFactory": accounts["FTProviderFactory"]!.address, + "FTAllFactory": accounts["FTAllFactory"]!.address, + "AccountCreator": accounts["AccountCreator"]!.address, + "GamingMetadataViews": accounts["GamingMetadataViews"]!.address, + "DynamicNFT": accounts["DynamicNFT"]!.address, + "GamePieceNFT": accounts["GamePieceNFT"]!.address, + "TicketToken": accounts["TicketToken"]!.address, + "RockPaperScissorsGame": accounts["RockPaperScissorsGame"]!.address, + "ArcadePrize": accounts["ArcadePrize"]!.address + })) + + // deploy standard libs first + deploy("NonFungibleToken", accounts["NonFungibleToken"]!, "../contracts/utility/NonFungibleToken.cdc") + deploy("MetadataViews", accounts["MetadataViews"]!, "../contracts/utility/MetadataViews.cdc") + deploy("FungibleTokenMetadataViews", accounts["FungibleTokenMetadataViews"]!, "../contracts/utility/FungibleTokenMetadataViews.cdc") + deploy("ViewResolver", accounts["ViewResolver"]!, "../contracts/utility/ViewResolver.cdc") + + // helper libs in the order they are imported + deploy("ArrayUtils", accounts["ArrayUtils"]!, "../contracts/flow-utils/ArrayUtils.cdc") + deploy("StringUtils", accounts["StringUtils"]!, "../contracts/flow-utils/StringUtils.cdc") + deploy("AddressUtils", accounts["AddressUtils"]!, "../contracts/flow-utils/AddressUtils.cdc") + + // helper nft contract so we can actually talk to nfts with tests + deploy("AccountCreator", accounts["AccountCreator"]!, "../contracts/utility/AccountCreator.cdc") + deploy("GamingMetadataViews", accounts["GamingMetadataViews"]!, "../contracts/GamingMetadataViews.cdc") + deploy("DynamicNFT", accounts["DynamicNFT"]!, "../contracts/DynamicNFT.cdc") + deploy("GamePieceNFT", accounts["GamePieceNFT"]!, "../contracts/GamePieceNFT.cdc") + deploy("TicketToken", accounts["TicketToken"]!, "../contracts/TicketToken.cdc") + deploy("RockPaperScissorsGame", accounts["RockPaperScissorsGame"]!, "../contracts/RockPaperScissorsGame.cdc") + deploy("ArcadePrize", accounts["ArcadePrize"]!, "../contracts/ArcadePrize.cdc") + + // our main contract is last + deploy("CapabilityDelegator", accounts["CapabilityDelegator"]!, "../contracts/hybrid-custody/CapabilityDelegator.cdc") + deploy("CapabilityFilter", accounts["CapabilityFilter"]!, "../contracts/hybrid-custody/CapabilityFilter.cdc") + deploy("CapabilityFactory", accounts["CapabilityFactory"]!, "../contracts/hybrid-custody/CapabilityFactory.cdc") + deploy("NFTCollectionPublicFactory", accounts["NFTCollectionPublicFactory"]!, "../contracts/hybrid-custody/factories/NFTCollectionPublicFactory.cdc") + deploy("NFTProviderAndCollectionFactory", accounts["NFTProviderAndCollectionFactory"]!, "../contracts/hybrid-custody/factories/NFTProviderAndCollectionFactory.cdc") + deploy("NFTProviderFactory", accounts["NFTProviderFactory"]!, "../contracts/hybrid-custody/factories/NFTProviderFactory.cdc") + deploy("FTProviderFactory", accounts["FTProviderFactory"]!, "../contracts/hybrid-custody/factories/FTProviderFactory.cdc") + deploy("FTAllFactory", accounts["FTAllFactory"]!, "../contracts/hybrid-custody/factories/FTAllFactory.cdc") + deploy("HybridCustody", accounts["HybridCustody"]!, "../contracts/hybrid-custody/HybridCustody.cdc") +} + +// BEGIN SECTION: Helper functions. All of the following were taken from +// https://github.com/onflow/Offers/blob/fd380659f0836e5ce401aa99a2975166b2da5cb0/lib/cadence/test/Offers.cdc +// - deploy +// - scriptExecutor +// - txExecutor +// - getErrorMessagePointer + +pub fun deploy(_ contractName: String, _ account: Test.Account, _ path: String) { + let contractCode = Test.readFile(path) + let err = blockchain.deployContract( + name: contractName, + code: contractCode, + account: account, + arguments: [], + ) + + if err != nil { + panic(err!.message) + } +} + +pub enum ErrorType: UInt8 { + pub case TX_PANIC + pub case TX_ASSERT + pub case TX_PRE +} + +pub fun getErrorMessagePointer(errorType: ErrorType) : Int { + switch errorType { + case ErrorType.TX_PANIC: return 159 + case ErrorType.TX_ASSERT: return 170 + case ErrorType.TX_PRE: return 174 + default: panic("Invalid error type") + } + + return 0 +} + +// END SECTION: Helper functions + + + // Copied functions from flow-utils so we can assert on error conditions + // https://github.com/green-goo-dao/flow-utils/blob/main/cadence/contracts/StringUtils.cdc +pub fun contains(_ s: String, _ substr: String): Bool { + if let index = index(s, substr, 0) { + return true + } + return false +} + + // https://github.com/green-goo-dao/flow-utils/blob/main/cadence/contracts/StringUtils.cdc +pub fun index(_ s : String, _ substr : String, _ startIndex: Int): Int?{ + for i in range(startIndex,s.length-substr.length+1){ + if s[i]==substr[0] && s.slice(from:i, upTo:i+substr.length) == substr{ + return i + } + } + return nil +} + +// https://github.com/green-goo-dao/flow-utils/blob/main/cadence/contracts/ArrayUtils.cdc +pub fun rangeFunc(_ start: Int, _ end: Int, _ f : ((Int):Void) ) { + var current = start + while current < end{ + f(current) + current = current + 1 + } +} + +pub fun range(_ start: Int, _ end: Int): [Int]{ + var res:[Int] = [] + rangeFunc(start, end, fun (i:Int){ + res.append(i) + }) + return res +} + +pub fun withoutPrefix(_ input: String): String{ + var address=input + + //get rid of 0x + if address.length>1 && address.utf8[1] == 120 { + address = address.slice(from: 2, upTo: address.length) + } + + //ensure even length + if address.length%2==1{ + address="0".concat(address) + } + return address +} diff --git a/test/rps_tests.cdc b/test/rps_tests.cdc new file mode 100644 index 0000000..89f5441 --- /dev/null +++ b/test/rps_tests.cdc @@ -0,0 +1,708 @@ +import Test + +pub var accounts: {String: Test.Account} = {} +pub var blockchain = Test.newEmulatorBlockchain() +pub let fungibleTokenAddress: Address = 0xee82856bf20e2aa6 +pub let flowTokenAddress: Address = 0x0ae53cb6e3f42a79 + +pub let dynamicNFT = "DynamicNFT" +pub let gamingMetadataViews = "GamingMetadataViews" +pub let gamePieceNFT = "GamePieceNFT" +pub let ticketToken = "TicketToken" +pub let rockPaperScissorsGame = "RockPaperScissorsGame" +pub let arcadePrize = "ArcadePrize" + +pub let gamePieceNFTPublicIdentifier = "GamePieceNFTCollection" +pub let arcadePrizePublicIdentifier = "ArcadePrizeCollection" + +pub let pubKey = "af45946342ac9fcc3f909c6f710d3a0c05be903fead0edf77da0bffa572c7a47bfce69218dc54998cdb86f3996fdbfb360be30854f462783188372861549409f" + +pub let matchTimeLimit: UInt = 10 +pub let rock: UInt8 = 0 +pub let paper: UInt8 = 1 +pub let scissors: UInt8 = 2 + +// --------------- Test cases --------------- + +pub fun testMintGamePieceNFT() { + let receiver = blockchain.createAccount() + setupNFTCollection(receiver, collection: gamePieceNFT) + + assertCollectionConfigured(receiver.address, collection: gamePieceNFT) + + mintRandomGamePieceNFTPublic(receiver) + + let ids = getCollectionIDs(receiver.address, collection: gamePieceNFT) + Test.assertEqual(1, ids.length) +} + +pub fun testSetupGamePlayer() { + let player = blockchain.createAccount() + + let success = txExecutor("rock_paper_scissors_game/game_player/setup_game_player.cdc", [player], [], nil, nil) + Test.assertEqual(true, success) + + assertGamePlayerConfigured(player.address) + + // Ensure we can query GamePlayer.id + let playerID = getGamePlayerID(player.address) +} + +pub fun testMintTicketToken() { + let mintAmount = 10.0 + let receiver = blockchain.createAccount() + + // Setup & verify TicketToken Vault configured correctly + setupTicketTokenVault(receiver) + assertTicketTokenConfigured(receiver.address) + + let balance = getTicketTokenBalance(receiver.address) + Test.assertEqual(0.0, balance) + + // Mint 10 TicketTokens + mintTicketTokens(to: receiver.address, amount: mintAmount) + let newBalance = getTicketTokenBalance(receiver.address) + Test.assertEqual(mintAmount, newBalance) +} + +pub fun testCompleteSinglePlayerMatch() { + /* --- Onboard Player --- */ + // + // Configure player's account with game resources + // **NOTE:** in the example app, we'd onboard players via walletless onboarding. We're not doing that here because + // we can't sign test transactions without a Test.Account object + let player = blockchain.createAccount() + selfCustodyOnboarding(player) + + // Ensure all resources & Capabilities configured as expected + assertCollectionConfigured(player.address, collection: gamePieceNFT) + assertGamePlayerConfigured(player.address) + assertTicketTokenConfigured(player.address) + + // Query minted NFT.id + let nftIDs = getCollectionIDs(player.address, collection: gamePieceNFT) + Test.assertEqual(1, nftIDs.length) + let nftID = nftIDs[0] + + // Query GamePlayer.id + let playerID = getGamePlayerID(player.address) + + /* --- Create Single-Player Match --- */ + // + // Sign up for match + setupNewSingleplayerMatch(player, nftID: nftID, matchTimeLimit: matchTimeLimit) + + // Get the ID of the match just created + let matchIDs = getMatchIDsInPlay(player.address) + Test.assertEqual(1, matchIDs.length) + let matchID = matchIDs[0] + + /* --- Play the Match --- */ + // + submitBothSinglePlayerMoves(player, matchID: matchID, move: rock) + resolveMatch(player, matchID: matchID) + + /* --- Verify Match Results --- */ + // + let history = getMatchHistoryAsRawValues(matchID: matchID) + ?? panic("Should have returned valid history, but got nil!") + assert(history.containsKey(playerID)) + Test.assertEqual(rock, history[playerID]!) +} + +pub fun testCompleteMultiPlayerMatch() { + + // **NOTE:** in the example app, we'd onboard players via walletless onboarding. We're not doing that here because + // we can't sign test transactions without a Test.Account object + let playerOne = blockchain.createAccount() + let playerTwo = blockchain.createAccount() + + selfCustodyOnboarding(playerOne) + selfCustodyOnboarding(playerTwo) + + // Ensure all resources & Capabilities configured as expected + assertCollectionConfigured(playerOne.address, collection: gamePieceNFT) + assertGamePlayerConfigured(playerOne.address) + assertTicketTokenConfigured(playerOne.address) + assertCollectionConfigured(playerTwo.address, collection: gamePieceNFT) + assertGamePlayerConfigured(playerTwo.address) + assertTicketTokenConfigured(playerTwo.address) + + // Query GamePlayer.ids for each player + let playerOneID = getGamePlayerID(playerOne.address) + let playerTwoID = getGamePlayerID(playerTwo.address) + + // Query minted NFT.ids + let playerOneIDs = getCollectionIDs(playerOne.address, collection: gamePieceNFT) + let playerTwoIDs = getCollectionIDs(playerTwo.address, collection: gamePieceNFT) + let playerOneNFTID = playerOneIDs[0] + let playerTwoNFTID = playerTwoIDs[0] + + setupNewMultiplayerMatch(playerOne, nftID: playerOneNFTID, playerTwoAddr: playerTwo.address, matchTimeLimit: matchTimeLimit) + + // Get the ID of the match just created + let playerOneMatchIDs = getMatchIDsInPlay(playerOne.address) + Test.assertEqual(1, playerOneMatchIDs.length) + let playerOneMatchID = playerOneMatchIDs[0] + + // Verify playerTwo has the same matchID in their lobby Capabilities + let playerTwoMatchLobbyIDs = getMatchIDsInLobby(playerTwo.address) + Test.assertEqual(1, playerTwoMatchLobbyIDs.length) + let playerTwoMatchLobbyID = playerTwoMatchLobbyIDs[0] + Test.assertEqual(playerOneMatchID, playerTwoMatchLobbyID) + + // Player two joins the match, escrowing an NFT + escrowNFTToExistingMatch(playerTwo, matchID: playerTwoMatchLobbyID, nftID: playerTwoNFTID) + + // Verify player two now has the ability to play the match + let playerTwoMatchIDs = getMatchIDsInPlay(playerTwo.address) + Test.assertEqual(1, playerTwoMatchLobbyIDs.length) + let playerTwoMatchID = playerTwoMatchIDs[0] + Test.assertEqual(playerTwoMatchLobbyID, playerTwoMatchID) + Test.assertEqual(playerOneMatchID, playerTwoMatchID) + + // Player submit their moves + submitMove(playerOne, matchID: playerOneMatchID, move: rock) + submitMove(playerTwo, matchID: playerTwoMatchID, move: scissors) + + // Resolve the match & return escrowed NFTs + resolveMatchAndReturnNFTs(playerOne, matchID: playerOneMatchID) + + /* --- Verify Match Results --- */ + // + let history = getMatchHistoryAsRawValues(matchID: playerOneMatchID) + ?? panic("Should have returned valid history, but got nil!") + + assert(history.containsKey(playerOneID)) + assert(history.containsKey(playerTwoID)) + + Test.assertEqual(rock, history[playerOneID]!) + Test.assertEqual(scissors, history[playerTwoID]!) +} + +pub fun testCheatingMoveFails() { + let expectedErrorMessage = "Too soon after move submission to resolve the match!" + + let playerOne = blockchain.createAccount() + let playerTwo = blockchain.createAccount() + + selfCustodyOnboarding(playerOne) + selfCustodyOnboarding(playerTwo) + + // Query GamePlayer.ids for each player + let playerOneID = getGamePlayerID(playerOne.address) + let playerTwoID = getGamePlayerID(playerTwo.address) + + // Query minted NFT.ids + let playerOneIDs = getCollectionIDs(playerOne.address, collection: gamePieceNFT) + let playerTwoIDs = getCollectionIDs(playerTwo.address, collection: gamePieceNFT) + let playerOneNFTID = playerOneIDs[0] + let playerTwoNFTID = playerTwoIDs[0] + + setupNewMultiplayerMatch(playerOne, nftID: playerOneNFTID, playerTwoAddr: playerTwo.address, matchTimeLimit: matchTimeLimit) + + // Get the ID of the match just created + let playerOneMatchIDs = getMatchIDsInPlay(playerOne.address) + Test.assertEqual(1, playerOneMatchIDs.length) + let playerOneMatchID = playerOneMatchIDs[0] + + // Verify playerTwo has the same matchID in their lobby Capabilities + let playerTwoMatchLobbyIDs = getMatchIDsInLobby(playerTwo.address) + Test.assertEqual(1, playerTwoMatchLobbyIDs.length) + let playerTwoMatchLobbyID = playerTwoMatchLobbyIDs[0] + + // Player two joins the match, escrowing an NFT + escrowNFTToExistingMatch(playerTwo, matchID: playerTwoMatchLobbyID, nftID: playerTwoNFTID) + + // Verify player two now has the ability to play the match + let playerTwoMatchIDs = getMatchIDsInPlay(playerTwo.address) + Test.assertEqual(1, playerTwoMatchLobbyIDs.length) + let playerTwoMatchID = playerTwoMatchIDs[0] + + // First player submits their move, second player attempts to condition their move on winning and fails + submitMove(playerOne, matchID: playerOneMatchID, move: rock) + let cheatingFails = txExecutor("test/cheat_multiplayer_submission.cdc", [playerTwo], [playerTwoMatchID, scissors], expectedErrorMessage, ErrorType.TX_PANIC) + Test.assert(cheatingFails) +} + +pub fun testCheatingResolutionFails() { + let expectedErrorMessage = "Signing game player didn't win!" + + let playerOne = blockchain.createAccount() + let playerTwo = blockchain.createAccount() + + selfCustodyOnboarding(playerOne) + selfCustodyOnboarding(playerTwo) + + // Query GamePlayer.ids for each player + let playerOneID = getGamePlayerID(playerOne.address) + let playerTwoID = getGamePlayerID(playerTwo.address) + + // Query minted NFT.ids + let playerOneIDs = getCollectionIDs(playerOne.address, collection: gamePieceNFT) + let playerTwoIDs = getCollectionIDs(playerTwo.address, collection: gamePieceNFT) + let playerOneNFTID = playerOneIDs[0] + let playerTwoNFTID = playerTwoIDs[0] + + setupNewMultiplayerMatch(playerOne, nftID: playerOneNFTID, playerTwoAddr: playerTwo.address, matchTimeLimit: matchTimeLimit) + + // Get the ID of the match just created + let playerOneMatchIDs = getMatchIDsInPlay(playerOne.address) + Test.assertEqual(1, playerOneMatchIDs.length) + let playerOneMatchID = playerOneMatchIDs[0] + + // Verify playerTwo has the same matchID in their lobby Capabilities + let playerTwoMatchLobbyIDs = getMatchIDsInLobby(playerTwo.address) + Test.assertEqual(1, playerTwoMatchLobbyIDs.length) + let playerTwoMatchLobbyID = playerTwoMatchLobbyIDs[0] + + // Player two joins the match, escrowing an NFT + escrowNFTToExistingMatch(playerTwo, matchID: playerTwoMatchLobbyID, nftID: playerTwoNFTID) + + // Verify player two now has the ability to play the match + let playerTwoMatchIDs = getMatchIDsInPlay(playerTwo.address) + Test.assertEqual(1, playerTwoMatchLobbyIDs.length) + let playerTwoMatchID = playerTwoMatchIDs[0] + + // Players submit their moves, player one with winning move + submitMove(playerOne, matchID: playerOneMatchID, move: rock) + submitMove(playerTwo, matchID: playerTwoMatchID, move: scissors) + + // Player two calls for match resolution, conditioning on them winning the match - post-condition succeeds + let cheatingSucceeds = txExecutor("test/cheat_resolution.cdc", [playerTwo], [playerTwoMatchID], expectedErrorMessage, ErrorType.TX_PANIC) + Test.assert(cheatingSucceeds) + + // Other player calls for resolution anyway and wins + resolveMatch(playerOne, matchID: playerOneMatchID) + + /* --- Verify Match Results --- */ + // + let history = getMatchHistoryAsRawValues(matchID: playerOneMatchID) + ?? panic("Should have returned valid history, but got nil!") + + assert(history.containsKey(playerOneID)) + assert(history.containsKey(playerTwoID)) + + Test.assertEqual(rock, history[playerOneID]!) + Test.assertEqual(scissors, history[playerTwoID]!) +} + +// --------------- Transaction wrapper functions --------------- + +pub fun transferFlow(amount: UFix64, to: Test.Account) { + let account = blockchain.serviceAccount() + + let code = loadCode("flow_token/transfer_flow.cdc", "transactions") + let tx = Test.Transaction( + code: code, + authorizers: [account.address], + signers: [], + arguments: [to.address, amount] + ) + + // Act + let result = blockchain.executeTransaction(tx) + Test.assert(result.status == Test.ResultStatus.succeeded) +} + +pub fun walletlessOnboarding(_ acct: Test.Account, fundingAmout: UFix64) { + txExecutor( + "onboarding/walletless_onboarding.cdc", + [acct], + [pubKey, 0.0, 1, 1, 1, 1], + nil, + nil + ) +} + +pub fun setupNFTCollection(_ acct: Test.Account, collection: String) { + var success: Bool = false + switch collection { + case gamePieceNFT: + success = txExecutor("game_piece_nft/setup_account.cdc", [acct], [], nil, nil) + case arcadePrize: + success = txExecutor("arcade_prize/setup_collection.cdc", [acct], [], nil, nil) + } + Test.assert(success) +} + +pub fun setupTicketTokenVault(_ acct: Test.Account) { + let success = txExecutor("ticket_token/setup_account.cdc", [acct], [], nil, nil) + Test.assert(success) +} + +pub fun mintGamePieceNFT(_ acct: Test.Account) { + let success = txExecutor("game_piece_nft/mint_nft_random_component_public.cdc", [acct], [accounts[gamePieceNFT]!.address], nil, nil) + Test.assert(success) +} + +pub fun mintRandomGamePieceNFTPublic(_ acct: Test.Account) { + let success = txExecutor("game_piece_nft/mint_nft_random_component_public.cdc", [acct], [accounts[gamePieceNFT]!.address], nil, nil) + Test.assert(success) +} + +pub fun mintTicketTokens(to: Address, amount: UFix64) { + let success = txExecutor("ticket_token/mint_tokens.cdc", [accounts[ticketToken]!], [to, amount], nil, nil) + Test.assert(success) +} + +pub fun selfCustodyOnboarding(_ acct: Test.Account) { + let success = txExecutor( + "onboarding/self_custody_onboarding.cdc", + [acct], + [accounts[gamePieceNFT]!.address], + nil, + nil + ) + Test.assert(success) +} + +pub fun setupNewSingleplayerMatch(_ acct: Test.Account, nftID: UInt64, matchTimeLimit: UInt) { + let success = txExecutor( + "rock_paper_scissors_game/game_player/setup_new_singleplayer_match.cdc", + [acct], + [nftID, matchTimeLimit], + nil, + nil + ) + Test.assert(success) +} + +pub fun setupNewMultiplayerMatch(_ acct: Test.Account, nftID: UInt64, playerTwoAddr: Address, matchTimeLimit: UInt) { + let success = txExecutor( + "rock_paper_scissors_game/game_player/setup_new_multiplayer_match.cdc", + [acct], + [nftID, playerTwoAddr, matchTimeLimit], + nil, + nil + ) + Test.assert(success) +} + +pub fun escrowNFTToExistingMatch(_ acct: Test.Account, matchID: UInt64, nftID: UInt64) { + let success = txExecutor( + "rock_paper_scissors_game/game_player/escrow_nft_to_existing_match.cdc", + [acct], + [matchID, nftID], + nil, + nil + ) + Test.assert(success) +} + +pub fun submitBothSinglePlayerMoves(_ acct: Test.Account, matchID: UInt64, move: UInt8) { + let success = txExecutor( + "rock_paper_scissors_game/game_player/submit_both_singleplayer_moves.cdc", + [acct], + [matchID, move], + nil, + nil + ) + Test.assert(success) +} + +pub fun submitMove(_ acct: Test.Account, matchID: UInt64, move: UInt8) { + let success = txExecutor( + "rock_paper_scissors_game/game_player/submit_move.cdc", + [acct], + [matchID, move], + nil, + nil + ) + Test.assert(success) +} + +pub fun resolveMatch(_ acct: Test.Account, matchID: UInt64) { + let success = txExecutor( + "rock_paper_scissors_game/game_player/resolve_match.cdc", + [acct], + [matchID], + nil, + nil + ) + Test.assert(success) +} + +pub fun resolveMatchAndReturnNFTs(_ acct: Test.Account, matchID: UInt64) { + let success = txExecutor( + "rock_paper_scissors_game/game_player/resolve_match_and_return_nfts.cdc", + [acct], + [matchID], + nil, + nil + ) + Test.assert(success) +} + +// ---------------- End Transaction wrapper functions + +// ---------------- Begin script wrapper functions + +pub fun getTicketTokenBalance(_ addr: Address): UFix64 { + return scriptExecutor("ticket_token/get_balance.cdc", [addr])! as! UFix64 +} + +pub fun getGamePlayerID(_ addr: Address): UInt64 { + return scriptExecutor("rock_paper_scissors_game/get_game_player_id.cdc", [addr])! as! UInt64 +} + +pub fun getCollectionIDs(_ addr: Address, collection: String): [UInt64] { + let collectionIDs: [UInt64] = [] + switch collection { + case gamePieceNFT: + collectionIDs.appendAll((scriptExecutor("game_piece_nft/get_collection_ids.cdc", [addr])! as! [UInt64])) + case arcadePrize: + collectionIDs.appendAll((scriptExecutor("game_piece_nft/get_collection_ids.cdc", [addr])! as! [UInt64])) + } + return collectionIDs +} + +pub fun getMatchIDsInLobby(_ addr: Address): [UInt64] { + return scriptExecutor("rock_paper_scissors_game/get_matches_in_lobby.cdc", [addr])! as! [UInt64] +} + +pub fun getMatchIDsInPlay(_ addr: Address): [UInt64] { + return scriptExecutor("rock_paper_scissors_game/get_matches_in_play.cdc", [addr])! as! [UInt64] +} + +pub fun getMatchHistoryAsRawValues(matchID: UInt64): {UInt64: UInt8}? { + return scriptExecutor("rock_paper_scissors_game/get_match_move_history_as_raw_values.cdc", [matchID]) as! {UInt64: UInt8}? +} + +pub fun assertGamePlayerConfigured(_ address: Address) { + let configured = scriptExecutor("test/test_game_player_configuration.cdc", [address]) as! Bool? + ?? panic("GamePlayer was not configured correctly!") + Test.assertEqual(true, configured) +} + +pub fun assertCollectionConfigured(_ address: Address, collection: String) { + var path: String = "" + switch collection { + case gamePieceNFT: + path = "test/test_game_piece_nft_configuration.cdc" + case arcadePrize: + path = "test/test_arcade_prize_configuration.cdc" + } + let configured = scriptExecutor(path, [address]) as! Bool? + ?? panic("NFT Collection was not configured correctly!") + Test.assertEqual(true, configured) +} + +pub fun assertTicketTokenConfigured(_ address: Address) { + let configured = scriptExecutor("test/test_ticket_token_configuration.cdc", [address]) as! Bool? + ?? panic("TicketToken Vault was not configured correctly!") + Test.assertEqual(true, configured) +} + +// ---------------- End script wrapper functions + +pub fun getTestAccount(_ name: String): Test.Account { + if accounts[name] == nil { + accounts[name] = blockchain.createAccount() + } + + return accounts[name]! +} + +pub fun loadCode(_ fileName: String, _ baseDirectory: String): String { + return Test.readFile("../".concat(baseDirectory).concat("/").concat(fileName)) +} + +pub fun scriptExecutor(_ scriptName: String, _ arguments: [AnyStruct]): AnyStruct? { + let scriptCode = loadCode(scriptName, "scripts") + let scriptResult = blockchain.executeScript(scriptCode, arguments) + var failureMessage = "" + if let failureError = scriptResult.error { + failureMessage = "Failed to execute the script because -: ".concat(failureError.message) + } + + assert(scriptResult.status == Test.ResultStatus.succeeded, message: failureMessage) + return scriptResult.returnValue +} + +pub fun expectScriptFailure(_ scriptName: String, _ arguments: [AnyStruct]): String { + let scriptCode = loadCode(scriptName, "scripts") + let scriptResult = blockchain.executeScript(scriptCode, arguments) + + assert(scriptResult.error != nil, message: "script error was expected but there is no error message") + return scriptResult.error!.message +} + +pub fun txExecutor(_ filePath: String, _ signers: [Test.Account], _ arguments: [AnyStruct], _ expectedError: String?, _ expectedErrorType: ErrorType?): Bool { + let txCode = loadCode(filePath, "transactions") + + let authorizers: [Address] = [] + for s in signers { + authorizers.append(s.address) + } + + let tx = Test.Transaction( + code: txCode, + authorizers: authorizers, + signers: signers, + arguments: arguments, + ) + + let txResult = blockchain.executeTransaction(tx) + if let err = txResult.error { + if let expectedErrorMessage = expectedError { + let ptr = getErrorMessagePointer(errorType: expectedErrorType!) + let errMessage = err.message + let hasEmittedCorrectMessage = contains(errMessage, expectedErrorMessage) + let failureMessage = "Expecting - " + .concat(expectedErrorMessage) + .concat("\n") + .concat("But received - ") + .concat(err.message) + assert(hasEmittedCorrectMessage, message: failureMessage) + return true + } + panic(err.message) + } else { + if let expectedErrorMessage = expectedError { + panic("Expecting error - ".concat(expectedErrorMessage).concat(". While no error triggered")) + } + } + + return txResult.status == Test.ResultStatus.succeeded +} + +pub fun setup() { + + // standard contracts + let nonFungibleToken = blockchain.createAccount() + let metadataViews = blockchain.createAccount() + let fungibleTokenMetadataViews = blockchain.createAccount() + let viewResolver = blockchain.createAccount() + + // main contracts + let accountCreator = blockchain.createAccount() + let gamingMetadataViews: Test.Account = blockchain.createAccount() + let dynamicNFT: Test.Account = blockchain.createAccount() + let gamePieceNFT = blockchain.createAccount() + let ticketToken = blockchain.createAccount() + let rockPaperScissorsGame = blockchain.createAccount() + let arcadePrize = blockchain.createAccount() + + accounts = { + "NonFungibleToken": nonFungibleToken, + "MetadataViews": metadataViews, + "FungibleTokenMetadataViews": fungibleTokenMetadataViews, + "ViewResolver": viewResolver, + "AccountCreator": accountCreator, + "GamingMetadataViews": gamingMetadataViews, + "DynamicNFT": dynamicNFT, + "GamePieceNFT": gamePieceNFT, + "TicketToken": ticketToken, + "RockPaperScissorsGame": rockPaperScissorsGame, + "ArcadePrize": arcadePrize + } + + blockchain.useConfiguration(Test.Configuration({ + "FungibleToken": fungibleTokenAddress, + "NonFungibleToken": accounts["NonFungibleToken"]!.address, + "FlowToken": flowTokenAddress, + "FungibleTokenMetadataViews": accounts["FungibleTokenMetadataViews"]!.address, + "MetadataViews": accounts["MetadataViews"]!.address, + "ViewResolver": accounts["ViewResolver"]!.address, + "AccountCreator": accounts["AccountCreator"]!.address, + "GamingMetadataViews": accounts["GamingMetadataViews"]!.address, + "DynamicNFT": accounts["DynamicNFT"]!.address, + "GamePieceNFT": accounts["GamePieceNFT"]!.address, + "TicketToken": accounts["TicketToken"]!.address, + "RockPaperScissorsGame": accounts["RockPaperScissorsGame"]!.address, + "ArcadePrize": accounts["ArcadePrize"]!.address + })) + + // deploy standard libs first + deploy("NonFungibleToken", accounts["NonFungibleToken"]!, "../contracts/utility/NonFungibleToken.cdc") + deploy("MetadataViews", accounts["MetadataViews"]!, "../contracts/utility/MetadataViews.cdc") + deploy("FungibleTokenMetadataViews", accounts["FungibleTokenMetadataViews"]!, "../contracts/utility/FungibleTokenMetadataViews.cdc") + deploy("ViewResolver", accounts["ViewResolver"]!, "../contracts/utility/ViewResolver.cdc") + + // main contracts we'll be testing + deploy("AccountCreator", accounts["AccountCreator"]!, "../contracts/utility/AccountCreator.cdc") + deploy("GamingMetadataViews", accounts["GamingMetadataViews"]!, "../contracts/GamingMetadataViews.cdc") + deploy("DynamicNFT", accounts["DynamicNFT"]!, "../contracts/DynamicNFT.cdc") + deploy("GamePieceNFT", accounts["GamePieceNFT"]!, "../contracts/GamePieceNFT.cdc") + deploy("TicketToken", accounts["TicketToken"]!, "../contracts/TicketToken.cdc") + deploy("RockPaperScissorsGame", accounts["RockPaperScissorsGame"]!, "../contracts/RockPaperScissorsGame.cdc") + deploy("ArcadePrize", accounts["ArcadePrize"]!, "../contracts/ArcadePrize.cdc") +} + +// BEGIN SECTION: Helper functions. All of the following were taken from +// https://github.com/onflow/Offers/blob/fd380659f0836e5ce401aa99a2975166b2da5cb0/lib/cadence/test/Offers.cdc +// - deploy +// - scriptExecutor +// - txExecutor +// - getErrorMessagePointer + +pub fun deploy(_ contractName: String, _ account: Test.Account, _ path: String) { + let contractCode = Test.readFile(path) + let err = blockchain.deployContract( + name: contractName, + code: contractCode, + account: account, + arguments: [], + ) + + if err != nil { + panic(err!.message) + } +} + +pub enum ErrorType: UInt8 { + pub case TX_PANIC + pub case TX_ASSERT + pub case TX_PRE +} + +pub fun getErrorMessagePointer(errorType: ErrorType) : Int { + switch errorType { + case ErrorType.TX_PANIC: return 159 + case ErrorType.TX_ASSERT: return 170 + case ErrorType.TX_PRE: return 174 + default: panic("Invalid error type") + } + + return 0 +} + +// END SECTION: Helper functions + + + // Copied functions from flow-utils so we can assert on error conditions + // https://github.com/green-goo-dao/flow-utils/blob/main/cadence/contracts/StringUtils.cdc +pub fun contains(_ s: String, _ substr: String): Bool { + if let index = index(s, substr, 0) { + return true + } + return false +} + + // https://github.com/green-goo-dao/flow-utils/blob/main/cadence/contracts/StringUtils.cdc +pub fun index(_ s : String, _ substr : String, _ startIndex: Int): Int?{ + for i in range(startIndex,s.length-substr.length+1){ + if s[i]==substr[0] && s.slice(from:i, upTo:i+substr.length) == substr{ + return i + } + } + return nil +} + +// https://github.com/green-goo-dao/flow-utils/blob/main/cadence/contracts/ArrayUtils.cdc +pub fun rangeFunc(_ start: Int, _ end: Int, _ f : ((Int):Void) ) { + var current = start + while current < end{ + f(current) + current = current + 1 + } +} + +pub fun range(_ start: Int, _ end: Int): [Int]{ + var res:[Int] = [] + rangeFunc(start, end, fun (i:Int){ + res.append(i) + }) + return res +} diff --git a/transactions/linked_accounts/setup_account_creator.cdc b/transactions/account_creator/setup.cdc similarity index 58% rename from transactions/linked_accounts/setup_account_creator.cdc rename to transactions/account_creator/setup.cdc index 3311a90..b9d820d 100644 --- a/transactions/linked_accounts/setup_account_creator.cdc +++ b/transactions/account_creator/setup.cdc @@ -1,21 +1,20 @@ -import AccountCreator from "../../contracts/utility/AccountCreator.cdc" +import "AccountCreator" -/// Sets up an AccountCreator in signer's account to enable creation of accounts & querying created addresses from th -/// originating public key +/// Configures and AccountCreator resource in the signer's account +/// **NOTE:** AccountCreator is used here to keep the demo app client-side & simple and should be replaced by an +/// an an account creation + database or custodial service in a production environment. /// transaction { prepare(signer: AuthAccount) { + // Ensure resource is saved where expected if signer.type(at: AccountCreator.CreatorStoragePath) == nil { - signer.save( - <-AccountCreator.createNewCreator(), - to: AccountCreator.CreatorStoragePath - ) + signer.save(<-AccountCreator.createNewCreator(), to: AccountCreator.CreatorStoragePath) } // Ensure public Capability is linked if !signer.getCapability<&AccountCreator.Creator{AccountCreator.CreatorPublic}>( - AccountCreator.CreatorPublicPath - ).check() { + AccountCreator.CreatorPublicPath + ).check() { // Link the public Capability signer.unlink(AccountCreator.CreatorPublicPath) signer.link<&AccountCreator.Creator{AccountCreator.CreatorPublic}>( diff --git a/transactions/arcade_prize/mint_rainbow_duck.cdc b/transactions/arcade_prize/mint_rainbow_duck.cdc index 7904b53..2a1f064 100644 --- a/transactions/arcade_prize/mint_rainbow_duck.cdc +++ b/transactions/arcade_prize/mint_rainbow_duck.cdc @@ -1,8 +1,8 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import ArcadePrize from "../../contracts/ArcadePrize.cdc" -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" -import TicketToken from "../../contracts/TicketToken.cdc" +import "NonFungibleToken" +import "MetadataViews" +import "ArcadePrize" +import "FungibleToken" +import "TicketToken" /// Transaction to mint ArcadePrize.NFT to recipient's Collection /// diff --git a/transactions/arcade_prize/mint_rainbow_duck_paying_with_child_vault.cdc b/transactions/arcade_prize/mint_rainbow_duck_paying_with_child_vault.cdc index 084e8a4..710ebe6 100644 --- a/transactions/arcade_prize/mint_rainbow_duck_paying_with_child_vault.cdc +++ b/transactions/arcade_prize/mint_rainbow_duck_paying_with_child_vault.cdc @@ -1,9 +1,11 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import ArcadePrize from "../../contracts/ArcadePrize.cdc" -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" -import TicketToken from "../../contracts/TicketToken.cdc" -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" +import "FungibleToken" +import "NonFungibleToken" +import "MetadataViews" + +import "HybridCustody" + +import "ArcadePrize" +import "TicketToken" /// Transaction to mint ArcadePrize.NFT to recipient's Collection, paying /// with the TicketToken.Vault in the signer's child account @@ -65,19 +67,23 @@ transaction(fundingChildAddress: Address, minterAddress: Address) { ).borrow() ?? panic("Could not get receiver reference to the NFT Collection") - // Get a reference to the signer's LinkedAccounts.Collection from storage - let collectionRef: &LinkedAccounts.Collection = signer.borrow<&LinkedAccounts.Collection>( - from: LinkedAccounts.CollectionStoragePath - ) ?? panic("Could not borrow reference to LinkedAccounts.Collection in signer's account at expected path!") + // Get a reference to the signer's HybridCustody.Manager from storage + let manager: &HybridCustody.Manager = signer.borrow<&HybridCustody.Manager>( + from: HybridCustody.ManagerStoragePath + ) ?? panic("Could not borrow reference to HybridCustody.Manager in signer's account at expected path!") // Borrow a reference to the signer's specified child account - let childAccount: &AuthAccount = collectionRef.getChildAccountRef(address: fundingChildAddress) + let childAccount: &{HybridCustody.AccountPrivate, HybridCustody.AccountPublic, MetadataViews.Resolver} = manager.borrowAccount(addr: fundingChildAddress) ?? panic("Signer does not have access to specified account") - // Get a reference to the child account's TicketToken Vault - let vaultRef: &TicketToken.Vault = childAccount.borrow<&TicketToken.Vault>( - from: TicketToken.VaultStoragePath - ) ?? panic("Could not borrow a reference to the child account's TicketToken Vault at expected path!") + + // Get a reference to the child account's TicketToken Provider + let providerCap = childAccount.getCapability( + path: TicketToken.ProviderPrivatePath, + type: Type<&{FungibleToken.Provider}>() + ) as! Capability<&{FungibleToken.Provider}>? ?? panic("Could not get a Provider to child account's TicketToken Vault!") + let providerRef: &{FungibleToken.Provider} = providerCap.borrow() + ?? panic("Could not borrow a reference to the child account's TicketToken Provider Capability") // Withdraw payment in the form of TicketToken - self.paymentVault <-vaultRef.withdraw(amount: ArcadePrize.prizePrices[ArcadePrize.PrizeType.RAINBOWDUCK]!) + self.paymentVault <-providerRef.withdraw(amount: ArcadePrize.prizePrices[ArcadePrize.PrizeType.RAINBOWDUCK]!) } execute { diff --git a/transactions/arcade_prize/setup_collection.cdc b/transactions/arcade_prize/setup_collection.cdc index fdab402..06d0105 100644 --- a/transactions/arcade_prize/setup_collection.cdc +++ b/transactions/arcade_prize/setup_collection.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import ArcadePrize from "../../contracts/ArcadePrize.cdc" +import "NonFungibleToken" +import "MetadataViews" +import "ArcadePrize" /// Transaction to setup ArcadePrize collection in the signer's account transaction { diff --git a/transactions/flow_token/transfer_flow.cdc b/transactions/flow_token/transfer_flow.cdc new file mode 100644 index 0000000..bfdc6fa --- /dev/null +++ b/transactions/flow_token/transfer_flow.cdc @@ -0,0 +1,15 @@ +import "FungibleToken" +import "FlowToken" + +transaction(amount: UFix64, to: Address) { + prepare(signer: AuthAccount) { + let recipient = getAccount(to) + let senderVault = signer.borrow<&FungibleToken.Vault>(from: /storage/flowTokenVault) + ?? panic("Could not borrow reference to the owner's vault") + let receiver = recipient.getCapability<&{FungibleToken.Receiver}>(/public/flowTokenReceiver) + .borrow() + ?? panic("Could not borrow receiver reference to the recipient's vault") + let from <- senderVault.withdraw(amount: amount) + receiver.deposit(from: <- from) + } +} \ No newline at end of file diff --git a/transactions/game_piece_nft/mint_nft_custom_component_from_minter.cdc b/transactions/game_piece_nft/mint_nft_custom_component_from_minter.cdc index f77a95a..452a5ba 100644 --- a/transactions/game_piece_nft/mint_nft_custom_component_from_minter.cdc +++ b/transactions/game_piece_nft/mint_nft_custom_component_from_minter.cdc @@ -1,7 +1,7 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" +import "NonFungibleToken" +import "GamePieceNFT" +import "MetadataViews" +import "FungibleToken" /// This transction uses the MinterPublic resource to mint a new NFT /// diff --git a/transactions/game_piece_nft/mint_nft_random_component_public.cdc b/transactions/game_piece_nft/mint_nft_random_component_public.cdc index b534cec..fbcf1f3 100644 --- a/transactions/game_piece_nft/mint_nft_random_component_public.cdc +++ b/transactions/game_piece_nft/mint_nft_random_component_public.cdc @@ -1,7 +1,7 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" +import "NonFungibleToken" +import "GamePieceNFT" +import "MetadataViews" +import "FungibleToken" /// This transction uses the MinterPublic resource to mint a new NFT /// diff --git a/transactions/game_piece_nft/remove_all_rps_attachments.cdc b/transactions/game_piece_nft/remove_all_rps_attachments.cdc index 36a8619..e133683 100644 --- a/transactions/game_piece_nft/remove_all_rps_attachments.cdc +++ b/transactions/game_piece_nft/remove_all_rps_attachments.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "NonFungibleToken" +import "GamePieceNFT" +import "RockPaperScissorsGame" /// Transaction that removes RockPaperScissorsGame related attachments from the desired NFT /// diff --git a/transactions/game_piece_nft/remove_attachment.cdc b/transactions/game_piece_nft/remove_attachment.cdc index 5c3b42d..462f963 100644 --- a/transactions/game_piece_nft/remove_attachment.cdc +++ b/transactions/game_piece_nft/remove_attachment.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "NonFungibleToken" +import "GamePieceNFT" +import "RockPaperScissorsGame" /// Transaction that removes attachment from the desired NFT. /// diff --git a/transactions/game_piece_nft/remove_rps_attachment.cdc b/transactions/game_piece_nft/remove_rps_attachment.cdc index 9362799..872e275 100644 --- a/transactions/game_piece_nft/remove_rps_attachment.cdc +++ b/transactions/game_piece_nft/remove_rps_attachment.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "NonFungibleToken" +import "GamePieceNFT" +import "RockPaperScissorsGame" /// Transaction that removes RockPaperScissorsGame related attachment /// from the desired NFT. Note that only RPSWinLossRetriever and diff --git a/transactions/game_piece_nft/setup_account.cdc b/transactions/game_piece_nft/setup_account.cdc index b35dc57..5cde175 100644 --- a/transactions/game_piece_nft/setup_account.cdc +++ b/transactions/game_piece_nft/setup_account.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" +import "NonFungibleToken" +import "GamePieceNFT" +import "MetadataViews" /// Configures signer's account with a GamePieceNFT Collection /// @@ -13,16 +13,12 @@ transaction { } if !signer.getCapability< &GamePieceNFT.Collection{NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, GamePieceNFT.GamePieceNFTCollectionPublic, MetadataViews.ResolverCollection} - >( - GamePieceNFT.CollectionPublicPath - ).check() { + >(GamePieceNFT.CollectionPublicPath).check() { signer.unlink(GamePieceNFT.CollectionPublicPath) // create a public capability for the collection signer.link<&GamePieceNFT.Collection{NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, GamePieceNFT.GamePieceNFTCollectionPublic, MetadataViews.ResolverCollection}>(GamePieceNFT.CollectionPublicPath, target: GamePieceNFT.CollectionStoragePath) } - if !signer.getCapability< - &GamePieceNFT.Collection{NonFungibleToken.Provider} - >( + if !signer.getCapability<&GamePieceNFT.Collection{NonFungibleToken.Provider}>( GamePieceNFT.ProviderPrivatePath ).check() { signer.unlink(GamePieceNFT.ProviderPrivatePath) diff --git a/transactions/game_piece_nft/transfer_nft.cdc b/transactions/game_piece_nft/transfer_nft.cdc index 2c55098..6483f2d 100644 --- a/transactions/game_piece_nft/transfer_nft.cdc +++ b/transactions/game_piece_nft/transfer_nft.cdc @@ -1,5 +1,5 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" +import "NonFungibleToken" +import "GamePieceNFT" /// This transaction moves all RockPaperScissorsGame & GamePieceNFT /// assets from the child account to the parent account diff --git a/transactions/hybrid_custody/add_account_multi_sign.cdc b/transactions/hybrid_custody/add_account_multi_sign.cdc new file mode 100644 index 0000000..272e45d --- /dev/null +++ b/transactions/hybrid_custody/add_account_multi_sign.cdc @@ -0,0 +1,166 @@ +#allowAccountLinking + +import "FungibleToken" +import "NonFungibleToken" +import "MetadataViews" + +import "CapabilityFactory" +import "CapabilityDelegator" +import "CapabilityFilter" +import "HybridCustody" + +import "GamePieceNFT" +import "RockPaperScissorsGame" +import "TicketToken" + +/// Links the signing accounts as labeled, with the child's AuthAccount Capability maintained in the parent's +/// HybridCustody.Manager. Signing parent is also configured with GamePieceNFT.Collection and TicketToken.Vault. +/// +transaction(childAccountFactoryAddress: Address, childAccountFilterAddress: Address) { + + let manager: &HybridCustody.Manager + let childAccountCapability: Capability<&HybridCustody.ChildAccount{HybridCustody.AccountPrivate, HybridCustody.AccountPublic, MetadataViews.Resolver}> + let display: MetadataViews.Display + + prepare(parent: AuthAccount, child: AuthAccount) { + + // --------------------- Begin HybridCustody setup of child account --------------------- + // + var acctCap = child.getCapability<&AuthAccount>(HybridCustody.LinkedAccountPrivatePath) + if !acctCap.check() { + acctCap = child.linkAccount(HybridCustody.LinkedAccountPrivatePath)! + } + + if child.borrow<&HybridCustody.OwnedAccount>(from: HybridCustody.OwnedAccountStoragePath) == nil { + let ownedAccount <- HybridCustody.createOwnedAccount(acct: acctCap) + child.save(<-ownedAccount, to: HybridCustody.OwnedAccountStoragePath) + } + + // check that paths are all configured properly + child.unlink(HybridCustody.OwnedAccountPrivatePath) + child.link<&HybridCustody.OwnedAccount{HybridCustody.BorrowableAccount, HybridCustody.OwnedAccountPublic, MetadataViews.Resolver}>(HybridCustody.OwnedAccountPrivatePath, target: HybridCustody.OwnedAccountStoragePath) + + child.unlink(HybridCustody.OwnedAccountPublicPath) + child.link<&HybridCustody.OwnedAccount{HybridCustody.OwnedAccountPublic, MetadataViews.Resolver}>(HybridCustody.OwnedAccountPublicPath, target: HybridCustody.OwnedAccountStoragePath) + + // --------------------- End HybridCustody setup of child account --------------------- + + // --------------------- Begin HybridCustody setup of parent account --------------------- + // + if parent.borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) == nil { + let m <- HybridCustody.createManager(filter: nil) + parent.save(<- m, to: HybridCustody.ManagerStoragePath) + } + + parent.unlink(HybridCustody.ManagerPublicPath) + parent.unlink(HybridCustody.ManagerPrivatePath) + + parent.link<&HybridCustody.Manager{HybridCustody.ManagerPrivate, HybridCustody.ManagerPublic}>(HybridCustody.ManagerPrivatePath, target: HybridCustody.ManagerStoragePath) + parent.link<&HybridCustody.Manager{HybridCustody.ManagerPublic}>(HybridCustody.ManagerPublicPath, target: HybridCustody.ManagerStoragePath) + + // --------------------- End HybridCustody setup of parent account --------------------- + + // --------------------- Begin HybridCustody redeem --------------------- + // + // Publish account to parent + let owned = child.borrow<&HybridCustody.OwnedAccount>(from: HybridCustody.OwnedAccountStoragePath) + ?? panic("owned account not found") + // Create display from the known contract association + let info = RockPaperScissorsGame.info + self.display = MetadataViews.Display( + name: info.name, + description: info.description, + thumbnail: info.thumbnail + ) + // Assign to OwnedAccount if still unset + if owned.resolveView(Type()) as! MetadataViews.Display? == nil { + owned.setDisplay(self.display) + } + + let factory = getAccount(childAccountFactoryAddress).getCapability<&CapabilityFactory.Manager{CapabilityFactory.Getter}>(CapabilityFactory.PublicPath) + assert(factory.check(), message: "factory address is not configured properly") + + let filterForChild = getAccount(childAccountFilterAddress).getCapability<&{CapabilityFilter.Filter}>(CapabilityFilter.PublicPath) + assert(filterForChild.check(), message: "capability filter is not configured properly") + + owned.publishToParent(parentAddress: parent.address, factory: factory, filter: filterForChild) + + // claim the account on the parent + let inboxName = HybridCustody.getChildAccountIdentifier(parent.address) + self.childAccountCapability = parent.inbox.claim<&HybridCustody.ChildAccount{HybridCustody.AccountPrivate, HybridCustody.AccountPublic, MetadataViews.Resolver}>(inboxName, provider: child.address) + ?? panic("child account cap not found") + + self.manager = parent.borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) + ?? panic("manager no found") + + // --------------------- End HybridCustody redeem --------------------- + + // --------------------- Begin GamePieceNFT setup of parent account --------------------- + // + // Set up GamePieceNFT.Collection if it doesn't exist + if parent.borrow<&GamePieceNFT.Collection>(from: GamePieceNFT.CollectionStoragePath) == nil { + // Create a new empty collection + let collection <- GamePieceNFT.createEmptyCollection() + // save it to the account + parent.save(<-collection, to: GamePieceNFT.CollectionStoragePath) + } + // Check for public capabilities + if !parent.getCapability< + &GamePieceNFT.Collection{NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, GamePieceNFT.GamePieceNFTCollectionPublic, MetadataViews.ResolverCollection} + >( + GamePieceNFT.CollectionPublicPath + ).check() { + // create a public capability for the collection + parent.unlink(GamePieceNFT.CollectionPublicPath) + parent.link< + &GamePieceNFT.Collection{NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, GamePieceNFT.GamePieceNFTCollectionPublic, MetadataViews.ResolverCollection} + >( + GamePieceNFT.CollectionPublicPath, + target: GamePieceNFT.CollectionStoragePath + ) + } + // Check for private capabilities + if !parent.getCapability<&GamePieceNFT.Collection{NonFungibleToken.Provider}>(GamePieceNFT.ProviderPrivatePath).check() { + // Link the Provider Capability in private storage + parent.unlink(GamePieceNFT.ProviderPrivatePath) + parent.link< + &GamePieceNFT.Collection{NonFungibleToken.Provider} + >( + GamePieceNFT.ProviderPrivatePath, + target: GamePieceNFT.CollectionStoragePath + ) + } + + // --------------------- End GamePieceNFT setup of parent account --------------------- + + // --------------------- Begin TicketToken setup of parent account --------------------- + // + /* --- Set parent account up with TicketToken.Vault --- */ + // + // Create & save a Vault + if parent.borrow<&TicketToken.Vault>(from: TicketToken.VaultStoragePath) == nil { + // Create a new flowToken Vault and put it in storage + parent.save(<-TicketToken.createEmptyVault(), to: TicketToken.VaultStoragePath) + } + + if !parent.getCapability<&TicketToken.Vault{FungibleToken.Receiver, FungibleToken.Balance, MetadataViews.Resolver}>( + TicketToken.ReceiverPublicPath + ).check() { + // Unlink any capability that may exist there + parent.unlink(TicketToken.ReceiverPublicPath) + // Create a public capability to the Vault that only exposes the deposit function + // & balance field through the Receiver & Balance interface + parent.link<&TicketToken.Vault{FungibleToken.Receiver, FungibleToken.Balance, MetadataViews.Resolver}>( + TicketToken.ReceiverPublicPath, + target: TicketToken.VaultStoragePath + ) + } + // --------------------- End TicketToken setup of parent account --------------------- + } + execute { + let childAddress = self.childAccountCapability.borrow()?.getAddress() ?? panic("Invalid ChildAccount Capability") + self.manager.addAccount(cap: self.childAccountCapability) + // Set parent-managed Display on the added account + self.manager.setChildAccountDisplay(address: childAddress, self.display) + } +} \ No newline at end of file diff --git a/transactions/hybrid_custody/dev_setup/setup_filter_and_factory_manager.cdc b/transactions/hybrid_custody/dev_setup/setup_filter_and_factory_manager.cdc new file mode 100644 index 0000000..7ac108c --- /dev/null +++ b/transactions/hybrid_custody/dev_setup/setup_filter_and_factory_manager.cdc @@ -0,0 +1,115 @@ +import "CapabilityFilter" +import "CapabilityFactory" +import "NFTCollectionPublicFactory" +import "NFTProviderAndCollectionFactory" +import "NFTProviderFactory" +import "FTProviderFactory" +import "FTAllFactory" + +import "NonFungibleToken" +import "FungibleToken" + +import "TicketToken" + +/* --- Helper Methods --- */ +// +/// Returns a type identifier for an NFT Collection +/// +access(all) fun deriveCollectionOrVaultTypeIdentifier(_ contractAddress: Address, _ contractName: String, isCollection: Bool): String { + let prefix = "A.".concat(withoutPrefix(contractAddress.toString())).concat(".").concat(contractName) + if isCollection { + return prefix.concat(".Collection") + } else { + return prefix.concat(".Vault") + } +} + +/// Taken from AddressUtils private method +/// +access(all) fun withoutPrefix(_ input: String): String{ + var address = input + + //get rid of 0x + if address.length > 1 && address.utf8[1] == 120 { + address = address.slice(from: 2, upTo: address.length) + } + + //ensure even length + if address.length % 2 == 1{ + address="0".concat(address) + } + return address +} + +/* --- Transaction Block --- */ +// +/// This transaction can be used by most developers implementing HybridCustody as the single pre-requisite transaction +/// to setup filter functionality between linked parent and child accounts. +/// +/// Creates a CapabilityFactory Manager and CapabilityFilter.AllowlistFilter in the signing account (if needed), adding +/// NFTCollectionPublicFactory, NFTProviderAndCollectionFactory, & NFTProviderFactory to the CapabilityFactory Manager +/// and the Collection Type to the CapabilityFilter.AllowlistFilter +/// +/// For more info, see docs at https://developers.onflow.org/docs/hybrid-custody/ +//// +transaction(nftContractAddress: Address, nftContractName: String, ftContractAddress: Address, ftContractName: String) { + prepare(acct: AuthAccount) { + + /* --- CapabilityFactory Manager configuration --- */ + // + if acct.borrow<&AnyResource>(from: CapabilityFactory.StoragePath) == nil { + let f <- CapabilityFactory.createFactoryManager() + acct.save(<-f, to: CapabilityFactory.StoragePath) + } + + if !acct.getCapability<&CapabilityFactory.Manager{CapabilityFactory.Getter}>(CapabilityFactory.PrivatePath).check() { + acct.unlink(CapabilityFactory.PublicPath) + acct.link<&CapabilityFactory.Manager{CapabilityFactory.Getter}>(CapabilityFactory.PublicPath, target: CapabilityFactory.StoragePath) + } + + assert( + acct.getCapability<&CapabilityFactory.Manager{CapabilityFactory.Getter}>(CapabilityFactory.PublicPath).check(), + message: "CapabilityFactory is not setup properly" + ) + + let factoryManager = acct.borrow<&CapabilityFactory.Manager>(from: CapabilityFactory.StoragePath) + ?? panic("CapabilityFactory Manager not found") + + // Add NFT-related Factories to the Manager + factoryManager.updateFactory(Type<&{NonFungibleToken.CollectionPublic}>(), NFTCollectionPublicFactory.Factory()) + factoryManager.updateFactory(Type<&{NonFungibleToken.Provider, NonFungibleToken.CollectionPublic}>(), NFTProviderAndCollectionFactory.Factory()) + factoryManager.updateFactory(Type<&{NonFungibleToken.Provider}>(), NFTProviderFactory.Factory()) + factoryManager.updateFactory(Type<&{FungibleToken.Provider}>(), FTProviderFactory.Factory()) + factoryManager.updateFactory(Type<&{FungibleToken.Provider, FungibleToken.Receiver, FungibleToken.Balance}>(), FTAllFactory.Factory()) + + /* --- AllowlistFilter configuration --- */ + // + if acct.borrow<&CapabilityFilter.AllowlistFilter>(from: CapabilityFilter.StoragePath) == nil { + acct.save(<-CapabilityFilter.create(Type<@CapabilityFilter.AllowlistFilter>()), to: CapabilityFilter.StoragePath) + } + + if !acct.getCapability<&CapabilityFilter.AllowlistFilter{CapabilityFilter.Filter}>(CapabilityFilter.PublicPath).check() { + acct.unlink(CapabilityFilter.PublicPath) + acct.link<&CapabilityFilter.AllowlistFilter{CapabilityFilter.Filter}>(CapabilityFilter.PublicPath, target: CapabilityFilter.StoragePath) + } + + assert( + acct.getCapability<&CapabilityFilter.AllowlistFilter{CapabilityFilter.Filter}>(CapabilityFilter.PublicPath).check(), + message: "AllowlistFilter is not setup properly" + ) + + let filter = acct.borrow<&CapabilityFilter.AllowlistFilter>(from: CapabilityFilter.StoragePath) + ?? panic("AllowlistFilter does not exist") + + // Construct an NFT Collection Type from the provided args & add to the AllowlistFilter + let collectionIdentifier = deriveCollectionOrVaultTypeIdentifier(nftContractAddress, nftContractName, isCollection: true) + let collectionType = CompositeType(collectionIdentifier) + ?? panic("Problem constructing CompositeType from given NFT contract address and name from identifier: ".concat(collectionIdentifier)) + filter.addType(collectionType) + // Construct an FT Vault Type from the provided args & add to the AllowlistFilter + let vaultIdentifier = deriveCollectionOrVaultTypeIdentifier(ftContractAddress, ftContractName, isCollection: false) + let vaultType = CompositeType(vaultIdentifier) + ?? panic("Problem vaultIdentifier CompositeType from given FungibleToken contract address and name from identifier: ".concat(vaultIdentifier)) + filter.addType(vaultType) + } +} diff --git a/transactions/hybrid_custody/metadata/set_child_account_display.cdc b/transactions/hybrid_custody/metadata/set_child_account_display.cdc new file mode 100644 index 0000000..0456286 --- /dev/null +++ b/transactions/hybrid_custody/metadata/set_child_account_display.cdc @@ -0,0 +1,27 @@ +import "MetadataViews" + +import "HybridCustody" + +import "RockPaperScissorsGame" + +/// Sets a child account's Display as associated with RockPaperScissorsGame +/// +transaction(childAddress: Address) { + + let manager: &HybridCustody.Manager + + prepare(signer: AuthAccount) { + self.manager = signer.borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) + ?? panic("Could not borrow a reference to Hybrid Custody Manager") + } + execute { + // Create display from the known contract association + let info = RockPaperScissorsGame.info + let display = MetadataViews.Display( + name: info.name, + description: info.description, + thumbnail: info.thumbnail + ) + self.manager.setChildAccountDisplay(address: childAddress, display) + } +} \ No newline at end of file diff --git a/transactions/hybrid_custody/metadata/set_owned_account_display.cdc b/transactions/hybrid_custody/metadata/set_owned_account_display.cdc new file mode 100644 index 0000000..da057d4 --- /dev/null +++ b/transactions/hybrid_custody/metadata/set_owned_account_display.cdc @@ -0,0 +1,27 @@ +import "MetadataViews" + +import "HybridCustody" + +import "RockPaperScissorsGame" + +/// Sets a child account's Display as associated with RockPaperScissorsGame +/// +transaction { + + let owned: &HybridCustody.OwnedAccount + + prepare(signer: AuthAccount) { + self.owned = signer.borrow<&HybridCustody.OwnedAccount>(from: HybridCustody.OwnedAccountStoragePath) + ?? panic("Could not borrow a reference to Hybrid Custody OwnedAccount") + } + execute { + // Create display from the known contract association + let info = RockPaperScissorsGame.info + let display = MetadataViews.Display( + name: info.name, + description: info.description, + thumbnail: info.thumbnail + ) + self.owned.setDisplay(display) + } +} \ No newline at end of file diff --git a/transactions/hybrid_custody/redeem_account.cdc b/transactions/hybrid_custody/redeem_account.cdc new file mode 100644 index 0000000..3f572a0 --- /dev/null +++ b/transactions/hybrid_custody/redeem_account.cdc @@ -0,0 +1,119 @@ +import "FungibleToken" +import "NonFungibleToken" +import "MetadataViews" + +import "HybridCustody" + +import "GamePieceNFT" +import "RockPaperScissorsGame" +import "TicketToken" + +/// This transaction redeems a published +transaction(childAddress: Address) { + prepare(parent: AuthAccount) { + /* --- Redeem HybridCustody ChildAccount --- */ + // + // Configure a HybridCustody Manager if needed + if parent.borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) == nil { + let m <- HybridCustody.createManager(filter: nil) + parent.save(<- m, to: HybridCustody.ManagerStoragePath) + + parent.unlink(HybridCustody.ManagerPublicPath) + parent.unlink(HybridCustody.ManagerPrivatePath) + + parent.link<&HybridCustody.Manager{HybridCustody.ManagerPrivate, HybridCustody.ManagerPublic}>(HybridCustody.ManagerPrivatePath, target: HybridCustody.ManagerStoragePath) + parent.link<&HybridCustody.Manager{HybridCustody.ManagerPublic}>(HybridCustody.ManagerPublicPath, target: HybridCustody.ManagerStoragePath) + } + // Get a reference to the Manager + let manager = parent.borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) + ?? panic("Manager not found in signing account!") + + // Get the published ChildAccount Capability name & claim it + let inboxName = HybridCustody.getChildAccountIdentifier(parent.address) + let cap = parent.inbox.claim<&HybridCustody.ChildAccount{HybridCustody.AccountPrivate, HybridCustody.AccountPublic, MetadataViews.Resolver}>(inboxName, provider: childAddress) + ?? panic("ChildAccount not available for claiming!") + + // Add the claimed Capability to the Manager as a child account + manager.addAccount(cap: cap) + + // Create display from the known contract association + let info = RockPaperScissorsGame.info + let display = MetadataViews.Display( + name: info.name, + description: info.description, + thumbnail: info.thumbnail + ) + // Set parent-managed Display on the added account + manager.setChildAccountDisplay(address: childAddress, display) + + /** --- Setup parent's GamePieceNFT.Collection --- */ + // + // Set up GamePieceNFT.Collection if it doesn't exist + if parent.borrow<&GamePieceNFT.Collection>(from: GamePieceNFT.CollectionStoragePath) == nil { + // Create a new empty collection + let collection <- GamePieceNFT.createEmptyCollection() + // save it to the account + parent.save(<-collection, to: GamePieceNFT.CollectionStoragePath) + } + // Check for public capabilities + if !parent.getCapability< + &GamePieceNFT.Collection{NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, GamePieceNFT.GamePieceNFTCollectionPublic, MetadataViews.ResolverCollection} + >( + GamePieceNFT.CollectionPublicPath + ).check() { + // create a public capability for the collection + parent.unlink(GamePieceNFT.CollectionPublicPath) + parent.link< + &GamePieceNFT.Collection{NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, GamePieceNFT.GamePieceNFTCollectionPublic, MetadataViews.ResolverCollection} + >( + GamePieceNFT.CollectionPublicPath, + target: GamePieceNFT.CollectionStoragePath + ) + } + // Check for private capabilities + if !parent.getCapability<&GamePieceNFT.Collection{NonFungibleToken.Provider}>(GamePieceNFT.ProviderPrivatePath).check() { + // Link the Provider Capability in private storage + parent.unlink(GamePieceNFT.ProviderPrivatePath) + parent.link< + &GamePieceNFT.Collection{NonFungibleToken.Provider} + >( + GamePieceNFT.ProviderPrivatePath, + target: GamePieceNFT.CollectionStoragePath + ) + } + + /* --- Set parent account up with TicketToken.Vault --- */ + // + // Create & save a Vault + if parent.borrow<&TicketToken.Vault>(from: TicketToken.VaultStoragePath) == nil { + // Create a new flowToken Vault and put it in storage + parent.save(<-TicketToken.createEmptyVault(), to: TicketToken.VaultStoragePath) + } + + if !parent.getCapability<&TicketToken.Vault{FungibleToken.Receiver, FungibleToken.Balance, MetadataViews.Resolver}>( + TicketToken.ReceiverPublicPath + ).check() { + // Unlink any capability that may exist there + parent.unlink(TicketToken.ReceiverPublicPath) + // Create a public capability to the Vault that only exposes the deposit function + // & balance field through the Receiver & Balance interface + parent.link<&TicketToken.Vault{FungibleToken.Receiver, FungibleToken.Balance, MetadataViews.Resolver}>( + TicketToken.ReceiverPublicPath, + target: TicketToken.VaultStoragePath + ) + } + + if !parent.getCapability<&TicketToken.Vault{FungibleToken.Provider}>( + TicketToken.ProviderPrivatePath + ).check() { + // Unlink any capability that may exist there + parent.unlink(TicketToken.ProviderPrivatePath) + // Create a private capability to the Vault that only exposes the withdraw function + // through the Provider interface + parent.link<&TicketToken.Vault{FungibleToken.Provider}>( + TicketToken.ProviderPrivatePath, + target: TicketToken.VaultStoragePath + ) + } + } +} \ No newline at end of file diff --git a/transactions/hybrid_custody/remove_child_account.cdc b/transactions/hybrid_custody/remove_child_account.cdc new file mode 100644 index 0000000..872b84a --- /dev/null +++ b/transactions/hybrid_custody/remove_child_account.cdc @@ -0,0 +1,9 @@ +import "HybridCustody" + +transaction(child: Address) { + prepare (acct: AuthAccount) { + let manager = acct.borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) + ?? panic("manager not found") + manager.removeChild(addr: child) + } +} \ No newline at end of file diff --git a/transactions/hybrid_custody/setup_manager.cdc b/transactions/hybrid_custody/setup_manager.cdc new file mode 100644 index 0000000..746d2a9 --- /dev/null +++ b/transactions/hybrid_custody/setup_manager.cdc @@ -0,0 +1,23 @@ +import "HybridCustody" +import "CapabilityFilter" + +transaction(filterAddress: Address?, filterPath: PublicPath?) { + prepare(acct: AuthAccount) { + var filter: Capability<&{CapabilityFilter.Filter}>? = nil + if filterAddress != nil && filterPath != nil { + filter = getAccount(filterAddress!).getCapability<&{CapabilityFilter.Filter}>(filterPath!) + } + + if acct.borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) == nil { + let m <- HybridCustody.createManager(filter: filter) + acct.save(<- m, to: HybridCustody.ManagerStoragePath) + } + + acct.unlink(HybridCustody.ManagerPublicPath) + acct.unlink(HybridCustody.ManagerPrivatePath) + + acct.link<&HybridCustody.Manager{HybridCustody.ManagerPrivate, HybridCustody.ManagerPublic}>(HybridCustody.ManagerPrivatePath, target: HybridCustody.ManagerStoragePath) + acct.link<&HybridCustody.Manager{HybridCustody.ManagerPublic}>(HybridCustody.ManagerPublicPath, target: HybridCustody.ManagerStoragePath) + } +} + \ No newline at end of file diff --git a/transactions/hybrid_custody/setup_owned_account_and_publish_to_parent.cdc b/transactions/hybrid_custody/setup_owned_account_and_publish_to_parent.cdc new file mode 100644 index 0000000..c64d7e0 --- /dev/null +++ b/transactions/hybrid_custody/setup_owned_account_and_publish_to_parent.cdc @@ -0,0 +1,63 @@ +#allowAccountLinking + +import "MetadataViews" + +import "RockPaperScissorsGame" + +import "HybridCustody" +import "CapabilityFactory" +import "CapabilityFilter" +import "CapabilityDelegator" + +/// This transaction configures an OwnedAccount in the signer if needed and with an attached MetadataViews.Display +/// from the RPSGame.info. The transaction then proceeds to create a ChildAccount using CapabilityFactory.Manager +/// and CapabilityFilter.Filter Capabilities from the given addresses, and publishes a Capability on said ChildAccount +/// to the specified parent account. +/// +transaction( + parent: Address, + factoryAddress: Address, + filterAddress: Address +) { + + prepare(acct: AuthAccount) { + // Configure OwnedAccount if it doesn't exist + if acct.borrow<&HybridCustody.OwnedAccount>(from: HybridCustody.OwnedAccountStoragePath) == nil { + var acctCap = acct.getCapability<&AuthAccount>(HybridCustody.LinkedAccountPrivatePath) + if !acctCap.check() { + acctCap = acct.linkAccount(HybridCustody.LinkedAccountPrivatePath)! + } + let ownedAccount <- HybridCustody.createOwnedAccount(acct: acctCap) + acct.save(<-ownedAccount, to: HybridCustody.OwnedAccountStoragePath) + } + + // check that paths are all configured properly + acct.unlink(HybridCustody.OwnedAccountPrivatePath) + acct.link<&HybridCustody.OwnedAccount{HybridCustody.BorrowableAccount, HybridCustody.OwnedAccountPublic, MetadataViews.Resolver}>(HybridCustody.OwnedAccountPrivatePath, target: HybridCustody.OwnedAccountStoragePath) + + acct.unlink(HybridCustody.OwnedAccountPublicPath) + acct.link<&HybridCustody.OwnedAccount{HybridCustody.OwnedAccountPublic, MetadataViews.Resolver}>(HybridCustody.OwnedAccountPublicPath, target: HybridCustody.OwnedAccountStoragePath) + + let owned = acct.borrow<&HybridCustody.OwnedAccount>(from: HybridCustody.OwnedAccountStoragePath) + ?? panic("owned account not found") + + // Set the display metadata for the OwnedAccount + let info = RockPaperScissorsGame.info + let display = MetadataViews.Display( + name: info.name, + description: info.description, + thumbnail: info.thumbnail + ) + owned.setDisplay(display) + + // Get CapabilityFactory & CapabilityFilter Capabilities + let factory = getAccount(factoryAddress).getCapability<&CapabilityFactory.Manager{CapabilityFactory.Getter}>(CapabilityFactory.PublicPath) + assert(factory.check(), message: "factory address is not configured properly") + + let filter = getAccount(filterAddress).getCapability<&{CapabilityFilter.Filter}>(CapabilityFilter.PublicPath) + assert(filter.check(), message: "capability filter is not configured properly") + + // Finally publish a ChildAccount capability on the signing account to the specified parent + owned.publishToParent(parentAddress: parent, factory: factory, filter: filter) + } +} \ No newline at end of file diff --git a/transactions/linked_accounts/add_as_child_from_claimed_auth_account_cap.cdc b/transactions/linked_accounts/add_as_child_from_claimed_auth_account_cap.cdc deleted file mode 100644 index 916c684..0000000 --- a/transactions/linked_accounts/add_as_child_from_claimed_auth_account_cap.cdc +++ /dev/null @@ -1,96 +0,0 @@ -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import LinkedAccountMetadataViews from "../../contracts/LinkedAccountMetadataViews.cdc" -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" - -/// Signing account claims a Capability to specified Address's AuthAccount -/// and adds it as a child account in its LinkedAccounts.Collection, allowing it -/// to maintain the claimed Capability -/// -transaction( - linkedAccountAddress: Address, - linkedAccountName: String, - linkedAccountDescription: String, - clientThumbnailURL: String, - clientExternalURL: String, - handlerPathSuffix: String - ) { - - let collectionRef: &LinkedAccounts.Collection - let info: LinkedAccountMetadataViews.AccountInfo - let authAccountCap: Capability<&AuthAccount> - - prepare(signer: AuthAccount) { - /** --- Configure Collection & get ref --- */ - // - // Check that Collection is saved in storage - if signer.type(at: LinkedAccounts.CollectionStoragePath) == nil { - signer.save( - <-LinkedAccounts.createEmptyCollection(), - to: LinkedAccounts.CollectionStoragePath - ) - } - // Link the public Capability - if !signer.getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, MetadataViews.ResolverCollection} - >(LinkedAccounts.CollectionPublicPath).check() { - signer.unlink(LinkedAccounts.CollectionPublicPath) - signer.link<&LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, MetadataViews.ResolverCollection}>( - LinkedAccounts.CollectionPublicPath, - target: LinkedAccounts.CollectionStoragePath - ) - } - // Link the private Capability - if !signer.getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.Provider, MetadataViews.ResolverCollection} - >(LinkedAccounts.CollectionPrivatePath).check() { - signer.unlink(LinkedAccounts.CollectionPrivatePath) - signer.link< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.Provider, MetadataViews.ResolverCollection} - >( - LinkedAccounts.CollectionPrivatePath, - target: LinkedAccounts.CollectionStoragePath - ) - } - // Get Collection reference from signer - self.collectionRef = signer.borrow< - &LinkedAccounts.Collection - >( - from: LinkedAccounts.CollectionStoragePath - )! - - /** --- Prep to link account --- */ - // - // Claim the previously published AuthAccount Capability from the given Address - self.authAccountCap = signer.inbox.claim<&AuthAccount>( - "AuthAccountCapability", - provider: linkedAccountAddress - ) ?? panic( - "No AuthAccount Capability available from given provider" - .concat(linkedAccountAddress.toString()) - .concat(" with name ") - .concat("AuthAccountCapability") - ) - - /** --- Construct metadata --- */ - // - // Construct linked account metadata from given arguments - self.info = LinkedAccountMetadataViews.AccountInfo( - name: linkedAccountName, - description: linkedAccountDescription, - thumbnail: MetadataViews.HTTPFile(url: clientThumbnailURL), - externalURL: MetadataViews.ExternalURL(clientExternalURL) - ) - } - - execute { - // Add account as child to the signer's LinkedAccounts.Collection - self.collectionRef.addAsChildAccount( - linkedAccountCap: self.authAccountCap, - linkedAccountMetadata: self.info, - linkedAccountMetadataResolver: nil, - handlerPathSuffix: handlerPathSuffix - ) - } -} - \ No newline at end of file diff --git a/transactions/linked_accounts/add_as_child_multisig.cdc b/transactions/linked_accounts/add_as_child_multisig.cdc deleted file mode 100644 index e162cc9..0000000 --- a/transactions/linked_accounts/add_as_child_multisig.cdc +++ /dev/null @@ -1,110 +0,0 @@ -#allowAccountLinking - -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import LinkedAccountMetadataViews from "../../contracts/LinkedAccountMetadataViews.cdc" -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" - -/// Links thie signing accounts as labeled, with the child's AuthAccount Capability -/// maintained in the parent's LinkedAccounts.Collection -/// -transaction( - linkedAccountName: String, - linkedAccountDescription: String, - clientThumbnailURL: String, - clientExternalURL: String -) { - - let collectionRef: &LinkedAccounts.Collection - let info: LinkedAccountMetadataViews.AccountInfo - let authAccountCap: Capability<&AuthAccount> - let linkedAccountAddress: Address - - prepare(parent: AuthAccount, child: AuthAccount) { - - /** --- Configure Collection & get ref --- */ - // - // Check that Collection is saved in storage - if parent.type(at: LinkedAccounts.CollectionStoragePath) == nil { - parent.save( - <-LinkedAccounts.createEmptyCollection(), - to: LinkedAccounts.CollectionStoragePath - ) - } - // Link the public Capability - if !parent.getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, MetadataViews.ResolverCollection} - >(LinkedAccounts.CollectionPublicPath).check() { - parent.unlink(LinkedAccounts.CollectionPublicPath) - parent.link<&LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, MetadataViews.ResolverCollection}>( - LinkedAccounts.CollectionPublicPath, - target: LinkedAccounts.CollectionStoragePath - ) - } - // Link the private Capability - if !parent.getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.Provider, MetadataViews.ResolverCollection} - >(LinkedAccounts.CollectionPrivatePath).check() { - parent.unlink(LinkedAccounts.CollectionPrivatePath) - parent.link< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.Provider, MetadataViews.ResolverCollection} - >( - LinkedAccounts.CollectionPrivatePath, - target: LinkedAccounts.CollectionStoragePath - ) - } - // Get Collection reference from signer - self.collectionRef = parent.borrow< - &LinkedAccounts.Collection - >( - from: LinkedAccounts.CollectionStoragePath - )! - - /* --- Link the child account's AuthAccount Capability & assign --- */ - // - // **NOTE:** You'll want to consider adding the AuthAccount Capability path suffix as a transaction arg - let authAccountPath: PrivatePath = PrivatePath(identifier: "RPSAuthAccountCapability") - ?? panic("Couldn't create Private Path from identifier: RPSAuthAccountCapability") - // Get the AuthAccount Capability, linking if necessary - if !child.getCapability<&AuthAccount>(authAccountPath).check() { - // Unlink any Capability that may be there - child.unlink(authAccountPath) - // Link & assign the AuthAccount Capability - self.authAccountCap = child.linkAccount(authAccountPath)! - } else { - // Assign the AuthAccount Capability - self.authAccountCap = child.getCapability<&AuthAccount>(authAccountPath) - } - self.linkedAccountAddress = self.authAccountCap.borrow()?.address ?? panic("Problem with retrieved AuthAccount Capability") - - /** --- Construct metadata --- */ - // - // Construct linked account metadata from given arguments - self.info = LinkedAccountMetadataViews.AccountInfo( - name: linkedAccountName, - description: linkedAccountDescription, - thumbnail: MetadataViews.HTTPFile(url: clientThumbnailURL), - externalURL: MetadataViews.ExternalURL(clientExternalURL) - ) - } - - execute { - // Add child account if it's parent-child accounts aren't already linked - // *NOTE:*** You may want to add handlerPathSuffix as a transaction arg for greater flexibility as - // this is where the LinkedAccounts.Handler will be saved in the linked account - if !self.collectionRef.getLinkedAccountAddresses().contains(self.linkedAccountAddress) { - // Add the child account - self.collectionRef.addAsChildAccount( - linkedAccountCap: self.authAccountCap, - linkedAccountMetadata: self.info, - linkedAccountMetadataResolver: nil, - handlerPathSuffix: "RPSLinkedAccountHandler" - ) - } - } - - post { - self.collectionRef.getLinkedAccountAddresses().contains(self.linkedAccountAddress): - "Problem linking accounts!" - } -} \ No newline at end of file diff --git a/transactions/linked_accounts/create_account.cdc b/transactions/linked_accounts/create_account.cdc deleted file mode 100644 index c0562e1..0000000 --- a/transactions/linked_accounts/create_account.cdc +++ /dev/null @@ -1,45 +0,0 @@ -import AccountCreator from "../../contracts/utility/AccountCreator.cdc" - -/// This transaction creates an account from the given public key, using the AccountCreator.Creator and the signer as -/// the account's payer, additionally funding the new account with the specified amount of Flow from the signer's -/// account. -/// -transaction( - pubKey: String, - fundingAmt: UFix64 - ) { - - prepare(signer: AuthAccount) { - // Ensure resource is saved where expected - if signer.type(at: AccountCreator.CreatorStoragePath) == nil { - signer.save( - <-AccountCreator.createNewCreator(), - to: AccountCreator.CreatorStoragePath - ) - } - // Ensure public Capability is linked - if !signer.getCapability<&AccountCreator.Creator{AccountCreator.CreatorPublic}>( - AccountCreator.CreatorPublicPath).check() { - // Link the public Capability - signer.unlink(AccountCreator.CreatorPublicPath) - signer.link<&AccountCreator.Creator{AccountCreator.CreatorPublic}>( - AccountCreator.CreatorPublicPath, - target: AccountCreator.CreatorStoragePath - ) - } - // Get a reference to the signer's Creator - let creatorRef = signer.borrow<&AccountCreator.Creator>( - from: AccountCreator.CreatorStoragePath - ) ?? panic( - "No AccountCreator in signer's account at " - .concat(AccountCreator.CreatorStoragePath.toString()) - ) - // Create the account - let newAccount = creatorRef.createNewAccount( - signer: signer, - initialFundingAmount: fundingAmt, - originatingPublicKey: pubKey - ) - // Now that account is created, we could proceed to configure the new account as desired - } -} \ No newline at end of file diff --git a/transactions/linked_accounts/create_account_and_publish_auth_account_cap.cdc b/transactions/linked_accounts/create_account_and_publish_auth_account_cap.cdc deleted file mode 100644 index 074bc87..0000000 --- a/transactions/linked_accounts/create_account_and_publish_auth_account_cap.cdc +++ /dev/null @@ -1,75 +0,0 @@ -#allowAccountLinking - -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" -import FlowToken from "../../contracts/utility/FlowToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import LinkedAccountMetadataViews from "../../contracts/LinkedAccountMetadataViews.cdc" -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" - -/// This transaction creates an account, funding creation via the signing account and adding the provided -/// public key (presumably custodied by the signing client/dApp). The new account then links a Capability to its -/// AuthAccount, and publishes that Capability to be claimed by the given parent account. -/// -transaction( - pubKey: String, - fundingAmt: UFix64, - authAccountPathSuffix: String, - parentAddress: Address - ) { - - prepare(signer: AuthAccount) { - - /* --- Account Creation (your dApp may choose to handle creation differently depending on your custodial model) --- */ - // - // Create the child account, funding via the signer - let newAccount = AuthAccount(payer: signer) - // Create a public key for the proxy account from string value in the provided arg - // **NOTE:** You may want to specify a different signature algo for your use case - let key = PublicKey( - publicKey: pubKey.decodeHex(), - signatureAlgorithm: SignatureAlgorithm.ECDSA_P256 - ) - // Add the key to the new account - // **NOTE:** You may want to specify a different hash algo & weight best for your use case - newAccount.keys.add( - publicKey: key, - hashAlgorithm: HashAlgorithm.SHA3_256, - weight: 1000.0 - ) - - /* (Optional) Additional Account Funding */ - // - // Fund the new account if specified - if fundingAmt > 0.0 { - // Get a vault to fund the new account - let fundingProvider = signer.borrow<&FlowToken.Vault{FungibleToken.Provider}>( - from: /storage/flowTokenVault - )! - // Fund the new account with the initialFundingAmount specified - newAccount.getCapability<&FlowToken.Vault{FungibleToken.Receiver}>( - /public/flowTokenReceiver - ).borrow()! - .deposit( - from: <-fundingProvider.withdraw( - amount: fundingAmt - ) - ) - } - - // At this point, the newAccount can further be configured as suitable for - // use in your dapp (e.g. Setup a Collection, Mint NFT, Configure Vault, etc.) - // ... - - /* --- Link the new account's AuthAccount Capability & publish --- */ - // - // Assign the PrivatePath where we'll link the AuthAccount Capability - let authAccountPath: PrivatePath = PrivatePath(identifier: authAccountPathSuffix) - ?? panic("Could not construct PrivatePath from given suffix: ".concat(authAccountPathSuffix)) - // Link the new account's AuthAccount Capability - let authAccountCap: Capability<&AuthAccount> = newAccount.linkAccount(authAccountPath) - // Publish AuthAccount Capability to be claimed by parent - // **NOTE:** You could specify a name for the published Capability in the txn args if you wished - newAccount.inbox.publish(self.authAccountCap!, name: "AuthAccountCapability", recipient: parentAddress) - } -} diff --git a/transactions/linked_accounts/grant_child_delegated_game_player_cap.cdc b/transactions/linked_accounts/grant_child_delegated_game_player_cap.cdc deleted file mode 100644 index 8e6d6e3..0000000 --- a/transactions/linked_accounts/grant_child_delegated_game_player_cap.cdc +++ /dev/null @@ -1,61 +0,0 @@ -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" - -/// Gives a DelegatedGamePlayer capability to a child account via the signer's LinkedAccounts.Collection & the linked -/// account's LinkedAccounts.Handler. If a GamePlayer doesn't exist in the signer's account, one is created & linked. -/// -transaction(childAddress: Address) { - - let collectionRef: &LinkedAccounts.Collection - let gamePlayerCap: Capability<&RockPaperScissorsGame.GamePlayer{RockPaperScissorsGame.DelegatedGamePlayer} - - prepare(signer: AuthAccount) { - - /** --- Set user up with GamePlayer --- */ - // - // Check if a GamePlayer already exists, pass this block if it does - if signer.borrow<&{RockPaperScissorsGame.GamePlayerPublic}>(from: RockPaperScissorsGame.GamePlayerStoragePath) == nil { - // Create & save GamePlayer resource - signer.save(<-RockPaperScissorsGame.createGamePlayer(), to: RockPaperScissorsGame.GamePlayerStoragePath) - } - // Link GamePlayerPublic Capability so player can be added to Matches - if !signer.getCapability<&{RockPaperScissorsGame.GamePlayerPublic}>(RockPaperScissorsGame.GamePlayerPublicPath).check() { - signer.unlink(RockPaperScissorsGame.GamePlayerPublicPath) - signer.link<& - {RockPaperScissorsGame.GamePlayerPublic} - >( - RockPaperScissorsGame.GamePlayerPublicPath, - target: RockPaperScissorsGame.GamePlayerStoragePath - ) - } - // Link GamePlayerID & DelegatedGamePlayer Capability - if !signer.getCapability<&{RockPaperScissorsGame.GamePlayerID}>(RockPaperScissorsGame.GamePlayerPrivatePath).check() { - signer.unlink(RockPaperScissorsGame.GamePlayerPrivatePath) - signer.link<&{ - RockPaperScissorsGame.DelegatedGamePlayer, - RockPaperScissorsGame.GamePlayerID - }>( - RockPaperScissorsGame.GamePlayerPrivatePath, - target: RockPaperScissorsGame.GamePlayerStoragePath - ) - } - - // Get the GamePlayer Capability - self.gamePlayerCap = signer.getCapability<&RockPaperScissorsGame.GamePlayer{RockPaperScissorsGame.DelegatedGamePlayer}>( - RockPaperScissorsGame.GamePlayerPrivatePath - ) - - /** --- Add the Capability to the linked account's Handler through the signer's Collection --- */ - // - // Get a reference to the ChildAcccountManager resource - self.collectionRef = signer.borrow<&LinkedAccounts.Collection>( - from: LinkedAccounts.CollectionStoragePath - )?? panic("Signer does not have a LinkedAccounts.Collection configured!") - } - execute { - // Grant the GamePlayer Capability to the child account - collectionRef.addCapability(to: childAddress, self.gamePlayerCap) - } -} - \ No newline at end of file diff --git a/transactions/linked_accounts/publish_auth_account_cap.cdc b/transactions/linked_accounts/publish_auth_account_cap.cdc deleted file mode 100644 index 3431589..0000000 --- a/transactions/linked_accounts/publish_auth_account_cap.cdc +++ /dev/null @@ -1,24 +0,0 @@ -#allowAccountLinking - -/// Signing account publishes a Capability to its AuthAccount for -/// the specified parentAddress to claim -/// -transaction(parentAddress: Address, authAccountPathSuffix: String) { - - let authAccountCap: Capability<&AuthAccount> - - prepare(signer: AuthAccount) { - // Assign the PrivatePath where we'll link the AuthAccount Capability - let authAccountPath: PrivatePath = PrivatePath(identifier: authAccountPathSuffix) - ?? panic("Could not construct PrivatePath from given suffix: ".concat(authAccountPathSuffix)) - // Get the AuthAccount Capability, linking if necessary - if !signer.getCapability<&AuthAccount>(authAccountPath).check() { - signer.unlink(authAccountPath) - self.authAccountCap = signer.linkAccount(authAccountPath)! - } else { - self.authAccountCap = signer.getCapability<&AuthAccount>(authAccountPath) - } - // Publish for the specified Address - signer.inbox.publish(self.authAccountCap!, name: "AuthAccountCapability", recipient: parentAddress) - } -} \ No newline at end of file diff --git a/transactions/linked_accounts/remove_child_account.cdc b/transactions/linked_accounts/remove_child_account.cdc deleted file mode 100644 index bff595c..0000000 --- a/transactions/linked_accounts/remove_child_account.cdc +++ /dev/null @@ -1,24 +0,0 @@ -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" - -/// This transaction removes access to a linked account from the signer's LinkedAccounts Collection. -/// **NOTE:** The signer will no longer have access to the removed child account via AuthAccount Capability, so care -/// should be taken to ensure any assets in the child account have been first transferred as well as checking active -/// keys that need to be revoked have been done so (a detail that will largely depend on you dApps custodial model) -/// -transaction(childAddress: Address) { - - let collectionRef: &LinkedAccounts.Collection - - prepare(signer: AuthAccount) { - // Assign a reference to signer's LinkedAccounts.Collection - self.collectionRef = signer.borrow<&LinkedAccounts.Collection>( - from: LinkedAccounts.CollectionStoragePath - ) ?? panic("Signer does not have a LinkedAccounts Collection configured!") - } - - execute { - // Remove child account, revoking any granted Capabilities - self.collectionRef.removeLinkedAccount(withAddress: childAddress) - } -} - \ No newline at end of file diff --git a/transactions/linked_accounts/setup_linked_accounts_collection.cdc b/transactions/linked_accounts/setup_linked_accounts_collection.cdc deleted file mode 100644 index a62fdaa..0000000 --- a/transactions/linked_accounts/setup_linked_accounts_collection.cdc +++ /dev/null @@ -1,40 +0,0 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" - -/// Sets up a LinkedAccounts.Collection in signer's account to enable management of linked accounts via -/// AuthAccount Capabilities wrapped in NFTs -/// -transaction { - prepare(signer: AuthAccount) { - // Check that Collection is saved in storage - if signer.type(at: LinkedAccounts.CollectionStoragePath) == nil { - signer.save( - <-LinkedAccounts.createEmptyCollection(), - to: LinkedAccounts.CollectionStoragePath - ) - } - // Link the public Capability - if !signer.getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, MetadataViews.ResolverCollection} - >(LinkedAccounts.CollectionPublicPath).check() { - signer.unlink(LinkedAccounts.CollectionPublicPath) - signer.link<&LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, MetadataViews.ResolverCollection}>( - LinkedAccounts.CollectionPublicPath, - target: LinkedAccounts.CollectionStoragePath - ) - } - // Link the private Capability - if !signer.getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.Provider, MetadataViews.ResolverCollection} - >(LinkedAccounts.CollectionPrivatePath).check() { - signer.unlink(LinkedAccounts.CollectionPrivatePath) - signer.link< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.Provider, MetadataViews.ResolverCollection} - >( - LinkedAccounts.CollectionPrivatePath, - target: LinkedAccounts.CollectionStoragePath - ) - } - } -} diff --git a/transactions/onboarding/blockchain_native_onboarding.cdc b/transactions/onboarding/blockchain_native_onboarding.cdc index e8e8865..53036b6 100644 --- a/transactions/onboarding/blockchain_native_onboarding.cdc +++ b/transactions/onboarding/blockchain_native_onboarding.cdc @@ -1,74 +1,86 @@ #allowAccountLinking -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" -import AccountCreator from "../../contracts/utility/AccountCreator.cdc" -import LinkedAccountMetadataViews from "../../contracts/LinkedAccountMetadataViews.cdc" -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" -import TicketToken from "../../contracts/TicketToken.cdc" +import "FungibleToken" +import "NonFungibleToken" +import "FlowToken" +import "MetadataViews" -/// This transaction creates a new account, funding creation with the signed client account and configuring it with a +import "HybridCustody" +import "CapabilityFactory" +import "CapabilityFilter" +import "CapabilityDelegator" + +import "AccountCreator" + +import "GamePieceNFT" +import "RockPaperScissorsGame" +import "TicketToken" + +/// This transaction creates a new account, funding creation with the signed app account and configuring it with a /// GamePieceNFT Collection & NFT, RockPaperScissorsGame GamePlayer, and TicketToken Vault. The parent account is -/// configured with a GamePieceNFT Collection, TicketToken Vault, and LinkedAccounts.Collection. Lastly, the new +/// configured with a GamePieceNFT Collection, TicketToken Vault, and HybridCustody.Manager. Lastly, the new /// account is then linked to the signing parent account, establishing it as a linked account of the parent account. /// transaction( pubKey: String, fundingAmt: UFix64, - linkedAccountName: String, - linkedAccountDescription: String, - clientThumbnailURL: String, - clientExternalURL: String, - monsterBackground: Int, - monsterHead: Int, - monsterTorso: Int, - monsterLeg: Int + factoryAddress: Address, + filterAddress: Address, + minterAddress: Address ) { - let minterRef: &GamePieceNFT.Minter + let childAddress: Address let gamePieceCollectionRef: &GamePieceNFT.Collection{NonFungibleToken.CollectionPublic} - let linkedAccountsCollectionRef: &LinkedAccounts.Collection - let linkedAccountCap: Capability<&AuthAccount> + let ownedAccountRef: &HybridCustody.OwnedAccount + let managerRef: &HybridCustody.Manager + let childAccountCapability: Capability<&HybridCustody.ChildAccount{HybridCustody.AccountPrivate, HybridCustody.AccountPublic, MetadataViews.Resolver}> - prepare(parent: AuthAccount, client: AuthAccount) { - /* --- Create a new account --- */ + prepare(parent: AuthAccount, app: AuthAccount) { + /* --- Create a new account using AccountCreator --- */ + // + // **NOTE:** AccountCreator is used here to keep the demo app client-side & simple and should be replaced by an + // an an account creation + database or custodial service in a production environment. // // Ensure resource is saved where expected - if client.type(at: AccountCreator.CreatorStoragePath) == nil { - client.save( + if app.type(at: AccountCreator.CreatorStoragePath) == nil { + app.save( <-AccountCreator.createNewCreator(), to: AccountCreator.CreatorStoragePath ) } // Ensure public Capability is linked - if !client.getCapability<&AccountCreator.Creator{AccountCreator.CreatorPublic}>( + if !app.getCapability<&AccountCreator.Creator{AccountCreator.CreatorPublic}>( AccountCreator.CreatorPublicPath).check() { // Link the public Capability - client.unlink(AccountCreator.CreatorPublicPath) - client.link<&AccountCreator.Creator{AccountCreator.CreatorPublic}>( + app.unlink(AccountCreator.CreatorPublicPath) + app.link<&AccountCreator.Creator{AccountCreator.CreatorPublic}>( AccountCreator.CreatorPublicPath, target: AccountCreator.CreatorStoragePath ) } // Get a reference to the client's AccountCreator.Creator - let creatorRef = client.borrow<&AccountCreator.Creator>( + let creatorRef = app.borrow<&AccountCreator.Creator>( from: AccountCreator.CreatorStoragePath - ) ?? panic("No AccountCreator in client's account!") + ) ?? panic("No AccountCreator in app's account!") + // Create the account let child = creatorRef.createNewAccount( - signer: client, + signer: app, initialFundingAmount: fundingAmt, originatingPublicKey: pubKey ) - // Link AuthAccountCapability & assign - // **NOTE:** You'll want to consider adding the AuthAccount Capability path suffix as a transaction arg - let authAccountCapPrivatePath: PrivatePath = PrivatePath(identifier: "RPSAuthAccountCapability") - ?? panic("Couldn't create Private Path from identifier: RPSAuthAccountCapability") - self.linkedAccountCap = child.linkAccount(authAccountCapPrivatePath) - ?? panic("Problem linking AuthAccount Capability for ".concat(child.address.toString())) + self.childAddress = child.address + + /* --- (Optional) Additional Account Funding --- */ + // + // Fund the new account if specified + if fundingAmt > 0.0 { + // Get a vault to fund the new account + let fundingProvider = app.borrow<&FlowToken.Vault{FungibleToken.Provider}>(from: /storage/flowTokenVault)! + // Fund the new account with the initialFundingAmount specified + child.getCapability<&FlowToken.Vault{FungibleToken.Receiver}>(/public/flowTokenReceiver).borrow()! + .deposit(from: <-fundingProvider.withdraw(amount: fundingAmt)) + } /* --- Set up GamePieceNFT.Collection --- */ // @@ -82,24 +94,14 @@ transaction( target: GamePieceNFT.CollectionStoragePath ) // Link the Provider Capability in private storage - child.link< - &GamePieceNFT.Collection{NonFungibleToken.Provider} - >( + child.link<&GamePieceNFT.Collection{NonFungibleToken.Provider}>( GamePieceNFT.ProviderPrivatePath, target: GamePieceNFT.CollectionStoragePath ) // Grab Collection related references & Capabilities - self.gamePieceCollectionRef = child.borrow< - &GamePieceNFT.Collection{NonFungibleToken.CollectionPublic} - >( + self.gamePieceCollectionRef = child.borrow<&GamePieceNFT.Collection{NonFungibleToken.CollectionPublic}>( from: GamePieceNFT.CollectionStoragePath )! - - /* --- Make sure child account has a GamePieceNFT.NFT to play with --- */ - // - // Borrow a reference to the Minter Capability in minter account's storage - self.minterRef = client.borrow<&GamePieceNFT.Minter>(from: GamePieceNFT.MinterStoragePath) - ?? panic("Couldn't borrow reference to Minter Capability in storage at ".concat(GamePieceNFT.MinterStoragePath.toString())) /* --- Set user up with GamePlayer in child account --- */ // @@ -114,7 +116,7 @@ transaction( ) // Link GamePlayerID & DelegatedGamePlayer Capability child.link< - &RockPaperScissorsGame.GamePlayer{RockPaperScissorsGame.DelegatedGamePlayer,RockPaperScissorsGame.GamePlayerID} + &RockPaperScissorsGame.GamePlayer{RockPaperScissorsGame.DelegatedGamePlayer, RockPaperScissorsGame.GamePlayerID} >( RockPaperScissorsGame.GamePlayerPrivatePath, target: RockPaperScissorsGame.GamePlayerStoragePath @@ -137,6 +139,41 @@ transaction( target: TicketToken.VaultStoragePath ) + /* --- Configure OwnedAccount in child account --- */ + // + var acctCap = child.linkAccount(HybridCustody.LinkedAccountPrivatePath) + ?? panic("problem linking account Capability for new account") + + // Create an OwnedAccount & link Capabilities + let ownedAccount <- HybridCustody.createOwnedAccount(acct: acctCap) + child.save(<-ownedAccount, to: HybridCustody.OwnedAccountStoragePath) + child + .link<&HybridCustody.OwnedAccount{HybridCustody.BorrowableAccount, HybridCustody.OwnedAccountPublic, MetadataViews.Resolver}>( + HybridCustody.OwnedAccountPrivatePath, + target: HybridCustody.OwnedAccountStoragePath + ) + child + .link<&HybridCustody.OwnedAccount{HybridCustody.OwnedAccountPublic, MetadataViews.Resolver}>( + HybridCustody.OwnedAccountPublicPath, + target: HybridCustody.OwnedAccountStoragePath + ) + // Get a reference to the OwnedAccount resource + self.ownedAccountRef = child.borrow<&HybridCustody.OwnedAccount>(from: HybridCustody.OwnedAccountStoragePath)! + + // Get the CapabilityFactory.Manager Capability + let factory = getAccount(factoryAddress) + .getCapability<&CapabilityFactory.Manager{CapabilityFactory.Getter}>( + CapabilityFactory.PublicPath + ) + assert(factory.check(), message: "factory address is not configured properly") + + // Get the CapabilityFilter.Filter Capability + let filter = getAccount(filterAddress).getCapability<&{CapabilityFilter.Filter}>(CapabilityFilter.PublicPath) + assert(filter.check(), message: "capability filter is not configured properly") + + // Configure access for the delegatee parent account + self.ownedAccountRef.publishToParent(parentAddress: parent.address, factory: factory, filter: filter) + /** --- Setup parent's GamePieceNFT.Collection --- */ // // Set up GamePieceNFT.Collection if it doesn't exist @@ -149,9 +186,7 @@ transaction( // Check for public capabilities if !parent.getCapability< &GamePieceNFT.Collection{NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, GamePieceNFT.GamePieceNFTCollectionPublic, MetadataViews.ResolverCollection} - >( - GamePieceNFT.CollectionPublicPath - ).check() { + >(GamePieceNFT.CollectionPublicPath).check() { // create a public capability for the collection parent.unlink(GamePieceNFT.CollectionPublicPath) parent.link< @@ -165,9 +200,7 @@ transaction( if !parent.getCapability<&GamePieceNFT.Collection{NonFungibleToken.Provider}>(GamePieceNFT.ProviderPrivatePath).check() { // Link the Provider Capability in private storage parent.unlink(GamePieceNFT.ProviderPrivatePath) - parent.link< - &GamePieceNFT.Collection{NonFungibleToken.Provider} - >( + parent.link<&GamePieceNFT.Collection{NonFungibleToken.Provider}>( GamePieceNFT.ProviderPrivatePath, target: GamePieceNFT.CollectionStoragePath ) @@ -207,69 +240,62 @@ transaction( ) } - /** --- Set user up with LinkedAccounts.Collection --- */ + /* --- Configure HybridCustody Manager --- */ // - // Check that Collection is saved in storage - if parent.type(at: LinkedAccounts.CollectionStoragePath) == nil { - parent.save( - <-LinkedAccounts.createEmptyCollection(), - to: LinkedAccounts.CollectionStoragePath - ) - } - // Link the public Capability - if !parent.getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, MetadataViews.ResolverCollection} - >(LinkedAccounts.CollectionPublicPath).check() { - parent.unlink(LinkedAccounts.CollectionPublicPath) - parent.link<&LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, MetadataViews.ResolverCollection}>( - LinkedAccounts.CollectionPublicPath, - target: LinkedAccounts.CollectionStoragePath - ) - } - // Link the private Capability - if !parent.getCapability< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.Provider, MetadataViews.ResolverCollection} - >(LinkedAccounts.CollectionPrivatePath).check() { - parent.unlink(LinkedAccounts.CollectionPrivatePath) - parent.link< - &LinkedAccounts.Collection{LinkedAccounts.CollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Receiver, NonFungibleToken.Provider, MetadataViews.ResolverCollection} - >( - LinkedAccounts.CollectionPrivatePath, - target: LinkedAccounts.CollectionStoragePath - ) + // Configure HybridCustody.Manager if needed + if parent.borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) == nil { + let m <- HybridCustody.createManager(filter: filter) + parent.save(<- m, to: HybridCustody.ManagerStoragePath) } - // Assign linkedAccountsCollectionRef - self.linkedAccountsCollectionRef = parent.borrow<&LinkedAccounts.Collection>(from: LinkedAccounts.CollectionStoragePath) - ?? panic("Couldn't get a reference to the parent's LinkedAccounts.Collection") + + // Link Capabilities + parent.unlink(HybridCustody.ManagerPublicPath) + parent.unlink(HybridCustody.ManagerPrivatePath) + parent.link<&HybridCustody.Manager{HybridCustody.ManagerPrivate, HybridCustody.ManagerPublic}>( + HybridCustody.ManagerPrivatePath, + target: HybridCustody.ManagerStoragePath + ) + parent.link<&HybridCustody.Manager{HybridCustody.ManagerPublic}>( + HybridCustody.ManagerPublicPath, + target: HybridCustody.ManagerStoragePath + ) + + // Get a reference to the Manager and add the account + self.managerRef = parent.borrow<&HybridCustody.Manager>(from: HybridCustody.ManagerStoragePath) + ?? panic("manager no found") + // Claim the ChildAccount Capability published earlier in the transaction by the OwnedAccount + let inboxName = HybridCustody.getChildAccountIdentifier(parent.address) + self.childAccountCapability = parent + .inbox + .claim<&HybridCustody.ChildAccount{HybridCustody.AccountPrivate, HybridCustody.AccountPublic, MetadataViews.Resolver}>( + inboxName, + provider: child.address + ) ?? panic("child account cap not found") } execute { - // Build the MonsterComponent struct from given arguments - let componentValue = GamePieceNFT.MonsterComponent( - background: monsterBackground, - head: monsterHead, - torso: monsterTorso, - leg: monsterLeg - ) + // Borrow a reference to the MinterPublic + let minterPublicRef = getAccount(minterAddress).getCapability<&GamePieceNFT.Minter{GamePieceNFT.MinterPublic}>( + GamePieceNFT.MinterPublicPath + ).borrow() + ?? panic("Couldn't borrow reference to MinterPublic at ".concat(minterAddress.toString())) // Mint NFT to child account's Collection - self.minterRef.mintNFT( + minterPublicRef.mintNFT( recipient: self.gamePieceCollectionRef, - component: componentValue + component: GamePieceNFT.getRandomComponent() ) - // Construct the AccountInfo metadata struct - let info = LinkedAccountMetadataViews.AccountInfo( - name: childAccountName, - description: childAccountDescription, - thumbnail: MetadataViews.HTTPFile(url: clientIconURL), - externalURL: MetadataViews.ExternalURL(clientExternalURL) - ) - // Add the child account to the LinkedAccounts.Collection so its AuthAccountCapability can be maintained - self.linkedAccountsCollectionRef.addAsChildAccount( - linkedAccountCap: self.linkedAccountCap, - linkedAccountMetadata: self.info, - linkedAccountMetadataResolver: nil, - handlerPathSuffix: "RockPaperScissorsHandler" + // Construct the Display from the game contract info + let info = RockPaperScissorsGame.info + let display = MetadataViews.Display( + name: info.name, + description: info.description, + thumbnail: info.thumbnail ) + // Add the child account to the HybridCustody.Manager so its AuthAccountCapability can be maintained + self.managerRef.addAccount(cap: self.childAccountCapability) + self.managerRef.setChildAccountDisplay(address: self.childAddress, display) + // Finally, set the owner display as well + self.ownedAccountRef.setDisplay(display) } } \ No newline at end of file diff --git a/transactions/onboarding/self_custody_onboarding.cdc b/transactions/onboarding/self_custody_onboarding.cdc index 689a0ff..544de1f 100644 --- a/transactions/onboarding/self_custody_onboarding.cdc +++ b/transactions/onboarding/self_custody_onboarding.cdc @@ -1,9 +1,9 @@ -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" -import TicketToken from "../../contracts/TicketToken.cdc" +import "FungibleToken" +import "NonFungibleToken" +import "MetadataViews" +import "GamePieceNFT" +import "RockPaperScissorsGame" +import "TicketToken" /// This transaction sets up the following in a signer's account /// - GamePieceNFT.Collection @@ -34,9 +34,7 @@ transaction(minterAddress: Address) { // Check for public capabilities if !signer.getCapability< &GamePieceNFT.Collection{NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, GamePieceNFT.GamePieceNFTCollectionPublic, MetadataViews.ResolverCollection} - >( - GamePieceNFT.CollectionPublicPath - ).check() { + >(GamePieceNFT.CollectionPublicPath).check() { // create a public capability for the collection signer.unlink(GamePieceNFT.CollectionPublicPath) signer.link< @@ -50,24 +48,18 @@ transaction(minterAddress: Address) { if !signer.getCapability<&GamePieceNFT.Collection{NonFungibleToken.Provider}>(GamePieceNFT.ProviderPrivatePath).check() { // Link the Provider Capability in private storage signer.unlink(GamePieceNFT.ProviderPrivatePath) - signer.link< - &GamePieceNFT.Collection{NonFungibleToken.Provider} - >( + signer.link<&GamePieceNFT.Collection{NonFungibleToken.Provider}>( GamePieceNFT.ProviderPrivatePath, target: GamePieceNFT.CollectionStoragePath ) } // Grab Collection related references & Capabilities - self.collectionRef = signer.borrow< - &GamePieceNFT.Collection{NonFungibleToken.CollectionPublic} - >( + self.collectionRef = signer.borrow<&GamePieceNFT.Collection{NonFungibleToken.CollectionPublic}>( from: GamePieceNFT.CollectionStoragePath ) ?? panic("Could not borrow reference to signer's CollectionPublic!") // Borrow a reference to the MinterPublic - self.minterPublicRef = getAccount(minterAddress).getCapability< - &GamePieceNFT.Minter{GamePieceNFT.MinterPublic} - >( + self.minterPublicRef = getAccount(minterAddress).getCapability<&GamePieceNFT.Minter{GamePieceNFT.MinterPublic}>( GamePieceNFT.MinterPublicPath ).borrow() ?? panic("Couldn't borrow reference to MinterPublic at ".concat(minterAddress.toString())) @@ -83,20 +75,16 @@ transaction(minterAddress: Address) { } if !signer.getCapability<&{RockPaperScissorsGame.GamePlayerPublic}>(RockPaperScissorsGame.GamePlayerPublicPath).check() { // Link GamePlayerPublic Capability so player can be added to Matches - signer.link< - &{RockPaperScissorsGame.GamePlayerPublic} - >( + signer.link<&{RockPaperScissorsGame.GamePlayerPublic}>( RockPaperScissorsGame.GamePlayerPublicPath, target: RockPaperScissorsGame.GamePlayerStoragePath ) } - if !signer.getCapability< - &{RockPaperScissorsGame.GamePlayerID, RockPaperScissorsGame.DelegatedGamePlayer} - >(RockPaperScissorsGame.GamePlayerPrivatePath).check() { + if !signer.getCapability<&{RockPaperScissorsGame.GamePlayerID, RockPaperScissorsGame.DelegatedGamePlayer}>( + RockPaperScissorsGame.GamePlayerPrivatePath + ).check() { // Link DelegatedGamePlayer & GamePlayerID Capability - signer.link< - &{RockPaperScissorsGame.DelegatedGamePlayer,RockPaperScissorsGame.GamePlayerID} - >( + signer.link<&{RockPaperScissorsGame.DelegatedGamePlayer,RockPaperScissorsGame.GamePlayerID}>( RockPaperScissorsGame.GamePlayerPrivatePath, target: RockPaperScissorsGame.GamePlayerStoragePath ) @@ -109,21 +97,19 @@ transaction(minterAddress: Address) { // Create a new flowToken Vault and put it in storage signer.save(<-TicketToken.createEmptyVault(), to: TicketToken.VaultStoragePath) } - if !signer.getCapability< - &TicketToken.Vault{FungibleToken.Receiver, FungibleToken.Balance}> - (TicketToken.ReceiverPublicPath).check() { + if !signer.getCapability<&TicketToken.Vault{FungibleToken.Receiver, FungibleToken.Balance, MetadataViews.Resolver}>( + TicketToken.ReceiverPublicPath + ).check() { // Unlink any capability that may exist there signer.unlink(TicketToken.ReceiverPublicPath) // Create a public capability to the Vault that only exposes the deposit function // & balance field through the Receiver & Balance interface - signer.link<&TicketToken.Vault{FungibleToken.Receiver, FungibleToken.Balance}>( + signer.link<&TicketToken.Vault{FungibleToken.Receiver, FungibleToken.Balance, MetadataViews.Resolver}>( TicketToken.ReceiverPublicPath, target: TicketToken.VaultStoragePath ) } - if !signer.getCapability< - &TicketToken.Vault{FungibleToken.Provider} - >(TicketToken.ProviderPrivatePath).check() { + if !signer.getCapability<&TicketToken.Vault{FungibleToken.Provider}>(TicketToken.ProviderPrivatePath).check() { // Unlink any capability that may exist there signer.unlink(TicketToken.ProviderPrivatePath) // Create a private capability to the Vault that only exposes the withdraw function diff --git a/transactions/onboarding/walletless_onboarding.cdc b/transactions/onboarding/walletless_onboarding.cdc index ee0dade..6e0de26 100644 --- a/transactions/onboarding/walletless_onboarding.cdc +++ b/transactions/onboarding/walletless_onboarding.cdc @@ -1,16 +1,16 @@ -import LinkedAccounts from "../../contracts/LinkedAccounts.cdc" -import AccountCreator from "../../contracts/utility/AccountCreator.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" -import TicketToken from "../../contracts/TicketToken.cdc" +import "MetadataViews" +import "FungibleToken" +import "NonFungibleToken" -/// This transaction creates an account from the given public key, using the signer's AccountCreator.Creator with the -/// signer as the account's payer, additionally funding the new account with the specified amount of Flow from the -/// signer's account. The newly created account is then configured with resources & Capabilities necessary to play -/// RockPaperScissorsGame Matches. +import "AccountCreator" + +import "GamePieceNFT" +import "RockPaperScissorsGame" +import "TicketToken" + +/// This transaction creates a signer-funded account, adding the given public key. The new account is additionally funded +/// with specified amount of Flow from the signer's account. The newly created account is then configured with resources +/// & Capabilities necessary to play RockPaperScissorsGame Matches. /// transaction( pubKey: String, @@ -22,7 +22,10 @@ transaction( ) { prepare(signer: AuthAccount) { - /* --- Create a new account --- */ + /* --- Create a new account using AccountCreator --- */ + // + // **NOTE:** AccountCreator is used here to keep the demo app client-side & simple and should be replaced by an + // an an account creation + database or custodial service in a production environment. // // Ensure resource is saved where expected if signer.type(at: AccountCreator.CreatorStoragePath) == nil { @@ -67,28 +70,22 @@ transaction( ) // Link the Provider Capability in private storage - newAccount.link< - &GamePieceNFT.Collection{NonFungibleToken.Provider} - >( + newAccount.link<&GamePieceNFT.Collection{NonFungibleToken.Provider}>( GamePieceNFT.ProviderPrivatePath, target: GamePieceNFT.CollectionStoragePath ) // Grab Collection related references & Capabilities - let collectionRef = newAccount.borrow< - &GamePieceNFT.Collection{NonFungibleToken.CollectionPublic} - >( + let collectionRef = newAccount + .borrow<&GamePieceNFT.Collection{NonFungibleToken.CollectionPublic}>( from: GamePieceNFT.CollectionStoragePath )! /* --- Make sure new account has a GamePieceNFT.NFT to play with --- */ // // Borrow a reference to the Minter Capability in minter account's storage - let minterRef = signer.borrow< - &GamePieceNFT.Minter - >( - from: GamePieceNFT.MinterStoragePath - ) ?? panic("Couldn't borrow reference to Minter Capability in storage at ".concat(GamePieceNFT.MinterStoragePath.toString())) + let minterRef = signer.borrow<&GamePieceNFT.Minter>(from: GamePieceNFT.MinterStoragePath) + ?? panic("Couldn't borrow reference to Minter Capability in storage at ".concat(GamePieceNFT.MinterStoragePath.toString())) // Build the MonsterComponent struct from given arguments let componentValue = GamePieceNFT.MonsterComponent( background: monsterBackground, @@ -97,10 +94,7 @@ transaction( leg: monsterLeg ) // Mint the NFT to the new account's collection - minterRef.mintNFT( - recipient: collectionRef, - component: componentValue - ) + minterRef.mintNFT(recipient: collectionRef, component: componentValue) /* --- Set user up with GamePlayer in new account --- */ // @@ -109,17 +103,12 @@ transaction( // Save it newAccount.save(<-gamePlayer, to: RockPaperScissorsGame.GamePlayerStoragePath) // Link GamePlayerPublic Capability so player can be added to Matches - newAccount.link<&{ - RockPaperScissorsGame.GamePlayerPublic - }>( + newAccount.link<&{RockPaperScissorsGame.GamePlayerPublic}>( RockPaperScissorsGame.GamePlayerPublicPath, target: RockPaperScissorsGame.GamePlayerStoragePath ) // Link GamePlayerID Capability - newAccount.link<&{ - RockPaperScissorsGame.DelegatedGamePlayer, - RockPaperScissorsGame.GamePlayerID - }>( + newAccount.link<&{RockPaperScissorsGame.DelegatedGamePlayer, RockPaperScissorsGame.GamePlayerID}>( RockPaperScissorsGame.GamePlayerPrivatePath, target: RockPaperScissorsGame.GamePlayerStoragePath ) diff --git a/transactions/rock_paper_scissors_game/game_player/escrow_nft_to_existing_match.cdc b/transactions/rock_paper_scissors_game/game_player/escrow_nft_to_existing_match.cdc index a0b9223..af02c32 100644 --- a/transactions/rock_paper_scissors_game/game_player/escrow_nft_to_existing_match.cdc +++ b/transactions/rock_paper_scissors_game/game_player/escrow_nft_to_existing_match.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../../contracts/GamePieceNFT.cdc" -import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" +import "NonFungibleToken" +import "GamePieceNFT" +import "RockPaperScissorsGame" /// Transaction escrows the specified GamePieceNFT to the specified /// Match.id for which the signer has a MatchLobbyActions in their GamePlayer @@ -9,34 +9,21 @@ transaction(matchID: UInt64, escrowNFTID: UInt64) { prepare(acct: AuthAccount) { // Get the GamePlayer reference from the signing account's storage - let gamePlayerRef = acct - .borrow<&RockPaperScissorsGame.GamePlayer>( + let gamePlayerRef = acct.borrow<&RockPaperScissorsGame.GamePlayer>( from: RockPaperScissorsGame.GamePlayerStoragePath ) ?? panic("Could not borrow GamePlayer reference!") // Get the account's Receiver Capability - let receiverCap = acct.getCapability< - &{NonFungibleToken.Receiver} - >( - GamePieceNFT.CollectionPublicPath - ) + let receiverCap = acct.getCapability<&{NonFungibleToken.Receiver}>(GamePieceNFT.CollectionPublicPath) // Get a reference to the account's Provider - let providerRef = acct.borrow< - &{NonFungibleToken.Provider} - >( - from: GamePieceNFT.CollectionStoragePath - ) ?? panic("Could not borrow reference to account's Provider") + let providerRef = acct.borrow<&{NonFungibleToken.Provider}>(from: GamePieceNFT.CollectionStoragePath) + ?? panic("Could not borrow reference to account's Provider") // Withdraw the desired NFT - let nft <-providerRef.withdraw(withdrawID: escrowNFTID) as! @GamePieceNFT.NFT + let nft <- providerRef.withdraw(withdrawID: escrowNFTID) as! @GamePieceNFT.NFT // Escrow NFT - gamePlayerRef - .depositNFTToMatchEscrow( - nft: <-nft, - matchID: matchID, - receiverCap: receiverCap - ) + gamePlayerRef.depositNFTToMatchEscrow(nft: <-nft, matchID: matchID, receiverCap: receiverCap) } } \ No newline at end of file diff --git a/transactions/rock_paper_scissors_game/game_player/resolve_match.cdc b/transactions/rock_paper_scissors_game/game_player/resolve_match.cdc index 4773097..1f02f4c 100644 --- a/transactions/rock_paper_scissors_game/game_player/resolve_match.cdc +++ b/transactions/rock_paper_scissors_game/game_player/resolve_match.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Transaction to resolve a Match & return escrowed NFTs to players /// diff --git a/transactions/rock_paper_scissors_game/game_player/resolve_match_and_return_nfts.cdc b/transactions/rock_paper_scissors_game/game_player/resolve_match_and_return_nfts.cdc index a6a55b6..c5bc3cf 100644 --- a/transactions/rock_paper_scissors_game/game_player/resolve_match_and_return_nfts.cdc +++ b/transactions/rock_paper_scissors_game/game_player/resolve_match_and_return_nfts.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Transaction to resolve a Match & return escrowed NFTs to players /// diff --git a/transactions/rock_paper_scissors_game/game_player/retrieve_unclaimed_nft.cdc b/transactions/rock_paper_scissors_game/game_player/retrieve_unclaimed_nft.cdc index 5b85c5c..5e33b9f 100644 --- a/transactions/rock_paper_scissors_game/game_player/retrieve_unclaimed_nft.cdc +++ b/transactions/rock_paper_scissors_game/game_player/retrieve_unclaimed_nft.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../../contracts/utility/NonFungibleToken.cdc" -import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" -import GamePieceNFT from "../../../contracts/GamePieceNFT.cdc" +import "NonFungibleToken" +import "RockPaperScissorsGame" +import "GamePieceNFT" /// ReturnsNFTs from escrow to their owners' Receiver which /// is stored in the Match resource itself diff --git a/transactions/rock_paper_scissors_game/game_player/return_nfts_from_escrow.cdc b/transactions/rock_paper_scissors_game/game_player/return_nfts_from_escrow.cdc index fc3230a..d075f46 100644 --- a/transactions/rock_paper_scissors_game/game_player/return_nfts_from_escrow.cdc +++ b/transactions/rock_paper_scissors_game/game_player/return_nfts_from_escrow.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// ReturnsNFTs from escrow to their owners' Receiver which /// is stored in the Match resource itself diff --git a/transactions/rock_paper_scissors_game/game_player/setup_game_player.cdc b/transactions/rock_paper_scissors_game/game_player/setup_game_player.cdc index bf1729f..1dc4d5d 100644 --- a/transactions/rock_paper_scissors_game/game_player/setup_game_player.cdc +++ b/transactions/rock_paper_scissors_game/game_player/setup_game_player.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Transaction that sets up GamePlayer resource in signing account /// and exposes GamePlayerPublic capability so matches can be added @@ -23,7 +23,9 @@ transaction { ) } // Link GamePlayerID & DelegatedGamePlayer Capability - if !signer.getCapability<&{RockPaperScissorsGame.GamePlayerID}>(RockPaperScissorsGame.GamePlayerPrivatePath).check() { + if !signer.getCapability<&{RockPaperScissorsGame.DelegatedGamePlayer, RockPaperScissorsGame.GamePlayerID}>( + RockPaperScissorsGame.GamePlayerPrivatePath + ).check() { signer.unlink(RockPaperScissorsGame.GamePlayerPrivatePath) signer.link<&{ RockPaperScissorsGame.DelegatedGamePlayer, diff --git a/transactions/rock_paper_scissors_game/game_player/setup_new_multiplayer_match.cdc b/transactions/rock_paper_scissors_game/game_player/setup_new_multiplayer_match.cdc index 8612a17..03c4ddc 100644 --- a/transactions/rock_paper_scissors_game/game_player/setup_new_multiplayer_match.cdc +++ b/transactions/rock_paper_scissors_game/game_player/setup_new_multiplayer_match.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../../contracts/GamePieceNFT.cdc" -import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" +import "NonFungibleToken" +import "GamePieceNFT" +import "RockPaperScissorsGame" /// Transaction that creates a new Match in multiplayer mode, escrows the /// specified NFT from the signer's Collection, and adds the MatchLobbyActions @@ -9,44 +9,35 @@ import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" transaction(submittingNFTID: UInt64, playerTwoAddr: Address, matchTimeLimitInMinutes: UInt) { let gamePlayerRef: &RockPaperScissorsGame.GamePlayer - let gamePlayerTwoPublicRef: &AnyResource{RockPaperScissorsGame.GamePlayerPublic} + let gamePlayerTwoPublicRef: &{RockPaperScissorsGame.GamePlayerPublic} let newMatchID: UInt64 prepare(acct: AuthAccount) { // Get a reference to the GamePlayer resource in the signing account's storage - self.gamePlayerRef = acct - .borrow<&RockPaperScissorsGame.GamePlayer>( + self.gamePlayerRef = acct.borrow<&RockPaperScissorsGame.GamePlayer>( from: RockPaperScissorsGame.GamePlayerStoragePath ) ?? panic("Could not borrow GamePlayer reference!") // Get the second player's account let playerTwoAccount = getAccount(playerTwoAddr) // Get the second player's GamePlayerPublic reference - self.gamePlayerTwoPublicRef = playerTwoAccount.getCapability< - &AnyResource{RockPaperScissorsGame.GamePlayerPublic} - >( + self.gamePlayerTwoPublicRef = playerTwoAccount.getCapability<&{RockPaperScissorsGame.GamePlayerPublic}>( RockPaperScissorsGame.GamePlayerPublicPath ).borrow() ?? panic("GamePlayerPublic not accessible at address ".concat(playerTwoAddr.toString())) - let receiverCap = acct.getCapability< - &GamePieceNFT.Collection{NonFungibleToken.Receiver} - >( + let receiverCap = acct.getCapability<&GamePieceNFT.Collection{NonFungibleToken.Receiver}>( GamePieceNFT.CollectionPublicPath ) // Get a reference to the account's Provider - let providerRef = acct.borrow< - &{NonFungibleToken.Provider} - >( - from: GamePieceNFT.CollectionStoragePath - ) ?? panic("Could not borrow reference to account's Provider") + let providerRef = acct.borrow<&{NonFungibleToken.Provider}>(from: GamePieceNFT.CollectionStoragePath) + ?? panic("Could not borrow reference to account's Provider") // Withdraw the desired NFT let submittingNFT <-providerRef.withdraw(withdrawID: submittingNFTID) as! @GamePieceNFT.NFT // Create a match with the given timeLimit in minutes - self.newMatchID = self.gamePlayerRef - .createMatch( + self.newMatchID = self.gamePlayerRef.createMatch( multiPlayer: true, matchTimeLimit: UFix64(matchTimeLimitInMinutes) * 60000.0, nft: <-submittingNFT, @@ -57,11 +48,7 @@ transaction(submittingNFTID: UInt64, playerTwoAddr: Address, matchTimeLimitInMin execute { // Then add the MatchPlayerActions for the match to each player's GamePlayer resource // via the GamePlayerPublic reference - self.gamePlayerRef - .addPlayerToMatch( - matchID: self.newMatchID, - gamePlayerRef: self.gamePlayerTwoPublicRef - ) + self.gamePlayerRef.addPlayerToMatch(matchID: self.newMatchID, gamePlayerRef: self.gamePlayerTwoPublicRef) } } \ No newline at end of file diff --git a/transactions/rock_paper_scissors_game/game_player/setup_new_singleplayer_match.cdc b/transactions/rock_paper_scissors_game/game_player/setup_new_singleplayer_match.cdc index 134c295..99255fa 100644 --- a/transactions/rock_paper_scissors_game/game_player/setup_new_singleplayer_match.cdc +++ b/transactions/rock_paper_scissors_game/game_player/setup_new_singleplayer_match.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../../contracts/GamePieceNFT.cdc" -import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" +import "NonFungibleToken" +import "GamePieceNFT" +import "RockPaperScissorsGame" /// Transaction that creates a new Match in single player mode and /// escrows the specified NFT from the signing account's Collection diff --git a/transactions/rock_paper_scissors_game/game_player/sign_up_for_match.cdc b/transactions/rock_paper_scissors_game/game_player/sign_up_for_match.cdc index df26a28..511ff6e 100644 --- a/transactions/rock_paper_scissors_game/game_player/sign_up_for_match.cdc +++ b/transactions/rock_paper_scissors_game/game_player/sign_up_for_match.cdc @@ -1,5 +1,5 @@ -import NonFungibleToken from "../../../contracts/utility/NonFungibleToken.cdc" -import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" +import "NonFungibleToken" +import "RockPaperScissorsGame" /// The signer signs up for the specified Match.id, setting up a GamePlayer resource /// if need be in the process. This gives the signer the ability to engage with an diff --git a/transactions/rock_paper_scissors_game/game_player/sign_up_for_match_and_escrow_nft.cdc b/transactions/rock_paper_scissors_game/game_player/sign_up_for_match_and_escrow_nft.cdc index a69fa3b..ecd4995 100644 --- a/transactions/rock_paper_scissors_game/game_player/sign_up_for_match_and_escrow_nft.cdc +++ b/transactions/rock_paper_scissors_game/game_player/sign_up_for_match_and_escrow_nft.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../../contracts/GamePieceNFT.cdc" -import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" +import "NonFungibleToken" +import "GamePieceNFT" +import "RockPaperScissorsGame" /// The signer signs up for the specified Match.id, setting up a GamePlayer resource /// if need be in the process and escrowing the specified GamePieceNFT NFT diff --git a/transactions/rock_paper_scissors_game/game_player/submit_both_singleplayer_moves.cdc b/transactions/rock_paper_scissors_game/game_player/submit_both_singleplayer_moves.cdc index adf4088..7c3e5e4 100644 --- a/transactions/rock_paper_scissors_game/game_player/submit_both_singleplayer_moves.cdc +++ b/transactions/rock_paper_scissors_game/game_player/submit_both_singleplayer_moves.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Transaction for a singleplayer match to submit player's move /// and consecutively call for the automated player's move to be diff --git a/transactions/rock_paper_scissors_game/game_player/submit_move.cdc b/transactions/rock_paper_scissors_game/game_player/submit_move.cdc index aaf32a5..e0843c8 100644 --- a/transactions/rock_paper_scissors_game/game_player/submit_move.cdc +++ b/transactions/rock_paper_scissors_game/game_player/submit_move.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Transaction to submit player's move /// int moves: 0 rock, 1 paper, 2 scissors diff --git a/transactions/rock_paper_scissors_game/submit_automated_player_move.cdc b/transactions/rock_paper_scissors_game/submit_automated_player_move.cdc index 9403e77..27c18a4 100644 --- a/transactions/rock_paper_scissors_game/submit_automated_player_move.cdc +++ b/transactions/rock_paper_scissors_game/submit_automated_player_move.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" transaction(matchID: UInt64) { execute { diff --git a/transactions/test/access_game_player_id_or_panic.cdc b/transactions/test/access_game_player_id_or_panic.cdc index c0f62ab..1a79524 100644 --- a/transactions/test/access_game_player_id_or_panic.cdc +++ b/transactions/test/access_game_player_id_or_panic.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Reverts is the GamePlayerID Capability is not configured on the signer's /// account at the expected PrivatePath diff --git a/transactions/test/access_provider_or_panic.cdc b/transactions/test/access_provider_or_panic.cdc index 49bdd6a..4fdda8d 100644 --- a/transactions/test/access_provider_or_panic.cdc +++ b/transactions/test/access_provider_or_panic.cdc @@ -1,5 +1,5 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" +import "NonFungibleToken" +import "GamePieceNFT" /// Reverts is the Provider Capability is not configured on the signer's /// account at the expected PrivatePath diff --git a/transactions/test/cheat_multiplayer_submission.cdc b/transactions/test/cheat_multiplayer_submission.cdc index adf5f78..56e091a 100644 --- a/transactions/test/cheat_multiplayer_submission.cdc +++ b/transactions/test/cheat_multiplayer_submission.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Transaction a player might use to cheat a match /// int moves: 0 rock, 1 paper, 2 scissors @@ -11,21 +11,17 @@ transaction(matchID: UInt64, move: UInt8) { prepare(acct: AuthAccount) { // Get the GamePlayer reference from the signing account's storage - self.gamePlayerRef = acct - .borrow<&RockPaperScissorsGame.GamePlayer>( + self.gamePlayerRef = acct.borrow<&RockPaperScissorsGame.GamePlayer>( from: RockPaperScissorsGame.GamePlayerStoragePath ) ?? panic("Could not borrow GamePlayer reference!") // Construct a legible move from the raw input value - self.moveAsEnum = RockPaperScissorsGame - .Moves( - rawValue: move - ) ?? panic("Given move does not map to a legal RockPaperScissorsGame.Moves value!") + self.moveAsEnum = RockPaperScissorsGame.Moves(rawValue: move) + ?? panic("Given move does not map to a legal RockPaperScissorsGame.Moves value!") // Get a reference to the relevant MatchPlayerActions Capability let matchPlayerActionsCap: Capability<&{RockPaperScissorsGame.MatchPlayerActions}> = self.gamePlayerRef .getMatchPlayerCaps()[matchID] ?? panic("Could not retrieve MatchPlayer capability for given matchID!") - self.matchPlayerActionsRef = matchPlayerActionsCap - .borrow() + self.matchPlayerActionsRef = matchPlayerActionsCap.borrow() ?? panic("Could not borrow Reference to MatchPlayerActions Capability!") } @@ -39,10 +35,9 @@ transaction(matchID: UInt64, move: UInt8) { } post { - RockPaperScissorsGame - .determineRockPaperScissorsWinner( - moves: RockPaperScissorsGame.getMatchMoveHistory(id: matchID)! - ) == self.gamePlayerRef.id: + RockPaperScissorsGame.determineRockPaperScissorsWinner( + moves: RockPaperScissorsGame.getMatchMoveHistory(id: matchID)! + ) == self.gamePlayerRef.id: "Signing game player didn't win!" } } diff --git a/transactions/test/cheat_resolution.cdc b/transactions/test/cheat_resolution.cdc index 2d61919..276580d 100644 --- a/transactions/test/cheat_resolution.cdc +++ b/transactions/test/cheat_resolution.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Transaction a player might use to cheat a match on resolution /// by conditioning match resolution on the signer winning @@ -10,16 +10,14 @@ transaction(matchID: UInt64) { prepare(acct: AuthAccount) { // Get the GamePlayer reference from the signing account's storage - self.gamePlayerRef = acct - .borrow<&RockPaperScissorsGame.GamePlayer>( + self.gamePlayerRef = acct.borrow<&RockPaperScissorsGame.GamePlayer>( from: RockPaperScissorsGame.GamePlayerStoragePath ) ?? panic("Could not borrow GamePlayer reference!") // Get a reference to the relevant MatchPlayerActions Capability let matchPlayerActionsCap: Capability<&{RockPaperScissorsGame.MatchPlayerActions}> = self.gamePlayerRef .getMatchPlayerCaps()[matchID] ?? panic("Could not retrieve MatchPlayer capability for given matchID!") - self.matchPlayerActionsRef = matchPlayerActionsCap - .borrow() + self.matchPlayerActionsRef = matchPlayerActionsCap.borrow() ?? panic("Could not borrow Reference to MatchPlayerActions Capability!") } diff --git a/transactions/test/cheat_singleplayer_submission.cdc b/transactions/test/cheat_singleplayer_submission.cdc index 749bdae..94557c5 100644 --- a/transactions/test/cheat_singleplayer_submission.cdc +++ b/transactions/test/cheat_singleplayer_submission.cdc @@ -1,4 +1,4 @@ -import RockPaperScissorsGame from "../../contracts/RockPaperScissorsGame.cdc" +import "RockPaperScissorsGame" /// Transaction a player might use to cheat a match /// int moves: 0 rock, 1 paper, 2 scissors diff --git a/transactions/test/link_collection.cdc b/transactions/test/link_collection.cdc index 4de375c..a49a121 100644 --- a/transactions/test/link_collection.cdc +++ b/transactions/test/link_collection.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" +import "NonFungibleToken" +import "MetadataViews" +import "GamePieceNFT" /// Transaction to relink GamePieceNFT collection in the signer's account /// diff --git a/transactions/test/unlink_receiver.cdc b/transactions/test/unlink_receiver.cdc index 2aa4c0e..828bb38 100644 --- a/transactions/test/unlink_receiver.cdc +++ b/transactions/test/unlink_receiver.cdc @@ -1,6 +1,6 @@ -import NonFungibleToken from "../../contracts/utility/NonFungibleToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" -import GamePieceNFT from "../../contracts/GamePieceNFT.cdc" +import "NonFungibleToken" +import "MetadataViews" +import "GamePieceNFT" /// Used to test RockPaperScissors.Match.returnPlayerNFTs() behavior /// Transaction to unlink NonFungibleToken.Receiver from diff --git a/transactions/ticket_token/mint_tokens.cdc b/transactions/ticket_token/mint_tokens.cdc index b1d2fd8..52189e4 100644 --- a/transactions/ticket_token/mint_tokens.cdc +++ b/transactions/ticket_token/mint_tokens.cdc @@ -1,5 +1,5 @@ -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" -import TicketToken from "../../contracts/TicketToken.cdc" +import "FungibleToken" +import "TicketToken" /// Mints the specified amount of TicketTokens to the given recipient's address, /// assuming the recipient has a TicketToken.Vault configured in their account diff --git a/transactions/ticket_token/setup_account.cdc b/transactions/ticket_token/setup_account.cdc index d0629a2..b92eb9f 100644 --- a/transactions/ticket_token/setup_account.cdc +++ b/transactions/ticket_token/setup_account.cdc @@ -1,6 +1,7 @@ -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" -import TicketToken from "../../contracts/TicketToken.cdc" -import MetadataViews from "../../contracts/utility/MetadataViews.cdc" +import "FungibleToken" +import "MetadataViews" + +import "TicketToken" /// This transaction creates a TicketToken.Vault, saves it in signer's storage /// and links public & private capabilities diff --git a/transactions/ticket_token/transfer_tokens.cdc b/transactions/ticket_token/transfer_tokens.cdc index bf4255c..410e05e 100644 --- a/transactions/ticket_token/transfer_tokens.cdc +++ b/transactions/ticket_token/transfer_tokens.cdc @@ -1,5 +1,5 @@ -import FungibleToken from "../../contracts/utility/FungibleToken.cdc" -import TicketToken from "../../contracts/TicketToken.cdc" +import "FungibleToken" +import "TicketToken" /// This transaction is a template for a transaction that /// could be used by anyone to send tokens to another account