From 80854b2322bd8a321d3e8f0c838f1b92e1e7a34e Mon Sep 17 00:00:00 2001 From: Stan Bondi Date: Thu, 16 Dec 2021 09:23:50 +0200 Subject: [PATCH 01/15] fix: return correct index for include_pruned_utxos = false (#3663) --- .../src/base_node/sync/rpc/sync_utxos_task.rs | 36 +++++++---- .../core/src/base_node/sync/rpc/tests.rs | 59 ++++++++++++++++++- 2 files changed, 82 insertions(+), 13 deletions(-) diff --git a/base_layer/core/src/base_node/sync/rpc/sync_utxos_task.rs b/base_layer/core/src/base_node/sync/rpc/sync_utxos_task.rs index 3ee57ab6ba..bf6c81c5d8 100644 --- a/base_layer/core/src/base_node/sync/rpc/sync_utxos_task.rs +++ b/base_layer/core/src/base_node/sync/rpc/sync_utxos_task.rs @@ -56,7 +56,14 @@ where B: BlockchainBackend + 'static .db .fetch_header_containing_utxo_mmr(request.start + 1) .await - .map_err(RpcStatus::log_internal_error(LOG_TARGET))?; + .map_err(|err| { + error!(target: LOG_TARGET, "{}", err); + if err.is_value_not_found() { + RpcStatus::not_found("start index not found") + } else { + RpcStatus::general("DB failure when fetching header containing start index") + } + })?; let end_header = self .db @@ -181,20 +188,25 @@ where B: BlockchainBackend + 'static deleted_diff.cardinality(), ); let utxos = utxos - .into_iter() - .enumerate() - .skip(skip_outputs as usize) + .into_iter() + .skip(skip_outputs as usize) + // Only enumerate after skip, because `start` already has the offset in it so `i` can begin from 0 + .enumerate() + .filter_map(|(i, utxo)| { // Only include pruned UTXOs if include_pruned_utxos is true - .filter(|(_, utxo)| include_pruned_utxos || !utxo.is_pruned()) - .map(|(i, utxo)| { - SyncUtxosResponse { + // We use filter_map because we still want the pruned utxos to count towards the index + if include_pruned_utxos || !utxo.is_pruned() { + Some(SyncUtxosResponse { utxo_or_deleted: Some(proto::base_node::sync_utxos_response::UtxoOrDeleted::Utxo( - SyncUtxo::from(utxo) + SyncUtxo::from(utxo), )), - mmr_index: start + i as u64, - } - }) - .map(Ok); + mmr_index: start + i as u64, + }) + } else { + None + } + }) + .map(Ok); // Ensure task stops if the peer prematurely stops their RPC session if utils::mpsc::send_all(tx, utxos).await.is_err() { diff --git a/base_layer/core/src/base_node/sync/rpc/tests.rs b/base_layer/core/src/base_node/sync/rpc/tests.rs index b994be85fc..6f343aa4f1 100644 --- a/base_layer/core/src/base_node/sync/rpc/tests.rs +++ b/base_layer/core/src/base_node/sync/rpc/tests.rs @@ -29,7 +29,7 @@ use super::BaseNodeSyncRpcService; use crate::{ base_node::BaseNodeSyncService, chain_storage::BlockchainDatabase, - proto::base_node::SyncBlocksRequest, + proto::base_node::{SyncBlocksRequest, SyncUtxosRequest}, test_helpers::{ blockchain::{create_main_chain, create_new_blockchain, TempDatabase}, create_peer_manager, @@ -108,3 +108,60 @@ mod sync_blocks { }); } } + +mod sync_utxos { + use super::*; + + #[tokio::test] + async fn it_returns_not_found_if_unknown_hash() { + let (service, _, rpc_request_mock, _tmp) = setup(); + let msg = SyncUtxosRequest { + start: 0, + end_header_hash: vec![0; 32], + include_pruned_utxos: true, + include_deleted_bitmaps: false, + }; + let req = rpc_request_mock.request_with_context(Default::default(), msg); + let err = service.sync_utxos(req).await.unwrap_err(); + unpack_enum!(RpcStatusCode::NotFound = err.as_status_code()); + } + + #[tokio::test] + async fn it_returns_not_found_if_index_too_large() { + let (service, db, rpc_request_mock, _tmp) = setup(); + let (_, chain) = create_main_chain(&db, block_specs!(["A->GB"])); + let gb = chain.get("GB").unwrap(); + let msg = SyncUtxosRequest { + start: 100000000, + end_header_hash: gb.hash().clone(), + include_pruned_utxos: true, + include_deleted_bitmaps: false, + }; + let req = rpc_request_mock.request_with_context(Default::default(), msg); + let err = service.sync_utxos(req).await.unwrap_err(); + unpack_enum!(RpcStatusCode::NotFound = err.as_status_code()); + } + + #[tokio::test] + async fn it_sends_an_offset_response() { + let (service, db, rpc_request_mock, _tmp) = setup(); + + let (_, chain) = create_main_chain(&db, block_specs!(["A->GB"], ["B->A"])); + + let block = chain.get("B").unwrap(); + let msg = SyncUtxosRequest { + start: 3500, + end_header_hash: block.hash().clone(), + include_pruned_utxos: true, + include_deleted_bitmaps: false, + }; + let req = rpc_request_mock.request_with_context(Default::default(), msg); + let mut streaming = service.sync_utxos(req).await.unwrap().into_inner(); + let utxo_indexes = convert_mpsc_to_stream(&mut streaming) + .map(|utxo| utxo.unwrap().mmr_index) + .collect::>() + .await; + + assert!(utxo_indexes.iter().all(|index| (3500..=4002).contains(index))); + } +} From 2c677b8ec0b27618335b7488d6a0e29f37478adc Mon Sep 17 00:00:00 2001 From: David Main <51991544+StriderDM@users.noreply.github.com> Date: Fri, 17 Dec 2021 16:15:06 +0200 Subject: [PATCH 02/15] feat: custom_base_node in config (#3651) Description --- This PR allows the custom_base_node_peer to be set via the config, env, or via the command line Motivation and Context --- Usability How Has This Been Tested? --- cargo test --all nvm use 12.22.6 && node_modules/.bin/cucumber-js --profile "ci" --tags "not @long-running and not @broken" manually --- .../tari_app_utilities/src/initialization.rs | 4 ++++ .../tari_console_wallet/src/automation/commands.rs | 2 +- applications/tari_console_wallet/src/init/mod.rs | 13 ++++++++++++- .../tari_console_wallet/src/ui/state/app_state.rs | 1 - .../tari_console_wallet/src/wallet_modes.rs | 9 ++++----- common/src/configuration/bootstrap.rs | 3 +++ common/src/configuration/global.rs | 9 +++++++++ 7 files changed, 33 insertions(+), 8 deletions(-) diff --git a/applications/tari_app_utilities/src/initialization.rs b/applications/tari_app_utilities/src/initialization.rs index b765986890..10b2792b89 100644 --- a/applications/tari_app_utilities/src/initialization.rs +++ b/applications/tari_app_utilities/src/initialization.rs @@ -75,6 +75,10 @@ pub fn init_configuration( global_config.grpc_console_wallet_address = grpc_address; } + if let Some(str) = bootstrap.custom_base_node.clone() { + global_config.wallet_custom_base_node = Some(str); + } + check_file_paths(&mut global_config, &bootstrap); Ok((bootstrap, global_config, cfg)) diff --git a/applications/tari_console_wallet/src/automation/commands.rs b/applications/tari_console_wallet/src/automation/commands.rs index fc62ea47b4..626a366857 100644 --- a/applications/tari_console_wallet/src/automation/commands.rs +++ b/applications/tari_console_wallet/src/automation/commands.rs @@ -289,6 +289,7 @@ async fn wait_for_comms(connectivity_requester: &ConnectivityRequester) -> Resul } } } + async fn set_base_node_peer( mut wallet: WalletSqlite, args: &[ParsedArgument], @@ -308,7 +309,6 @@ async fn set_base_node_peer( wallet .set_base_node_peer(public_key.clone(), net_address.to_string()) .await?; - Ok((public_key, net_address)) } diff --git a/applications/tari_console_wallet/src/init/mod.rs b/applications/tari_console_wallet/src/init/mod.rs index 4588cc1bc2..e57983b231 100644 --- a/applications/tari_console_wallet/src/init/mod.rs +++ b/applications/tari_console_wallet/src/init/mod.rs @@ -153,7 +153,18 @@ pub async fn get_base_node_peer_config( wallet: &mut WalletSqlite, ) -> Result { // custom - let base_node_custom = get_custom_base_node_peer_from_db(wallet).await; + let mut base_node_custom = get_custom_base_node_peer_from_db(wallet).await; + + if let Some(custom) = config.wallet_custom_base_node.clone() { + match SeedPeer::from_str(&custom) { + Ok(node) => { + base_node_custom = Some(Peer::from(node)); + }, + Err(err) => { + return Err(ExitCodes::ConfigError(format!("Malformed custom base node: {}", err))); + }, + } + } // config let base_node_peers = config diff --git a/applications/tari_console_wallet/src/ui/state/app_state.rs b/applications/tari_console_wallet/src/ui/state/app_state.rs index e2e348a7ab..64e643f399 100644 --- a/applications/tari_console_wallet/src/ui/state/app_state.rs +++ b/applications/tari_console_wallet/src/ui/state/app_state.rs @@ -804,7 +804,6 @@ impl AppStateInner { peer.addresses.first().ok_or(UiError::NoAddress)?.to_string(), ) .await?; - info!( target: LOG_TARGET, "Setting custom base node peer for wallet: {}::{}", diff --git a/applications/tari_console_wallet/src/wallet_modes.rs b/applications/tari_console_wallet/src/wallet_modes.rs index d04fd6e6f9..e1b879ffad 100644 --- a/applications/tari_console_wallet/src/wallet_modes.rs +++ b/applications/tari_console_wallet/src/wallet_modes.rs @@ -224,7 +224,7 @@ fn wallet_or_exit(config: WalletModeConfig, wallet: WalletSqlite) -> Result<(), pub fn tui_mode(config: WalletModeConfig, mut wallet: WalletSqlite) -> Result<(), ExitCodes> { let WalletModeConfig { - mut base_node_config, + base_node_config, mut base_node_selected, global_config, handle, @@ -236,10 +236,9 @@ pub fn tui_mode(config: WalletModeConfig, mut wallet: WalletSqlite) -> Result<() let notifier = Notifier::new(notify_script, handle.clone(), wallet.clone()); - // update the selected/custom base node since it may have been changed by script/command mode - let base_node_custom = handle.block_on(get_custom_base_node_peer_from_db(&mut wallet)); - base_node_config.base_node_custom = base_node_custom.clone(); - if let Some(peer) = base_node_custom { + if let Some(peer) = base_node_config.base_node_custom.clone() { + base_node_selected = peer; + } else if let Some(peer) = handle.block_on(get_custom_base_node_peer_from_db(&mut wallet)) { base_node_selected = peer; } else if let Some(peer) = handle.block_on(wallet.get_base_node_peer()) { base_node_selected = peer; diff --git a/common/src/configuration/bootstrap.rs b/common/src/configuration/bootstrap.rs index d4952953e3..0fd43c02b3 100644 --- a/common/src/configuration/bootstrap.rs +++ b/common/src/configuration/bootstrap.rs @@ -164,6 +164,8 @@ pub struct ConfigBootstrap { /// Metrics push endpoint (prometheus push) #[structopt(long)] pub metrics_push_endpoint: Option, + #[structopt(long, alias = "custom_base_node")] + pub custom_base_node: Option, } fn normalize_path(path: PathBuf) -> PathBuf { @@ -203,6 +205,7 @@ impl Default for ConfigBootstrap { wallet_grpc_address: None, metrics_server_bind_addr: None, metrics_push_endpoint: None, + custom_base_node: None, } } } diff --git a/common/src/configuration/global.rs b/common/src/configuration/global.rs index 220e568f45..68ed002223 100644 --- a/common/src/configuration/global.rs +++ b/common/src/configuration/global.rs @@ -117,6 +117,7 @@ pub struct GlobalConfig { pub wallet_command_send_wait_stage: String, pub wallet_command_send_wait_timeout: u64, pub wallet_base_node_service_peers: Vec, + pub wallet_custom_base_node: Option, pub wallet_base_node_service_refresh_interval: u64, pub wallet_base_node_service_request_max_age: u64, pub wallet_balance_enquiry_cooldown_period: u64, @@ -526,6 +527,13 @@ fn convert_node_config( }, }; + let key = config_string("wallet", net_str, "custom_base_node"); + let custom_peer: Option = match cfg.get_int(&key) { + Ok(peer) => Some(peer.to_string()), + Err(ConfigError::NotFound(_)) => None, + Err(e) => return Err(ConfigurationError::new(&key, &e.to_string())), + }; + let key = "wallet.password"; let console_wallet_password = optional(cfg.get_str(key))?; @@ -795,6 +803,7 @@ fn convert_node_config( wallet_command_send_wait_stage, wallet_command_send_wait_timeout, wallet_base_node_service_peers, + wallet_custom_base_node: custom_peer, wallet_base_node_service_refresh_interval, wallet_base_node_service_request_max_age, wallet_balance_enquiry_cooldown_period, From d006b6701be3216d5c4dcb67e82520305383e831 Mon Sep 17 00:00:00 2001 From: SW van Heerden Date: Fri, 17 Dec 2021 16:27:56 +0200 Subject: [PATCH 03/15] feat: add GRPC call to search for utxo via commitment hex (#3666) Added a GRPC call to search for the block a UTXO was mined in via the commitment. UI command already exists, this adds a GPRC mapping to the same command. This fixes a UI bug that when a commitment is not found, says the the node is pruned and that the utxo was found. --- .../tari_app_grpc/proto/base_node.proto | 7 +++ .../tari_base_node/src/command_handler.rs | 5 +- .../src/grpc/base_node_grpc_server.rs | 59 ++++++++++++++++++- .../comms_interface/inbound_handlers.rs | 19 +++--- 4 files changed, 76 insertions(+), 14 deletions(-) diff --git a/applications/tari_app_grpc/proto/base_node.proto b/applications/tari_app_grpc/proto/base_node.proto index c1e3a2c5a7..264759f256 100644 --- a/applications/tari_app_grpc/proto/base_node.proto +++ b/applications/tari_app_grpc/proto/base_node.proto @@ -68,6 +68,8 @@ service BaseNode { rpc GetTipInfo(Empty) returns (TipInfoResponse); // Search for blocks containing the specified kernels rpc SearchKernels(SearchKernelsRequest) returns (stream HistoricalBlock); + // Search for blocks containing the specified commitments + rpc SearchUtxos(SearchUtxosRequest) returns (stream HistoricalBlock); // Fetch any utxos that exist in the main chain rpc FetchMatchingUtxos(FetchMatchingUtxosRequest) returns (stream FetchMatchingUtxosResponse); // get all peers from the base node @@ -289,6 +291,11 @@ message SearchKernelsRequest{ repeated Signature signatures = 1; } +// This is the request type for the Search Utxo rpc +message SearchUtxosRequest{ + repeated bytes commitments = 1; +} + message FetchMatchingUtxosRequest { repeated bytes hashes = 1; } diff --git a/applications/tari_base_node/src/command_handler.rs b/applications/tari_base_node/src/command_handler.rs index ce5d9f35e8..c67cee2298 100644 --- a/applications/tari_base_node/src/command_handler.rs +++ b/applications/tari_base_node/src/command_handler.rs @@ -335,10 +335,7 @@ impl CommandHandler { }, Ok(mut data) => match data.pop() { Some(v) => println!("{}", v.block()), - _ => println!( - "Pruned node: utxo found, but block not found for utxo commitment {}", - commitment.to_hex() - ), + _ => println!("Block not found for utxo commitment {}", commitment.to_hex()), }, }; }); diff --git a/applications/tari_base_node/src/grpc/base_node_grpc_server.rs b/applications/tari_base_node/src/grpc/base_node_grpc_server.rs index d9a237e069..417a191a77 100644 --- a/applications/tari_base_node/src/grpc/base_node_grpc_server.rs +++ b/applications/tari_base_node/src/grpc/base_node_grpc_server.rs @@ -32,7 +32,7 @@ use tari_app_grpc::{ tari_rpc::{CalcType, Sorting}, }; use tari_app_utilities::consts; -use tari_common_types::types::Signature; +use tari_common_types::types::{Commitment, Signature}; use tari_comms::{Bytes, CommsNode}; use tari_core::{ base_node::{ @@ -122,6 +122,7 @@ impl tari_rpc::base_node_server::BaseNode for BaseNodeGrpcServer { type GetTokensInCirculationStream = mpsc::Receiver>; type ListHeadersStream = mpsc::Receiver>; type SearchKernelsStream = mpsc::Receiver>; + type SearchUtxosStream = mpsc::Receiver>; async fn get_network_difficulty( &self, @@ -794,6 +795,62 @@ impl tari_rpc::base_node_server::BaseNode for BaseNodeGrpcServer { Ok(Response::new(rx)) } + async fn search_utxos( + &self, + request: Request, + ) -> Result, Status> { + debug!(target: LOG_TARGET, "Incoming GRPC request for SearchUtxos"); + let request = request.into_inner(); + + let converted: Result, _> = request + .commitments + .into_iter() + .map(|s| Commitment::from_bytes(&s)) + .collect(); + let outputs = converted.map_err(|_| Status::internal("Failed to convert one or more arguments."))?; + + let mut handler = self.node_service.clone(); + + let (mut tx, rx) = mpsc::channel(GET_BLOCKS_PAGE_SIZE); + task::spawn(async move { + let blocks = match handler.fetch_blocks_with_utxos(outputs).await { + Err(err) => { + warn!( + target: LOG_TARGET, + "Error communicating with local base node: {:?}", err, + ); + return; + }, + Ok(data) => data, + }; + for block in blocks { + match tx + .send( + block + .try_into() + .map_err(|err| Status::internal(format!("Could not provide block:{}", err))), + ) + .await + { + Ok(_) => (), + Err(err) => { + warn!(target: LOG_TARGET, "Error sending header via GRPC: {}", err); + match tx.send(Err(Status::unknown("Error sending data"))).await { + Ok(_) => (), + Err(send_err) => { + warn!(target: LOG_TARGET, "Error sending error to GRPC client: {}", send_err) + }, + } + return; + }, + } + } + }); + + debug!(target: LOG_TARGET, "Sending SearchUtxos response stream to client"); + Ok(Response::new(rx)) + } + #[allow(clippy::useless_conversion)] async fn fetch_matching_utxos( &self, diff --git a/base_layer/core/src/base_node/comms_interface/inbound_handlers.rs b/base_layer/core/src/base_node/comms_interface/inbound_handlers.rs index 9372ec8c5c..5e3894e57b 100644 --- a/base_layer/core/src/base_node/comms_interface/inbound_handlers.rs +++ b/base_layer/core/src/base_node/comms_interface/inbound_handlers.rs @@ -292,24 +292,25 @@ where T: BlockchainBackend + 'static } Ok(NodeCommsResponse::HistoricalBlocks(blocks)) }, - NodeCommsRequest::FetchBlocksWithUtxos(hashes) => { - let mut blocks = Vec::with_capacity(hashes.len()); - for hash in hashes { - let hash_hex = hash.to_hex(); + NodeCommsRequest::FetchBlocksWithUtxos(commitments) => { + let mut blocks = Vec::with_capacity(commitments.len()); + for commitment in commitments { + let commitment_hex = commitment.to_hex(); debug!( target: LOG_TARGET, - "A peer has requested a block with hash {}", hash_hex, + "A peer has requested a block with commitment {}", commitment_hex, ); - match self.blockchain_db.fetch_block_with_utxo(hash).await { + match self.blockchain_db.fetch_block_with_utxo(commitment).await { Ok(Some(block)) => blocks.push(block), Ok(None) => warn!( target: LOG_TARGET, - "Could not provide requested block {} to peer because not stored", hash_hex, + "Could not provide requested block with commitment {} to peer because not stored", + commitment_hex, ), Err(e) => warn!( target: LOG_TARGET, - "Could not provide requested block {} to peer because: {}", - hash_hex, + "Could not provide requested block with commitment {} to peer because: {}", + commitment_hex, e.to_string() ), } From fe9033b56704602cf22f6d28c03e73de97482f8e Mon Sep 17 00:00:00 2001 From: Philip Robinson Date: Tue, 21 Dec 2021 14:41:45 +0200 Subject: [PATCH 04/15] feat: improve wallet recovery and scanning handling of reorgs (#3655) Description --- @mikethetike Merging this into the `weatherwax` branch because I would like to see it tested on the Mobile apps sooner rather than later and not sure what the plan is for migrating them to the new `Development` This PR updates the wallet UtxoScanner to better detect and handle reorgs. Previously only the last scanned block was check to see if it had been re-orged out and if it had then the whole chain was scanned from scratch. Reorgs of a few blocks are common so to reduce the amount of work done after a reorg this PR adds maintaining history of previously scanned block headers so that the depth of the reorg can be quickly determined and the rescan only be done for affected blocks. This PR adds a number of updates: - Add the `sync_utxos_by_block` method to the `BaseNodeWalletService` RPC service to facilitate a more appropriate UTXO sync strategy for the wallet - Add the `ScannedBlocks` table to the wallet DB to keep a history of scanned block headers and the number and amount of outputs recovered from each block. - Update the UTXO scanner to use this stored history to detect reorgs and only sync the required UTXOs - Built out a test harness to test the scanner thoroughly in Rust integration tests. How Has This Been Tested? --- Added new Rust integration tests Added back excluded Cucumber tests --- .../tari_console_wallet/src/recovery.rs | 34 +- base_layer/core/src/base_node/proto/rpc.proto | 11 + base_layer/core/src/base_node/rpc/mod.rs | 16 +- base_layer/core/src/base_node/rpc/service.rs | 93 ++- .../base_node/rpc/sync_utxos_by_block_task.rs | 196 +++++ base_layer/core/src/base_node/sync/rpc/mod.rs | 3 - .../core/src/base_node/sync/rpc/service.rs | 55 -- base_layer/core/tests/base_node_rpc.rs | 114 ++- .../down.sql | 1 + .../up.sql | 7 + base_layer/wallet/src/lib.rs | 2 +- .../storage/sqlite_db/mod.rs | 2 +- .../storage/sqlite_db/output_sql.rs | 2 +- base_layer/wallet/src/schema.rs | 11 + base_layer/wallet/src/storage/database.rs | 71 +- .../storage/sqlite_db}/mod.rs | 7 +- .../src/storage/sqlite_db/scanned_blocks.rs | 132 ++++ .../{sqlite_db.rs => sqlite_db/wallet.rs} | 35 +- .../src/storage/sqlite_utilities/mod.rs | 4 +- .../transaction_service/storage/sqlite_db.rs | 2 +- .../wallet/src/utxo_scanner_service/error.rs | 2 + .../wallet/src/utxo_scanner_service/handle.rs | 10 +- .../wallet/src/utxo_scanner_service/mod.rs | 2 +- .../src/utxo_scanner_service/service.rs | 25 +- .../utxo_scanner_service/utxo_scanner_task.rs | 559 +++++++------- .../uxto_scanner_service_builder.rs | 2 +- .../mod.rs => contacts_service.rs} | 25 +- .../{mod.rs => output_manager_service.rs} | 7 +- .../mod.rs | 7 +- .../service.rs | 1 - .../storage.rs | 0 base_layer/wallet/tests/support/comms_rpc.rs | 185 ++++- base_layer/wallet/tests/support/mod.rs | 2 + .../support/output_manager_service_mock.rs | 166 ++++ .../tests/support/transaction_service_mock.rs | 108 +++ base_layer/wallet/tests/support/utils.rs | 28 - .../wallet/tests/transaction_service.rs | 24 + .../tests/transaction_service_tests/mod.rs | 24 + .../service.rs | 2 +- .../storage.rs | 0 .../transaction_protocols.rs | 39 +- base_layer/wallet/tests/utxo_scanner.rs | 731 ++++++++++++++++++ .../wallet/tests/{wallet/mod.rs => wallet.rs} | 27 +- base_layer/wallet_ffi/src/lib.rs | 4 +- base_layer/wallet_ffi/src/tasks.rs | 27 +- base_layer/wallet_ffi/wallet.h | 2 +- .../features/WalletRecovery.feature | 4 +- .../features/WalletTransactions.feature | 2 +- integration_tests/package-lock.json | 74 +- 49 files changed, 2407 insertions(+), 480 deletions(-) create mode 100644 base_layer/core/src/base_node/rpc/sync_utxos_by_block_task.rs create mode 100644 base_layer/wallet/migrations/2021-12-06-104545_add_block_scanned_cache/down.sql create mode 100644 base_layer/wallet/migrations/2021-12-06-104545_add_block_scanned_cache/up.sql rename base_layer/wallet/{tests/transaction_service => src/storage/sqlite_db}/mod.rs (93%) create mode 100644 base_layer/wallet/src/storage/sqlite_db/scanned_blocks.rs rename base_layer/wallet/src/storage/{sqlite_db.rs => sqlite_db/wallet.rs} (96%) rename base_layer/wallet/tests/{contacts_service/mod.rs => contacts_service.rs} (76%) rename base_layer/wallet/tests/{mod.rs => output_manager_service.rs} (91%) rename base_layer/wallet/tests/{output_manager_service => output_manager_service_tests}/mod.rs (95%) rename base_layer/wallet/tests/{output_manager_service => output_manager_service_tests}/service.rs (99%) rename base_layer/wallet/tests/{output_manager_service => output_manager_service_tests}/storage.rs (100%) create mode 100644 base_layer/wallet/tests/support/output_manager_service_mock.rs create mode 100644 base_layer/wallet/tests/support/transaction_service_mock.rs create mode 100644 base_layer/wallet/tests/transaction_service.rs create mode 100644 base_layer/wallet/tests/transaction_service_tests/mod.rs rename base_layer/wallet/tests/{transaction_service => transaction_service_tests}/service.rs (99%) rename base_layer/wallet/tests/{transaction_service => transaction_service_tests}/storage.rs (100%) rename base_layer/wallet/tests/{transaction_service => transaction_service_tests}/transaction_protocols.rs (97%) create mode 100644 base_layer/wallet/tests/utxo_scanner.rs rename base_layer/wallet/tests/{wallet/mod.rs => wallet.rs} (93%) diff --git a/applications/tari_console_wallet/src/recovery.rs b/applications/tari_console_wallet/src/recovery.rs index d94de9419b..54b01a8571 100644 --- a/applications/tari_console_wallet/src/recovery.rs +++ b/applications/tari_console_wallet/src/recovery.rs @@ -29,7 +29,7 @@ use tari_crypto::tari_utilities::hex::Hex; use tari_key_manager::{cipher_seed::CipherSeed, mnemonic::Mnemonic}; use tari_shutdown::Shutdown; use tari_wallet::{ - storage::sqlite_db::WalletSqliteDatabase, + storage::sqlite_db::wallet::WalletSqliteDatabase, utxo_scanner_service::{handle::UtxoScannerEvent, service::UtxoScannerService}, WalletSqlite, }; @@ -126,24 +126,24 @@ pub async fn wallet_recovery( println!("OK (latency = {:.2?})", latency); }, Ok(UtxoScannerEvent::Progress { - current_index: current, - total_index: total, + current_height, + tip_height, }) => { - let percentage_progress = ((current as f32) * 100f32 / (total as f32)).round() as u32; + let percentage_progress = ((current_height as f32) * 100f32 / (tip_height as f32)).round() as u32; debug!( target: LOG_TARGET, - "{}: Recovery process {}% complete ({} of {} utxos).", + "{}: Recovery process {}% complete (Block {} of {}).", Local::now(), percentage_progress, - current, - total + current_height, + tip_height ); println!( - "{}: Recovery process {}% complete ({} of {} utxos).", + "{}: Recovery process {}% complete (Block {} of {}).", Local::now(), percentage_progress, - current, - total + current_height, + tip_height ); }, Ok(UtxoScannerEvent::ScanningRoundFailed { @@ -172,15 +172,15 @@ pub async fn wallet_recovery( warn!(target: LOG_TARGET, "{}", s); }, Ok(UtxoScannerEvent::Completed { - number_scanned: num_scanned, - number_received: num_utxos, - value_received: total_amount, - time_taken: elapsed, + final_height, + num_recovered, + value_recovered, + time_taken, }) => { - let rate = (num_scanned as f32) * 1000f32 / (elapsed.as_millis() as f32); + let rate = (final_height as f32) * 1000f32 / (time_taken.as_millis() as f32); let stats = format!( - "Recovery complete! Scanned = {} in {:.2?} ({:.2?} utxos/s), Recovered {} worth {}", - num_scanned, elapsed, rate, num_utxos, total_amount + "Recovery complete! Scanned {} blocks in {:.2?} ({:.2?} blocks/s), Recovered {} outputs worth {}", + final_height, time_taken, rate, num_recovered, value_recovered ); info!(target: LOG_TARGET, "{}", stats); println!("{}", stats); diff --git a/base_layer/core/src/base_node/proto/rpc.proto b/base_layer/core/src/base_node/proto/rpc.proto index f1c4ee9d6f..17f04e5fa3 100644 --- a/base_layer/core/src/base_node/proto/rpc.proto +++ b/base_layer/core/src/base_node/proto/rpc.proto @@ -76,3 +76,14 @@ message PrunedOutput { bytes hash = 1; bytes witness_hash = 2; } + +message SyncUtxosByBlockRequest { + bytes start_header_hash = 1; + bytes end_header_hash = 2; +} + +message SyncUtxosByBlockResponse { + repeated tari.types.TransactionOutput outputs = 1; + uint64 height = 2; + bytes header_hash = 3; +} \ No newline at end of file diff --git a/base_layer/core/src/base_node/rpc/mod.rs b/base_layer/core/src/base_node/rpc/mod.rs index 0916f13808..eb97721008 100644 --- a/base_layer/core/src/base_node/rpc/mod.rs +++ b/base_layer/core/src/base_node/rpc/mod.rs @@ -22,9 +22,12 @@ #[cfg(feature = "base_node")] mod service; +#[cfg(feature = "base_node")] +pub mod sync_utxos_by_block_task; + #[cfg(feature = "base_node")] pub use service::BaseNodeWalletRpcService; -use tari_comms::protocol::rpc::{Request, Response, RpcStatus}; +use tari_comms::protocol::rpc::{Request, Response, RpcStatus, Streaming}; use tari_comms_rpc_macros::tari_rpc; #[cfg(feature = "base_node")] @@ -43,6 +46,8 @@ use crate::{ QueryDeletedRequest, QueryDeletedResponse, Signatures, + SyncUtxosByBlockRequest, + SyncUtxosByBlockResponse, TipInfoResponse, TxQueryBatchResponses, TxQueryResponse, @@ -97,6 +102,15 @@ pub trait BaseNodeWalletService: Send + Sync + 'static { &self, request: Request, ) -> Result, RpcStatus>; + + #[rpc(method = 10)] + async fn get_height_at_time(&self, request: Request) -> Result, RpcStatus>; + + #[rpc(method = 11)] + async fn sync_utxos_by_block( + &self, + request: Request, + ) -> Result, RpcStatus>; } #[cfg(feature = "base_node")] diff --git a/base_layer/core/src/base_node/rpc/service.rs b/base_layer/core/src/base_node/rpc/service.rs index ec9d7bb052..0d2887538f 100644 --- a/base_layer/core/src/base_node/rpc/service.rs +++ b/base_layer/core/src/base_node/rpc/service.rs @@ -1,7 +1,10 @@ use std::convert::TryFrom; +use log::*; use tari_common_types::types::Signature; -use tari_comms::protocol::rpc::{Request, Response, RpcStatus}; +use tari_comms::protocol::rpc::{Request, Response, RpcStatus, Streaming}; +use tari_crypto::tari_utilities::hex::Hex; +use tokio::sync::mpsc; // Copyright 2020, The Tari Project // @@ -26,7 +29,11 @@ use tari_comms::protocol::rpc::{Request, Response, RpcStatus}; // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH // DAMAGE. use crate::{ - base_node::{rpc::BaseNodeWalletService, state_machine_service::states::StateInfo, StateMachineHandle}, + base_node::{ + rpc::{sync_utxos_by_block_task::SyncUtxosByBlockTask, BaseNodeWalletService}, + state_machine_service::states::StateInfo, + StateMachineHandle, + }, chain_storage::{async_db::AsyncBlockchainDb, BlockchainBackend, PrunedOutput, UtxoMinedInfo}, mempool::{service::MempoolHandle, TxStorageResponse}, proto, @@ -37,6 +44,8 @@ use crate::{ QueryDeletedRequest, QueryDeletedResponse, Signatures as SignaturesProto, + SyncUtxosByBlockRequest, + SyncUtxosByBlockResponse, TipInfoResponse, TxLocation, TxQueryBatchResponse, @@ -52,7 +61,6 @@ use crate::{ }, transactions::transaction::Transaction, }; - const LOG_TARGET: &str = "c::base_node::rpc"; pub struct BaseNodeWalletRpcService { @@ -499,4 +507,83 @@ impl BaseNodeWalletService for BaseNodeWalletRpc Ok(Response::new(header.into())) } + + async fn get_height_at_time(&self, request: Request) -> Result, RpcStatus> { + let requested_epoch_time: u64 = request.into_message(); + + let tip_header = self + .db() + .fetch_tip_header() + .await + .map_err(RpcStatus::log_internal_error(LOG_TARGET))?; + let mut left_height = 0u64; + let mut right_height = tip_header.height(); + + while left_height <= right_height { + let mut mid_height = (left_height + right_height) / 2; + + if mid_height == 0 { + return Ok(Response::new(0u64)); + } + // If the two bounds are adjacent then perform the test between the right and left sides + if left_height == mid_height { + mid_height = right_height; + } + + let mid_header = self + .db() + .fetch_header(mid_height) + .await + .map_err(RpcStatus::log_internal_error(LOG_TARGET))? + .ok_or_else(|| { + RpcStatus::not_found(format!("Header not found during search at height {}", mid_height)) + })?; + let before_mid_header = self + .db() + .fetch_header(mid_height - 1) + .await + .map_err(RpcStatus::log_internal_error(LOG_TARGET))? + .ok_or_else(|| { + RpcStatus::not_found(format!("Header not found during search at height {}", mid_height - 1)) + })?; + + if requested_epoch_time < mid_header.timestamp.as_u64() && + requested_epoch_time >= before_mid_header.timestamp.as_u64() + { + return Ok(Response::new(before_mid_header.height)); + } else if mid_height == right_height { + return Ok(Response::new(right_height)); + } else if requested_epoch_time <= mid_header.timestamp.as_u64() { + right_height = mid_height; + } else { + left_height = mid_height; + } + } + + Ok(Response::new(0u64)) + } + + async fn sync_utxos_by_block( + &self, + request: Request, + ) -> Result, RpcStatus> { + let req = request.message(); + let peer = request.context().peer_node_id(); + debug!( + target: LOG_TARGET, + "Received sync_utxos_by_block request from {} from header {} to {} ", + peer, + req.start_header_hash.to_hex(), + req.end_header_hash.to_hex(), + ); + + // Number of blocks to load and push to the stream before loading the next batch. Most blocks have 1 output but + // full blocks will have 500 + const BATCH_SIZE: usize = 5; + let (tx, rx) = mpsc::channel(BATCH_SIZE); + let task = SyncUtxosByBlockTask::new(self.db()); + task.run(request.into_message(), tx).await?; + + Ok(Streaming::new(rx)) + } } diff --git a/base_layer/core/src/base_node/rpc/sync_utxos_by_block_task.rs b/base_layer/core/src/base_node/rpc/sync_utxos_by_block_task.rs new file mode 100644 index 0000000000..b0d24c5398 --- /dev/null +++ b/base_layer/core/src/base_node/rpc/sync_utxos_by_block_task.rs @@ -0,0 +1,196 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +use std::{sync::Arc, time::Instant}; + +use log::*; +use tari_comms::protocol::rpc::RpcStatus; +use tari_crypto::tari_utilities::{hex::Hex, Hashable}; +use tokio::{sync::mpsc, task}; + +use crate::{ + blocks::BlockHeader, + chain_storage::{async_db::AsyncBlockchainDb, BlockchainBackend, PrunedOutput}, + proto, + proto::base_node::{SyncUtxosByBlockRequest, SyncUtxosByBlockResponse}, +}; + +const LOG_TARGET: &str = "c::base_node::sync_rpc::sync_utxo_by_block_task"; + +pub(crate) struct SyncUtxosByBlockTask { + db: AsyncBlockchainDb, +} + +impl SyncUtxosByBlockTask +where B: BlockchainBackend + 'static +{ + pub(crate) fn new(db: AsyncBlockchainDb) -> Self { + Self { db } + } + + pub(crate) async fn run( + self, + request: SyncUtxosByBlockRequest, + mut tx: mpsc::Sender>, + ) -> Result<(), RpcStatus> { + let start_header = self + .db + .fetch_header_by_block_hash(request.start_header_hash.clone()) + .await + .map_err(RpcStatus::log_internal_error(LOG_TARGET))? + .ok_or_else(|| RpcStatus::not_found("Start header hash is was not found"))?; + + let end_header = self + .db + .fetch_header_by_block_hash(request.end_header_hash.clone()) + .await + .map_err(RpcStatus::log_internal_error(LOG_TARGET))? + .ok_or_else(|| RpcStatus::not_found("End header hash is was not found"))?; + + if start_header.height > end_header.height { + return Err(RpcStatus::bad_request(format!( + "start header height {} cannot be greater than the end header height ({})", + start_header.height, end_header.height + ))); + } + + task::spawn(async move { + if let Err(err) = self.start_streaming(&mut tx, start_header, end_header).await { + let _ = tx.send(Err(err)).await; + } + }); + + Ok(()) + } + + #[allow(clippy::too_many_arguments)] + async fn start_streaming( + &self, + tx: &mut mpsc::Sender>, + start_header: BlockHeader, + end_header: BlockHeader, + ) -> Result<(), RpcStatus> { + let bitmap = self + .db + .fetch_complete_deleted_bitmap_at(end_header.hash()) + .await + .map_err(|err| { + error!(target: LOG_TARGET, "Failed to get deleted bitmap: {}", err); + RpcStatus::general(format!( + "Could not get deleted bitmap at hash {}", + end_header.hash().to_hex() + )) + })? + .into_bitmap(); + let bitmap = Arc::new(bitmap); + + debug!( + target: LOG_TARGET, + "Starting stream task with start_header: {} and end_header: {}", + start_header.hash().to_hex(), + end_header.hash().to_hex(), + ); + + let mut current_header = start_header; + + loop { + let timer = Instant::now(); + let current_header_hash = current_header.hash(); + + debug!( + target: LOG_TARGET, + "current header = {} ({})", + current_header.height, + current_header_hash.to_hex() + ); + + if tx.is_closed() { + debug!(target: LOG_TARGET, "Exiting sync_utxos early because client has gone",); + break; + } + + let (utxos, _deleted_diff) = self + .db + .fetch_utxos_in_block(current_header.hash(), Some(bitmap.clone())) + .await + .map_err(RpcStatus::log_internal_error(LOG_TARGET))?; + + let utxos: Vec = utxos + .into_iter() + .enumerate() + // Don't include pruned UTXOs + .filter_map(|(_, utxo)| match utxo { + PrunedOutput::Pruned{output_hash: _,witness_hash:_} => None, + PrunedOutput::NotPruned{output} => Some(output.into()), + }).collect(); + + debug!( + target: LOG_TARGET, + "Streaming {} UTXO(s) for block #{} (Hash: {})", + utxos.len(), + current_header.height, + current_header_hash.to_hex(), + ); + + let utxo_block_response = SyncUtxosByBlockResponse { + outputs: utxos, + height: current_header.height, + header_hash: current_header_hash, + }; + // Ensure task stops if the peer prematurely stops their RPC session + if tx.send(Ok(utxo_block_response)).await.is_err() { + break; + } + + debug!( + target: LOG_TARGET, + "Streamed utxos in {:.2?} (including stream backpressure)", + timer.elapsed() + ); + + if current_header.height >= end_header.height { + break; + } + + current_header = self + .db + .fetch_header(current_header.height + 1) + .await + .map_err(RpcStatus::log_internal_error(LOG_TARGET))? + .ok_or_else(|| { + RpcStatus::general(format!( + "Potential data consistency issue: header {} not found", + current_header.height + 1 + )) + })?; + } + + debug!( + target: LOG_TARGET, + "UTXO sync by block completed to UTXO {} (Header hash = {})", + current_header.output_mmr_size, + current_header.hash().to_hex() + ); + + Ok(()) + } +} diff --git a/base_layer/core/src/base_node/sync/rpc/mod.rs b/base_layer/core/src/base_node/sync/rpc/mod.rs index 3a54356c11..2f540636be 100644 --- a/base_layer/core/src/base_node/sync/rpc/mod.rs +++ b/base_layer/core/src/base_node/sync/rpc/mod.rs @@ -90,9 +90,6 @@ pub trait BaseNodeSyncService: Send + Sync + 'static { #[rpc(method = 8)] async fn sync_utxos(&self, request: Request) -> Result, RpcStatus>; - - #[rpc(method = 9)] - async fn get_height_at_time(&self, request: Request) -> Result, RpcStatus>; } #[cfg(feature = "base_node")] diff --git a/base_layer/core/src/base_node/sync/rpc/service.rs b/base_layer/core/src/base_node/sync/rpc/service.rs index c86026de5b..2c9f87a1e1 100644 --- a/base_layer/core/src/base_node/sync/rpc/service.rs +++ b/base_layer/core/src/base_node/sync/rpc/service.rs @@ -508,59 +508,4 @@ impl BaseNodeSyncService for BaseNodeSyncRpcServ Ok(Streaming::new(rx)) } - - async fn get_height_at_time(&self, request: Request) -> Result, RpcStatus> { - let requested_epoch_time: u64 = request.into_message(); - - let tip_header = self - .db() - .fetch_tip_header() - .await - .map_err(RpcStatus::log_internal_error(LOG_TARGET))?; - let mut left_height = 0u64; - let mut right_height = tip_header.height(); - - while left_height <= right_height { - let mut mid_height = (left_height + right_height) / 2; - - if mid_height == 0 { - return Ok(Response::new(0u64)); - } - // If the two bounds are adjacent then perform the test between the right and left sides - if left_height == mid_height { - mid_height = right_height; - } - - let mid_header = self - .db() - .fetch_header(mid_height) - .await - .map_err(RpcStatus::log_internal_error(LOG_TARGET))? - .ok_or_else(|| { - RpcStatus::not_found(format!("Header not found during search at height {}", mid_height)) - })?; - let before_mid_header = self - .db() - .fetch_header(mid_height - 1) - .await - .map_err(RpcStatus::log_internal_error(LOG_TARGET))? - .ok_or_else(|| { - RpcStatus::not_found(format!("Header not found during search at height {}", mid_height - 1)) - })?; - - if requested_epoch_time < mid_header.timestamp.as_u64() && - requested_epoch_time >= before_mid_header.timestamp.as_u64() - { - return Ok(Response::new(before_mid_header.height)); - } else if mid_height == right_height { - return Ok(Response::new(right_height)); - } else if requested_epoch_time <= mid_header.timestamp.as_u64() { - right_height = mid_height; - } else { - left_height = mid_height; - } - } - - Ok(Response::new(0u64)) - } } diff --git a/base_layer/core/tests/base_node_rpc.rs b/base_layer/core/tests/base_node_rpc.rs index 48007690c6..0a3ee467aa 100644 --- a/base_layer/core/tests/base_node_rpc.rs +++ b/base_layer/core/tests/base_node_rpc.rs @@ -22,6 +22,7 @@ use std::{convert::TryFrom, sync::Arc, time::Duration}; +use futures::StreamExt; use randomx_rs::RandomXFlag; use tari_common::configuration::Network; use tari_comms::protocol::rpc::mock::RpcRequestMock; @@ -38,13 +39,12 @@ use tari_core::{ rpc::{BaseNodeWalletRpcService, BaseNodeWalletService}, state_machine_service::states::{ListeningInfo, StateInfo, StatusInfo}, sync::rpc::BaseNodeSyncRpcService, - BaseNodeSyncService, }, blocks::ChainBlock, consensus::{ConsensusManager, ConsensusManagerBuilder, NetworkConsensus}, crypto::tari_utilities::Hashable, proto::{ - base_node::{FetchMatchingUtxos, Signatures as SignaturesProto}, + base_node::{FetchMatchingUtxos, Signatures as SignaturesProto, SyncUtxosByBlockRequest}, types::{Signature as SignatureProto, Transaction as TransactionProto}, }, test_helpers::blockchain::TempDatabase, @@ -57,6 +57,7 @@ use tari_core::{ txn_schema, }; use tari_crypto::tari_utilities::epoch_time::EpochTime; +use tari_test_utils::streams::convert_mpsc_to_stream; use tempfile::{tempdir, TempDir}; use crate::helpers::{ @@ -174,7 +175,7 @@ async fn test_base_node_wallet_rpc() { .await .unwrap(); - // Check that subitting Tx2 will now be accepted + // Check that submiting Tx2 will now be accepted let msg = TransactionProto::from(tx2); let req = request_mock.request_with_context(Default::default(), msg); let resp = service.submit_transaction(req).await.unwrap().into_message(); @@ -278,7 +279,7 @@ async fn test_base_node_wallet_rpc() { async fn test_get_height_at_time() { let factories = CryptoFactories::default(); - let (_, service, base_node, request_mock, consensus_manager, block0, _utxo0, _temp_dir) = setup().await; + let (service, _, base_node, request_mock, consensus_manager, block0, _utxo0, _temp_dir) = setup().await; let mut prev_block = block0.clone(); let mut times: Vec = vec![prev_block.header().timestamp]; @@ -333,3 +334,108 @@ async fn test_get_height_at_time() { let resp = service.get_height_at_time(req).await.unwrap().into_message(); assert_eq!(resp, 10); } + +#[tokio::test] +async fn test_sync_utxos_by_block() { + let (service, _, mut base_node, request_mock, consensus_manager, block0, utxo0, _temp_dir) = setup().await; + + let (txs1, utxos1) = schema_to_transaction(&[txn_schema!( + from: vec![utxo0.clone()], + to: vec![10 * T, 10 * T, 10 * T, 10 * T, 10 * T, 10 * T, 10 * T, 10 * T, 10 * T] + )]); + let tx1 = (*txs1[0]).clone(); + + let (txs2, utxos2) = schema_to_transaction(&[txn_schema!( + from: vec![utxos1[0].clone()], + to: vec![2 * T, 2 * T, 2 * T, 2 * T] + )]); + let tx2 = (*txs2[0]).clone(); + + let (txs3, _utxos3) = schema_to_transaction(&[txn_schema!( + from: vec![utxos2[0].clone(), utxos2[1].clone()], + to: vec![100_000 * uT, 100_000 * uT, 100_000 * uT, 100_000 * uT, 100_000 * uT] + )]); + let tx3 = (*txs3[0]).clone(); + + let block1 = base_node + .blockchain_db + .prepare_new_block(chain_block(block0.block(), vec![tx1.clone()], &consensus_manager)) + .unwrap(); + + base_node + .local_nci + .submit_block(block1.clone(), Broadcast::from(true)) + .await + .unwrap(); + + let block2 = base_node + .blockchain_db + .prepare_new_block(chain_block(&block1, vec![tx2], &consensus_manager)) + .unwrap(); + + base_node + .local_nci + .submit_block(block2.clone(), Broadcast::from(true)) + .await + .unwrap(); + + let block3 = base_node + .blockchain_db + .prepare_new_block(chain_block(&block2, vec![tx3], &consensus_manager)) + .unwrap(); + + base_node + .local_nci + .submit_block(block3.clone(), Broadcast::from(true)) + .await + .unwrap(); + + // All blocks + let msg = SyncUtxosByBlockRequest { + start_header_hash: block0.header().hash(), + end_header_hash: block3.header.hash(), + }; + + let req = request_mock.request_with_context(Default::default(), msg); + let mut streaming = service.sync_utxos_by_block(req).await.unwrap().into_inner(); + + let responses = convert_mpsc_to_stream(&mut streaming).collect::>().await; + + assert_eq!( + vec![ + (0, block0.header().hash(), 0), + (1, block1.header.hash(), 9), + (2, block2.header.hash(), 3), + (3, block3.header.hash(), 6) + ], + responses + .iter() + .map(|r| { + let resp = r.clone().unwrap(); + (resp.height, resp.header_hash, resp.outputs.len()) + }) + .collect::, usize)>>() + ); + + // Block 1 to 2 + let msg = SyncUtxosByBlockRequest { + start_header_hash: block1.header.hash(), + end_header_hash: block2.header.hash(), + }; + + let req = request_mock.request_with_context(Default::default(), msg); + let mut streaming = service.sync_utxos_by_block(req).await.unwrap().into_inner(); + + let responses = convert_mpsc_to_stream(&mut streaming).collect::>().await; + + assert_eq!( + vec![(1, block1.header.hash(), 9), (2, block2.header.hash(), 5),], + responses + .iter() + .map(|r| { + let resp = r.clone().unwrap(); + (resp.height, resp.header_hash, resp.outputs.len()) + }) + .collect::, usize)>>() + ); +} diff --git a/base_layer/wallet/migrations/2021-12-06-104545_add_block_scanned_cache/down.sql b/base_layer/wallet/migrations/2021-12-06-104545_add_block_scanned_cache/down.sql new file mode 100644 index 0000000000..3ecdf26d20 --- /dev/null +++ b/base_layer/wallet/migrations/2021-12-06-104545_add_block_scanned_cache/down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS scanned_blocks; \ No newline at end of file diff --git a/base_layer/wallet/migrations/2021-12-06-104545_add_block_scanned_cache/up.sql b/base_layer/wallet/migrations/2021-12-06-104545_add_block_scanned_cache/up.sql new file mode 100644 index 0000000000..60967bf7fb --- /dev/null +++ b/base_layer/wallet/migrations/2021-12-06-104545_add_block_scanned_cache/up.sql @@ -0,0 +1,7 @@ +CREATE TABLE scanned_blocks ( + header_hash BLOB PRIMARY KEY NOT NULL, + height BIGINT NOT NULL, + num_outputs BIGINT NULL, + amount BIGINT NULL, + timestamp DATETIME NOT NULL +); diff --git a/base_layer/wallet/src/lib.rs b/base_layer/wallet/src/lib.rs index 463a83154b..461e02dffd 100644 --- a/base_layer/wallet/src/lib.rs +++ b/base_layer/wallet/src/lib.rs @@ -40,7 +40,7 @@ pub use wallet::Wallet; use crate::{ contacts_service::storage::sqlite_db::ContactsServiceSqliteDatabase, output_manager_service::storage::sqlite_db::OutputManagerSqliteDatabase, - storage::sqlite_db::WalletSqliteDatabase, + storage::sqlite_db::wallet::WalletSqliteDatabase, transaction_service::storage::sqlite_db::TransactionServiceSqliteDatabase, }; diff --git a/base_layer/wallet/src/output_manager_service/storage/sqlite_db/mod.rs b/base_layer/wallet/src/output_manager_service/storage/sqlite_db/mod.rs index 6325766041..5a0824dd93 100644 --- a/base_layer/wallet/src/output_manager_service/storage/sqlite_db/mod.rs +++ b/base_layer/wallet/src/output_manager_service/storage/sqlite_db/mod.rs @@ -67,7 +67,7 @@ use crate::{ mod new_output_sql; mod output_sql; -const LOG_TARGET: &str = "wallet::output_manager_service::database::sqlite_db"; +const LOG_TARGET: &str = "wallet::output_manager_service::database::wallet"; /// A Sqlite backend for the Output Manager Service. The Backend is accessed via a connection pool to the Sqlite file. #[derive(Clone)] diff --git a/base_layer/wallet/src/output_manager_service/storage/sqlite_db/output_sql.rs b/base_layer/wallet/src/output_manager_service/storage/sqlite_db/output_sql.rs index ff65873b65..b1fabeb84f 100644 --- a/base_layer/wallet/src/output_manager_service/storage/sqlite_db/output_sql.rs +++ b/base_layer/wallet/src/output_manager_service/storage/sqlite_db/output_sql.rs @@ -59,7 +59,7 @@ use crate::{ }, }; -const LOG_TARGET: &str = "wallet::output_manager_service::database::sqlite_db"; +const LOG_TARGET: &str = "wallet::output_manager_service::database::wallet"; #[derive(Clone, Debug, Queryable, Identifiable, PartialEq)] #[table_name = "outputs"] diff --git a/base_layer/wallet/src/schema.rs b/base_layer/wallet/src/schema.rs index 383dc93f7b..3bcefe0cf8 100644 --- a/base_layer/wallet/src/schema.rs +++ b/base_layer/wallet/src/schema.rs @@ -118,6 +118,16 @@ table! { } } +table! { + scanned_blocks (header_hash) { + header_hash -> Binary, + height -> BigInt, + num_outputs -> Nullable, + amount -> Nullable, + timestamp -> Timestamp, + } +} + table! { wallet_settings (key) { key -> Text, @@ -134,5 +144,6 @@ allow_tables_to_appear_in_same_query!( known_one_sided_payment_scripts, outbound_transactions, outputs, + scanned_blocks, wallet_settings, ); diff --git a/base_layer/wallet/src/storage/database.rs b/base_layer/wallet/src/storage/database.rs index ea41b84c76..7e9b926aeb 100644 --- a/base_layer/wallet/src/storage/database.rs +++ b/base_layer/wallet/src/storage/database.rs @@ -31,7 +31,7 @@ use tari_common_types::chain_metadata::ChainMetadata; use tari_comms::{multiaddr::Multiaddr, peer_manager::PeerFeatures, tor::TorIdentity}; use tari_key_manager::cipher_seed::CipherSeed; -use crate::error::WalletStorageError; +use crate::{error::WalletStorageError, utxo_scanner_service::service::ScannedBlock}; const LOG_TARGET: &str = "wallet::database"; @@ -45,6 +45,19 @@ pub trait WalletBackend: Send + Sync + Clone { fn apply_encryption(&self, passphrase: String) -> Result; /// Remove encryption from the backend. fn remove_encryption(&self) -> Result<(), WalletStorageError>; + + fn get_scanned_blocks(&self) -> Result, WalletStorageError>; + fn save_scanned_block(&self, scanned_block: ScannedBlock) -> Result<(), WalletStorageError>; + fn clear_scanned_blocks(&self) -> Result<(), WalletStorageError>; + /// Clear scanned blocks from the givne height and higher + fn clear_scanned_blocks_from_and_higher(&self, height: u64) -> Result<(), WalletStorageError>; + /// Clear scanned block history from before the specified height. Choice to exclude blocks that contained recovered + /// outputs + fn clear_scanned_blocks_before_height( + &self, + height: u64, + exclude_recovered: bool, + ) -> Result<(), WalletStorageError>; } #[derive(Debug, Clone, PartialEq)] @@ -326,6 +339,60 @@ where T: WalletBackend + 'static .map_err(|err| WalletStorageError::BlockingTaskSpawnError(err.to_string()))??; Ok(result) } + + pub async fn get_scanned_blocks(&self) -> Result, WalletStorageError> { + let db_clone = self.db.clone(); + + let result = tokio::task::spawn_blocking(move || db_clone.get_scanned_blocks()) + .await + .map_err(|err| WalletStorageError::BlockingTaskSpawnError(err.to_string()))??; + + Ok(result) + } + + pub async fn save_scanned_block(&self, scanned_block: ScannedBlock) -> Result<(), WalletStorageError> { + let db_clone = self.db.clone(); + + tokio::task::spawn_blocking(move || db_clone.save_scanned_block(scanned_block)) + .await + .map_err(|err| WalletStorageError::BlockingTaskSpawnError(err.to_string()))??; + + Ok(()) + } + + pub async fn clear_scanned_blocks(&self) -> Result<(), WalletStorageError> { + let db_clone = self.db.clone(); + + tokio::task::spawn_blocking(move || db_clone.clear_scanned_blocks()) + .await + .map_err(|err| WalletStorageError::BlockingTaskSpawnError(err.to_string()))??; + + Ok(()) + } + + pub async fn clear_scanned_blocks_from_and_higher(&self, height: u64) -> Result<(), WalletStorageError> { + let db_clone = self.db.clone(); + + tokio::task::spawn_blocking(move || db_clone.clear_scanned_blocks_from_and_higher(height)) + .await + .map_err(|err| WalletStorageError::BlockingTaskSpawnError(err.to_string()))??; + + Ok(()) + } + + pub async fn clear_scanned_blocks_before_height( + &self, + height: u64, + exclude_recovered: bool, + ) -> Result<(), WalletStorageError> { + let db_clone = self.db.clone(); + + tokio::task::spawn_blocking(move || db_clone.clear_scanned_blocks_before_height(height, exclude_recovered)) + .await + .map_err(|err| WalletStorageError::BlockingTaskSpawnError(err.to_string()))??; + + Ok(()) + } } impl Display for DbKey { @@ -386,7 +453,7 @@ mod test { use crate::storage::{ database::WalletDatabase, - sqlite_db::WalletSqliteDatabase, + sqlite_db::wallet::WalletSqliteDatabase, sqlite_utilities::run_migration_and_create_sqlite_connection, }; diff --git a/base_layer/wallet/tests/transaction_service/mod.rs b/base_layer/wallet/src/storage/sqlite_db/mod.rs similarity index 93% rename from base_layer/wallet/tests/transaction_service/mod.rs rename to base_layer/wallet/src/storage/sqlite_db/mod.rs index cf5a90b4c3..71fb427105 100644 --- a/base_layer/wallet/tests/transaction_service/mod.rs +++ b/base_layer/wallet/src/storage/sqlite_db/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2019. The Tari Project +// Copyright 2021. The Tari Project // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that the // following conditions are met: @@ -20,6 +20,5 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -pub mod service; -pub mod storage; -pub mod transaction_protocols; +pub mod scanned_blocks; +pub mod wallet; diff --git a/base_layer/wallet/src/storage/sqlite_db/scanned_blocks.rs b/base_layer/wallet/src/storage/sqlite_db/scanned_blocks.rs new file mode 100644 index 0000000000..b3e7be2ee8 --- /dev/null +++ b/base_layer/wallet/src/storage/sqlite_db/scanned_blocks.rs @@ -0,0 +1,132 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +use chrono::{NaiveDateTime, Utc}; +use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl, SqliteConnection}; +use tari_core::transactions::tari_amount::MicroTari; + +use crate::{ + diesel::BoolExpressionMethods, + error::WalletStorageError, + schema::scanned_blocks, + utxo_scanner_service::service::ScannedBlock, +}; + +#[derive(Clone, Debug, Queryable, Insertable, PartialEq)] +#[table_name = "scanned_blocks"] +pub struct ScannedBlockSql { + header_hash: Vec, + height: i64, + num_outputs: Option, + amount: Option, + timestamp: NaiveDateTime, +} + +impl ScannedBlockSql { + pub fn index(conn: &SqliteConnection) -> Result, WalletStorageError> { + Ok(scanned_blocks::table + .order(scanned_blocks::height.desc()) + .load::(conn)?) + } + + pub fn new(header_hash: Vec, height: i64) -> Self { + Self { + header_hash, + height, + num_outputs: None, + amount: None, + timestamp: Utc::now().naive_utc(), + } + } + + pub fn new_with_amount(header_hash: Vec, height: i64, num_outputs: i64, amount: i64) -> Self { + Self { + header_hash, + height, + num_outputs: Some(num_outputs), + amount: Some(amount), + timestamp: Utc::now().naive_utc(), + } + } + + pub fn commit(&self, conn: &SqliteConnection) -> Result<(), WalletStorageError> { + diesel::insert_into(scanned_blocks::table) + .values(self.clone()) + .execute(conn)?; + Ok(()) + } + + pub fn clear_all(conn: &SqliteConnection) -> Result<(), WalletStorageError> { + diesel::delete(scanned_blocks::table).execute(conn)?; + Ok(()) + } + + /// Clear Scanned Blocks from the given height and higher + pub fn clear_from_and_higher(height: u64, conn: &SqliteConnection) -> Result<(), WalletStorageError> { + diesel::delete(scanned_blocks::table.filter(scanned_blocks::height.ge(height as i64))).execute(conn)?; + Ok(()) + } + + pub fn clear_before_height( + height: u64, + exclude_recovered: bool, + conn: &SqliteConnection, + ) -> Result<(), WalletStorageError> { + let mut query = diesel::delete(scanned_blocks::table) + .into_boxed() + .filter(scanned_blocks::height.lt(height as i64)); + if exclude_recovered { + query = query.filter( + scanned_blocks::num_outputs + .is_null() + .or(scanned_blocks::num_outputs.eq(0)), + ); + } + + query.execute(conn)?; + Ok(()) + } +} + +impl From for ScannedBlockSql { + fn from(sb: ScannedBlock) -> Self { + Self { + header_hash: sb.header_hash, + height: sb.height as i64, + num_outputs: sb.num_outputs.map(|n| n as i64), + amount: sb.amount.map(|a| a.as_u64() as i64), + timestamp: sb.timestamp, + } + } +} + +impl From for ScannedBlock { + fn from(sb: ScannedBlockSql) -> Self { + Self { + header_hash: sb.header_hash, + height: sb.height as u64, + num_outputs: sb.num_outputs.map(|n| n as u64), + amount: sb.amount.map(|a| MicroTari::from(a as u64)), + timestamp: sb.timestamp, + } + } +} diff --git a/base_layer/wallet/src/storage/sqlite_db.rs b/base_layer/wallet/src/storage/sqlite_db/wallet.rs similarity index 96% rename from base_layer/wallet/src/storage/sqlite_db.rs rename to base_layer/wallet/src/storage/sqlite_db/wallet.rs index f1201a5a52..50a974ad25 100644 --- a/base_layer/wallet/src/storage/sqlite_db.rs +++ b/base_layer/wallet/src/storage/sqlite_db/wallet.rs @@ -50,12 +50,14 @@ use crate::{ schema::{client_key_values, wallet_settings}, storage::{ database::{DbKey, DbKeyValuePair, DbValue, WalletBackend, WriteOperation}, + sqlite_db::scanned_blocks::ScannedBlockSql, sqlite_utilities::wallet_db_connection::WalletDbConnection, }, util::encryption::{decrypt_bytes_integral_nonce, encrypt_bytes_integral_nonce, Encryptable, AES_NONCE_BYTES}, + utxo_scanner_service::service::ScannedBlock, }; -const LOG_TARGET: &str = "wallet::storage::sqlite_db"; +const LOG_TARGET: &str = "wallet::storage::wallet"; /// A Sqlite backend for the Output Manager Service. The Backend is accessed via a connection pool to the Sqlite file. #[derive(Clone)] @@ -512,6 +514,35 @@ impl WalletBackend for WalletSqliteDatabase { Ok(()) } + + fn get_scanned_blocks(&self) -> Result, WalletStorageError> { + let conn = self.database_connection.get_pooled_connection()?; + ScannedBlockSql::index(&conn).map(|sb| sb.into_iter().map(ScannedBlock::from).collect()) + } + + fn save_scanned_block(&self, scanned_block: ScannedBlock) -> Result<(), WalletStorageError> { + let conn = self.database_connection.get_pooled_connection()?; + ScannedBlockSql::from(scanned_block).commit(&conn) + } + + fn clear_scanned_blocks(&self) -> Result<(), WalletStorageError> { + let conn = self.database_connection.get_pooled_connection()?; + ScannedBlockSql::clear_all(&conn) + } + + fn clear_scanned_blocks_from_and_higher(&self, height: u64) -> Result<(), WalletStorageError> { + let conn = self.database_connection.get_pooled_connection()?; + ScannedBlockSql::clear_from_and_higher(height, &conn) + } + + fn clear_scanned_blocks_before_height( + &self, + height: u64, + exclude_recovered: bool, + ) -> Result<(), WalletStorageError> { + let conn = self.database_connection.get_pooled_connection()?; + ScannedBlockSql::clear_before_height(height, exclude_recovered, &conn) + } } /// Confirm if database is encrypted or not and if a cipher is provided confirm the cipher is correct. @@ -736,7 +767,7 @@ mod test { use crate::storage::{ database::{DbKey, DbValue, WalletBackend}, - sqlite_db::{ClientKeyValueSql, WalletSettingSql, WalletSqliteDatabase}, + sqlite_db::wallet::{ClientKeyValueSql, WalletSettingSql, WalletSqliteDatabase}, sqlite_utilities::run_migration_and_create_sqlite_connection, }; diff --git a/base_layer/wallet/src/storage/sqlite_utilities/mod.rs b/base_layer/wallet/src/storage/sqlite_utilities/mod.rs index e119bf1f40..7d766f9097 100644 --- a/base_layer/wallet/src/storage/sqlite_utilities/mod.rs +++ b/base_layer/wallet/src/storage/sqlite_utilities/mod.rs @@ -36,7 +36,7 @@ use crate::{ contacts_service::storage::sqlite_db::ContactsServiceSqliteDatabase, error::WalletStorageError, output_manager_service::storage::sqlite_db::OutputManagerSqliteDatabase, - storage::{database::WalletDatabase, sqlite_db::WalletSqliteDatabase}, + storage::{database::WalletDatabase, sqlite_db::wallet::WalletSqliteDatabase}, transaction_service::storage::sqlite_db::TransactionServiceSqliteDatabase, }; @@ -167,7 +167,7 @@ pub fn initialize_sqlite_database_backends( /// the DB /// TODO remove at next testnet reset fn check_for_incompatible_db_encryption(connection: &SqliteConnection) -> Result<(), WalletStorageError> { - use crate::{diesel::RunQueryDsl, schema::wallet_settings, storage::sqlite_db::WalletSettingSql}; + use crate::{diesel::RunQueryDsl, schema::wallet_settings, storage::sqlite_db::wallet::WalletSettingSql}; if wallet_settings::table .filter(wallet_settings::key.eq("MasterSecretKey".to_string())) diff --git a/base_layer/wallet/src/transaction_service/storage/sqlite_db.rs b/base_layer/wallet/src/transaction_service/storage/sqlite_db.rs index 92b8fbdaef..1b19bd7cd3 100644 --- a/base_layer/wallet/src/transaction_service/storage/sqlite_db.rs +++ b/base_layer/wallet/src/transaction_service/storage/sqlite_db.rs @@ -66,7 +66,7 @@ use crate::{ }, }; -const LOG_TARGET: &str = "wallet::transaction_service::database::sqlite_db"; +const LOG_TARGET: &str = "wallet::transaction_service::database::wallet"; /// A Sqlite backend for the Transaction Service. The Backend is accessed via a connection pool to the Sqlite file. #[derive(Clone)] diff --git a/base_layer/wallet/src/utxo_scanner_service/error.rs b/base_layer/wallet/src/utxo_scanner_service/error.rs index 53c79f4f71..d479e82fae 100644 --- a/base_layer/wallet/src/utxo_scanner_service/error.rs +++ b/base_layer/wallet/src/utxo_scanner_service/error.rs @@ -56,4 +56,6 @@ pub enum UtxoScannerError { TransportChannelError(#[from] TransportChannelError), #[error("Serde json error: `{0}`")] SerdeJsonError(#[from] SerdeJsonError), + #[error("Overflow Error")] + OverflowError, } diff --git a/base_layer/wallet/src/utxo_scanner_service/handle.rs b/base_layer/wallet/src/utxo_scanner_service/handle.rs index 09240bd998..dea0c1d9b9 100644 --- a/base_layer/wallet/src/utxo_scanner_service/handle.rs +++ b/base_layer/wallet/src/utxo_scanner_service/handle.rs @@ -43,14 +43,14 @@ pub enum UtxoScannerEvent { }, /// Progress of the recovery process (current_block, current_chain_height) Progress { - current_index: u64, - total_index: u64, + current_height: u64, + tip_height: u64, }, /// Completed Recovery (Number scanned, Num of Recovered outputs, Value of recovered outputs, Time taken) Completed { - number_scanned: u64, - number_received: u64, - value_received: MicroTari, + final_height: u64, + num_recovered: u64, + value_recovered: MicroTari, time_taken: Duration, }, /// Scanning process has failed and scanning process has exited diff --git a/base_layer/wallet/src/utxo_scanner_service/mod.rs b/base_layer/wallet/src/utxo_scanner_service/mod.rs index b17c5c775e..75957248f8 100644 --- a/base_layer/wallet/src/utxo_scanner_service/mod.rs +++ b/base_layer/wallet/src/utxo_scanner_service/mod.rs @@ -24,7 +24,7 @@ pub mod error; pub mod handle; pub mod service; mod utxo_scanner_task; -mod uxto_scanner_service_builder; +pub mod uxto_scanner_service_builder; pub use utxo_scanner_task::RECOVERY_KEY; diff --git a/base_layer/wallet/src/utxo_scanner_service/service.rs b/base_layer/wallet/src/utxo_scanner_service/service.rs index 6f21bced64..31af81c0c3 100644 --- a/base_layer/wallet/src/utxo_scanner_service/service.rs +++ b/base_layer/wallet/src/utxo_scanner_service/service.rs @@ -22,9 +22,9 @@ use std::sync::Arc; +use chrono::NaiveDateTime; use futures::FutureExt; use log::*; -use serde::{Deserialize, Serialize}; use tari_common_types::types::HashOutput; use tari_comms::{connectivity::ConnectivityRequester, peer_manager::Peer, types::CommsPublicKey, NodeIdentity}; use tari_core::transactions::{tari_amount::MicroTari, CryptoFactories}; @@ -49,6 +49,12 @@ use crate::{ pub const LOG_TARGET: &str = "wallet::utxo_scanning"; +// Cache 1 days worth of headers. +// TODO Determine a better strategy for maintaining a cache. Logarithmic sampling has been suggested but the problem +// with it is that as you move on to the next block you need to resample say a 100 headers where a simple window like +// this only samples 1 header per new block. A ticket has been added to the backlog to think about this +pub const SCANNED_BLOCK_CACHE_SIZE: u64 = 720; + pub struct UtxoScannerService where TBackend: WalletBackend + 'static { @@ -172,14 +178,6 @@ where TBackend: WalletBackend + 'static } } -#[derive(Clone, Default, Serialize, Deserialize)] -pub struct ScanningMetadata { - pub total_amount: MicroTari, - pub number_of_utxos: u64, - pub utxo_index: u64, - pub height_hash: HashOutput, -} - #[derive(Clone)] pub struct UtxoScannerResources { pub db: WalletDatabase, @@ -190,3 +188,12 @@ pub struct UtxoScannerResources { pub node_identity: Arc, pub factories: CryptoFactories, } + +#[derive(Debug, Clone)] +pub struct ScannedBlock { + pub header_hash: HashOutput, + pub height: u64, + pub num_outputs: Option, + pub amount: Option, + pub timestamp: NaiveDateTime, +} diff --git a/base_layer/wallet/src/utxo_scanner_service/utxo_scanner_task.rs b/base_layer/wallet/src/utxo_scanner_service/utxo_scanner_task.rs index 0180d9705f..783d8093b5 100644 --- a/base_layer/wallet/src/utxo_scanner_service/utxo_scanner_task.rs +++ b/base_layer/wallet/src/utxo_scanner_service/utxo_scanner_task.rs @@ -28,19 +28,13 @@ use std::{ use chrono::Utc; use futures::StreamExt; use log::*; -use tari_common_types::transaction::TxId; -use tari_comms::{ - peer_manager::NodeId, - protocol::rpc::{RpcError, RpcStatus}, - types::CommsPublicKey, - PeerConnection, -}; +use tari_common_types::{transaction::TxId, types::HashOutput}; +use tari_comms::{peer_manager::NodeId, types::CommsPublicKey, PeerConnection}; use tari_core::{ - base_node::sync::rpc::BaseNodeSyncRpcClient, + base_node::rpc::BaseNodeWalletRpcClient, blocks::BlockHeader, crypto::tari_utilities::hex::Hex, - proto, - proto::base_node::{FindChainSplitRequest, SyncUtxosRequest}, + proto::base_node::SyncUtxosByBlockRequest, tari_utilities::Hashable, transactions::{ tari_amount::MicroTari, @@ -48,7 +42,7 @@ use tari_core::{ }, }; use tari_shutdown::ShutdownSignal; -use tokio::{sync::broadcast, time}; +use tokio::sync::broadcast; use crate::{ error::WalletError, @@ -56,7 +50,7 @@ use crate::{ utxo_scanner_service::{ error::UtxoScannerError, handle::UtxoScannerEvent, - service::{ScanningMetadata, UtxoScannerResources}, + service::{ScannedBlock, UtxoScannerResources, SCANNED_BLOCK_CACHE_SIZE}, uxto_scanner_service_builder::UtxoScannerMode, }, }; @@ -64,7 +58,6 @@ use crate::{ pub const LOG_TARGET: &str = "wallet::utxo_scanning"; pub const RECOVERY_KEY: &str = "recovery_data"; -const SCANNING_KEY: &str = "scanning_data"; pub struct UtxoScannerTask where TBackend: WalletBackend + 'static @@ -81,27 +74,87 @@ where TBackend: WalletBackend + 'static impl UtxoScannerTask where TBackend: WalletBackend + 'static { + pub async fn run(mut self) -> Result<(), UtxoScannerError> { + if self.mode == UtxoScannerMode::Recovery { + self.set_recovery_mode().await?; + } else if self.check_recovery_mode().await? { + warn!( + target: LOG_TARGET, + "Scanning round aborted as a Recovery is in progress" + ); + return Ok(()); + } + + loop { + if self.shutdown_signal.is_triggered() { + return Ok(()); + } + match self.get_next_peer() { + Some(peer) => match self.attempt_sync(peer.clone()).await { + Ok((num_outputs_recovered, final_height, final_amount, elapsed)) => { + debug!(target: LOG_TARGET, "Scanned to height #{}", final_height); + self.finalize(num_outputs_recovered, final_height, final_amount, elapsed) + .await?; + return Ok(()); + }, + Err(e) => { + warn!( + target: LOG_TARGET, + "Failed to scan UTXO's from base node {}: {}", peer, e + ); + self.publish_event(UtxoScannerEvent::ScanningRoundFailed { + num_retries: self.num_retries, + retry_limit: self.retry_limit, + error: e.to_string(), + }); + continue; + }, + }, + None => { + self.publish_event(UtxoScannerEvent::ScanningRoundFailed { + num_retries: self.num_retries, + retry_limit: self.retry_limit, + error: "No new peers to try after this round".to_string(), + }); + + if self.num_retries >= self.retry_limit { + self.publish_event(UtxoScannerEvent::ScanningFailed); + return Err(UtxoScannerError::UtxoScanningError(format!( + "Failed to scan UTXO's after {} attempt(s) using all {} sync peer(s). Aborting...", + self.num_retries, + self.peer_seeds.len() + ))); + } + + self.num_retries += 1; + // Reset peer index to try connect to the first peer again + self.peer_index = 0; + }, + } + } + } + async fn finalize( &self, - total_scanned: u64, - final_utxo_pos: u64, + num_outputs_recovered: u64, + final_height: u64, + total_value: MicroTari, elapsed: Duration, ) -> Result<(), UtxoScannerError> { - let metadata = self.get_metadata().await?.unwrap_or_default(); self.publish_event(UtxoScannerEvent::Progress { - current_index: final_utxo_pos, - total_index: final_utxo_pos, + current_height: final_height, + tip_height: final_height, }); self.publish_event(UtxoScannerEvent::Completed { - number_scanned: total_scanned, - number_received: metadata.number_of_utxos, - value_received: metadata.total_amount, + final_height, + num_recovered: num_outputs_recovered, + value_recovered: total_value, time_taken: elapsed, }); // Presence of scanning keys are used to determine if a wallet is busy with recovery or not. if self.mode == UtxoScannerMode::Recovery { - self.clear_db().await?; + self.clear_recovery_mode().await?; } Ok(()) } @@ -121,14 +174,11 @@ where TBackend: WalletBackend + 'static retry_limit: self.retry_limit, error: e.to_string(), }); - // No use re-dialing a peer that is not responsive for recovery mode - if self.mode == UtxoScannerMode::Recovery { - if let Ok(Some(connection)) = self.resources.comms_connectivity.get_connection(peer.clone()).await { - if connection.clone().disconnect().await.is_ok() { - debug!(target: LOG_TARGET, "Disconnected base node peer {}", peer); - } - }; - let _ = time::sleep(Duration::from_secs(30)); + + if let Ok(Some(connection)) = self.resources.comms_connectivity.get_connection(peer.clone()).await { + if connection.clone().disconnect().await.is_ok() { + debug!(target: LOG_TARGET, "Disconnected base node peer {}", peer); + } } Err(e.into()) @@ -136,11 +186,11 @@ where TBackend: WalletBackend + 'static } } - async fn attempt_sync(&mut self, peer: NodeId) -> Result<(u64, u64, Duration), UtxoScannerError> { + async fn attempt_sync(&mut self, peer: NodeId) -> Result<(u64, u64, MicroTari, Duration), UtxoScannerError> { let mut connection = self.connect_to_peer(peer.clone()).await?; let mut client = connection - .connect_rpc_using_builder(BaseNodeSyncRpcClient::builder().with_deadline(Duration::from_secs(60))) + .connect_rpc_using_builder(BaseNodeWalletRpcClient::builder().with_deadline(Duration::from_secs(60))) .await?; let latency = client.get_last_request_latency(); @@ -150,36 +200,47 @@ where TBackend: WalletBackend + 'static )); let timer = Instant::now(); - let mut total_scanned = 0u64; + loop { - let start_index = self.get_start_utxo_mmr_pos(&mut client).await?; let tip_header = self.get_chain_tip_header(&mut client).await?; - let output_mmr_size = tip_header.output_mmr_size; + let tip_header_hash = tip_header.hash(); + let start_block = self.get_start_scanned_block(tip_header.height, &mut client).await?; + if self.shutdown_signal.is_triggered() { - // if running is set to false, we know its been canceled upstream so lets exit the loop - return Ok((total_scanned, start_index, timer.elapsed())); + return Ok(( + start_block.num_outputs.unwrap_or(0), + start_block.height, + start_block.amount.unwrap_or_else(|| MicroTari::from(0)), + timer.elapsed(), + )); } debug!( target: LOG_TARGET, - "Scanning UTXO's (start_index = {}, output_mmr_size = {}, height = {}, tip_hash = {})", - start_index, - output_mmr_size, + "Scanning UTXO's from height = {} to current tip_height = {} (starting header_hash: {})", + start_block.height, tip_header.height, - tip_header.hash().to_hex() + start_block.header_hash.to_hex(), ); - // start_index could be greater than output_mmr_size if we switch to a new peer that is behind the original - // peer. In the common case, we wait for start index. - if start_index >= output_mmr_size - 1 { + + // If we have scanned to the tip we are done + if start_block.height >= tip_header.height || start_block.header_hash == tip_header_hash { debug!( target: LOG_TARGET, - "Scanning complete UTXO #{} in {:.2?}", - start_index, + "Scanning complete to current tip (height: {}) in {:.2?}", + start_block.height, timer.elapsed() ); - return Ok((total_scanned, start_index, timer.elapsed())); + return Ok(( + start_block.num_outputs.unwrap_or(0), + start_block.height, + start_block.amount.unwrap_or_else(|| MicroTari::from(0)), + timer.elapsed(), + )); } - let num_scanned = self.scan_utxos(&mut client, start_index, tip_header).await?; + let (num_recovered, num_scanned, amount) = self + .scan_utxos(&mut client, start_block.header_hash, tip_header_hash, tip_header.height) + .await?; if num_scanned == 0 { return Err(UtxoScannerError::UtxoScanningError( "Peer returned 0 UTXOs to scan".to_string(), @@ -187,101 +248,161 @@ where TBackend: WalletBackend + 'static } debug!( target: LOG_TARGET, - "Scanning round completed UTXO #{} in {:.2?} ({} scanned)", - output_mmr_size, + "Scanning round completed up to height {} in {:.2?} ({} outputs scanned, {} recovered with value {})", + tip_header.height, timer.elapsed(), - num_scanned + num_scanned, + num_recovered, + amount ); - - // let num_scanned = 0; - total_scanned += num_scanned; - // return Ok((total_scanned, start_index, timer.elapsed())); } } - async fn get_chain_tip_header(&self, client: &mut BaseNodeSyncRpcClient) -> Result { - let chain_metadata = client.get_chain_metadata().await?; - let chain_height = chain_metadata.height_of_longest_chain(); + async fn get_chain_tip_header( + &self, + client: &mut BaseNodeWalletRpcClient, + ) -> Result { + let tip_info = client.get_tip_info().await?; + let chain_height = tip_info.metadata.map(|m| m.height_of_longest_chain()).unwrap_or(0); let end_header = client.get_header_by_height(chain_height).await?; let end_header = BlockHeader::try_from(end_header).map_err(|_| UtxoScannerError::ConversionError)?; Ok(end_header) } - async fn get_start_utxo_mmr_pos(&self, client: &mut BaseNodeSyncRpcClient) -> Result { - let metadata = match self.get_metadata().await? { - None => { - let birthday_metadata = self.get_birthday_metadata(client).await?; - self.set_metadata(birthday_metadata.clone()).await?; - return Ok(birthday_metadata.utxo_index); - }, - Some(m) => m, - }; + async fn get_start_scanned_block( + &self, + current_tip_height: u64, + client: &mut BaseNodeWalletRpcClient, + ) -> Result { + // Check for reogs + let scanned_blocks = self.resources.db.get_scanned_blocks().await?; + + if scanned_blocks.is_empty() { + let birthday_height_hash = self.get_birthday_header_height_hash(client).await?; + return Ok(ScannedBlock { + header_hash: birthday_height_hash.header_hash, + height: birthday_height_hash.height, + num_outputs: None, + amount: None, + timestamp: Utc::now().naive_utc(), + }); + } - // if it's none, we return 0 above. - let request = FindChainSplitRequest { - block_hashes: vec![metadata.height_hash], - header_count: 1, - }; - // this returns the index of the vec of hashes we sent it, that is the last hash it knows of. - match client.find_chain_split(request).await { - Ok(_) => Ok(metadata.utxo_index + 1), - Err(RpcError::RequestFailed(err)) if err.as_status_code().is_not_found() => { - warn!(target: LOG_TARGET, "Reorg detected: {}", err); - // The node does not know of the last hash we scanned, thus we had a chain split. - // We now start at the wallet birthday again - let birthday_metdadata = self.get_birthday_metadata(client).await?; - Ok(birthday_metdadata.utxo_index) - }, - Err(err) => Err(err.into()), + // Run through the cached blocks and check which are not found in the current chain anymore + // Accumulate number of outputs and recovered Tari in the valid blocks + // Assumption: The blocks are ordered and a reorg will occur to the most recent blocks. Once you have found a + // valid block the blocks before it are also valid and don't need to be checked + let mut missing_scanned_blocks = Vec::new(); + let mut found_scanned_block = None; + let mut num_outputs = 0u64; + let mut amount = MicroTari::from(0); + for sb in scanned_blocks.into_iter() { + if sb.height <= current_tip_height { + if found_scanned_block.is_none() { + let header = BlockHeader::try_from(client.get_header_by_height(sb.height).await?) + .map_err(|_| UtxoScannerError::ConversionError)?; + let header_hash = header.hash(); + if header_hash != sb.header_hash { + missing_scanned_blocks.push(sb.clone()); + } else { + found_scanned_block = Some(sb.clone()); + } + } + if found_scanned_block.is_some() { + num_outputs = num_outputs.saturating_add(sb.num_outputs.unwrap_or(0)); + amount = amount + .checked_add(sb.amount.unwrap_or_else(|| MicroTari::from(0))) + .ok_or(UtxoScannerError::OverflowError)?; + } + } else { + missing_scanned_blocks.push(sb.clone()); + } + } + + if let Some(sb) = found_scanned_block { + let (height, next_header_hash) = if sb.height == current_tip_height { + // If we are at the tip just return the tip height and hash + (current_tip_height, sb.header_hash) + } else { + // If we are not at the tip scanning should resume from the next header in the chain + let next_header = BlockHeader::try_from(client.get_header_by_height(sb.height + 1).await?) + .map_err(|_| UtxoScannerError::ConversionError)?; + let next_header_hash = next_header.hash(); + (sb.height + 1, next_header_hash) + }; + + if !missing_scanned_blocks.is_empty() { + warn!( + target: LOG_TARGET, + "Reorg detected on base node. Restarting scanning from height {} (Header Hash: {})", + height, + next_header_hash.to_hex() + ); + self.resources + .db + .clear_scanned_blocks_from_and_higher( + missing_scanned_blocks + .last() + .expect("cannot fail, the vector is not empty") + .height, + ) + .await?; + } + Ok(ScannedBlock { + height, + num_outputs: Some(num_outputs), + amount: Some(amount), + header_hash: next_header_hash, + timestamp: Utc::now().naive_utc(), + }) + } else { + warn!( + target: LOG_TARGET, + "Reorg detected on base node. No previously scanned block headers found, resuming scan from wallet \ + birthday" + ); + // The node does not know of any of our cached headers so we will start the scan anew from the wallet + // birthday + self.resources.db.clear_scanned_blocks().await?; + let birthday_height_hash = self.get_birthday_header_height_hash(client).await?; + Ok(ScannedBlock { + header_hash: birthday_height_hash.header_hash, + height: birthday_height_hash.height, + num_outputs: None, + amount: None, + timestamp: Utc::now().naive_utc(), + }) } } async fn scan_utxos( &mut self, - client: &mut BaseNodeSyncRpcClient, - start_mmr_leaf_index: u64, - end_header: BlockHeader, - ) -> Result { - debug!( - target: LOG_TARGET, - "Scanning UTXO's from #{} to #{} (height {})", - start_mmr_leaf_index, - end_header.output_mmr_size, - end_header.height - ); + client: &mut BaseNodeWalletRpcClient, + start_header_hash: HashOutput, + end_header_hash: HashOutput, + tip_height: u64, + ) -> Result<(u64, u64, MicroTari), UtxoScannerError> { + // Setting how often the progress event and log should occur during scanning. Defined in blocks + const PROGRESS_REPORT_INTERVAL: u64 = 100; - let end_header_hash = end_header.hash(); - let output_mmr_size = end_header.output_mmr_size; let mut num_recovered = 0u64; let mut total_amount = MicroTari::from(0); let mut total_scanned = 0; - self.publish_event(UtxoScannerEvent::Progress { - current_index: start_mmr_leaf_index, - total_index: (output_mmr_size - 1), - }); - let request = SyncUtxosRequest { - start: start_mmr_leaf_index, + let request = SyncUtxosByBlockRequest { + start_header_hash: start_header_hash.clone(), end_header_hash: end_header_hash.clone(), - include_pruned_utxos: false, - include_deleted_bitmaps: false, }; let start = Instant::now(); - let utxo_stream = client.sync_utxos(request).await?; + let mut utxo_stream = client.sync_utxos_by_block(request).await?; trace!( target: LOG_TARGET, "bulletproof rewind profile - UTXO stream request time {} ms", start.elapsed().as_millis(), ); - // We download in chunks for improved streaming efficiency - const CHUNK_SIZE: usize = 125; - let mut utxo_stream = utxo_stream.chunks(CHUNK_SIZE); - const COMMIT_EVERY_N: u64 = (1000_i64 / CHUNK_SIZE as i64) as u64; - let mut last_utxo_index = 0u64; - let mut iteration_count = 0u64; let mut utxo_next_await_profiling = Vec::new(); let mut scan_for_outputs_profiling = Vec::new(); while let Some(response) = { @@ -292,32 +413,53 @@ where TBackend: WalletBackend + 'static } { if self.shutdown_signal.is_triggered() { // if running is set to false, we know its been canceled upstream so lets exit the loop - return Ok(total_scanned as u64); + return Ok((num_recovered, total_scanned as u64, total_amount)); } - let (outputs, utxo_index) = convert_response_to_transaction_outputs(response, last_utxo_index)?; - last_utxo_index = utxo_index; + + let response = response.map_err(|e| UtxoScannerError::RpcStatus(e.to_string()))?; + let current_height = response.height; + let current_header_hash = response.header_hash; + let outputs = response + .outputs + .into_iter() + .map(|utxo| TransactionOutput::try_from(utxo).map_err(|_| UtxoScannerError::ConversionError)) + .collect::, _>>()?; + total_scanned += outputs.len(); - iteration_count += 1; let start = Instant::now(); let found_outputs = self.scan_for_outputs(outputs).await?; scan_for_outputs_profiling.push(start.elapsed()); - // Reduce the number of db hits by only persisting progress every N iterations - if iteration_count % COMMIT_EVERY_N == 0 || last_utxo_index >= output_mmr_size - 1 { + let (count, amount) = self.import_utxos_to_transaction_service(found_outputs).await?; + + self.resources + .db + .save_scanned_block(ScannedBlock { + header_hash: current_header_hash, + height: current_height, + num_outputs: Some(count), + amount: Some(amount), + timestamp: Utc::now().naive_utc(), + }) + .await?; + + self.resources + .db + .clear_scanned_blocks_before_height(current_height.saturating_sub(SCANNED_BLOCK_CACHE_SIZE), true) + .await?; + + if current_height % PROGRESS_REPORT_INTERVAL == 0 { + debug!( + target: LOG_TARGET, + "Scanned up to block {} with a current tip_height of {}", current_height, tip_height + ); self.publish_event(UtxoScannerEvent::Progress { - current_index: last_utxo_index, - total_index: (output_mmr_size - 1), + current_height, + tip_height, }); - self.update_scanning_progress_in_db( - last_utxo_index, - total_amount, - num_recovered, - end_header_hash.clone(), - ) - .await?; } - let (count, amount) = self.import_utxos_to_transaction_service(found_outputs).await?; + num_recovered = num_recovered.saturating_add(count); total_amount += amount; } @@ -333,30 +475,8 @@ where TBackend: WalletBackend + 'static total_scanned, scan_for_outputs_profiling.iter().fold(0, |acc, &x| acc + x.as_millis()), ); - self.update_scanning_progress_in_db(last_utxo_index, total_amount, num_recovered, end_header_hash) - .await?; - self.publish_event(UtxoScannerEvent::Progress { - current_index: (output_mmr_size - 1), - total_index: (output_mmr_size - 1), - }); - Ok(total_scanned as u64) - } - - async fn update_scanning_progress_in_db( - &self, - last_utxo_index: u64, - total_amount: MicroTari, - num_recovered: u64, - end_header_hash: Vec, - ) -> Result<(), UtxoScannerError> { - let mut meta_data = self.get_metadata().await?.unwrap_or_default(); - meta_data.height_hash = end_header_hash; - meta_data.number_of_utxos += num_recovered; - meta_data.utxo_index = last_utxo_index; - meta_data.total_amount += total_amount; - self.set_metadata(meta_data).await?; - Ok(()) + Ok((num_recovered, total_scanned as u64, total_amount)) } async fn scan_for_outputs( @@ -417,32 +537,28 @@ where TBackend: WalletBackend + 'static Ok((num_recovered, total_amount)) } - fn get_db_mode_key(&self) -> String { - match self.mode { - UtxoScannerMode::Recovery => RECOVERY_KEY.to_owned(), - UtxoScannerMode::Scanning => SCANNING_KEY.to_owned(), - } - } - - async fn set_metadata(&self, data: ScanningMetadata) -> Result<(), UtxoScannerError> { - let total_key = self.get_db_mode_key(); - let db_value = serde_json::to_string(&data)?; - self.resources.db.set_client_key_value(total_key, db_value).await?; + async fn set_recovery_mode(&self) -> Result<(), UtxoScannerError> { + self.resources + .db + .set_client_key_value(RECOVERY_KEY.to_owned(), Utc::now().to_string()) + .await?; Ok(()) } - async fn get_metadata(&self) -> Result, UtxoScannerError> { - let total_key = self.get_db_mode_key(); - let value: Option = self.resources.db.get_client_key_from_str(total_key).await?; + async fn check_recovery_mode(&self) -> Result { + let value: Option = self + .resources + .db + .get_client_key_from_str(RECOVERY_KEY.to_owned()) + .await?; match value { - None => Ok(None), - Some(v) => Ok(serde_json::from_str(&v)?), + None => Ok(false), + Some(_v) => Ok(true), } } - async fn clear_db(&self) -> Result<(), UtxoScannerError> { - let total_key = self.get_db_mode_key(); - let _ = self.resources.db.clear_client_value(total_key).await?; + async fn clear_recovery_mode(&self) -> Result<(), UtxoScannerError> { + let _ = self.resources.db.clear_client_value(RECOVERY_KEY.to_owned()).await?; Ok(()) } @@ -481,66 +597,16 @@ where TBackend: WalletBackend + 'static Ok(tx_id) } - pub async fn run(mut self) -> Result<(), UtxoScannerError> { - loop { - if self.shutdown_signal.is_triggered() { - // if running is set to false, we know its been canceled upstream so lets exit the loop - return Ok(()); - } - match self.get_next_peer() { - Some(peer) => match self.attempt_sync(peer.clone()).await { - Ok((total_scanned, final_utxo_pos, elapsed)) => { - debug!(target: LOG_TARGET, "Scanned to UTXO #{}", final_utxo_pos); - self.finalize(total_scanned, final_utxo_pos, elapsed).await?; - return Ok(()); - }, - Err(e) => { - warn!( - target: LOG_TARGET, - "Failed to scan UTXO's from base node {}: {}", peer, e - ); - self.publish_event(UtxoScannerEvent::ScanningRoundFailed { - num_retries: self.num_retries, - retry_limit: self.retry_limit, - error: e.to_string(), - }); - continue; - }, - }, - None => { - self.publish_event(UtxoScannerEvent::ScanningRoundFailed { - num_retries: self.num_retries, - retry_limit: self.retry_limit, - error: "No new peers to try after this round".to_string(), - }); - - if self.num_retries >= self.retry_limit { - self.publish_event(UtxoScannerEvent::ScanningFailed); - return Err(UtxoScannerError::UtxoScanningError(format!( - "Failed to scan UTXO's after {} attempt(s) using all {} sync peer(s). Aborting...", - self.num_retries, - self.peer_seeds.len() - ))); - } - - self.num_retries += 1; - // Reset peer index to try connect to the first peer again - self.peer_index = 0; - }, - } - } - } - fn get_next_peer(&mut self) -> Option { let peer = self.peer_seeds.get(self.peer_index).map(NodeId::from_public_key); self.peer_index += 1; peer } - async fn get_birthday_metadata( + async fn get_birthday_header_height_hash( &self, - client: &mut BaseNodeSyncRpcClient, - ) -> Result { + client: &mut BaseNodeWalletRpcClient, + ) -> Result { let birthday = self.resources.db.get_wallet_birthday().await?; // Calculate the unix epoch time of two days before the wallet birthday. This is to avoid any weird time zone // issues @@ -557,50 +623,21 @@ where TBackend: WalletBackend + 'static }; let header = client.get_header_by_height(block_height).await?; let header = BlockHeader::try_from(header).map_err(|_| UtxoScannerError::ConversionError)?; - + let header_hash = header.hash(); info!( target: LOG_TARGET, - "Fresh wallet recovery starting at Block {}", block_height + "Fresh wallet recovery starting at Block {} (Header Hash: {})", + block_height, + header_hash.to_hex(), ); - Ok(ScanningMetadata { - total_amount: Default::default(), - number_of_utxos: 0, - utxo_index: header.output_mmr_size, - height_hash: header.hash(), + Ok(HeightHash { + height: block_height, + header_hash, }) } } -fn convert_response_to_transaction_outputs( - response: Vec>, - last_utxo_index: u64, -) -> Result<(Vec, u64), UtxoScannerError> { - let response: Vec = response - .into_iter() - .map(|v| v.map_err(|e| UtxoScannerError::RpcStatus(e.to_string()))) - .collect::, _>>()?; - - let current_utxo_index = response - // Assumes correct ordering which is otherwise not required for this protocol - .last() - .ok_or_else(|| { - UtxoScannerError::BaseNodeResponseError("Invalid response from base node: response was empty".to_string()) - })? - .mmr_index; - if current_utxo_index < last_utxo_index { - return Err(UtxoScannerError::BaseNodeResponseError( - "Invalid response from base node: mmr index must be non-decreasing".to_string(), - )); - } - - let outputs = response - .into_iter() - .filter_map(|utxo| { - utxo.into_utxo() - .and_then(|o| o.utxo) - .and_then(|utxo| utxo.into_transaction_output()) - .map(|output| TransactionOutput::try_from(output).map_err(|_| UtxoScannerError::ConversionError)) - }) - .collect::, _>>()?; - Ok((outputs, current_utxo_index)) +struct HeightHash { + height: u64, + header_hash: HashOutput, } diff --git a/base_layer/wallet/src/utxo_scanner_service/uxto_scanner_service_builder.rs b/base_layer/wallet/src/utxo_scanner_service/uxto_scanner_service_builder.rs index fadec3c353..271ab0a3bc 100644 --- a/base_layer/wallet/src/utxo_scanner_service/uxto_scanner_service_builder.rs +++ b/base_layer/wallet/src/utxo_scanner_service/uxto_scanner_service_builder.rs @@ -33,7 +33,7 @@ use crate::{ output_manager_service::handle::OutputManagerHandle, storage::{ database::{WalletBackend, WalletDatabase}, - sqlite_db::WalletSqliteDatabase, + sqlite_db::wallet::WalletSqliteDatabase, }, transaction_service::handle::TransactionServiceHandle, utxo_scanner_service::{ diff --git a/base_layer/wallet/tests/contacts_service/mod.rs b/base_layer/wallet/tests/contacts_service.rs similarity index 76% rename from base_layer/wallet/tests/contacts_service/mod.rs rename to base_layer/wallet/tests/contacts_service.rs index ba4f37722d..b325c9221a 100644 --- a/base_layer/wallet/tests/contacts_service/mod.rs +++ b/base_layer/wallet/tests/contacts_service.rs @@ -1,3 +1,25 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + // Copyright 2019. The Tari Project // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that the @@ -37,7 +59,8 @@ use tari_wallet::contacts_service::{ }; use tokio::runtime::Runtime; -use crate::support::data::get_temp_sqlite_database_connection; +pub mod support; +use support::data::get_temp_sqlite_database_connection; pub fn setup_contacts_service( runtime: &mut Runtime, diff --git a/base_layer/wallet/tests/mod.rs b/base_layer/wallet/tests/output_manager_service.rs similarity index 91% rename from base_layer/wallet/tests/mod.rs rename to base_layer/wallet/tests/output_manager_service.rs index a7a8824b0b..74748b3a6a 100644 --- a/base_layer/wallet/tests/mod.rs +++ b/base_layer/wallet/tests/output_manager_service.rs @@ -1,4 +1,4 @@ -// Copyright 2019. The Tari Project +// Copyright 2021. The Tari Project // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that the // following conditions are met: @@ -20,8 +20,5 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -pub mod contacts_service; -pub mod output_manager_service; +mod output_manager_service_tests; pub mod support; -pub mod transaction_service; -pub mod wallet; diff --git a/base_layer/wallet/tests/output_manager_service/mod.rs b/base_layer/wallet/tests/output_manager_service_tests/mod.rs similarity index 95% rename from base_layer/wallet/tests/output_manager_service/mod.rs rename to base_layer/wallet/tests/output_manager_service_tests/mod.rs index 4e344eb9f5..fbc3a8f203 100644 --- a/base_layer/wallet/tests/output_manager_service/mod.rs +++ b/base_layer/wallet/tests/output_manager_service_tests/mod.rs @@ -1,4 +1,4 @@ -// Copyright 2019. The Tari Project +// Copyright 2021. The Tari Project // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that the // following conditions are met: @@ -19,6 +19,5 @@ // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -pub mod service; -pub mod storage; +mod service; +mod storage; diff --git a/base_layer/wallet/tests/output_manager_service/service.rs b/base_layer/wallet/tests/output_manager_service_tests/service.rs similarity index 99% rename from base_layer/wallet/tests/output_manager_service/service.rs rename to base_layer/wallet/tests/output_manager_service_tests/service.rs index dc3058d6dd..6f7a94452f 100644 --- a/base_layer/wallet/tests/output_manager_service/service.rs +++ b/base_layer/wallet/tests/output_manager_service_tests/service.rs @@ -123,7 +123,6 @@ async fn setup_output_manager_service( let (sender, receiver_bns) = reply_channel::unbounded(); let (event_publisher_bns, _) = broadcast::channel(100); - let basenode_service_handle = BaseNodeServiceHandle::new(sender, event_publisher_bns.clone()); let mut mock_base_node_service = MockBaseNodeService::new(receiver_bns, shutdown.to_signal()); mock_base_node_service.set_default_base_node_state(); diff --git a/base_layer/wallet/tests/output_manager_service/storage.rs b/base_layer/wallet/tests/output_manager_service_tests/storage.rs similarity index 100% rename from base_layer/wallet/tests/output_manager_service/storage.rs rename to base_layer/wallet/tests/output_manager_service_tests/storage.rs diff --git a/base_layer/wallet/tests/support/comms_rpc.rs b/base_layer/wallet/tests/support/comms_rpc.rs index 62edc0fd98..4b69752325 100644 --- a/base_layer/wallet/tests/support/comms_rpc.rs +++ b/base_layer/wallet/tests/support/comms_rpc.rs @@ -21,15 +21,16 @@ // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. use std::{ + cmp::min, collections::HashMap, convert::TryFrom, sync::{Arc, Mutex}, time::{Duration, Instant}, }; -use tari_common_types::types::Signature; +use tari_common_types::types::{HashOutput, Signature}; use tari_comms::{ - protocol::rpc::{NamedProtocolService, Request, Response, RpcClient, RpcStatus}, + protocol::rpc::{NamedProtocolService, Request, Response, RpcClient, RpcStatus, Streaming}, PeerConnection, }; use tari_core::{ @@ -47,6 +48,8 @@ use tari_core::{ QueryDeletedRequest, QueryDeletedResponse, Signatures as SignaturesProto, + SyncUtxosByBlockRequest, + SyncUtxosByBlockResponse, TipInfoResponse, TxQueryBatchResponses as TxQueryBatchResponsesProto, TxQueryResponse as TxQueryResponseProto, @@ -63,7 +66,7 @@ use tari_core::{ tari_utilities::Hashable, transactions::transaction::{Transaction, TransactionOutput}, }; -use tokio::time::sleep; +use tokio::{sync::mpsc, time::sleep}; pub async fn connect_rpc_client(connection: &mut PeerConnection) -> T where T: From + NamedProtocolService { @@ -87,6 +90,8 @@ pub struct BaseNodeWalletRpcMockState { utxo_query_calls: Arc>>>>, query_deleted_calls: Arc>>, get_header_by_height_calls: Arc>>, + get_height_at_time_calls: Arc>>, + sync_utxo_by_block_calls: Arc>>, submit_transaction_response: Arc>, transaction_query_response: Arc>, transaction_query_batch_response: Arc>, @@ -100,6 +105,8 @@ pub struct BaseNodeWalletRpcMockState { synced: Arc>, utxos: Arc>>, blocks: Arc>>, + utxos_by_block: Arc>>, + sync_utxos_by_block_trigger_channel: Arc>>>, } #[allow(clippy::mutex_atomic)] @@ -112,6 +119,8 @@ impl BaseNodeWalletRpcMockState { utxo_query_calls: Arc::new(Mutex::new(vec![])), query_deleted_calls: Arc::new(Mutex::new(vec![])), get_header_by_height_calls: Arc::new(Mutex::new(vec![])), + get_height_at_time_calls: Arc::new(Mutex::new(vec![])), + sync_utxo_by_block_calls: Arc::new(Mutex::new(vec![])), submit_transaction_response: Arc::new(Mutex::new(TxSubmissionResponse { accepted: true, rejection_reason: TxSubmissionRejectionReason::None, @@ -159,6 +168,8 @@ impl BaseNodeWalletRpcMockState { synced: Arc::new(Mutex::new(true)), utxos: Arc::new(Mutex::new(Vec::new())), blocks: Arc::new(Mutex::new(Default::default())), + utxos_by_block: Arc::new(Mutex::new(vec![])), + sync_utxos_by_block_trigger_channel: Arc::new(Mutex::new(None)), } } @@ -219,6 +230,17 @@ impl BaseNodeWalletRpcMockState { *lock = blocks; } + pub fn set_utxos_by_block(&self, utxos_by_block: Vec) { + let mut lock = acquire_lock!(self.utxos_by_block); + *lock = utxos_by_block; + } + + /// This channel will used to control which height a sync stream will return to from the testing client + pub fn set_utxos_by_block_trigger_channel(&self, channel: mpsc::Receiver) { + let mut lock = acquire_lock!(self.sync_utxos_by_block_trigger_channel); + *lock = Some(channel); + } + pub fn take_utxo_query_calls(&self) -> Vec>> { acquire_lock!(self.utxo_query_calls).drain(..).collect() } @@ -275,6 +297,44 @@ impl BaseNodeWalletRpcMockState { acquire_lock!(self.get_header_by_height_calls).pop() } + pub fn pop_get_height_at_time_calls(&self) -> Option { + acquire_lock!(self.get_height_at_time_calls).pop() + } + + pub fn take_get_height_at_time_calls(&self) -> Vec { + acquire_lock!(self.get_height_at_time_calls).drain(..).collect() + } + + pub fn take_sync_utxos_by_block_calls(&self) -> Vec<(HashOutput, HashOutput)> { + acquire_lock!(self.sync_utxo_by_block_calls).drain(..).collect() + } + + pub fn pop_sync_utxos_by_block_calls(&self) -> Option<(HashOutput, HashOutput)> { + acquire_lock!(self.sync_utxo_by_block_calls).pop() + } + + pub async fn wait_pop_sync_utxos_by_block_calls( + &self, + num_calls: usize, + timeout: Duration, + ) -> Result, String> { + let now = Instant::now(); + let mut count = 0usize; + while now.elapsed() < timeout { + let mut lock = acquire_lock!(self.sync_utxo_by_block_calls); + count = (*lock).len(); + if (*lock).len() >= num_calls { + return Ok((*lock).drain(..num_calls).collect()); + } + drop(lock); + sleep(Duration::from_millis(100)).await; + } + Err(format!( + "Did not receive enough calls within the timeout period, received {}, expected {}.", + count, num_calls + )) + } + pub async fn wait_pop_get_header_by_height_calls( &self, num_calls: usize, @@ -297,6 +357,24 @@ impl BaseNodeWalletRpcMockState { )) } + pub async fn wait_pop_get_height_at_time(&self, num_calls: usize, timeout: Duration) -> Result, String> { + let now = Instant::now(); + let mut count = 0usize; + while now.elapsed() < timeout { + let mut lock = acquire_lock!(self.get_height_at_time_calls); + count = (*lock).len(); + if (*lock).len() >= num_calls { + return Ok((*lock).drain(..num_calls).collect()); + } + drop(lock); + sleep(Duration::from_millis(100)).await; + } + Err(format!( + "Did not receive enough calls within the timeout period, received {}, expected {}.", + count, num_calls + )) + } + pub async fn wait_pop_utxo_query_calls( &self, num_calls: usize, @@ -644,6 +722,107 @@ impl BaseNodeWalletService for BaseNodeWalletRpcMockService { Err(RpcStatus::not_found("Header not found")) } } + + async fn get_height_at_time(&self, request: Request) -> Result, RpcStatus> { + let time = request.into_message(); + + let mut height_at_time_lock = acquire_lock!(self.state.get_height_at_time_calls); + (*height_at_time_lock).push(time); + + let block_lock = acquire_lock!(self.state.blocks); + + let mut headers = (*block_lock).values().cloned().collect::>(); + headers.sort_by(|a, b| b.height.cmp(&a.height)); + + let mut found_height = 0; + for h in headers.iter() { + if h.timestamp.as_u64() < time { + found_height = h.height; + break; + } + } + if found_height == 0 { + found_height = headers[0].height; + } + Ok(Response::new(found_height)) + } + + async fn sync_utxos_by_block( + &self, + request: Request, + ) -> Result, RpcStatus> { + let SyncUtxosByBlockRequest { + start_header_hash, + end_header_hash, + } = request.into_message(); + + let mut sync_utxo_by_block_lock = acquire_lock!(self.state.sync_utxo_by_block_calls); + (*sync_utxo_by_block_lock).push((start_header_hash.clone(), end_header_hash.clone())); + + let block_lock = acquire_lock!(self.state.utxos_by_block); + let mut blocks = (*block_lock).clone(); + blocks.sort_by(|a, b| a.height.cmp(&b.height)); + + let start_index = blocks.iter().position(|b| b.header_hash == start_header_hash); + let end_index = blocks.iter().position(|b| b.header_hash == end_header_hash); + + let mut channel_lock = acquire_lock!(self.state.sync_utxos_by_block_trigger_channel); + let trigger_channel_option = (*channel_lock).take(); + + if let (Some(start), Some(end)) = (start_index, end_index) { + let (tx, rx) = mpsc::channel(200); + let task = async move { + if let Some(mut trigger_channel) = trigger_channel_option { + let mut current_block = start; + while let Some(trigger_block) = trigger_channel.recv().await { + if trigger_block < current_block { + // This is a testing harness so just panic if used incorrectly. + panic!("Trigger block cannot be before current starting block"); + } + for b in blocks + .clone() + .into_iter() + .skip(current_block) + .take(min(trigger_block, end) - current_block + 1) + { + let item = SyncUtxosByBlockResponse { + outputs: b.utxos.clone().into_iter().map(|o| o.into()).collect(), + height: b.height, + header_hash: b.header_hash.clone(), + }; + tx.send(Ok(item)).await.unwrap(); + } + if trigger_block >= end { + break; + } + current_block = trigger_block + 1; + } + } else { + for b in blocks.into_iter().skip(start).take(end - start + 1) { + let item = SyncUtxosByBlockResponse { + outputs: b.utxos.clone().into_iter().map(|o| o.into()).collect(), + height: b.height, + header_hash: b.header_hash.clone(), + }; + tx.send(Ok(item)).await.unwrap(); + } + } + }; + + tokio::spawn(task); + + Ok(Streaming::new(rx)) + } else { + Err(RpcStatus::not_found("Headers not found")) + } + } +} + +#[derive(Clone, Debug)] +pub struct UtxosByBlock { + pub height: u64, + pub header_hash: Vec, + pub utxos: Vec, } #[cfg(test)] diff --git a/base_layer/wallet/tests/support/mod.rs b/base_layer/wallet/tests/support/mod.rs index ea01f6c3d9..6915c1cc0d 100644 --- a/base_layer/wallet/tests/support/mod.rs +++ b/base_layer/wallet/tests/support/mod.rs @@ -24,3 +24,5 @@ pub mod utils; pub mod comms_and_services; pub mod comms_rpc; pub mod data; +pub mod output_manager_service_mock; +pub mod transaction_service_mock; diff --git a/base_layer/wallet/tests/support/output_manager_service_mock.rs b/base_layer/wallet/tests/support/output_manager_service_mock.rs new file mode 100644 index 0000000000..a409dd2c4c --- /dev/null +++ b/base_layer/wallet/tests/support/output_manager_service_mock.rs @@ -0,0 +1,166 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +use std::sync::{Arc, Mutex}; + +use futures::StreamExt; +use log::*; +use tari_service_framework::{reply_channel, reply_channel::Receiver}; +use tari_shutdown::ShutdownSignal; +use tari_wallet::output_manager_service::{ + error::OutputManagerError, + handle::{OutputManagerEvent, OutputManagerHandle, OutputManagerRequest, OutputManagerResponse}, + storage::models::DbUnblindedOutput, +}; +use tokio::sync::{broadcast, broadcast::Sender, oneshot}; + +const LOG_TARGET: &str = "wallet::output_manager_service_mock"; + +pub fn make_output_manager_service_mock( + shutdown_signal: ShutdownSignal, +) -> (OutputManagerServiceMock, OutputManagerHandle) { + let (sender, receiver) = reply_channel::unbounded(); + let (publisher, _) = broadcast::channel(100); + let output_manager_handle = OutputManagerHandle::new(sender, publisher.clone()); + let mock = OutputManagerServiceMock::new(publisher, receiver, shutdown_signal); + (mock, output_manager_handle) +} + +pub struct OutputManagerServiceMock { + _event_publisher: Sender>, + request_stream: Option>>, + shutdown_signal: ShutdownSignal, + state: OutputManagerMockState, +} + +impl OutputManagerServiceMock { + pub fn new( + event_publisher: Sender>, + request_stream: Receiver>, + shutdown_signal: ShutdownSignal, + ) -> Self { + Self { + _event_publisher: event_publisher, + request_stream: Some(request_stream), + shutdown_signal, + state: OutputManagerMockState::new(), + } + } + + pub fn get_state(&self) -> OutputManagerMockState { + self.state.clone() + } + + pub async fn run(mut self) { + info!(target: LOG_TARGET, "Starting Mock OutputManager Service"); + let mut shutdown = self.shutdown_signal.clone(); + let mut request_stream = self.request_stream.take().unwrap(); + + loop { + tokio::select! { + Some(request_context) = request_stream.next() => { + let (request, reply_tx) = request_context.split(); + self.handle_request(request, reply_tx); + }, + _ = shutdown.wait() => { + info!(target: LOG_TARGET, "OutputManager service mock shutting down because it received the shutdown signal"); + break; + } + } + } + } + + fn handle_request( + &self, + request: OutputManagerRequest, + reply_tx: oneshot::Sender>, + ) { + info!(target: LOG_TARGET, "Handling Request: {}", request); + match request { + OutputManagerRequest::ScanForRecoverableOutputs(requested_outputs) => { + let lock = acquire_lock!(self.state.recoverable_outputs); + let outputs = (*lock) + .clone() + .into_iter() + .filter_map(|dbuo| { + if requested_outputs.iter().any(|ro| dbuo.commitment == ro.commitment) { + Some(dbuo.unblinded_output) + } else { + None + } + }) + .collect(); + + let _ = reply_tx + .send(Ok(OutputManagerResponse::RewoundOutputs(outputs))) + .map_err(|e| { + warn!(target: LOG_TARGET, "Failed to send reply"); + e + }); + }, + OutputManagerRequest::ScanOutputs(_to) => { + let lock = acquire_lock!(self.state.one_sided_payments); + let outputs = (*lock).clone(); + let _ = reply_tx + .send(Ok(OutputManagerResponse::ScanOutputs( + outputs.into_iter().map(|dbuo| dbuo.unblinded_output).collect(), + ))) + .map_err(|e| { + warn!(target: LOG_TARGET, "Failed to send reply"); + e + }); + }, + _ => panic!("Output Manager Service Mock does not support this call"), + } + } +} + +#[derive(Clone, Debug)] +pub struct OutputManagerMockState { + pub recoverable_outputs: Arc>>, + pub one_sided_payments: Arc>>, +} + +impl OutputManagerMockState { + pub fn new() -> Self { + Self { + recoverable_outputs: Arc::new(Mutex::new(Vec::new())), + one_sided_payments: Arc::new(Mutex::new(Vec::new())), + } + } + + pub fn set_recoverable_outputs(&self, outputs: Vec) { + let mut lock = acquire_lock!(self.recoverable_outputs); + *lock = outputs; + } + + pub fn _set_one_sided_payments(&self, outputs: Vec) { + let mut lock = acquire_lock!(self.one_sided_payments); + *lock = outputs; + } +} + +impl Default for OutputManagerMockState { + fn default() -> Self { + Self::new() + } +} diff --git a/base_layer/wallet/tests/support/transaction_service_mock.rs b/base_layer/wallet/tests/support/transaction_service_mock.rs new file mode 100644 index 0000000000..5fa2446e6c --- /dev/null +++ b/base_layer/wallet/tests/support/transaction_service_mock.rs @@ -0,0 +1,108 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +use std::sync::Arc; + +use futures::StreamExt; +use log::*; +use tari_service_framework::{reply_channel, reply_channel::Receiver}; +use tari_shutdown::ShutdownSignal; +use tari_wallet::transaction_service::{ + error::TransactionServiceError, + handle::{TransactionEvent, TransactionServiceHandle, TransactionServiceRequest, TransactionServiceResponse}, +}; +use tokio::sync::{broadcast, broadcast::Sender, oneshot}; + +const LOG_TARGET: &str = "wallet::transaction_service_mock"; + +pub fn make_transaction_service_mock( + shutdown_signal: ShutdownSignal, +) -> (TransactionServiceMock, TransactionServiceHandle) { + let (sender, receiver) = reply_channel::unbounded(); + let (publisher, _) = broadcast::channel(100); + let transaction_handle = TransactionServiceHandle::new(sender, publisher.clone()); + let mock = TransactionServiceMock::new(publisher, receiver, shutdown_signal); + (mock, transaction_handle) +} + +pub struct TransactionServiceMock { + _event_publisher: Sender>, + request_stream: + Option>>, + shutdown_signal: ShutdownSignal, +} + +impl TransactionServiceMock { + pub fn new( + event_publisher: Sender>, + request_stream: Receiver< + TransactionServiceRequest, + Result, + >, + shutdown_signal: ShutdownSignal, + ) -> Self { + Self { + _event_publisher: event_publisher, + request_stream: Some(request_stream), + shutdown_signal, + } + } + + pub async fn run(mut self) { + info!(target: LOG_TARGET, "Starting Mock Transaction Service"); + + let mut shutdown = self.shutdown_signal.clone(); + let mut request_stream = self.request_stream.take().unwrap(); + + loop { + tokio::select! { + Some(request_context) = request_stream.next() => { + let (request, reply_tx) = request_context.split(); + Self::handle_request(request, reply_tx); + }, + _ = shutdown.wait() => { + info!(target: LOG_TARGET, "Transaction service mock shutting down because it received the shutdown signal"); + break; + } + } + } + } + + fn handle_request( + request: TransactionServiceRequest, + reply_tx: oneshot::Sender>, + ) { + info!(target: LOG_TARGET, "Handling Request: {}", request); + + match request { + TransactionServiceRequest::ImportUtxo(_, _, _, _) => { + let _ = reply_tx + .send(Ok(TransactionServiceResponse::UtxoImported(42))) + .map_err(|e| { + warn!(target: LOG_TARGET, "Failed to send reply"); + e + }); + }, + _ => panic!("Transaction Service Mock does not support this call"), + } + } +} diff --git a/base_layer/wallet/tests/support/utils.rs b/base_layer/wallet/tests/support/utils.rs index 5c42c06452..30179dc8bf 100644 --- a/base_layer/wallet/tests/support/utils.rs +++ b/base_layer/wallet/tests/support/utils.rs @@ -20,8 +20,6 @@ // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -use std::{fmt::Debug, thread, time::Duration}; - use rand::{CryptoRng, Rng}; use tari_common_types::types::{CommitmentFactory, PrivateKey, PublicKey}; use tari_core::transactions::{ @@ -34,32 +32,6 @@ use tari_crypto::{ script, }; -pub fn assert_change(mut func: F, to: T, poll_count: usize) -where - F: FnMut() -> T, - T: Eq + Debug, -{ - let mut i = 0; - loop { - let last_val = func(); - if last_val == to { - break; - } - - i += 1; - if i >= poll_count { - panic!( - "Value did not change to {:?} within {}ms (last value: {:?})", - to, - poll_count * 100, - last_val, - ); - } - - thread::sleep(Duration::from_millis(100)); - } -} - pub struct TestParams { pub spend_key: PrivateKey, pub change_spend_key: PrivateKey, diff --git a/base_layer/wallet/tests/transaction_service.rs b/base_layer/wallet/tests/transaction_service.rs new file mode 100644 index 0000000000..fee8cdd673 --- /dev/null +++ b/base_layer/wallet/tests/transaction_service.rs @@ -0,0 +1,24 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +pub mod support; +mod transaction_service_tests; diff --git a/base_layer/wallet/tests/transaction_service_tests/mod.rs b/base_layer/wallet/tests/transaction_service_tests/mod.rs new file mode 100644 index 0000000000..4431baf1d3 --- /dev/null +++ b/base_layer/wallet/tests/transaction_service_tests/mod.rs @@ -0,0 +1,24 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +mod service; +mod storage; +mod transaction_protocols; diff --git a/base_layer/wallet/tests/transaction_service/service.rs b/base_layer/wallet/tests/transaction_service_tests/service.rs similarity index 99% rename from base_layer/wallet/tests/transaction_service/service.rs rename to base_layer/wallet/tests/transaction_service_tests/service.rs index 75d1468e60..e8cc71fbd5 100644 --- a/base_layer/wallet/tests/transaction_service/service.rs +++ b/base_layer/wallet/tests/transaction_service_tests/service.rs @@ -123,7 +123,7 @@ use tari_wallet::{ }, storage::{ database::WalletDatabase, - sqlite_db::WalletSqliteDatabase, + sqlite_db::wallet::WalletSqliteDatabase, sqlite_utilities::{run_migration_and_create_sqlite_connection, WalletDbConnection}, }, test_utils::{create_consensus_constants, make_wallet_database_connection}, diff --git a/base_layer/wallet/tests/transaction_service/storage.rs b/base_layer/wallet/tests/transaction_service_tests/storage.rs similarity index 100% rename from base_layer/wallet/tests/transaction_service/storage.rs rename to base_layer/wallet/tests/transaction_service_tests/storage.rs diff --git a/base_layer/wallet/tests/transaction_service/transaction_protocols.rs b/base_layer/wallet/tests/transaction_service_tests/transaction_protocols.rs similarity index 97% rename from base_layer/wallet/tests/transaction_service/transaction_protocols.rs rename to base_layer/wallet/tests/transaction_service_tests/transaction_protocols.rs index 7364b171c3..67650fe53e 100644 --- a/base_layer/wallet/tests/transaction_service/transaction_protocols.rs +++ b/base_layer/wallet/tests/transaction_service_tests/transaction_protocols.rs @@ -91,16 +91,7 @@ use crate::support::{ utils::make_input, }; -// Just in case other options become apparent in later testing -#[derive(PartialEq)] -pub enum TxProtocolTestConfig { - WithConnection, - WithoutConnection, -} - -pub async fn setup( - config: TxProtocolTestConfig, -) -> ( +pub async fn setup() -> ( TransactionServiceResources, OutboundServiceMockState, MockRpcServer>, @@ -125,13 +116,11 @@ pub async fn setup( let wallet_connectivity = create_wallet_connectivity_mock(); - if config == TxProtocolTestConfig::WithConnection { - let mut connection = mock_rpc_server - .create_connection(server_node_identity.to_peer(), protocol_name.into()) - .await; + let mut connection = mock_rpc_server + .create_connection(server_node_identity.to_peer(), protocol_name.into()) + .await; - wallet_connectivity.set_base_node_wallet_rpc_client(connect_rpc_client(&mut connection).await); - } + wallet_connectivity.set_base_node_wallet_rpc_client(connect_rpc_client(&mut connection).await); let db_name = format!("{}.sqlite3", random::string(8).as_str()); let temp_dir = tempdir().unwrap(); @@ -245,7 +234,7 @@ async fn tx_broadcast_protocol_submit_success() { _temp_dir, _transaction_event_receiver, wallet_connectivity, - ) = setup(TxProtocolTestConfig::WithConnection).await; + ) = setup().await; let mut event_stream = resources.event_publisher.subscribe(); wallet_connectivity.notify_base_node_set(server_node_identity.to_peer()); @@ -329,7 +318,7 @@ async fn tx_broadcast_protocol_submit_rejection() { _temp_dir, _transaction_event_receiver, wallet_connectivity, - ) = setup(TxProtocolTestConfig::WithConnection).await; + ) = setup().await; let mut event_stream = resources.event_publisher.subscribe(); add_transaction_to_database(1, 1 * T, true, None, None, resources.db.clone()).await; @@ -400,7 +389,7 @@ async fn tx_broadcast_protocol_restart_protocol_as_query() { _temp_dir, _transaction_event_receiver, wallet_connectivity, - ) = setup(TxProtocolTestConfig::WithConnection).await; + ) = setup().await; add_transaction_to_database(1, 1 * T, true, None, None, resources.db.clone()).await; @@ -487,7 +476,7 @@ async fn tx_broadcast_protocol_submit_success_followed_by_rejection() { _temp_dir, _transaction_event_receiver, wallet_connectivity, - ) = setup(TxProtocolTestConfig::WithConnection).await; + ) = setup().await; let mut event_stream = resources.event_publisher.subscribe(); add_transaction_to_database(1, 1 * T, true, None, None, resources.db.clone()).await; @@ -577,7 +566,7 @@ async fn tx_broadcast_protocol_submit_already_mined() { _temp_dir, _transaction_event_receiver, wallet_connectivity, - ) = setup(TxProtocolTestConfig::WithConnection).await; + ) = setup().await; add_transaction_to_database(1, 1 * T, true, None, None, resources.db.clone()).await; // Set Base Node to respond with AlreadyMined @@ -641,7 +630,7 @@ async fn tx_broadcast_protocol_submit_and_base_node_gets_changed() { _temp_dir, _transaction_event_receiver, wallet_connectivity, - ) = setup(TxProtocolTestConfig::WithConnection).await; + ) = setup().await; add_transaction_to_database(1, 1 * T, true, None, None, resources.db.clone()).await; @@ -737,7 +726,7 @@ async fn tx_validation_protocol_tx_becomes_mined_unconfirmed_then_confirmed() { _temp_dir, _transaction_event_receiver, wallet_connectivity, - ) = setup(TxProtocolTestConfig::WithConnection).await; + ) = setup().await; // Now we add the connection let mut connection = mock_rpc_server .create_connection(server_node_identity.to_peer(), "t/bnwallet/1".into()) @@ -878,7 +867,7 @@ async fn tx_revalidation() { _temp_dir, _transaction_event_receiver, wallet_connectivity, - ) = setup(TxProtocolTestConfig::WithConnection).await; + ) = setup().await; // Now we add the connection let mut connection = mock_rpc_server .create_connection(server_node_identity.to_peer(), "t/bnwallet/1".into()) @@ -1002,7 +991,7 @@ async fn tx_validation_protocol_reorg() { _temp_dir, _transaction_event_receiver, wallet_connectivity, - ) = setup(TxProtocolTestConfig::WithConnection).await; + ) = setup().await; // Now we add the connection let mut connection = mock_rpc_server .create_connection(server_node_identity.to_peer(), "t/bnwallet/1".into()) diff --git a/base_layer/wallet/tests/utxo_scanner.rs b/base_layer/wallet/tests/utxo_scanner.rs new file mode 100644 index 0000000000..59538a266c --- /dev/null +++ b/base_layer/wallet/tests/utxo_scanner.rs @@ -0,0 +1,731 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +use std::{collections::HashMap, sync::Arc, time::Duration}; + +use chrono::{Duration as ChronoDuration, Utc}; +use rand::{rngs::OsRng, RngCore}; +use tari_comms::{ + peer_manager::PeerFeatures, + protocol::rpc::{mock::MockRpcServer, NamedProtocolService}, + test_utils::{ + mocks::{create_connectivity_mock, ConnectivityManagerMockState}, + node_identity::build_node_identity, + }, +}; +use tari_core::{ + base_node::rpc::BaseNodeWalletRpcServer, + blocks::BlockHeader, + proto::base_node::{ChainMetadata, TipInfoResponse}, + tari_utilities::{epoch_time::EpochTime, Hashable}, + transactions::{tari_amount::MicroTari, transaction::UnblindedOutput, CryptoFactories}, +}; +use tari_key_manager::cipher_seed::CipherSeed; +use tari_service_framework::reply_channel; +use tari_shutdown::Shutdown; +use tari_test_utils::random; +use tari_wallet::{ + base_node_service::{ + handle::{BaseNodeEvent, BaseNodeServiceHandle}, + mock_base_node_service::MockBaseNodeService, + }, + connectivity_service::{create_wallet_connectivity_mock, WalletConnectivityInterface, WalletConnectivityMock}, + output_manager_service::storage::models::DbUnblindedOutput, + storage::{ + database::WalletDatabase, + sqlite_db::wallet::WalletSqliteDatabase, + sqlite_utilities::run_migration_and_create_sqlite_connection, + }, + utxo_scanner_service::{ + handle::UtxoScannerEvent, + service::{ScannedBlock, UtxoScannerService}, + uxto_scanner_service_builder::UtxoScannerMode, + }, +}; +use tempfile::{tempdir, TempDir}; +use tokio::{ + sync::{broadcast, mpsc}, + task, + time, +}; + +pub mod support; + +use support::{ + comms_rpc::{BaseNodeWalletRpcMockService, BaseNodeWalletRpcMockState, UtxosByBlock}, + output_manager_service_mock::{make_output_manager_service_mock, OutputManagerMockState}, + transaction_service_mock::make_transaction_service_mock, + utils::make_input, +}; + +async fn setup( + mode: UtxoScannerMode, + previous_db: Option>, +) -> ( + UtxoScannerService, + WalletDatabase, + broadcast::Sender, + broadcast::Sender>, + BaseNodeWalletRpcMockState, + MockRpcServer>, + ConnectivityManagerMockState, + WalletConnectivityMock, + OutputManagerMockState, + Shutdown, + TempDir, +) { + let shutdown = Shutdown::new(); + let factories = CryptoFactories::default(); + + // Base Node Service Mock + let (sender, receiver_bns) = reply_channel::unbounded(); + let (event_publisher_bns, _) = broadcast::channel(100); + let base_node_service_handle = BaseNodeServiceHandle::new(sender, event_publisher_bns.clone()); + let mut mock_base_node_service = MockBaseNodeService::new(receiver_bns, shutdown.to_signal()); + mock_base_node_service.set_default_base_node_state(); + task::spawn(mock_base_node_service.run()); + + // BaseNodeRpcService Mock + let service = BaseNodeWalletRpcMockService::new(); + let rpc_service_state = service.get_state(); + let server = BaseNodeWalletRpcServer::new(service); + let protocol_name = server.as_protocol_name(); + let server_node_identity = build_node_identity(PeerFeatures::COMMUNICATION_NODE); + let mut mock_server = MockRpcServer::new(server, server_node_identity.clone()); + mock_server.serve(); + + let rpc_server_connection = mock_server + .create_connection(server_node_identity.to_peer(), protocol_name.into()) + .await; + + let (comms_connectivity, connectivity_mock) = create_connectivity_mock(); + let comms_connectivity_mock_state = connectivity_mock.get_shared_state(); + comms_connectivity_mock_state + .add_active_connection(rpc_server_connection) + .await; + task::spawn(connectivity_mock.run()); + + let wallet_connectivity_mock = create_wallet_connectivity_mock(); + + let (ts_mock, ts_handle) = make_transaction_service_mock(shutdown.to_signal()); + task::spawn(ts_mock.run()); + + let (oms_mock, oms_handle) = make_output_manager_service_mock(shutdown.to_signal()); + let oms_mock_state = oms_mock.get_state(); + task::spawn(oms_mock.run()); + + let node_identity = build_node_identity(PeerFeatures::COMMUNICATION_NODE); + let (event_sender, _) = broadcast::channel(200); + + let temp_dir = tempdir().unwrap(); + let wallet_db = match previous_db { + None => { + let path_string = temp_dir.path().to_str().unwrap().to_string(); + let db_name = format!("{}.sqlite3", random::string(8).as_str()); + let db_path = format!("{}/{}", path_string, db_name); + // let db_path = "/tmp/test.sqlite3"; + + let db_connection = run_migration_and_create_sqlite_connection(&db_path, 16).unwrap(); + + WalletDatabase::new( + WalletSqliteDatabase::new(db_connection, None).expect("Should be able to create wallet database"), + ) + }, + Some(db) => db, + }; + + let scanning_service = UtxoScannerService::::builder() + .with_peers(vec![server_node_identity.public_key().clone()]) + .with_retry_limit(1) + .with_mode(mode) + .build_with_resources( + wallet_db.clone(), + comms_connectivity, + wallet_connectivity_mock.get_current_base_node_watcher(), + oms_handle, + ts_handle, + node_identity, + factories, + shutdown.to_signal(), + event_sender.clone(), + base_node_service_handle, + ); + ( + scanning_service, + wallet_db, + event_sender, + event_publisher_bns, + rpc_service_state, + mock_server, + comms_connectivity_mock_state, + wallet_connectivity_mock, + oms_mock_state, + shutdown, + temp_dir, + ) +} + +pub struct TestBlockData { + block_headers: HashMap, + unblinded_outputs: HashMap>, + utxos_by_block: Vec, +} + +/// Generates a set of block headers and unblinded outputs for each header. The `birthday_offset` specifies at which +/// block in the `num_block` the birthday timestamp will have passed i.e. it occured during the previous block period. +/// e.g. with `num_blocks` = 10 and `birthday_offset` = 5 the birthday timestamp will occur between block 4 and 5 +fn generate_block_headers_and_utxos( + start_height: u64, + num_blocks: u64, + birthday_epoch_time: u64, + birthday_offset: u64, + only_coinbase: bool, +) -> TestBlockData { + let factories = CryptoFactories::default(); + let mut block_headers = HashMap::new(); + let mut utxos_by_block = Vec::new(); + let mut unblinded_outputs = HashMap::new(); + for i in start_height..num_blocks + start_height { + let mut block_header = BlockHeader::new(0); + block_header.height = i; + block_header.timestamp = + EpochTime::from((birthday_epoch_time as i64 + (i as i64 - birthday_offset as i64) * 100i64 + 5) as u64); + block_headers.insert(i, block_header.clone()); + // Generate utxos for this block + let mut block_outputs = Vec::new(); + + for _j in 0..=i + 1 { + let (_ti, uo) = make_input( + &mut OsRng, + MicroTari::from(100 + OsRng.next_u64() % 1000), + &factories.commitment, + ); + block_outputs.push(uo); + if only_coinbase { + break; + } + } + + let transaction_outputs = block_outputs + .clone() + .iter() + .map(|uo| uo.as_transaction_output(&factories).unwrap()) + .collect(); + let utxos = UtxosByBlock { + height: i, + header_hash: block_header.hash(), + utxos: transaction_outputs, + }; + utxos_by_block.push(utxos); + unblinded_outputs.insert(i, block_outputs); + } + TestBlockData { + block_headers, + unblinded_outputs, + utxos_by_block, + } +} + +#[tokio::test] +async fn test_utxo_scanner_recovery() { + let _ = env_logger::try_init(); + let factories = CryptoFactories::default(); + let ( + scanning_service, + wallet_db, + scanner_event_sender, + _base_node_service_event_publisher, + rpc_service_state, + _rpc_mock_server, + _comms_connectivity_mock_state, + _wallet_connectivity_mock, + oms_mock_state, + _shutdown, + _temp_dir, + ) = setup(UtxoScannerMode::Recovery, None).await; + + let cipher_seed = CipherSeed::new(); + let birthday_epoch_time = (cipher_seed.birthday() - 2) as u64 * 60 * 60 * 24; + wallet_db.set_master_seed(cipher_seed).await.unwrap(); + + const NUM_BLOCKS: u64 = 11; + const BIRTHDAY_OFFSET: u64 = 5; + + let TestBlockData { + block_headers, + unblinded_outputs, + utxos_by_block, + } = generate_block_headers_and_utxos(0, NUM_BLOCKS, birthday_epoch_time, BIRTHDAY_OFFSET, false); + + rpc_service_state.set_utxos_by_block(utxos_by_block.clone()); + rpc_service_state.set_blocks(block_headers.clone()); + + let chain_metadata = ChainMetadata { + height_of_longest_chain: Some(NUM_BLOCKS - 1), + best_block: Some(block_headers.get(&(NUM_BLOCKS - 1)).unwrap().clone().hash()), + accumulated_difficulty: Vec::new(), + pruned_height: 0, + }; + rpc_service_state.set_tip_info_response(TipInfoResponse { + metadata: Some(chain_metadata), + is_synced: true, + }); + + // Adding half the outputs of the blocks to the OMS mock + let mut db_unblinded_outputs = Vec::new(); + let mut total_outputs_to_recover = 0; + let mut total_amount_to_recover = MicroTari::from(0); + for (h, outputs) in unblinded_outputs.iter() { + for output in outputs.iter().skip(outputs.len() / 2) { + let dbo = DbUnblindedOutput::from_unblinded_output(output.clone(), &factories, None).unwrap(); + // Only the outputs in blocks after the birthday should be included in the recovered total + if *h >= NUM_BLOCKS.saturating_sub(BIRTHDAY_OFFSET).saturating_sub(2) { + total_outputs_to_recover += 1; + total_amount_to_recover += dbo.unblinded_output.value; + } + db_unblinded_outputs.push(dbo); + } + } + oms_mock_state.set_recoverable_outputs(db_unblinded_outputs); + + let mut scanner_event_stream = scanner_event_sender.subscribe(); + + tokio::spawn(scanning_service.run()); + + let delay = time::sleep(Duration::from_secs(60)); + tokio::pin!(delay); + loop { + tokio::select! { + _ = &mut delay => { + panic!("Completed event should have arrived by now."); + } + event = scanner_event_stream.recv() => { + if let UtxoScannerEvent::Completed { + final_height, + num_recovered, + value_recovered, + time_taken: _,} = event.unwrap() { + assert_eq!(final_height, NUM_BLOCKS-1); + assert_eq!(num_recovered, total_outputs_to_recover); + assert_eq!(value_recovered, total_amount_to_recover); + break; + } + } + } + } +} + +#[tokio::test] +async fn test_utxo_scanner_recovery_with_restart() { + let factories = CryptoFactories::default(); + let ( + scanning_service, + wallet_db, + _scanner_event_sender, + _base_node_service_event_publisher, + rpc_service_state, + _rpc_mock_server, + _comms_connectivity_mock_state, + _wallet_connectivity_mock, + oms_mock_state, + mut shutdown, + _temp_dir, + ) = setup(UtxoScannerMode::Recovery, None).await; + + let cipher_seed = CipherSeed::new(); + let birthday_epoch_time = (cipher_seed.birthday() - 2) as u64 * 60 * 60 * 24; + wallet_db.set_master_seed(cipher_seed).await.unwrap(); + + const NUM_BLOCKS: u64 = 11; + const BIRTHDAY_OFFSET: u64 = 5; + const SYNC_INTERRUPT: u64 = 6; + + let TestBlockData { + block_headers, + unblinded_outputs, + utxos_by_block, + } = generate_block_headers_and_utxos(0, NUM_BLOCKS, birthday_epoch_time, BIRTHDAY_OFFSET, false); + + rpc_service_state.set_utxos_by_block(utxos_by_block.clone()); + rpc_service_state.set_blocks(block_headers.clone()); + + let chain_metadata = ChainMetadata { + height_of_longest_chain: Some(NUM_BLOCKS - 1), + best_block: Some(block_headers.get(&(NUM_BLOCKS - 1)).unwrap().clone().hash()), + accumulated_difficulty: Vec::new(), + pruned_height: 0, + }; + rpc_service_state.set_tip_info_response(TipInfoResponse { + metadata: Some(chain_metadata.clone()), + is_synced: true, + }); + + // Adding half the outputs of the blocks to the OMS mock + let mut db_unblinded_outputs = Vec::new(); + let mut total_outputs_to_recover = 0; + let mut total_amount_to_recover = MicroTari::from(0); + for (h, outputs) in unblinded_outputs.iter() { + for output in outputs.iter().skip(outputs.len() / 2) { + let dbo = DbUnblindedOutput::from_unblinded_output(output.clone(), &factories, None).unwrap(); + // Only the outputs in blocks after the birthday should be included in the recovered total + if *h >= NUM_BLOCKS.saturating_sub(BIRTHDAY_OFFSET).saturating_sub(2) { + total_outputs_to_recover += 1; + total_amount_to_recover += dbo.unblinded_output.value; + } + db_unblinded_outputs.push(dbo); + } + } + oms_mock_state.set_recoverable_outputs(db_unblinded_outputs.clone()); + + let (tx, rx) = mpsc::channel(100); + rpc_service_state.set_utxos_by_block_trigger_channel(rx); + + tokio::spawn(scanning_service.run()); + + tx.send(SYNC_INTERRUPT as usize).await.unwrap(); + + let _ = rpc_service_state + .wait_pop_sync_utxos_by_block_calls(1, Duration::from_secs(30)) + .await + .unwrap(); + + shutdown.trigger(); + + let ( + scanning_service, + _wallet_db, + scanner_event_sender, + _base_node_service_event_publisher, + rpc_service_state, + _rpc_mock_server, + _comms_connectivity_mock_state, + _wallet_connectivity_mock, + oms_mock_state, + _shutdown, + _temp_dir2, + ) = setup(UtxoScannerMode::Recovery, Some(wallet_db)).await; + rpc_service_state.set_utxos_by_block(utxos_by_block.clone()); + rpc_service_state.set_blocks(block_headers.clone()); + rpc_service_state.set_tip_info_response(TipInfoResponse { + metadata: Some(chain_metadata), + is_synced: true, + }); + oms_mock_state.set_recoverable_outputs(db_unblinded_outputs); + let mut scanner_event_stream = scanner_event_sender.subscribe(); + tokio::spawn(scanning_service.run()); + + let delay = time::sleep(Duration::from_secs(60)); + tokio::pin!(delay); + loop { + tokio::select! { + _ = &mut delay => { + panic!("Completed event should have arrived by now."); + } + event = scanner_event_stream.recv() => { + if let UtxoScannerEvent::Completed { + final_height, + num_recovered, + value_recovered, + time_taken: _,} = event.unwrap() { + assert_eq!(final_height, NUM_BLOCKS-1); + assert_eq!(num_recovered, total_outputs_to_recover); + assert_eq!(value_recovered, total_amount_to_recover); + break; + } + } + } + } +} + +#[tokio::test] +async fn test_utxo_scanner_recovery_with_restart_and_reorg() { + let factories = CryptoFactories::default(); + let ( + scanning_service, + wallet_db, + _scanner_event_sender, + _base_node_service_event_publisher, + rpc_service_state, + _rpc_mock_server, + _comms_connectivity_mock_state, + _wallet_connectivity_mock, + oms_mock_state, + mut shutdown, + _temp_dir, + ) = setup(UtxoScannerMode::Recovery, None).await; + + let cipher_seed = CipherSeed::new(); + let birthday_epoch_time = (cipher_seed.birthday() - 2) as u64 * 60 * 60 * 24; + wallet_db.set_master_seed(cipher_seed).await.unwrap(); + + const NUM_BLOCKS: u64 = 11; + const BIRTHDAY_OFFSET: u64 = 5; + const SYNC_INTERRUPT: u64 = 6; + + let TestBlockData { + mut block_headers, + mut unblinded_outputs, + utxos_by_block, + } = generate_block_headers_and_utxos(0, NUM_BLOCKS, birthday_epoch_time, BIRTHDAY_OFFSET, false); + + rpc_service_state.set_utxos_by_block(utxos_by_block.clone()); + rpc_service_state.set_blocks(block_headers.clone()); + + let chain_metadata = ChainMetadata { + height_of_longest_chain: Some(NUM_BLOCKS - 1), + best_block: Some(block_headers.get(&(NUM_BLOCKS - 1)).unwrap().clone().hash()), + accumulated_difficulty: Vec::new(), + pruned_height: 0, + }; + rpc_service_state.set_tip_info_response(TipInfoResponse { + metadata: Some(chain_metadata.clone()), + is_synced: true, + }); + + // Adding half the outputs of the blocks to the OMS mock + let mut db_unblinded_outputs = Vec::new(); + for (_h, outputs) in unblinded_outputs.iter() { + for output in outputs.iter().skip(outputs.len() / 2) { + let dbo = DbUnblindedOutput::from_unblinded_output(output.clone(), &factories, None).unwrap(); + db_unblinded_outputs.push(dbo); + } + } + oms_mock_state.set_recoverable_outputs(db_unblinded_outputs.clone()); + + let (tx, rx) = mpsc::channel(100); + rpc_service_state.set_utxos_by_block_trigger_channel(rx); + + tokio::spawn(scanning_service.run()); + + tx.send(SYNC_INTERRUPT as usize).await.unwrap(); + + let _ = rpc_service_state + .wait_pop_sync_utxos_by_block_calls(1, Duration::from_secs(30)) + .await + .unwrap(); + + shutdown.trigger(); + + // So at this point we have synced to block 6. We are going to create a reorg back to block 4 so that blocks 5-10 + // are new blocks. + block_headers.retain(|h, _| h <= &4u64); + unblinded_outputs.retain(|h, _| h <= &4u64); + let mut utxos_by_block = utxos_by_block + .into_iter() + .filter(|u| u.height <= 4) + .collect::>(); + + let TestBlockData { + block_headers: new_block_headers, + unblinded_outputs: new_unblinded_outputs, + utxos_by_block: mut new_utxos_by_block, + } = generate_block_headers_and_utxos(5, 5, birthday_epoch_time + 500, 0, false); + + block_headers.extend(new_block_headers); + utxos_by_block.append(&mut new_utxos_by_block); + unblinded_outputs.extend(new_unblinded_outputs); + + let ( + scanning_service, + _wallet_db, + scanner_event_sender, + _base_node_service_event_publisher, + rpc_service_state, + _rpc_mock_server, + _comms_connectivity_mock_state, + _wallet_connectivity_mock, + oms_mock_state, + _shutdown, + _temp_dir2, + ) = setup(UtxoScannerMode::Recovery, Some(wallet_db)).await; + rpc_service_state.set_utxos_by_block(utxos_by_block.clone()); + rpc_service_state.set_blocks(block_headers.clone()); + let chain_metadata = ChainMetadata { + height_of_longest_chain: Some(9), + best_block: Some(block_headers.get(&9).unwrap().clone().hash()), + accumulated_difficulty: Vec::new(), + pruned_height: 0, + }; + rpc_service_state.set_tip_info_response(TipInfoResponse { + metadata: Some(chain_metadata), + is_synced: true, + }); + + // calculate new recoverable outputs for the reorg + // Adding half the outputs of the blocks to the OMS mock + let mut db_unblinded_outputs = Vec::new(); + let mut total_outputs_to_recover = 0; + let mut total_amount_to_recover = MicroTari::from(0); + for (h, outputs) in unblinded_outputs.iter() { + for output in outputs.iter().skip(outputs.len() / 2) { + let dbo = DbUnblindedOutput::from_unblinded_output(output.clone(), &factories, None).unwrap(); + // Only the outputs in blocks after the birthday should be included in the recovered total + if *h >= 4 { + total_outputs_to_recover += 1; + total_amount_to_recover += dbo.unblinded_output.value; + } + db_unblinded_outputs.push(dbo); + } + } + + oms_mock_state.set_recoverable_outputs(db_unblinded_outputs); + + let mut scanner_event_stream = scanner_event_sender.subscribe(); + tokio::spawn(scanning_service.run()); + + let delay = time::sleep(Duration::from_secs(60)); + tokio::pin!(delay); + loop { + tokio::select! { + _ = &mut delay => { + panic!("Completed event should have arrived by now."); + } + event = scanner_event_stream.recv() => { + if let UtxoScannerEvent::Completed { + final_height, + num_recovered, + value_recovered, + time_taken: _,} = event.unwrap() { + assert_eq!(final_height, 9); + assert_eq!(num_recovered, total_outputs_to_recover); + assert_eq!(value_recovered, total_amount_to_recover); + break; + } + } + } + } +} + +#[tokio::test] +async fn test_utxo_scanner_scanned_block_cache_clearing() { + let ( + scanning_service, + wallet_db, + scanner_event_sender, + _base_node_service_event_publisher, + rpc_service_state, + _rpc_mock_server, + _comms_connectivity_mock_state, + _wallet_connectivity_mock, + _oms_mock_state, + _shutdown, + _temp_dir, + ) = setup(UtxoScannerMode::Recovery, None).await; + + for h in 0u64..800u64 { + let num_outputs = if h % 2 == 1 { Some(1) } else { None }; + let mut header_hash = h.to_le_bytes().to_vec(); + header_hash.extend([0u8; 24].to_vec()); + wallet_db + .save_scanned_block(ScannedBlock { + header_hash, + height: h, + num_outputs, + amount: None, + timestamp: Utc::now() + .naive_utc() + .checked_sub_signed(ChronoDuration::days(1000)) + .unwrap(), + }) + .await + .unwrap(); + } + + let cipher_seed = CipherSeed::new(); + let birthday_epoch_time = (cipher_seed.birthday() - 2) as u64 * 60 * 60 * 24; + wallet_db.set_master_seed(cipher_seed).await.unwrap(); + + const NUM_BLOCKS: u64 = 11; + const BIRTHDAY_OFFSET: u64 = 5; + + let TestBlockData { + block_headers, + unblinded_outputs: _unblinded_outputs, + utxos_by_block, + } = generate_block_headers_and_utxos(800, NUM_BLOCKS, birthday_epoch_time, BIRTHDAY_OFFSET, true); + + rpc_service_state.set_utxos_by_block(utxos_by_block.clone()); + rpc_service_state.set_blocks(block_headers.clone()); + + let chain_metadata = ChainMetadata { + height_of_longest_chain: Some(800 + NUM_BLOCKS - 1), + best_block: Some(block_headers.get(&(800 + NUM_BLOCKS - 1)).unwrap().clone().hash()), + accumulated_difficulty: Vec::new(), + pruned_height: 0, + }; + rpc_service_state.set_tip_info_response(TipInfoResponse { + metadata: Some(chain_metadata), + is_synced: true, + }); + + let first_block_header = block_headers.get(&(800)).unwrap().clone(); + wallet_db + .save_scanned_block(ScannedBlock { + header_hash: first_block_header.hash(), + height: first_block_header.height, + num_outputs: Some(0), + amount: None, + timestamp: Utc::now().naive_utc(), + }) + .await + .unwrap(); + + let mut scanner_event_stream = scanner_event_sender.subscribe(); + + tokio::spawn(scanning_service.run()); + + let delay = time::sleep(Duration::from_secs(60)); + tokio::pin!(delay); + loop { + tokio::select! { + _ = &mut delay => { + panic!("Completed event should have arrived by now."); + } + event = scanner_event_stream.recv() => { + if let UtxoScannerEvent::Completed { + final_height:_, + num_recovered:_, + value_recovered:_, + time_taken: _,} = event.unwrap(){ + break; + } + } + } + } + let scanned_blocks = wallet_db.get_scanned_blocks().await.unwrap(); + + use tari_wallet::utxo_scanner_service::service::SCANNED_BLOCK_CACHE_SIZE; + let threshold = 800 + NUM_BLOCKS - 1 - SCANNED_BLOCK_CACHE_SIZE; + + // Below the threshold the even indices had no outputs and should be cleared + for i in 0..threshold { + if i % 2 == 0 { + assert!(!scanned_blocks.iter().any(|sb| sb.height == i)); + } + } + // Check that above the threshold the even indices are still there + for i in threshold..800 { + if i % 2 == 0 { + assert!(scanned_blocks.iter().any(|sb| sb.height == i)); + } + } +} diff --git a/base_layer/wallet/tests/wallet/mod.rs b/base_layer/wallet/tests/wallet.rs similarity index 93% rename from base_layer/wallet/tests/wallet/mod.rs rename to base_layer/wallet/tests/wallet.rs index 3670a9e976..ce7dc5dab2 100644 --- a/base_layer/wallet/tests/wallet/mod.rs +++ b/base_layer/wallet/tests/wallet.rs @@ -1,3 +1,25 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + // Copyright 2019 The Tari Project // // Redistribution and use in source and binary forms, with or without modification, are permitted provided that the @@ -54,7 +76,7 @@ use tari_wallet::{ output_manager_service::storage::sqlite_db::OutputManagerSqliteDatabase, storage::{ database::{DbKeyValuePair, WalletBackend, WalletDatabase, WriteOperation}, - sqlite_db::WalletSqliteDatabase, + sqlite_db::wallet::WalletSqliteDatabase, sqlite_utilities::{ initialize_sqlite_database_backends, partial_wallet_backup, @@ -74,7 +96,8 @@ use tari_wallet::{ use tempfile::tempdir; use tokio::{runtime::Runtime, time::sleep}; -use crate::support::{comms_and_services::get_next_memory_address, utils::make_input}; +pub mod support; +use support::{comms_and_services::get_next_memory_address, utils::make_input}; fn create_peer(public_key: CommsPublicKey, net_address: Multiaddr) -> Peer { Peer::new( diff --git a/base_layer/wallet_ffi/src/lib.rs b/base_layer/wallet_ffi/src/lib.rs index 392525f88f..8569a9bd8e 100644 --- a/base_layer/wallet_ffi/src/lib.rs +++ b/base_layer/wallet_ffi/src/lib.rs @@ -140,7 +140,7 @@ use tari_wallet::{ error::{WalletError, WalletStorageError}, storage::{ database::WalletDatabase, - sqlite_db::WalletSqliteDatabase, + sqlite_db::wallet::WalletSqliteDatabase, sqlite_utilities::{initialize_sqlite_database_backends, partial_wallet_backup}, }, transaction_service::{ @@ -5442,7 +5442,7 @@ pub unsafe extern "C" fn wallet_is_recovery_in_progress(wallet: *mut TariWallet, /// - ConnectedToBaseNode, 0, 1 /// - ConnectionToBaseNodeFailed, number of retries, retry limit /// - Progress, current block, total number of blocks -/// - Completed, total number of UTXO's scanned, MicroTari recovered, +/// - Completed, total number of UTXO's recovered, MicroTari recovered, /// - ScanningRoundFailed, number of retries, retry limit /// - RecoveryFailed, 0, 0 /// diff --git a/base_layer/wallet_ffi/src/tasks.rs b/base_layer/wallet_ffi/src/tasks.rs index f538e92721..096e04b17b 100644 --- a/base_layer/wallet_ffi/src/tasks.rs +++ b/base_layer/wallet_ffi/src/tasks.rs @@ -87,8 +87,8 @@ pub async fn recovery_event_monitoring( ); }, Ok(UtxoScannerEvent::Progress { - current_index: current, - total_index: total, + current_height: current, + tip_height: total, }) => { unsafe { (recovery_progress_callback)(RecoveryEvent::Progress as u8, current, total); @@ -96,22 +96,27 @@ pub async fn recovery_event_monitoring( info!(target: LOG_TARGET, "Recovery progress: {}/{}", current, total); }, Ok(UtxoScannerEvent::Completed { - number_scanned: num_scanned, - number_received: num_utxos, - value_received: total_amount, + final_height, + num_recovered, + value_recovered, time_taken: elapsed, }) => { + let rate = (final_height as f32) * 1000f32 / (elapsed.as_millis() as f32); info!( target: LOG_TARGET, - "Recovery complete! Scanned = {} in {:.2?} ({} utxos/s), Recovered {} worth {}", - num_scanned, + "Recovery complete! Scanned {} blocks in {:.2?} ({:.2?} blocks/s), Recovered {} outputs worth {}", + final_height, elapsed, - num_scanned / (1 + elapsed.as_secs()), - num_utxos, - total_amount + rate, + num_recovered, + value_recovered ); unsafe { - (recovery_progress_callback)(RecoveryEvent::Completed as u8, num_scanned, u64::from(total_amount)); + (recovery_progress_callback)( + RecoveryEvent::Completed as u8, + num_recovered, + u64::from(value_recovered), + ); } break; }, diff --git a/base_layer/wallet_ffi/wallet.h b/base_layer/wallet_ffi/wallet.h index c6ed604541..b13281dc9b 100644 --- a/base_layer/wallet_ffi/wallet.h +++ b/base_layer/wallet_ffi/wallet.h @@ -688,7 +688,7 @@ bool wallet_is_recovery_in_progress(struct TariWallet *wallet, int *error_out); /// - ConnectedToBaseNode, 0, 1 /// - ConnectionToBaseNodeFailed, number of retries, retry limit /// - Progress, current block, total number of blocks -/// - Completed, total number of UTXO's scanned, MicroTari recovered, +/// - Completed, total number of UTXO's recovered, MicroTari recovered, /// - ScanningRoundFailed, number of retries, retry limit /// - RecoveryFailed, 0, 0 /// diff --git a/integration_tests/features/WalletRecovery.feature b/integration_tests/features/WalletRecovery.feature index 5b4484e708..14a7ac9e87 100644 --- a/integration_tests/features/WalletRecovery.feature +++ b/integration_tests/features/WalletRecovery.feature @@ -40,8 +40,8 @@ Feature: Wallet Recovery | 5 | | 10 | - # fails often on circle CI - @critical @flaky + + @critical Scenario: Recover one-sided payments Given I have a seed node NODE And I have 1 base nodes connected to all seed nodes diff --git a/integration_tests/features/WalletTransactions.feature b/integration_tests/features/WalletTransactions.feature index a279582e1b..96d7378903 100644 --- a/integration_tests/features/WalletTransactions.feature +++ b/integration_tests/features/WalletTransactions.feature @@ -1,7 +1,7 @@ @wallet-transact @wallet Feature: Wallet Transactions - @critical @flaky + @critical Scenario: Wallet sending and receiving one-sided transactions Given I have a seed node NODE And I have 1 base nodes connected to all seed nodes diff --git a/integration_tests/package-lock.json b/integration_tests/package-lock.json index f06b53441d..0ff556688c 100644 --- a/integration_tests/package-lock.json +++ b/integration_tests/package-lock.json @@ -195,7 +195,7 @@ }, "@babel/helper-validator-option": { "version": "7.14.5", - "resolved": false, + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", "dev": true }, @@ -1945,7 +1945,7 @@ }, "globals": { "version": "11.12.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, @@ -2251,7 +2251,7 @@ }, "jsesc": { "version": "2.5.2", - "resolved": false, + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, @@ -3028,7 +3028,7 @@ }, "source-map": { "version": "0.5.7", - "resolved": false, + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true }, @@ -3280,7 +3280,7 @@ }, "to-fast-properties": { "version": "2.0.0", - "resolved": false, + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, @@ -3430,68 +3430,104 @@ "dependencies": { "@grpc/grpc-js": { "version": "1.3.6", + "resolved": false, + "integrity": "sha512-v7+LQFbqZKmd/Tvf5/j1Xlbq6jXL/4d+gUtm2TNX4QiEC3ELWADmGr2dGlUyLl6aKTuYfsN72vAsO5zmavYkEg==", "requires": { "@types/node": ">=12.12.47" } }, "@grpc/proto-loader": { "version": "0.5.6", + "resolved": false, + "integrity": "sha512-DT14xgw3PSzPxwS13auTEwxhMMOoz33DPUKNtmYK/QYbBSpLXJy78FGGs5yVoxVobEqPm4iW9MOIoz0A3bLTRQ==", "requires": { "lodash.camelcase": "^4.3.0", "protobufjs": "^6.8.6" } }, "@protobufjs/aspromise": { - "version": "1.1.2" + "version": "1.1.2", + "resolved": false, + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" }, "@protobufjs/base64": { - "version": "1.1.2" + "version": "1.1.2", + "resolved": false, + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" }, "@protobufjs/codegen": { - "version": "2.0.4" + "version": "2.0.4", + "resolved": false, + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, "@protobufjs/eventemitter": { - "version": "1.1.0" + "version": "1.1.0", + "resolved": false, + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" }, "@protobufjs/fetch": { "version": "1.1.0", + "resolved": false, + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", "requires": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "@protobufjs/float": { - "version": "1.0.2" + "version": "1.0.2", + "resolved": false, + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" }, "@protobufjs/inquire": { - "version": "1.1.0" + "version": "1.1.0", + "resolved": false, + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" }, "@protobufjs/path": { - "version": "1.1.2" + "version": "1.1.2", + "resolved": false, + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" }, "@protobufjs/pool": { - "version": "1.1.0" + "version": "1.1.0", + "resolved": false, + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" }, "@protobufjs/utf8": { - "version": "1.1.0" + "version": "1.1.0", + "resolved": false, + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, "@types/long": { - "version": "4.0.1" + "version": "4.0.1", + "resolved": false, + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" }, "@types/node": { - "version": "16.3.2" + "version": "16.3.2", + "resolved": false, + "integrity": "sha512-jJs9ErFLP403I+hMLGnqDRWT0RYKSvArxuBVh2veudHV7ifEC1WAmjJADacZ7mRbA2nWgHtn8xyECMAot0SkAw==" }, "grpc-promise": { - "version": "1.4.0" + "version": "1.4.0", + "resolved": false, + "integrity": "sha512-4BBXHXb5OjjBh7luylu8vFqL6H6aPn/LeqpQaSBeRzO/Xv95wHW/WkU9TJRqaCTMZ5wq9jTSvlJWp0vRJy1pVA==" }, "lodash.camelcase": { - "version": "4.3.0" + "version": "4.3.0", + "resolved": false, + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, "long": { - "version": "4.0.0" + "version": "4.0.0", + "resolved": false, + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "protobufjs": { "version": "6.11.2", + "resolved": false, + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", From ca5f0ee70569fe78c19ddae77078ef2da9bfc142 Mon Sep 17 00:00:00 2001 From: David Main <51991544+StriderDM@users.noreply.github.com> Date: Wed, 22 Dec 2021 09:28:18 +0200 Subject: [PATCH 05/15] feat: base_node switching for console_wallet when status is offline (#3639) Description --- This PR allows the console_wallet to periodically attempt to connect to another base_node in the list should it be found to be offline. Motivation and Context --- Usability. How Has This Been Tested? --- cargo test --all nvm use 12.22.6 && node_modules/.bin/cucumber-js --profile "ci" --tags "not @long-running and not @broken" manually --- .../src/ui/components/base_node.rs | 2 +- .../tari_console_wallet/src/ui/mod.rs | 2 ++ .../src/ui/state/app_state.rs | 26 ++++++++++++++++--- .../mock_base_node_service.rs | 1 + 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/applications/tari_console_wallet/src/ui/components/base_node.rs b/applications/tari_console_wallet/src/ui/components/base_node.rs index 0e47820a19..f180800f21 100644 --- a/applications/tari_console_wallet/src/ui/components/base_node.rs +++ b/applications/tari_console_wallet/src/ui/components/base_node.rs @@ -43,6 +43,7 @@ impl BaseNode { impl Component for BaseNode { fn draw(&mut self, f: &mut Frame, area: Rect, app_state: &AppState) where B: Backend { + let base_node_state = app_state.get_base_node_state(); let current_online_status = app_state.get_wallet_connectivity().get_connectivity_status(); let chain_info = match current_online_status { @@ -57,7 +58,6 @@ impl Component for BaseNode { Span::styled("Offline", Style::default().fg(Color::Red)), ]), OnlineStatus::Online => { - let base_node_state = app_state.get_base_node_state(); if let Some(ref metadata) = base_node_state.chain_metadata { let tip = metadata.height_of_longest_chain(); diff --git a/applications/tari_console_wallet/src/ui/mod.rs b/applications/tari_console_wallet/src/ui/mod.rs index 0113d6cb75..3468bbb785 100644 --- a/applications/tari_console_wallet/src/ui/mod.rs +++ b/applications/tari_console_wallet/src/ui/mod.rs @@ -62,6 +62,8 @@ pub fn run(app: App>) -> Result<(), ExitCodes> { app.app_state.refresh_contacts_state().await?; trace!(target: LOG_TARGET, "Refreshing connected peers state"); app.app_state.refresh_connected_peers_state().await?; + trace!(target: LOG_TARGET, "Checking connectivity"); + app.app_state.check_connectivity().await; trace!(target: LOG_TARGET, "Starting balance enquiry debouncer"); app.app_state.start_balance_enquiry_debouncer().await?; trace!(target: LOG_TARGET, "Starting app state event monitor"); diff --git a/applications/tari_console_wallet/src/ui/state/app_state.rs b/applications/tari_console_wallet/src/ui/state/app_state.rs index 64e643f399..6b5558ae0f 100644 --- a/applications/tari_console_wallet/src/ui/state/app_state.rs +++ b/applications/tari_console_wallet/src/ui/state/app_state.rs @@ -52,7 +52,7 @@ use tari_p2p::auto_update::SoftwareUpdaterHandle; use tari_shutdown::ShutdownSignal; use tari_wallet::{ base_node_service::{handle::BaseNodeEventReceiver, service::BaseNodeState}, - connectivity_service::WalletConnectivityHandle, + connectivity_service::{OnlineStatus, WalletConnectivityHandle, WalletConnectivityInterface}, contacts_service::storage::database::Contact, output_manager_service::{handle::OutputManagerEventReceiver, service::Balance}, transaction_service::{handle::TransactionEventReceiver, storage::models::CompletedTransaction}, @@ -157,6 +157,7 @@ impl AppState { } pub async fn refresh_connected_peers_state(&mut self) -> Result<(), UiError> { + self.check_connectivity().await; let mut inner = self.inner.write().await; inner.refresh_connected_peers_state().await?; drop(inner); @@ -180,6 +181,27 @@ impl AppState { } } + pub async fn check_connectivity(&mut self) { + if self.get_custom_base_node().is_none() && + self.wallet_connectivity.get_connectivity_status() == OnlineStatus::Offline + { + let current = self.get_selected_base_node(); + let list = self.get_base_node_list().clone(); + let mut index: usize = list.iter().position(|(_, p)| p == current).unwrap_or_default(); + if !list.is_empty() { + if index == list.len() - 1 { + index = 0; + } else { + index += 1; + } + let (_, next) = &list[index]; + if let Err(e) = self.set_base_node_peer(next.clone()).await { + error!(target: LOG_TARGET, "Base node offline: {:?}", e); + } + } + } + } + pub async fn upsert_contact(&mut self, alias: String, public_key_or_emoji_id: String) -> Result<(), UiError> { let mut inner = self.inner.write().await; @@ -682,7 +704,6 @@ impl AppStateInner { pub async fn refresh_connected_peers_state(&mut self) -> Result<(), UiError> { let connections = self.wallet.comms.connectivity().get_active_connections().await?; - let peer_manager = self.wallet.comms.peer_manager(); let mut peers = Vec::with_capacity(connections.len()); for c in connections.iter() { @@ -690,7 +711,6 @@ impl AppStateInner { peers.push(p); } } - self.data.connected_peers = peers; self.updated = true; Ok(()) diff --git a/base_layer/wallet/src/base_node_service/mock_base_node_service.rs b/base_layer/wallet/src/base_node_service/mock_base_node_service.rs index e3d6e01525..18eda7a77c 100644 --- a/base_layer/wallet/src/base_node_service/mock_base_node_service.rs +++ b/base_layer/wallet/src/base_node_service/mock_base_node_service.rs @@ -86,6 +86,7 @@ impl MockBaseNodeService { }, None => (None, None), }; + self.state = BaseNodeState { chain_metadata, is_synced, From 5dd9e1ce3664550dbb682a150ac83eb6d143eafa Mon Sep 17 00:00:00 2001 From: Cayle Sharrock Date: Thu, 23 Dec 2021 14:40:41 +0000 Subject: [PATCH 06/15] feat: tari launchpad (#3671) Description --- A tauri-based app for simplifying the running of Tari infrastructure Motivation and Context --- How Has This Been Tested? --- --- .github/workflows/base_node_binaries.yml | 6 + .github/workflows/ci.yml | 65 +- Cargo.lock | 2517 ++- Cargo.toml | 2 +- applications/installer/Cargo.toml | 7 - applications/installer/src/main.rs | 3 - applications/launchpad/.dockerignore | 3 + applications/launchpad/.gitignore | 23 + applications/launchpad/backend/.gitignore | 4 + applications/launchpad/backend/Cargo.toml | 36 + .../launchpad/backend/assets/config.toml | 160 + .../launchpad/backend/assets/log4rs.yml | 162 + applications/launchpad/backend/assets/torrc | 2 + .../backend/icons/android-icon-192x192.png | Bin 0 -> 13704 bytes .../backend/icons/apple-icon-114x114.png | Bin 0 -> 7771 bytes .../backend/icons/apple-icon-120x120.png | Bin 0 -> 8254 bytes .../backend/icons/apple-icon-144x144.png | Bin 0 -> 10542 bytes .../backend/icons/apple-icon-152x152.png | Bin 0 -> 11298 bytes .../backend/icons/apple-icon-180x180.png | Bin 0 -> 14189 bytes .../backend/icons/apple-icon-57x57.png | Bin 0 -> 3620 bytes .../backend/icons/apple-icon-57x57.png.1 | Bin 0 -> 3620 bytes .../backend/icons/apple-icon-60x60.png | Bin 0 -> 3770 bytes .../backend/icons/apple-icon-72x72.png | Bin 0 -> 4499 bytes .../backend/icons/apple-icon-76x76.png | Bin 0 -> 4708 bytes .../launchpad/backend/icons/favicon-16x16.png | Bin 0 -> 1540 bytes .../launchpad/backend/icons/favicon-32x32.png | Bin 0 -> 2103 bytes .../launchpad/backend/icons/favicon-96x96.png | Bin 0 -> 6117 bytes applications/launchpad/backend/icons/icon.ico | Bin 0 -> 86642 bytes applications/launchpad/backend/icons/icon.png | Bin 0 -> 194402 bytes .../launchpad/backend/icons/tari_issues.png | Bin 0 -> 390222 bytes applications/launchpad/backend/package.json | 7 + applications/launchpad/backend/src/build.rs | 3 + .../backend/src/commands/create_workspace.rs | 67 + .../launchpad/backend/src/commands/events.rs | 65 + .../backend/src/commands/launch_docker.rs | 192 + .../backend/src/commands/mod.rs} | 43 +- .../backend/src/commands/pull_images.rs | 99 + .../launchpad/backend/src/commands/service.rs | 348 + .../backend/src/commands/shutdown.rs} | 46 +- .../launchpad/backend/src/commands/state.rs | 56 + .../backend/src/docker/error.rs} | 88 +- .../backend/src/docker/filesystem.rs | 72 + .../backend/src/docker/helpers.rs} | 17 +- .../backend/src/docker/mod.rs} | 42 +- .../launchpad/backend/src/docker/models.rs | 261 + .../launchpad/backend/src/docker/settings.rs | 532 + .../launchpad/backend/src/docker/workspace.rs | 611 + .../launchpad/backend/src/docker/wrapper.rs | 93 + .../backend/src/error.rs} | 40 +- .../mod.rs => launchpad/backend/src/lib.rs} | 5 +- applications/launchpad/backend/src/main.rs | 85 + .../launchpad/backend/tauri.conf.json | 80 + applications/launchpad/build_images.sh | 28 + .../launchpad/docker_rig/base_node.Dockerfile | 11 +- .../docker_rig/console_wallet.Dockerfile | 10 +- .../launchpad/docker_rig/docker-compose.yml | 71 +- .../launchpad/docker_rig/frontail.Dockerfile | 9 + .../launchpad/docker_rig/mm_proxy.Dockerfile | 9 +- .../launchpad/docker_rig/monerod.Dockerfile | 3 +- .../launchpad/docker_rig/push_bundle.sh | 62 - .../launchpad/docker_rig/run_frontail.sh | 3 + .../docker_rig/sha3_miner.Dockerfile | 8 +- .../launchpad/docker_rig/tor.Dockerfile | 3 +- .../launchpad/docker_rig/xmrig.Dockerfile | 13 +- applications/launchpad/gui-vue/.gitignore | 23 + applications/launchpad/gui-vue/README.md | 24 + .../launchpad/gui-vue/babel.config.js | 5 + .../launchpad/gui-vue/package-lock.json | 15810 ++++++++++++++++ applications/launchpad/gui-vue/package.json | 53 + .../launchpad/gui-vue/public/favicon.ico | Bin 0 -> 4286 bytes .../launchpad/gui-vue/public/index.html | 17 + applications/launchpad/gui-vue/src/App.vue | 44 + .../launchpad/gui-vue/src/assets/logo.png | Bin 0 -> 6849 bytes .../launchpad/gui-vue/src/assets/material.css | 12183 ++++++++++++ .../gui-vue/src/assets/oruga-material.css | 99 + .../gui-vue/src/components/Containers.vue | 79 + .../gui-vue/src/components/LaunchDocker.vue | 228 + .../launchpad/gui-vue/src/components/Logs.vue | 85 + .../gui-vue/src/components/Service.vue | 115 + .../gui-vue/src/components/Settings.vue | 83 + .../gui-vue/src/components/oldLauncher.vue | 79 + applications/launchpad/gui-vue/src/main.js | 47 + applications/launchpad/gui-vue/src/store.js | 207 + applications/launchpad/versions.txt | 2 + .../src/conversions/new_block_template.rs | 4 +- .../src/conversions/transaction.rs | 5 +- .../src/conversions/transaction_kernel.rs | 4 +- .../src/conversions/transaction_output.rs | 4 +- applications/tari_app_utilities/Cargo.toml | 6 +- .../src/identity_management.rs | 11 +- applications/tari_app_utilities/src/lib.rs | 3 + .../tari_app_utilities/src/utilities.rs | 4 +- applications/tari_base_node/src/cli.rs | 6 +- .../src/automation/command_parser.rs | 20 +- .../src/ui/components/network_tab.rs | 8 +- applications/test_faucet/src/main.rs | 2 +- base_layer/core/src/consensus/emission.rs | 3 +- .../src/proof_of_work/monero_rx/pow_data.rs | 2 +- .../core/src/proof_of_work/randomx_factory.rs | 24 +- .../core/src/transactions/tari_amount.rs | 8 +- .../transaction/transaction_output.rs | 6 +- base_layer/key_manager/src/cipher_seed.rs | 7 +- base_layer/key_manager/src/key_manager.rs | 2 +- base_layer/service_framework/src/lib.rs | 12 +- .../src/contacts_service/storage/database.rs | 6 +- .../src/contacts_service/storage/sqlite_db.rs | 2 +- .../storage/sqlite_db/output_sql.rs | 2 +- base_layer/wallet/src/util/watch.rs | 10 +- common/src/configuration/bootstrap.rs | 2 +- common/src/configuration/global.rs | 2 + common/src/logging.rs | 2 +- comms/dht/src/actor.rs | 2 +- comms/dht/src/outbound/message_params.rs | 6 +- comms/examples/stress/service.rs | 1 + comms/src/memsocket/mod.rs | 17 +- comms/src/noise/socket.rs | 41 +- comms/src/peer_manager/wrapper.rs | 14 +- comms/src/protocol/rpc/client/mod.rs | 2 +- comms/src/protocol/rpc/server/mock.rs | 2 +- .../storage/src/lmdb_store/store.rs | 2 +- infrastructure/test_utils/src/enums.rs | 7 +- .../src/futures/async_assert_eventually.rs | 22 +- infrastructure/test_utils/src/futures/mod.rs | 20 +- infrastructure/test_utils/src/streams/mod.rs | 13 +- rust-toolchain.toml | 2 +- 125 files changed, 35078 insertions(+), 495 deletions(-) delete mode 100644 applications/installer/Cargo.toml delete mode 100644 applications/installer/src/main.rs create mode 100644 applications/launchpad/.dockerignore create mode 100644 applications/launchpad/.gitignore create mode 100644 applications/launchpad/backend/.gitignore create mode 100644 applications/launchpad/backend/Cargo.toml create mode 100644 applications/launchpad/backend/assets/config.toml create mode 100644 applications/launchpad/backend/assets/log4rs.yml create mode 100644 applications/launchpad/backend/assets/torrc create mode 100644 applications/launchpad/backend/icons/android-icon-192x192.png create mode 100644 applications/launchpad/backend/icons/apple-icon-114x114.png create mode 100644 applications/launchpad/backend/icons/apple-icon-120x120.png create mode 100644 applications/launchpad/backend/icons/apple-icon-144x144.png create mode 100644 applications/launchpad/backend/icons/apple-icon-152x152.png create mode 100644 applications/launchpad/backend/icons/apple-icon-180x180.png create mode 100644 applications/launchpad/backend/icons/apple-icon-57x57.png create mode 100644 applications/launchpad/backend/icons/apple-icon-57x57.png.1 create mode 100644 applications/launchpad/backend/icons/apple-icon-60x60.png create mode 100644 applications/launchpad/backend/icons/apple-icon-72x72.png create mode 100644 applications/launchpad/backend/icons/apple-icon-76x76.png create mode 100644 applications/launchpad/backend/icons/favicon-16x16.png create mode 100644 applications/launchpad/backend/icons/favicon-32x32.png create mode 100644 applications/launchpad/backend/icons/favicon-96x96.png create mode 100644 applications/launchpad/backend/icons/icon.ico create mode 100644 applications/launchpad/backend/icons/icon.png create mode 100644 applications/launchpad/backend/icons/tari_issues.png create mode 100644 applications/launchpad/backend/package.json create mode 100644 applications/launchpad/backend/src/build.rs create mode 100644 applications/launchpad/backend/src/commands/create_workspace.rs create mode 100644 applications/launchpad/backend/src/commands/events.rs create mode 100644 applications/launchpad/backend/src/commands/launch_docker.rs rename applications/{installer/src/config/base_node.rs => launchpad/backend/src/commands/mod.rs} (66%) create mode 100644 applications/launchpad/backend/src/commands/pull_images.rs create mode 100644 applications/launchpad/backend/src/commands/service.rs rename applications/{installer/src/config/mining.rs => launchpad/backend/src/commands/shutdown.rs} (64%) create mode 100644 applications/launchpad/backend/src/commands/state.rs rename applications/{installer/src/config/common.rs => launchpad/backend/src/docker/error.rs} (52%) create mode 100644 applications/launchpad/backend/src/docker/filesystem.rs rename applications/{installer/src/config/mod.rs => launchpad/backend/src/docker/helpers.rs} (84%) rename applications/{installer/src/config/combined.rs => launchpad/backend/src/docker/mod.rs} (73%) create mode 100644 applications/launchpad/backend/src/docker/models.rs create mode 100644 applications/launchpad/backend/src/docker/settings.rs create mode 100644 applications/launchpad/backend/src/docker/workspace.rs create mode 100644 applications/launchpad/backend/src/docker/wrapper.rs rename applications/{installer/src/config/wallet.rs => launchpad/backend/src/error.rs} (56%) rename applications/{installer/src/utils/mod.rs => launchpad/backend/src/lib.rs} (96%) create mode 100644 applications/launchpad/backend/src/main.rs create mode 100644 applications/launchpad/backend/tauri.conf.json create mode 100755 applications/launchpad/build_images.sh create mode 100644 applications/launchpad/docker_rig/frontail.Dockerfile delete mode 100755 applications/launchpad/docker_rig/push_bundle.sh create mode 100755 applications/launchpad/docker_rig/run_frontail.sh create mode 100644 applications/launchpad/gui-vue/.gitignore create mode 100644 applications/launchpad/gui-vue/README.md create mode 100644 applications/launchpad/gui-vue/babel.config.js create mode 100644 applications/launchpad/gui-vue/package-lock.json create mode 100644 applications/launchpad/gui-vue/package.json create mode 100644 applications/launchpad/gui-vue/public/favicon.ico create mode 100644 applications/launchpad/gui-vue/public/index.html create mode 100644 applications/launchpad/gui-vue/src/App.vue create mode 100644 applications/launchpad/gui-vue/src/assets/logo.png create mode 100644 applications/launchpad/gui-vue/src/assets/material.css create mode 100644 applications/launchpad/gui-vue/src/assets/oruga-material.css create mode 100644 applications/launchpad/gui-vue/src/components/Containers.vue create mode 100644 applications/launchpad/gui-vue/src/components/LaunchDocker.vue create mode 100644 applications/launchpad/gui-vue/src/components/Logs.vue create mode 100644 applications/launchpad/gui-vue/src/components/Service.vue create mode 100644 applications/launchpad/gui-vue/src/components/Settings.vue create mode 100644 applications/launchpad/gui-vue/src/components/oldLauncher.vue create mode 100644 applications/launchpad/gui-vue/src/main.js create mode 100644 applications/launchpad/gui-vue/src/store.js create mode 100644 applications/launchpad/versions.txt diff --git a/.github/workflows/base_node_binaries.yml b/.github/workflows/base_node_binaries.yml index 0da2411273..b41ee1f406 100644 --- a/.github/workflows/base_node_binaries.yml +++ b/.github/workflows/base_node_binaries.yml @@ -132,6 +132,12 @@ jobs: target key: ${{ runner.os }}-${{ matrix.os }}-${{ matrix.target_cpu }}-${{ matrix.features }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} + - name: Compile NPM + run: | + cd applications/launchpad/gui-vue + npm install + npm run build + - name: Build binaries env: RUSTFLAGS: "-C target_cpu=${{ matrix.target_cpu }}" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9d9961d7e8..8b984d23ae 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ name: CI env: CARGO_HTTP_MULTIPLEXING: false PROTOC: protoc - toolchain: nightly-2021-09-18 + toolchain: nightly-2021-11-20 jobs: clippy: @@ -23,17 +23,25 @@ jobs: run: | sudo apt-get update && \ sudo apt-get -y install \ - libssl-dev \ - openssl \ - libsqlite3-dev \ - pkg-config \ - git \ - cmake \ - zip \ - libc++-dev \ - libc++abi-dev \ - libprotobuf-dev \ - protobuf-compiler + libssl-dev \ + openssl \ + libsqlite3-dev \ + pkg-config \ + git \ + cmake \ + zip \ + libc++-dev \ + libc++abi-dev \ + libprotobuf-dev \ + protobuf-compiler \ + libwebkit2gtk-4.0-dev \ + build-essential \ + curl \ + wget \ + libgtk-3-dev \ + libappindicator3-dev \ + patchelf \ + librsvg2-dev - name: checkout uses: actions/checkout@v2 - name: toolchain @@ -55,6 +63,11 @@ jobs: with: command: fmt args: --all -- --check + - name: Compile NPM + run: | + cd applications/launchpad/gui-vue + npm install + npm run build - name: Clippy check uses: actions-rs/cargo@v1 with: @@ -78,17 +91,23 @@ jobs: run: | sudo apt-get update && \ sudo apt-get -y install \ - libssl-dev \ - openssl \ - libsqlite3-dev \ - pkg-config \ - git \ - cmake \ - zip \ - libc++-dev \ - libc++abi-dev \ - libprotobuf-dev \ - protobuf-compiler + build-essential \ + libgtk-3-dev \ + libwebkit2gtk-4.0-dev \ + libsoup2.4-dev \ + curl \ + wget \ + libappindicator3-dev \ + patchelf \ + librsvg2-dev \ + libprotobuf-dev \ + protobuf-compiler + + - name: Compile NPM + run: | + cd applications/launchpad/gui-vue + npm install + npm run build - name: toolchain uses: actions-rs/toolchain@v1 diff --git a/Cargo.lock b/Cargo.lock index cba0dcbdba..9243799a7c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,6 +8,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler32" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" + [[package]] name = "aead" version = "0.3.2" @@ -173,12 +179,37 @@ dependencies = [ "nodrop", ] +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + [[package]] name = "arrayvec" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +[[package]] +name = "async-io" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" +dependencies = [ + "concurrent-queue", + "futures-lite", + "libc", + "log", + "once_cell", + "parking", + "polling", + "slab", + "socket2", + "waker-fn", + "winapi 0.3.9", +] + [[package]] name = "async-stream" version = "0.3.2" @@ -211,6 +242,48 @@ dependencies = [ "syn 1.0.81", ] +[[package]] +name = "atk" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a83b21d2aa75e464db56225e1bda2dd5993311ba1095acaa8fa03d1ae67026ba" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "badcf670157c84bb8b1cf6b5f70b650fed78da2033c9eed84c4e49b11cbe83ea" +dependencies = [ + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "attohttpc" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8bda305457262b339322106c776e3fd21df860018e566eb6a5b1aa4b6ae02d" +dependencies = [ + "flate2", + "http", + "log", + "native-tls", + "openssl", + "serde 1.0.130", + "serde_json", + "serde_urlencoded 0.6.1", + "url 2.2.2", + "wildmatch", +] + [[package]] name = "atty" version = "0.2.14" @@ -308,7 +381,7 @@ dependencies = [ "bitflags 1.3.2", "cexpr", "clang-sys", - "clap", + "clap 2.33.3", "env_logger 0.8.4", "lazy_static 1.4.0", "lazycell", @@ -357,6 +430,38 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "blake2b_simd" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "constant_time_eq", +] + +[[package]] +name = "blake3" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "526c210b4520e416420759af363083471656e819a75e831b8d2c9d5a584f2413" +dependencies = [ + "arrayref", + "arrayvec 0.7.2", + "cc", + "cfg-if 1.0.0", + "constant_time_eq", + "digest 0.9.0", + "rayon", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-buffer" version = "0.7.3" @@ -424,6 +529,47 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "bollard" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92fed694fd5a7468c971538351c61b9c115f1ae6ed411cd2800f0f299403a4b" +dependencies = [ + "base64 0.13.0", + "bollard-stubs", + "bytes 1.1.0", + "chrono", + "dirs-next 2.0.0", + "futures-core", + "futures-util", + "hex", + "http", + "hyper", + "hyperlocal", + "log", + "pin-project 1.0.8", + "serde 1.0.130", + "serde_derive", + "serde_json", + "serde_urlencoded 0.7.0", + "thiserror", + "tokio", + "tokio-util", + "url 2.2.2", + "winapi 0.3.9", +] + +[[package]] +name = "bollard-stubs" +version = "1.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2f2e73fffe9455141e170fb9c1feb0ac521ec7e7dcd47a7cab72a658490fb8" +dependencies = [ + "chrono", + "serde 1.0.130", + "serde_with", +] + [[package]] name = "bs58" version = "0.4.0" @@ -497,12 +643,63 @@ dependencies = [ "serde 1.0.130", ] +[[package]] +name = "bzip2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6afcd980b5f3a45017c57e57a2fcccbb351cc43a356ce117ef760ef8052b89b0" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "c_linked_list" version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" +[[package]] +name = "cache-padded" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" + +[[package]] +name = "cairo-rs" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b5725979db0c586d98abad2193cdb612dd40ef95cd26bd99851bf93b3cb482" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.14.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b448b876970834fda82ba3aeaccadbd760206b75388fc5c1b02f1e343b697570" +dependencies = [ + "glib-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + [[package]] name = "case" version = "0.1.0" @@ -541,7 +738,7 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "744fcfb4c9f64d649756fd972afec5120641eaa8b2ff86a4ae981f68648780b8" dependencies = [ - "clap", + "clap 2.33.3", "heck", "indexmap", "log", @@ -559,6 +756,9 @@ name = "cc" version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +dependencies = [ + "jobserver", +] [[package]] name = "cexpr" @@ -569,6 +769,16 @@ dependencies = [ "nom 5.1.2", ] +[[package]] +name = "cfb" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca453e8624711b2f0f4eb47076a318feda166252a827ee25d067b43de83dcba0" +dependencies = [ + "byteorder", + "uuid", +] + [[package]] name = "cfb-mode" version = "0.6.0" @@ -578,6 +788,15 @@ dependencies = [ "cipher 0.2.5", ] +[[package]] +name = "cfg-expr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b412e83326147c2bb881f8b40edfbf9905b9b8abaebd0e47ca190ba62fda8f0e" +dependencies = [ + "smallvec", +] + [[package]] name = "cfg-if" version = "0.1.10" @@ -590,6 +809,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "chacha20" version = "0.7.3" @@ -690,11 +915,43 @@ dependencies = [ "atty", "bitflags 1.3.2", "strsim 0.8.0", - "textwrap", + "textwrap 0.11.0", + "unicode-width", + "vec_map", +] + +[[package]] +name = "clap" +version = "3.0.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd1061998a501ee7d4b6d449020df3266ca3124b941ec56cf2005c3779ca142" +dependencies = [ + "atty", + "bitflags 1.3.2", + "clap_derive", + "indexmap", + "lazy_static 1.4.0", + "os_str_bytes", + "strsim 0.10.0", + "termcolor", + "textwrap 0.12.1", "unicode-width", "vec_map", ] +[[package]] +name = "clap_derive" +version = "3.0.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85946d4034625800196413478a1c6d3a57c12785e1f3970e590e0137dfa07342" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + [[package]] name = "clear_on_drop" version = "0.2.4" @@ -724,12 +981,83 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "cocoa" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation 0.9.2", + "core-graphics 0.22.3", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation 0.9.2", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + [[package]] name = "color_quant" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "com" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a30a2b2a013da986dc5cc3eda3d19c0d59d53f835be1b2356eb8d00f000c793" +dependencies = [ + "com_macros", +] + +[[package]] +name = "com_macros" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7606b05842fea68ddcc89e8053b8860ebcb2a0ba8d6abfe3a148e5d5a8d3f0c1" +dependencies = [ + "com_macros_support", + "proc-macro2 1.0.32", + "syn 1.0.81", +] + +[[package]] +name = "com_macros_support" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97e9a6d20f4ac8830e309a455d7e9416e65c6af5a97c88c55fbb4c2012e107da" +dependencies = [ + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + +[[package]] +name = "concurrent-queue" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" +dependencies = [ + "cache-padded", +] + [[package]] name = "config" version = "0.9.3" @@ -740,34 +1068,122 @@ dependencies = [ "nom 4.2.3", "rust-ini", "serde 1.0.130", - "serde-hjson", + "serde-hjson 0.8.2", "serde_json", "toml 0.4.10", "yaml-rust", ] +[[package]] +name = "config" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1b9d958c2b1368a663f05538fc1b5975adce1e19f435acceae987aceeeb369" +dependencies = [ + "lazy_static 1.4.0", + "nom 5.1.2", + "rust-ini", + "serde 1.0.130", + "serde-hjson 0.9.1", + "serde_json", + "toml 0.5.8", + "yaml-rust", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + [[package]] name = "convert_case" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +[[package]] +name = "core-foundation" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +dependencies = [ + "core-foundation-sys 0.7.0", + "libc", +] + [[package]] name = "core-foundation" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" dependencies = [ - "core-foundation-sys", + "core-foundation-sys 0.8.3", "libc", ] +[[package]] +name = "core-foundation-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" + [[package]] name = "core-foundation-sys" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +[[package]] +name = "core-graphics" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.7.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.2", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.2", + "foreign-types", + "libc", +] + +[[package]] +name = "core-video-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" +dependencies = [ + "cfg-if 0.1.10", + "core-foundation-sys 0.7.0", + "core-graphics 0.19.2", + "libc", + "objc", +] + [[package]] name = "cpufeatures" version = "0.2.1" @@ -806,7 +1222,7 @@ checksum = "0363053954f3e679645fc443321ca128b7b950a6fe288cf5f9335cc22ee58394" dependencies = [ "atty", "cast", - "clap", + "clap 2.33.3", "criterion-plot", "csv", "itertools 0.8.2", @@ -1011,6 +1427,33 @@ dependencies = [ "subtle", ] +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.8.0", + "proc-macro2 1.0.32", + "quote 1.0.10", + "smallvec", + "syn 1.0.81", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" +dependencies = [ + "quote 1.0.10", + "syn 1.0.81", +] + [[package]] name = "csv" version = "1.1.6" @@ -1051,6 +1494,12 @@ dependencies = [ "cipher 0.3.0", ] +[[package]] +name = "cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" + [[package]] name = "curl-sys" version = "0.4.51+curl-7.80.0" @@ -1101,8 +1550,18 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.10.2", + "darling_macro 0.10.2", +] + +[[package]] +name = "darling" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" +dependencies = [ + "darling_core 0.13.1", + "darling_macro 0.13.1", ] [[package]] @@ -1119,13 +1578,38 @@ dependencies = [ "syn 1.0.81", ] +[[package]] +name = "darling_core" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2 1.0.32", + "quote 1.0.10", + "strsim 0.10.0", + "syn 1.0.81", +] + [[package]] name = "darling_macro" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ - "darling_core", + "darling_core 0.10.2", + "quote 1.0.10", + "syn 1.0.81", +] + +[[package]] +name = "darling_macro" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" +dependencies = [ + "darling_core 0.13.1", "quote 1.0.10", "syn 1.0.81", ] @@ -1148,6 +1632,26 @@ dependencies = [ "thiserror", ] +[[package]] +name = "deflate" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707b6a7b384888a70c8d2e8650b3e60170dfc6a67bb4aa67b6dfca57af4bedb4" +dependencies = [ + "adler32", + "byteorder", +] + +[[package]] +name = "deflate" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +dependencies = [ + "adler32", + "byteorder", +] + [[package]] name = "deps_only" version = "0.1.0" @@ -1183,7 +1687,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2658621297f2cf68762a6f7dc0bb7e1ff2cfd6583daef8ee0fed6f7ec468ec0" dependencies = [ - "darling", + "darling 0.10.2", "derive_builder_core", "proc-macro2 1.0.32", "quote 1.0.10", @@ -1196,7 +1700,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2791ea3e372c8495c0bc2033991d76b512cd799d07491fbd6890124db9458bef" dependencies = [ - "darling", + "darling 0.10.2", "proc-macro2 1.0.32", "quote 1.0.10", "syn 1.0.81", @@ -1283,6 +1787,17 @@ dependencies = [ "generic-array 0.14.4", ] +[[package]] +name = "dirs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" +dependencies = [ + "libc", + "redox_users 0.3.5", + "winapi 0.3.9", +] + [[package]] name = "dirs-next" version = "1.0.2" @@ -1310,16 +1825,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", - "redox_users", + "redox_users 0.4.0", "winapi 0.3.9", ] +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + [[package]] name = "dtoa" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" +[[package]] +name = "dtoa-short" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6" +dependencies = [ + "dtoa", +] + [[package]] name = "ed25519" version = "1.3.0" @@ -1349,6 +1879,12 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +[[package]] +name = "embed_plist" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53dd2e43a7d32952a6054141ee0d75183958620e84e5eab045de362dff13dc99" + [[package]] name = "encoding_rs" version = "0.8.29" @@ -1376,6 +1912,27 @@ dependencies = [ "syn 1.0.81", ] +[[package]] +name = "enumflags2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" +dependencies = [ + "enumflags2_derive", + "serde 1.0.130", +] + +[[package]] +name = "enumflags2_derive" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" +dependencies = [ + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + [[package]] name = "env_logger" version = "0.6.2" @@ -1415,6 +1972,19 @@ dependencies = [ "termcolor", ] +[[package]] +name = "env_logger" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +dependencies = [ + "atty", + "humantime 2.1.0", + "log", + "regex", + "termcolor", +] + [[package]] name = "error-code" version = "2.3.0" @@ -1443,6 +2013,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95765f67b4b18863968b4a1bd5bb576f732b29a4a28c7cd84c09fa3e2875f33c" +[[package]] +name = "fastrand" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b394ed3d285a429378d3b384b9eb1285267e7df4b166df24b7a6939a04dc392e" +dependencies = [ + "instant", +] + [[package]] name = "fd-lock" version = "3.0.0" @@ -1454,6 +2033,28 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "field-offset" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" +dependencies = [ + "memoffset", + "rustc_version 0.3.3", +] + +[[package]] +name = "filetime" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall 0.2.10", + "winapi 0.3.9", +] + [[package]] name = "fixed-hash" version = "0.7.0" @@ -1481,7 +2082,7 @@ dependencies = [ "cfg-if 1.0.0", "crc32fast", "libc", - "miniz_oxide", + "miniz_oxide 0.4.4", ] [[package]] @@ -1532,6 +2133,16 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" +[[package]] +name = "futf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c9c1ce3fa9336301af935ab852c437817d14cd33690446569392e65170aac3b" +dependencies = [ + "mac", + "new_debug_unreachable", +] + [[package]] name = "futures" version = "0.1.31" @@ -1619,6 +2230,21 @@ version = "0.3.0-alpha.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4914ae450db1921a56c91bde97a27846287d062087d4a652efc09bb3a01ebda" +[[package]] +name = "futures-lite" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + [[package]] name = "futures-macro" version = "0.3.17" @@ -1728,12 +2354,92 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "gcc" version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" +[[package]] +name = "gdk" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d749dcfc00d8de0d7c3a289e04a04293eb5ba3d8a4e64d64911d481fa9933b" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534192cb8f01daeb8fab2c8d4baa8f9aae5b7a39130525779f5c2608e235b10f" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f097c0704201fbc8f69c1762dc58c6947c8bb188b8ed0bc7e65259f1894fe590" +dependencies = [ + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "gdk-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e091b3d3d6696949ac3b3fb3c62090e5bfd7bd6850bef5c3c5ea701de1b1f1e" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "pango-sys", + "pkg-config", + "system-deps 3.2.0", +] + +[[package]] +name = "generator" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "winapi 0.3.9", +] + [[package]] name = "generic-array" version = "0.12.4" @@ -1817,6 +2523,49 @@ dependencies = [ "polyval 0.5.3", ] +[[package]] +name = "gio" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711c3632b3ebd095578a9c091418d10fed492da9443f58ebc8f45efbeb215cb0" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys 0.14.0", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e24fb752f8f5d2cf6bbc2c606fd2bc989c81c5e2fe321ab974d54f8b6344eac" +dependencies = [ + "glib-sys 0.10.1", + "gobject-sys 0.10.0", + "libc", + "system-deps 1.3.2", + "winapi 0.3.9", +] + +[[package]] +name = "gio-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0a41df66e57fcc287c4bcf74fc26b884f31901ea9792ec75607289b456f48fa" +dependencies = [ + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", + "winapi 0.3.9", +] + [[package]] name = "git2" version = "0.8.0" @@ -1832,12 +2581,157 @@ dependencies = [ "url 1.7.2", ] +[[package]] +name = "glib" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c515f1e62bf151ef6635f528d05b02c11506de986e43b34a5c920ef0b3796a4" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "once_cell", + "smallvec", +] + +[[package]] +name = "glib-macros" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aad66361f66796bfc73f530c51ef123970eb895ffba991a234fcf7bea89e518" +dependencies = [ + "anyhow", + "heck", + "proc-macro-crate 1.1.0", + "proc-macro-error", + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + +[[package]] +name = "glib-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7e9b997a66e9a23d073f2b1abb4dbfc3925e0b8952f67efd8d9b6e168e4cdc1" +dependencies = [ + "libc", + "system-deps 1.3.2", +] + +[[package]] +name = "glib-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c1d60554a212445e2a858e42a0e48cece1bd57b311a19a9468f70376cf554ae" +dependencies = [ + "libc", + "system-deps 3.2.0", +] + [[package]] name = "glob" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" +[[package]] +name = "globset" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" +dependencies = [ + "aho-corasick", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "gobject-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "952133b60c318a62bf82ee75b93acc7e84028a093e06b9e27981c2b6fe68218c" +dependencies = [ + "glib-sys 0.10.1", + "libc", + "system-deps 1.3.2", +] + +[[package]] +name = "gobject-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa92cae29759dae34ab5921d73fff5ad54b3d794ab842c117e36cafc7994c3f5" +dependencies = [ + "glib-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "gtk" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb51122dd3317e9327ec1e4faa151d1fa0d95664cd8fb8dcfacf4d4d29ac70c" +dependencies = [ + "atk", + "bitflags 1.3.2", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c14c8d3da0545785a7c5a120345b3abb534010fb8ae0f2ef3f47c027fba303e" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "pango-sys", + "system-deps 3.2.0", +] + +[[package]] +name = "gtk3-macros" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21de1da96dc117443fb03c2e270b2d34b7de98d0a79a19bbb689476173745b79" +dependencies = [ + "anyhow", + "heck", + "proc-macro-crate 1.1.0", + "proc-macro-error", + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + [[package]] name = "h2" version = "0.3.7" @@ -1932,6 +2826,20 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ebdb29d2ea9ed0083cd8cece49bbd968021bd99b0849edb4a9a7ee0fdf6a4e0" +[[package]] +name = "html5ever" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aafcf38a1a36118242d29b92e1b08ef84e67e4a5ed06e0a80be20e6a32bfed6b" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + [[package]] name = "http" version = "0.2.5" @@ -1954,6 +2862,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-range" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee9694f83d9b7c09682fdb32213682939507884e5bcf227be9aff5d644b90dc" + [[package]] name = "httparse" version = "1.5.1" @@ -2030,6 +2944,29 @@ dependencies = [ "tokio-native-tls", ] +[[package]] +name = "hyperlocal" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fafdf7b2b2de7c9784f76e02c0935e65a8117ec3b768644379983ab333ac98c" +dependencies = [ + "futures-util", + "hex", + "hyper", + "pin-project 1.0.8", + "tokio", +] + +[[package]] +name = "ico" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a4b3331534254a9b64095ae60d3dc2a8225a7a70229cd5888be127cdc1f6804" +dependencies = [ + "byteorder", + "png 0.11.0", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -2058,6 +2995,24 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "ignore" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" +dependencies = [ + "crossbeam-utils 0.8.5", + "globset", + "lazy_static 1.4.0", + "log", + "memchr", + "regex", + "same-file", + "thread_local", + "walkdir", + "winapi-util", +] + [[package]] name = "image" version = "0.23.14" @@ -2082,6 +3037,24 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "infer" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f92b41dab759f9e8427c03f519c344a14655490b8db548dac1e57a75b3258391" +dependencies = [ + "cfb", +] + +[[package]] +name = "inflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5f9f47468e9a76a6452271efadc88fe865a82be91fe75e6c0c57b87ccea59d4" +dependencies = [ + "adler32", +] + [[package]] name = "instant" version = "0.1.12" @@ -2133,6 +3106,40 @@ version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +[[package]] +name = "javascriptcore-rs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca9c7d1445bba2889672fbadc16c3d5007bfdcf0a15a18a3a50fe9fab2c7427" +dependencies = [ + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f46ada8a08dcd75a10afae872fbfb51275df4a8ae0d46b8cc7c708f08dd2998" +dependencies = [ + "libc", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.55" @@ -2181,6 +3188,18 @@ dependencies = [ "winapi-build", ] +[[package]] +name = "kuchiki" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" +dependencies = [ + "cssparser", + "html5ever", + "matches", + "selectors", +] + [[package]] name = "lazy_static" version = "0.2.11" @@ -2202,6 +3221,19 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" +[[package]] +name = "lexical-core" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" +dependencies = [ + "arrayvec 0.5.2", + "bitflags 1.3.2", + "cfg-if 1.0.0", + "ryu", + "static_assertions", +] + [[package]] name = "libc" version = "0.2.108" @@ -2404,12 +3436,68 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "loom" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc5c7d328e32cc4954e8e01193d7f0ef5ab257b5090b70a964e099a36034309" +dependencies = [ + "cfg-if 1.0.0", + "generator", + "scoped-tls", + "serde 1.0.130", + "serde_json", + "tracing", + "tracing-subscriber 0.3.3", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "mac-notification-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb6b71a9a89cd38b395d994214297447e8e63b1ba5708a9a2b0b1048ceda76" +dependencies = [ + "cc", + "chrono", + "dirs", + "objc-foundation", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + [[package]] name = "maplit" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" +[[package]] +name = "markup5ever" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" +dependencies = [ + "log", + "phf 0.8.0", + "phf_codegen", + "string_cache", + "string_cache_codegen", + "tendril", +] + [[package]] name = "matchers" version = "0.0.1" @@ -2419,6 +3507,15 @@ dependencies = [ "regex-automata", ] +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + [[package]] name = "matches" version = "0.1.9" @@ -2500,6 +3597,21 @@ dependencies = [ "unicase", ] +[[package]] +name = "minisign-verify" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db0507fe8e3c68cd62961cf9f87f6c2b21d884d3515a7150a4a3fa9d014e5c12" + +[[package]] +name = "miniz_oxide" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" +dependencies = [ + "adler32", +] + [[package]] name = "miniz_oxide" version = "0.4.4" @@ -2584,7 +3696,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "424f6e86263cd5294cbd7f1e95746b95aca0e0d66bff31e5a40d6baa87b4aa99" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.1.0", "proc-macro-error", "proc-macro2 1.0.32", "quote 1.0.10", @@ -2634,6 +3746,68 @@ dependencies = [ "tempfile", ] +[[package]] +name = "nb-connect" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1bb540dc6ef51cfe1916ec038ce7a620daf3a111e2502d745197cd53d6bca15" +dependencies = [ + "libc", + "socket2", +] + +[[package]] +name = "ndk" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d64d6af06fde0e527b1ba5c7b79a6cc89cfc46325b0b2887dffe8f70197e0c3c" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-glue" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e9e94628f24e7a3cb5b96a2dc5683acd9230bf11991c2a1677b87695138420" +dependencies = [ + "lazy_static 1.4.0", + "libc", + "log", + "ndk", + "ndk-macro", + "ndk-sys", +] + +[[package]] +name = "ndk-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d" +dependencies = [ + "darling 0.10.2", + "proc-macro-crate 0.1.5", + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + +[[package]] +name = "ndk-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1bcdd74c20ad5d95aacd60ef9ba40fdf77f767051040541df557b7a9b2a2121" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + [[package]] name = "newtype-ops" version = "0.1.4" @@ -2649,6 +3823,19 @@ dependencies = [ "smallvec", ] +[[package]] +name = "nix" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" +dependencies = [ + "bitflags 1.3.2", + "cc", + "cfg-if 0.1.10", + "libc", + "void", +] + [[package]] name = "nix" version = "0.22.0" @@ -2690,10 +3877,25 @@ version = "5.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" dependencies = [ + "lexical-core", "memchr", "version_check 0.9.3", ] +[[package]] +name = "notify-rust" +version = "4.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6ebab865e67efdd7182a88d76cadbdd2a8d02d1c7a4e16bb7c234016a12cac" +dependencies = [ + "mac-notification-sys", + "serde 1.0.130", + "winrt-notification", + "zbus", + "zvariant", + "zvariant_derive", +] + [[package]] name = "ntapi" version = "0.3.6" @@ -2822,31 +4024,82 @@ dependencies = [ ] [[package]] -name = "num-traits" -version = "0.1.43" +name = "num-traits" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +dependencies = [ + "num-traits 0.2.14", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg 1.0.1", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9bd055fb730c4f8f4f57d45d35cd6b3f0980535b056dc7ff119cee6a66ed6f" +dependencies = [ + "derivative", + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "486ea01961c4a818096de679a8b740b26d9033146ac5291b1c98557658f8cdd9" +dependencies = [ + "proc-macro-crate 1.1.0", + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + +[[package]] +name = "objc" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ - "num-traits 0.2.14", + "malloc_buf", ] [[package]] -name = "num-traits" -version = "0.2.14" +name = "objc-foundation" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" dependencies = [ - "autocfg 1.0.1", + "block", + "objc", + "objc_id", ] [[package]] -name = "num_cpus" -version = "1.13.0" +name = "objc_id" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" dependencies = [ - "hermit-abi", - "libc", + "objc", ] [[package]] @@ -2867,6 +4120,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "open" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "176ee4b630d174d2da8241336763bb459281dddc0f4d87f72c3b1efc9a6109b7" +dependencies = [ + "pathdiff", + "winapi 0.3.9", +] + [[package]] name = "openssl" version = "0.10.38" @@ -2989,6 +4252,33 @@ dependencies = [ "num-traits 0.2.14", ] +[[package]] +name = "os_info" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5501659840950e918d046ad97ebe9702cbb4ec0097e47dbd27abf7692223181" +dependencies = [ + "log", + "serde 1.0.130", + "winapi 0.3.9", +] + +[[package]] +name = "os_pipe" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb233f06c2307e1f5ce2ecad9f8121cffbbee2c95428f44ea85222e460d0d213" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "os_str_bytes" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb2e1c3ee07430c2cf76151675e583e0f19985fa6efae47d6848a3e2c824f85" + [[package]] name = "packed_simd_2" version = "0.3.6" @@ -2999,6 +4289,37 @@ dependencies = [ "libm 0.1.4", ] +[[package]] +name = "pango" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "546fd59801e5ca735af82839007edd226fe7d3bb06433ec48072be4439c28581" +dependencies = [ + "bitflags 1.3.2", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2367099ca5e761546ba1d501955079f097caa186bb53ce0f718dca99ac1942fe" +dependencies = [ + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "libc", + "system-deps 3.2.0", +] + +[[package]] +name = "parking" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" + [[package]] name = "parking_lot" version = "0.10.2" @@ -3065,6 +4386,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ecba01bf2678719532c5e3059e0b5f0811273d94b397088b82e3bd0a78c78fdd" +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + [[package]] name = "peeking_take_while" version = "0.1.2" @@ -3197,6 +4524,104 @@ dependencies = [ "zeroize", ] +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_macros 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.4", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" version = "0.4.28" @@ -3255,6 +4680,43 @@ version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" +[[package]] +name = "png" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0b0cabbbd20c2d7f06dbf015e06aad59b6ca3d9ed14848783e98af9aaf19925" +dependencies = [ + "bitflags 1.3.2", + "deflate 0.7.20", + "inflate", + "num-iter", +] + +[[package]] +name = "png" +version = "0.16.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "deflate 0.8.6", + "miniz_oxide 0.3.7", +] + +[[package]] +name = "polling" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "log", + "wepoll-ffi", + "winapi 0.3.9", +] + [[package]] name = "poly1305" version = "0.7.2" @@ -3295,6 +4757,21 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml 0.5.8", +] + [[package]] name = "proc-macro-crate" version = "1.1.0" @@ -3503,6 +4980,7 @@ dependencies = [ "rand_chacha 0.2.2", "rand_core 0.5.1", "rand_hc 0.2.0", + "rand_pcg", ] [[package]] @@ -3602,6 +5080,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + [[package]] name = "rand_xoshiro" version = "0.1.0" @@ -3623,6 +5110,25 @@ dependencies = [ "thiserror", ] +[[package]] +name = "raw-window-handle" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28f55143d0548dad60bb4fbdc835a3d7ac6acc3324506450c5fdd6e42903a76" +dependencies = [ + "libc", + "raw-window-handle 0.4.2", +] + +[[package]] +name = "raw-window-handle" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba75eee94a9d5273a68c9e1e105d9cffe1ef700532325788389e5a83e2522b7" +dependencies = [ + "cty", +] + [[package]] name = "rayon" version = "1.5.1" @@ -3672,6 +5178,17 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_users" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +dependencies = [ + "getrandom 0.1.16", + "redox_syscall 0.1.57", + "rust-argon2", +] + [[package]] name = "redox_users" version = "0.4.0" @@ -3742,7 +5259,7 @@ dependencies = [ "pin-project-lite", "serde 1.0.130", "serde_json", - "serde_urlencoded", + "serde_urlencoded 0.7.0", "tokio", "tokio-native-tls", "url 2.2.2", @@ -3752,6 +5269,29 @@ dependencies = [ "winreg", ] +[[package]] +name = "rfd" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "609ed912e110af7d7084b6b17d2a68b25e766208e015a37beba1be3c2d7cbb3b" +dependencies = [ + "block", + "dispatch", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "gtk-sys", + "js-sys", + "lazy_static 1.4.0", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle 0.3.4", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winapi 0.3.9", +] + [[package]] name = "ring" version = "0.16.20" @@ -3831,6 +5371,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rust-argon2" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" +dependencies = [ + "base64 0.13.0", + "blake2b_simd", + "constant_time_eq", + "crossbeam-utils 0.8.5", +] + [[package]] name = "rust-ini" version = "0.13.0" @@ -3880,6 +5432,12 @@ dependencies = [ "webpki", ] +[[package]] +name = "rustversion" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" + [[package]] name = "rustyline" version = "9.0.0" @@ -3894,7 +5452,7 @@ dependencies = [ "libc", "log", "memchr", - "nix", + "nix 0.22.0", "radix_trie", "scopeguard", "smallvec", @@ -3983,8 +5541,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" dependencies = [ "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", + "core-foundation 0.9.2", + "core-foundation-sys 0.8.3", "libc", "security-framework-sys", ] @@ -3995,10 +5553,30 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" dependencies = [ - "core-foundation-sys", + "core-foundation-sys 0.8.3", "libc", ] +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + [[package]] name = "semver" version = "0.11.0" @@ -4061,6 +5639,18 @@ dependencies = [ "serde 0.8.23", ] +[[package]] +name = "serde-hjson" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a3a4e0ea8a88553209f6cc6cfe8724ecad22e1acf372793c27d995290fe74f8" +dependencies = [ + "lazy_static 1.4.0", + "num-traits 0.1.43", + "regex", + "serde 0.8.23", +] + [[package]] name = "serde-value" version = "0.5.3" @@ -4118,9 +5708,21 @@ dependencies = [ name = "serde_test" version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "110b3dbdf8607ec493c22d5d947753282f3bae73c0f56d322af1e8c78e4c23d5" +checksum = "110b3dbdf8607ec493c22d5d947753282f3bae73c0f56d322af1e8c78e4c23d5" +dependencies = [ + "serde 0.8.23", +] + +[[package]] +name = "serde_urlencoded" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" dependencies = [ - "serde 0.8.23", + "dtoa", + "itoa", + "serde 1.0.130", + "url 2.2.2", ] [[package]] @@ -4135,6 +5737,29 @@ dependencies = [ "serde 1.0.130", ] +[[package]] +name = "serde_with" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad6056b4cb69b6e43e3a0f055def223380baecc99da683884f205bf347f7c4b3" +dependencies = [ + "rustversion", + "serde 1.0.130", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12e47be9471c72889ebafb5e14d5ff930d89ae7a67bbdb5f8abb564f845a927e" +dependencies = [ + "darling 0.13.1", + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + [[package]] name = "serde_yaml" version = "0.8.21" @@ -4147,6 +5772,16 @@ dependencies = [ "yaml-rust", ] +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + [[package]] name = "sha-1" version = "0.8.2" @@ -4172,6 +5807,12 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "sha1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" + [[package]] name = "sha2" version = "0.9.8" @@ -4206,6 +5847,16 @@ dependencies = [ "lazy_static 1.4.0", ] +[[package]] +name = "shared_child" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6be9f7d5565b1483af3e72975e2dee33879b3b86bd48c0929fccf6585d79e65a" +dependencies = [ + "libc", + "winapi 0.3.9", +] + [[package]] name = "shlex" version = "0.1.1" @@ -4270,6 +5921,12 @@ dependencies = [ "num-traits 0.2.14", ] +[[package]] +name = "siphasher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b" + [[package]] name = "slab" version = "0.4.5" @@ -4309,18 +5966,48 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "soup-sys" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7adf08565630bbb71f955f11f8a68464817ded2703a3549747c235b58a13e" +dependencies = [ + "bitflags 1.3.2", + "gio-sys 0.10.1", + "glib-sys 0.10.1", + "gobject-sys 0.10.0", + "libc", + "pkg-config", + "system-deps 1.3.2", +] + [[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "stack-buf" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7386b49cb287f6fafbfd3bd604914bccb99fb8d53483f40e1ecfda5d45f3370" +[[package]] +name = "state" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cf4f5369e6d3044b5e365c9690f451516ac8f0954084622b49ea3fde2f6de5" +dependencies = [ + "loom", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -4342,6 +6029,32 @@ dependencies = [ "futures 0.1.31", ] +[[package]] +name = "string_cache" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "923f0f39b6267d37d23ce71ae7235602134b250ace715dd2c90421998ddac0c6" +dependencies = [ + "lazy_static 1.4.0", + "new_debug_unreachable", + "parking_lot 0.11.2", + "phf_shared 0.8.0", + "precomputed-hash", + "serde 1.0.130", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro2 1.0.32", + "quote 1.0.10", +] + [[package]] name = "strsim" version = "0.8.0" @@ -4354,13 +6067,19 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "structopt" version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40b9788f4202aa75c240ecc9c15c65185e6a39ccdeb0fd5d008b98825464c87c" dependencies = [ - "clap", + "clap 2.33.3", "lazy_static 1.4.0", "structopt-derive", ] @@ -4378,12 +6097,24 @@ dependencies = [ "syn 1.0.81", ] +[[package]] +name = "strum" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b" + [[package]] name = "strum" version = "0.19.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89a286a7e3b5720b9a477b23253bc50debac207c8d21505f8e70b36792f11b5" +[[package]] +name = "strum" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf86bbcfd1fa9670b7a129f64fc0c9fcbbfe4f1bc4210e9e98fe71ffc12cde2" + [[package]] name = "strum" version = "0.22.0" @@ -4393,6 +6124,12 @@ dependencies = [ "strum_macros 0.22.0", ] +[[package]] +name = "strum" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cae14b91c7d11c9a851d3fbc80a963198998c2a64eec840477fa92d8ce9b70bb" + [[package]] name = "strum_macros" version = "0.17.1" @@ -4429,6 +6166,18 @@ dependencies = [ "syn 1.0.81", ] +[[package]] +name = "strum_macros" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d06aaeeee809dbc59eb4556183dd927df67db1540de5be8d3ec0b6636358a5ec" +dependencies = [ + "heck", + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + [[package]] name = "strum_macros" version = "0.22.0" @@ -4441,6 +6190,19 @@ dependencies = [ "syn 1.0.81", ] +[[package]] +name = "strum_macros" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bb0dc7ee9c15cea6199cde9a127fa16a4c5819af85395457ad72d68edc85a38" +dependencies = [ + "heck", + "proc-macro2 1.0.32", + "quote 1.0.10", + "rustversion", + "syn 1.0.81", +] + [[package]] name = "subtle" version = "2.4.1" @@ -4513,6 +6275,89 @@ dependencies = [ "unicode-xid 0.2.2", ] +[[package]] +name = "system-deps" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3ecc17269a19353b3558b313bba738b25d82993e30d62a18406a24aba4649b" +dependencies = [ + "heck", + "pkg-config", + "strum 0.18.0", + "strum_macros 0.18.0", + "thiserror", + "toml 0.5.8", + "version-compare 0.0.10", +] + +[[package]] +name = "system-deps" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "480c269f870722b3b08d2f13053ce0c2ab722839f472863c3e2d61ff3a1c2fa6" +dependencies = [ + "anyhow", + "cfg-expr", + "heck", + "itertools 0.10.1", + "pkg-config", + "strum 0.21.0", + "strum_macros 0.21.1", + "thiserror", + "toml 0.5.8", + "version-compare 0.0.11", +] + +[[package]] +name = "tao" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa57de7c282b68f8906278543a724ed8f5a2568f069dd0cc05fc10d1f07036b" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "cc", + "cocoa", + "core-foundation 0.9.2", + "core-graphics 0.22.3", + "core-video-sys", + "crossbeam-channel 0.5.1", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "glib-sys 0.14.0", + "gtk", + "instant", + "lazy_static 1.4.0", + "libc", + "log", + "ndk", + "ndk-glue", + "ndk-sys", + "objc", + "parking_lot 0.11.2", + "raw-window-handle 0.3.4", + "scopeguard", + "serde 1.0.130", + "unicode-segmentation", + "winapi 0.3.9", + "x11-dl", +] + +[[package]] +name = "tar" +version = "0.4.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f5515d3add52e0bbdcad7b83c388bb36ba7b754dda3b5f5bc2d38640cdba5c" +dependencies = [ + "filetime", + "libc", + "xattr", +] + [[package]] name = "tari_app_grpc" version = "0.22.0" @@ -4532,7 +6377,7 @@ dependencies = [ name = "tari_app_utilities" version = "0.22.0" dependencies = [ - "config", + "config 0.9.3", "dirs-next 1.0.2", "futures 0.3.17", "json5", @@ -4546,9 +6391,9 @@ dependencies = [ "tari_common", "tari_common_types", "tari_comms", - "tari_core", "tari_crypto", "tari_p2p", + "tari_utilities", "thiserror", "tokio", "tonic", @@ -4561,7 +6406,7 @@ dependencies = [ "anyhow", "bincode", "chrono", - "config", + "config 0.9.3", "either", "futures 0.3.17", "log", @@ -4593,7 +6438,7 @@ dependencies = [ "tonic", "tracing", "tracing-opentelemetry", - "tracing-subscriber", + "tracing-subscriber 0.2.25", "warp", ] @@ -4621,7 +6466,7 @@ name = "tari_common" version = "0.22.0" dependencies = [ "anyhow", - "config", + "config 0.9.3", "dirs-next 1.0.2", "get_if_addrs", "git2", @@ -4723,7 +6568,7 @@ dependencies = [ "bytes 0.5.6", "chacha20", "chrono", - "clap", + "clap 2.33.3", "diesel", "diesel_migrations", "digest 0.9.0", @@ -4814,7 +6659,7 @@ dependencies = [ "tonic", "tracing", "tracing-opentelemetry", - "tracing-subscriber", + "tracing-subscriber 0.2.25", "tui", "unicode-segmentation", "unicode-width", @@ -4830,7 +6675,7 @@ dependencies = [ "blake2", "bytes 0.5.6", "chrono", - "config", + "config 0.9.3", "croaring", "decimal-rs", "derive_more", @@ -4932,6 +6777,29 @@ dependencies = [ "thiserror", ] +[[package]] +name = "tari_launchpad" +version = "0.1.0" +dependencies = [ + "bollard", + "config 0.11.0", + "env_logger 0.9.0", + "futures 0.3.17", + "log", + "rand 0.8.4", + "serde 1.0.130", + "serde_json", + "strum 0.23.0", + "strum_macros 0.23.1", + "tari_app_utilities", + "tari_comms", + "tauri", + "tauri-build", + "thiserror", + "tokio", + "tor-hash-passwd", +] + [[package]] name = "tari_merge_mining_proxy" version = "0.22.0" @@ -4940,7 +6808,7 @@ dependencies = [ "bincode", "bytes 1.1.0", "chrono", - "config", + "config 0.9.3", "derive-error", "env_logger 0.7.1", "futures 0.3.17", @@ -4966,7 +6834,7 @@ dependencies = [ "tonic", "tracing", "tracing-futures", - "tracing-subscriber", + "tracing-subscriber 0.2.25", "url 2.2.2", ] @@ -5034,7 +6902,7 @@ dependencies = [ "anyhow", "bytes 0.5.6", "chrono", - "clap", + "clap 2.33.3", "env_logger 0.6.2", "fs2", "futures 0.3.17", @@ -5138,7 +7006,7 @@ dependencies = [ "bincode", "bytes 0.5.6", "chrono", - "config", + "config 0.9.3", "derive-error", "env_logger 0.7.1", "futures 0.3.17", @@ -5164,7 +7032,7 @@ dependencies = [ "tonic-build", "tracing", "tracing-futures", - "tracing-subscriber", + "tracing-subscriber 0.2.25", "url 2.2.2", ] @@ -5272,7 +7140,155 @@ dependencies = [ "tari_wallet", "tempfile", "thiserror", - "tokio", + "tokio", +] + +[[package]] +name = "tauri" +version = "1.0.0-beta.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79a0579dcc6fb883fe90dd3c66d76b8b8f4a1786e1e915e314b2017a500ede09" +dependencies = [ + "attohttpc", + "base64 0.13.0", + "bincode", + "cfg_aliases", + "clap 3.0.0-beta.2", + "dirs-next 2.0.0", + "either", + "embed_plist", + "flate2", + "futures 0.3.17", + "futures-lite", + "glib", + "gtk", + "http", + "ignore", + "minisign-verify", + "notify-rust", + "once_cell", + "open", + "os_info", + "os_pipe", + "percent-encoding 2.1.0", + "rand 0.8.4", + "raw-window-handle 0.3.4", + "rfd", + "semver 1.0.4", + "serde 1.0.130", + "serde_json", + "serde_repr", + "shared_child", + "state", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url 2.2.2", + "uuid", + "zip", +] + +[[package]] +name = "tauri-build" +version = "1.0.0-beta.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9c9a9bea25b9d6f5845b8662e18447e17218f99860cab37e39e2b57a9fcd49" +dependencies = [ + "anyhow", + "proc-macro2 1.0.32", + "quote 1.0.10", + "serde_json", + "tauri-utils", + "winres", +] + +[[package]] +name = "tauri-codegen" +version = "1.0.0-beta.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1663739ab53e281919676f216fb56a031104d0d2cd1a2dd5b012d279bcdb0ea4" +dependencies = [ + "blake3", + "kuchiki", + "proc-macro2 1.0.32", + "quote 1.0.10", + "regex", + "serde 1.0.130", + "serde_json", + "tauri-utils", + "thiserror", + "walkdir", + "zstd", +] + +[[package]] +name = "tauri-macros" +version = "1.0.0-beta.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddf9f5868402323f35ef94fa6ab1d5d10b29aea9de598d829723aa1db5693b4" +dependencies = [ + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", + "tauri-codegen", +] + +[[package]] +name = "tauri-runtime" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c52eccfb7f2ce5a09262bdc3671f0f07f637e27f8aa25e5f38145cddcd4e01" +dependencies = [ + "gtk", + "http", + "http-range", + "infer", + "serde 1.0.130", + "serde_json", + "tauri-utils", + "thiserror", + "uuid", + "winapi 0.3.9", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fed8dd0a448c303fa764859d6dfa1c746c4f2c6c30a83c162f8bebb12e4af4e" +dependencies = [ + "gtk", + "ico", + "infer", + "png 0.16.8", + "tauri-runtime", + "tauri-utils", + "uuid", + "winapi 0.3.9", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.0.0-beta.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb9b79594f22b6ed0cc8362e0dfde5b7969962de3cd8ca683de702e59e8221b" +dependencies = [ + "html5ever", + "kuchiki", + "phf 0.10.1", + "proc-macro2 1.0.32", + "quote 1.0.10", + "serde 1.0.130", + "serde_json", + "thiserror", + "url 2.2.2", + "zstd", ] [[package]] @@ -5289,6 +7305,17 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "tendril" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9ef557cb397a4f0a5a3a628f06515f78563f2209e64d47055d9dc6052bf5e33" +dependencies = [ + "futf", + "mac", + "utf-8", +] + [[package]] name = "termcolor" version = "1.1.2" @@ -5321,6 +7348,21 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "textwrap" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "203008d98caf094106cfaba70acfed15e18ed3ddb7d94e49baec153a2b462789" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + [[package]] name = "thiserror" version = "1.0.30" @@ -5602,6 +7644,19 @@ dependencies = [ "syn 1.0.81", ] +[[package]] +name = "tor-hash-passwd" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b83cd43a176c0c19d5db4401283e8f5c296b9c6c7fa29029de15cc445f26e12" +dependencies = [ + "hex", + "hex-literal", + "rand 0.8.4", + "sha1", + "thiserror", +] + [[package]] name = "tower" version = "0.4.11" @@ -5714,7 +7769,7 @@ dependencies = [ "tracing", "tracing-core", "tracing-log", - "tracing-subscriber", + "tracing-subscriber 0.2.25", ] [[package]] @@ -5736,7 +7791,7 @@ dependencies = [ "ansi_term 0.12.1", "chrono", "lazy_static 1.4.0", - "matchers", + "matchers 0.0.1", "regex", "serde 1.0.130", "serde_json", @@ -5749,6 +7804,24 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "tracing-subscriber" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245da694cc7fc4729f3f418b304cb57789f1bed2a78c575407ab8a23f53cb4d3" +dependencies = [ + "ansi_term 0.12.1", + "lazy_static 1.4.0", + "matchers 0.1.0", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + [[package]] name = "traitobject" version = "0.1.0" @@ -6022,6 +8095,7 @@ dependencies = [ "idna 0.2.3", "matches", "percent-encoding 2.1.0", + "serde 1.0.130", ] [[package]] @@ -6036,6 +8110,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.3", +] + [[package]] name = "vcpkg" version = "0.2.15" @@ -6048,6 +8131,18 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +[[package]] +name = "version-compare" +version = "0.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d63556a25bae6ea31b52e640d7c41d1ab27faba4ccb600013837a3d0b3994ca1" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + [[package]] name = "version_check" version = "0.1.5" @@ -6060,6 +8155,18 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "waker-fn" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" + [[package]] name = "walkdir" version = "2.3.2" @@ -6102,7 +8209,7 @@ dependencies = [ "scoped-tls", "serde 1.0.130", "serde_json", - "serde_urlencoded", + "serde_urlencoded 0.7.0", "tokio", "tokio-stream", "tokio-tungstenite", @@ -6199,6 +8306,52 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webkit2gtk" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e47b7f870883fc21612d2a51b74262f7f2cc5371f1621370817292a35300a9" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys 0.14.0", + "glib", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66ccc9f0cb4de7c3b92376a5bf64e7ddffb33852f092721731a039ec38dda98" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys 0.14.0", + "glib-sys 0.14.0", + "gobject-sys 0.14.0", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup-sys", + "system-deps 3.2.0", +] + [[package]] name = "webpki" version = "0.21.4" @@ -6209,6 +8362,38 @@ dependencies = [ "untrusted", ] +[[package]] +name = "webview2" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "283bf6b0ed9c83faea8c7bfe40bb261592147a109effaa4077eed294863d5031" +dependencies = [ + "com", + "once_cell", + "webview2-sys", + "widestring", + "winapi 0.3.9", +] + +[[package]] +name = "webview2-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24b7889e893ac4c50d7346356be3ce13a85e56512c38b8fde0526559b8012a4c" +dependencies = [ + "com", + "winapi 0.3.9", +] + +[[package]] +name = "wepoll-ffi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" +dependencies = [ + "cc", +] + [[package]] name = "which" version = "3.1.1" @@ -6229,6 +8414,18 @@ dependencies = [ "libc", ] +[[package]] +name = "widestring" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" + +[[package]] +name = "wildmatch" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f44b95f62d34113cf558c93511ac93027e03e9c29a60dd0fd70e6e025c7270a" + [[package]] name = "winapi" version = "0.2.8" @@ -6272,6 +8469,42 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9f39345ae0c8ab072c0ac7fe8a8b411636aa34f89be19ddd0d9226544f13944" +dependencies = [ + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_i686_gnu" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0866510a3eca9aed73a077490bbbf03e5eaac4e1fd70849d89539e5830501fd" + +[[package]] +name = "windows_i686_msvc" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf0ffed56b7e9369a29078d2ab3aaeceea48eb58999d2cff3aa2494a275b95c6" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384a173630588044205a2993b6864a2f56e5a8c1e7668c07b93ec18cf4888dc4" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd8f062d8ca5446358159d79a90be12c543b3a965c847c8f3eedf14b321d399" + [[package]] name = "winreg" version = "0.7.0" @@ -6281,6 +8514,67 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "winres" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b68db261ef59e9e52806f688020631e987592bd83619edccda9c47d42cde4f6c" +dependencies = [ + "toml 0.5.8", +] + +[[package]] +name = "winrt-notification" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda101fb8e034a25f3d50a0714d7ca4f234a4fc7bc57427f6d81040db0ccbe6a" +dependencies = [ + "strum 0.22.0", + "windows", + "xml-rs", +] + +[[package]] +name = "wry" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9549393a3917b5303277abb0267f8eecf9fd629b25f1c04e5284aa58b61915" +dependencies = [ + "cocoa", + "core-graphics 0.22.3", + "gdk", + "gio", + "glib", + "gtk", + "http", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde 1.0.130", + "serde_json", + "tao", + "thiserror", + "url 2.2.2", + "webkit2gtk", + "webkit2gtk-sys", + "webview2", + "webview2-sys", + "winapi 0.3.9", +] + +[[package]] +name = "x11-dl" +version = "2.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" +dependencies = [ + "lazy_static 1.4.0", + "libc", + "pkg-config", +] + [[package]] name = "x25519-dalek" version = "1.2.0" @@ -6292,6 +8586,21 @@ dependencies = [ "zeroize", ] +[[package]] +name = "xattr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +dependencies = [ + "libc", +] + +[[package]] +name = "xml-rs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" + [[package]] name = "yaml-rust" version = "0.4.5" @@ -6315,6 +8624,41 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "zbus" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2326acc379a3ac4e34b794089f5bdb17086bf29a5fdf619b7b4cc772dc2e9dad" +dependencies = [ + "async-io", + "byteorder", + "derivative", + "enumflags2", + "fastrand", + "futures 0.3.17", + "nb-connect", + "nix 0.17.0", + "once_cell", + "polling", + "scoped-tls", + "serde 1.0.130", + "serde_repr", + "zbus_macros", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a482c56029e48681b89b92b5db3c446db0915e8dd1052c0328a574eda38d5f93" +dependencies = [ + "proc-macro-crate 0.1.5", + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] + [[package]] name = "zeroize" version = "1.3.0" @@ -6335,3 +8679,72 @@ dependencies = [ "syn 1.0.81", "synstructure", ] + +[[package]] +name = "zip" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815" +dependencies = [ + "byteorder", + "bzip2", + "crc32fast", + "flate2", + "thiserror", + "time", +] + +[[package]] +name = "zstd" +version = "0.9.0+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07749a5dc2cb6b36661290245e350f15ec3bbb304e493db54a1d354480522ccd" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "4.1.1+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c91c90f2c593b003603e5e0493c837088df4469da25aafff8bce42ba48caf079" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "1.6.1+zstd.1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "615120c7a2431d16cf1cf979e7fc31ba7a5b5e5707b29c8a99e5dbf8a8392a33" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "zvariant" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68c7b55f2074489b7e8e07d2d0a6ee6b4f233867a653c664d8020ba53692525" +dependencies = [ + "byteorder", + "enumflags2", + "libc", + "serde 1.0.130", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ca5e22593eb4212382d60d26350065bf2a02c34b85bc850474a74b589a3de9" +dependencies = [ + "proc-macro-crate 1.1.0", + "proc-macro2 1.0.32", + "quote 1.0.10", + "syn 1.0.81", +] diff --git a/Cargo.toml b/Cargo.toml index 385dbaf1dd..e26dd17415 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ members = [ "infrastructure/storage", "infrastructure/test_utils", "applications/deps_only", - # "applications/installer", + "applications/launchpad/backend", "applications/tari_base_node", "applications/tari_console_wallet", "applications/test_faucet", diff --git a/applications/installer/Cargo.toml b/applications/installer/Cargo.toml deleted file mode 100644 index 87b343848d..0000000000 --- a/applications/installer/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "installer" -version = "0.1.0" -edition = "2018" - -[dependencies] -dirs = "3.0" diff --git a/applications/installer/src/main.rs b/applications/installer/src/main.rs deleted file mode 100644 index e0265f2609..0000000000 --- a/applications/installer/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod config; - -fn main() {} diff --git a/applications/launchpad/.dockerignore b/applications/launchpad/.dockerignore new file mode 100644 index 0000000000..b3f92c7597 --- /dev/null +++ b/applications/launchpad/.dockerignore @@ -0,0 +1,3 @@ +build_images.sh +versions.txt +docker_rig/*.Dockerfile \ No newline at end of file diff --git a/applications/launchpad/.gitignore b/applications/launchpad/.gitignore new file mode 100644 index 0000000000..b1d86c6ef2 --- /dev/null +++ b/applications/launchpad/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +gui/node_modules +gui/.pnp +gui/.pnp.js + +# testing +gui/coverage + +# production +gui/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +gui/npm-debug.log* +gui/yarn-debug.log* +gui/yarn-error.log* diff --git a/applications/launchpad/backend/.gitignore b/applications/launchpad/backend/.gitignore new file mode 100644 index 0000000000..c123704591 --- /dev/null +++ b/applications/launchpad/backend/.gitignore @@ -0,0 +1,4 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +WixTools diff --git a/applications/launchpad/backend/Cargo.toml b/applications/launchpad/backend/Cargo.toml new file mode 100644 index 0000000000..a84fc5783a --- /dev/null +++ b/applications/launchpad/backend/Cargo.toml @@ -0,0 +1,36 @@ +[package] +name = "tari_launchpad" +version = "0.1.0" +description = "The Tari Launcher" +authors = ["The Tari Development Community"] +license = "" +repository = "" +edition = "2018" +build = "src/build.rs" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tauri-build = { version = "1.0.0-beta.4" } + +[dependencies] +tari_app_utilities = { version = "0.22.0", path = "../../tari_app_utilities" } +tari_comms = { version = "0.22.0", path = "../../../comms" } +bollard = "0.11.0" +config = "0.11.0" +env_logger = "0.9.0" +log = "0.4.14" +rand = "0.8.4" +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +strum = "0.23.0" +strum_macros = "0.23.0" +tauri = { version = "1.0.0-beta.8", features = ["api-all", "cli"] } +tor-hash-passwd = "1.0.1" +thiserror = "1.0.30" +tokio = { version = "1.9", features= ["sync"] } +futures = "0.3" + +[features] +default = [ "custom-protocol" ] +custom-protocol = [ "tauri/custom-protocol" ] diff --git a/applications/launchpad/backend/assets/config.toml b/applications/launchpad/backend/assets/config.toml new file mode 100644 index 0000000000..5941810e4a --- /dev/null +++ b/applications/launchpad/backend/assets/config.toml @@ -0,0 +1,160 @@ +# Config for launchpad v0.0.2 +######################################################################################################################## +# Common Configuration Options # +######################################################################################################################## + +[common] +network = "weatherwax" +message_cache_size = 10 +message_cache_ttl = 1440 +denylist_ban_period = 1440 +buffer_rate_limit_console_wallet = 1000 +dedup_cache_capacity = 25000 +rpc_max_simultaneous_sessions = 1000 + +[common.weatherwax] +peer_seeds = [ + # weatherwax + "98bc76afc1c35ad4651bdc9ef57bbe0655a2ea3cd86c0e19b5fd5890546eb040::/onion3/33izgtjkrlxhxybj6luqowkpiy2wvte43osejnbqyieqtdfhovzghxad:18141", #jozi + "9a26e910288213d649b26f9a7a7ee51fe2b2a67ff7d42334523463bf4be94312::/onion3/56kq54ylttnbl5ikotqex3oqvtzlxdpn7zlx4v56rvzf4kq7eezlclid:18141", #london + "6afd5b3c7772ad7d4bb26e0c19668fe04f2d68f99de9e132bee50a6c1846946d::/onion3/may4ajbmcn4dlnzf6fanvqlklxzqiw6qwu6ywqwkjc3bb354rc2i5wid:18141", #ncal + "8e7beec9becdc44fe6015a00d97a77fa3dbafe65127dcc988df6326bd9fd040d::/onion3/3pise36l4imoopsbjic5rtw67adx7rms6w5pgjmccpdwiqx66j7oqcqd:18141", #nvir + "80bb590d943a46e63ae79af5dc2c7d35a3dcd7922c182b28f619dc4cfc366f44::/onion3/oaxwahri7r3h5qjlcdbveyjmg4jsttausik66bicmhixft73nmvecdad:18141", #oregon + "981cc8cd1e4fe2f99ea1bd3e0ab1e7821ca0bfab336a4967cfec053fee86254c::/onion3/7hxpnxrxycdfevirddau7ybofwedaamjrg2ijm57k2kevh5q46ixamid:18141", #seoul + "f2ce179fb733725961a5f7e1e45dacdd443dd43ba6237438d6abe344fb717058::/onion3/nvgdmjf4wucgatz7vemzvi2u4sw5o4gyzwuikagpepoj4w7mkii47zid:18141", #stockholm + "909c0160f4d8e815aba5c2bbccfcceb448877e7b38759fb160f3e9494484d515::/onion3/qw5uxv533sqdn2qoncfyqo35dgecy4rt4x27rexi2her6q6pcpxbm4qd:18141", #sydney + # igor + "8e7eb81e512f3d6347bf9b1ca9cd67d2c8e29f2836fc5bd608206505cc72af34::/onion3/l4wouomx42nezhzexjdzfh7pcou5l7df24ggmwgekuih7tkv2rsaokqd:18141", + "00b35047a341401bcd336b2a3d564280a72f6dc72ec4c739d30c502acce4e803::/onion3/ojhxd7z6ga7qrvjlr3px66u7eiwasmffnuklscbh5o7g6wrbysj45vid:18141", + "40a9d8573745072534bce7d0ecafe882b1c79570375a69841c08a98dee9ecb5f::/onion3/io37fylc2pupg4cte4siqlsmuszkeythgjsxs2i3prm6jyz2dtophaad:18141", + "126c7ee64f71aca36398b977dd31fbbe9f9dad615df96473fb655bef5709c540::/onion3/6ilmgndocop7ybgmcvivbdsetzr5ggj4hhsivievoa2dx2b43wqlrlid:18141", +] +dns_seeds =["seeds.weatherwax.tari.com"] +dns_seeds_use_dnssec = false + +[common.igor] +peer_seeds = [ + # igor + "8e7eb81e512f3d6347bf9b1ca9cd67d2c8e29f2836fc5bd608206505cc72af34::/onion3/l4wouomx42nezhzexjdzfh7pcou5l7df24ggmwgekuih7tkv2rsaokqd:18141", + "00b35047a341401bcd336b2a3d564280a72f6dc72ec4c739d30c502acce4e803::/onion3/ojhxd7z6ga7qrvjlr3px66u7eiwasmffnuklscbh5o7g6wrbysj45vid:18141", + "40a9d8573745072534bce7d0ecafe882b1c79570375a69841c08a98dee9ecb5f::/onion3/io37fylc2pupg4cte4siqlsmuszkeythgjsxs2i3prm6jyz2dtophaad:18141", + "126c7ee64f71aca36398b977dd31fbbe9f9dad615df96473fb655bef5709c540::/onion3/6ilmgndocop7ybgmcvivbdsetzr5ggj4hhsivievoa2dx2b43wqlrlid:18141", +] + +dns_seeds =["seeds.igor.tari.com"] +# dns_seeds_name_server = "1.1.1.1:853/cloudfare-dns.com" +dns_seeds_use_dnssec = false + +# auto_update.check_interval = 300 +# "auto_update.dns_hosts" = ["updates.igor.taripulse.com"] +# "auto_update.hashes_url" = "https://
/hashes.txt" +# "auto_update.hashes_sig_url" = "https://
/hashes.txt.sig" + +[common.dibbler] +dns_seeds =["seeds.dibbler.tari.com"] +peer_seeds = [ + "721e9da488302e69523bca1a9cdcbd2419dddda11698a1e8c6c7bd619659ff21::/onion3/qw4ymrzbanbcr3wwlesxbot72iayd7xdjcrtnacbwgk637vfon47hqad:18141", + # 333388d1cbe3e2bd17453d052f + "c2eca9cf32261a1343e21ed718e79f25bfc74386e9305350b06f62047f519347::/onion3/6yxqk2ybo43u73ukfhyc42qn25echn4zegjpod2ccxzr2jd5atipwzqd:18141", + # 555575715a49fc242d756e52ca + "42fcde82b44af1de95a505d858cb31a422c56c4ac4747fbf3da47d648d4fc346::/onion3/2l3e7ysmihc23zybapdrsbcfg6omtjtfkvwj65dstnfxkwtai2fawtyd:18141", + # 77771f53be07fab4be5f1e1ff7 + "50e6aa8f6c50f1b9d9b3d438dfd2a29cfe1f3e3a650bd9e6b1e10f96b6c38f4d::/onion3/7s6y3cz5bnewlj5ypm7sekhgvqjyrq4bpaj5dyvvo7vxydj7hsmyf5ad:18141", + # 9999016f1f3a6162dddf5a45aa + "36a9df45e1423b5315ffa7a91521924210c8e1d1537ad0968450f20f21e5200d::/onion3/v24qfheti2rztlwzgk6v4kdbes3ra7mo3i2fobacqkbfrk656e3uvnid:18141", + # bbbb8358387d81c388fadb4649 + "be128d570e8ec7b15c101ee1a56d6c56dd7d109199f0bd02f182b71142b8675f::/onion3/ha422qsy743ayblgolui5pg226u42wfcklhc5p7nbhiytlsp4ir2syqd:18141", + # eeeeb0a943ed143e613a135392 + "3e0321c0928ca559ab3c0a396272dfaea705efce88440611a38ff3898b097217::/onion3/sl5ledjoaisst6d4fh7kde746dwweuge4m4mf5nkzdhmy57uwgtb7qqd:18141" +] +######################################################################################################################## +# Base Node Configuration Options # +######################################################################################################################## + +[base_node] +network = "weatherwax" + +# Configuration options for testnet Weatherwax +[base_node.weatherwax] +db_type = "lmdb" +# db_init_size_mb = 1000 +# db_grow_size_mb = 500 +# db_resize_threshold_mb = 100 +# The maximum number of orphans that can be stored in the Orphan block pool. +orphan_storage_capacity = 120 +#orphan_db_clean_out_threshold = 0 +# The pruning horizon. Default value is "0", which indicates an archival node without any pruning. +pruning_horizon = 0 +# The amount of messages that will be permitted in the flood ban timespan of 100s +flood_ban_max_msg_count = 10000 +# The relative path to store persistent data +data_dir = "/blockchain/weatherwax" +# This allowlist provides a method to force syncing from any known nodes you may choose +# force_sync_peers = ["public_key1::address1", "public_key2::address2",... ] +force_sync_peers = [] +# Configure the maximum number of threads available for base node operation. +max_threads = 512 +# The number of threads to spawn and keep active at all times. The default is the number of cores available on this node. +core_threads = 4 +allow_test_addresses = false +grpc_enabled = true +# The socket to expose for the gRPC base node server. +grpc_base_node_address = "0.0.0.0:18142" +# The socket to expose for the gRPC wallet server. +grpc_console_wallet_address = "0.0.0.0:18143" +# A path to the file that stores your node identity and secret key +base_node_identity_file = "/var/tari/config/weatherwax/tari_base_node_id.json" +# A path to the file that stores your console wallet's node identity and secret key +console_wallet_identity_file = "/var/tari/config/weatherwax/tari_console_wallet_id.json" +# -------------- Transport configuration -------------- +transport = "tor" +tor_control_address = "/dns4/tor/tcp/9051" +# Overridden by the docker environment variables +tor_control_auth = "password=tari" +tor_onion_port = 18141 +tor_forward_address = "/dns4/base_node/tcp/18189" +tor_socks_address_override="/dns4/tor/tcp/9050" +base_node_tor_identity_file = "/var/tari/config/weatherwax/base_node_tor.json" +console_wallet_tor_identity_file = "/var/tari/config/weatherwax/console_wallet_tor.json" +# Optionally bind an additional TCP socket for inbound Tari P2P protocol commms. +# auxilary_tcp_listener_address = "/ip4/127.0.0.1/tcp/9998" +# When these addresses are encountered when dialing another peer, the tor proxy is bypassed and the connection is made +# direcly over TCP. /ip4, /ip6, /dns, /dns4 and /dns6 are supported. +# tor_proxy_bypass_addresses = ["/dns4/my-foo-base-node/tcp/9998"] +# When using the tor transport and set to true, outbound TCP connections bypass the tor proxy. Defaults to false for better privacy +# tor_proxy_bypass_for_outbound_tcp = false; + +[base_node.igor] +db_type = "lmdb" +#pruning_horizon = 0 +flood_ban_max_msg_count = 10000 +data_dir = "/blockchain/igor" +allow_test_addresses = false +grpc_enabled = true +grpc_base_node_address = "127.0.0.1:18142" +grpc_console_wallet_address = "127.0.0.1:18143" +base_node_identity_file = "/var/tari/config/igor/base_node_id.json" +console_wallet_identity_file = "/var/tari/config/igor/console_wallet_id.json" + +# -------------- Transport configuration -------------- +transport = "tor" +tor_control_address = "/dns4/tor/tcp/9051" +tor_control_auth = "password=tari" +tor_onion_port = 18141 +tor_forward_address = "/dns4/base_node/tcp/18189" +tor_socks_address_override="/dns4/tor/tcp/9050" +base_node_tor_identity_file = "/var/tari/config/igor/base_node_tor.json" +console_wallet_tor_identity_file = "/var/tari/config/igor/console_wallet_tor.json" +# auxilary_tcp_listener_address = "/ip4/127.0.0.1/tcp/9998" +# tor_proxy_bypass_addresses = ["/dns4/my-foo-base-node/tcp/9998"] +# tor_proxy_bypass_for_outbound_tcp = false; + +######################################################################################################################## +# Mempool Configuration Options # +######################################################################################################################## + +[mempool.weatherwax] + +[mempool.igor] + + diff --git a/applications/launchpad/backend/assets/log4rs.yml b/applications/launchpad/backend/assets/log4rs.yml new file mode 100644 index 0000000000..7982521aa0 --- /dev/null +++ b/applications/launchpad/backend/assets/log4rs.yml @@ -0,0 +1,162 @@ +# A customised logfile configuration for running the Tari system in docker + +# timestamp [target] LEVEL message +refresh_rate: 30 seconds +appenders: + # An appender named "stdout" that writes to stdout + stdout: + kind: console + encoder: + pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} [{t}] {h({l}):5} {m}{n}" + + # An appender named "network" that writes to a file with a custom pattern encoder + network: + kind: rolling_file + path: "log/network.log" + policy: + kind: compound + trigger: + kind: size + limit: 10mb + roller: + kind: fixed_window + base: 1 + count: 5 + pattern: "log/network.{}.log" + encoder: + pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} [{t}] {l:5} {m}{n}" + + # An appender named "core" that writes to a file with a custom pattern encoder + core: + kind: rolling_file + path: "log/core.log" + policy: + kind: compound + trigger: + kind: size + limit: 10mb + roller: + kind: fixed_window + base: 1 + count: 5 + pattern: "log/core.{}.log" + encoder: + pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} [{t}] {l:5} {m}{n}" + + # An appender named "other" that writes to a file with a custom pattern encoder + other: + kind: rolling_file + path: "log/other.log" + policy: + kind: compound + trigger: + kind: size + limit: 10mb + roller: + kind: fixed_window + base: 1 + count: 5 + pattern: "log/other.{}.log" + encoder: + pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} [{t}] {l:5} {m}{n}" + +# Set the default logging level to "info" +root: + level: info + appenders: + - core + - stdout + +loggers: + # All events that get logged to core. Many of these are in separate log folders corresponding to their docker containers + tari::application: + level: info + appenders: + - core + additive: false + base_node::app: + level: info + appenders: + - core + additive: false + c: + level: info + appenders: + - core + additive: false + tari: + level: info + appenders: + - core + additive: false + wallet: + level: info + appenders: + - core + additive: false + tari_mining_node: + level: info + appenders: + - core + additive: false + tari_mm_proxy: + level: info + appenders: + - core + additive: false + + tracing: + level: info + appenders: + - other + additive: false + + + # Comms messages get logged to the 'network' log + comms: + level: info + appenders: + - network + additive: false + tari_comms: + level: info + appenders: + - network + additive: false + p2p: + level: info + appenders: + - network + additive: false + yamux: + level: warn + appenders: + - network + additive: false + mio: + level: error + appenders: + - network + additive: false + + # Miscellaneous events. Log these in 'other' + rustyline: + level: error + appenders: + - other + additive: false + tokio_util: + level: error + appenders: + - other + additive: false + pgp: + level: warn + appenders: + - other + additive: false + stress_test: + level: info + appenders: + - other + additive: false diff --git a/applications/launchpad/backend/assets/torrc b/applications/launchpad/backend/assets/torrc new file mode 100644 index 0000000000..d05b2c7526 --- /dev/null +++ b/applications/launchpad/backend/assets/torrc @@ -0,0 +1,2 @@ +# see settings.rs::tor_cmd() for settings sent to docker container + diff --git a/applications/launchpad/backend/icons/android-icon-192x192.png b/applications/launchpad/backend/icons/android-icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..19a7b783c0da2bc0ff6fa457168947cc4d6936b7 GIT binary patch literal 13704 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 Q!wN=DN=dR#+&JWa03vF2@&Et; literal 0 HcmV?d00001 diff --git a/applications/launchpad/backend/icons/apple-icon-114x114.png b/applications/launchpad/backend/icons/apple-icon-114x114.png new file mode 100644 index 0000000000000000000000000000000000000000..5c4d95a0ae70e9a224d1165492c7fcdf65bcf425 GIT binary patch literal 7771 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 Km8q37h5ipOEqeg~ literal 0 HcmV?d00001 diff --git a/applications/launchpad/backend/icons/apple-icon-120x120.png b/applications/launchpad/backend/icons/apple-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..03ee8dabbce2726657ae7274bde24953b8317f19 GIT binary patch literal 8254 zcmZ{pbx>SQm+%J|+%1sc?lXhC6I_BONN{(zpc4r0?g<*)-3hM2g2Uhr0|X~zdEWY} z_No1L>(;rayU*`PcmHv3)rokgDu<2n1_J;9U@OSWXuN3ee*_KXGNCq;*H8ffd>H|Npb!Ay;bkf4008iS002kE0Dw?B z06^lL-KH+`Vn8ufl9K`a{pb1GS(5a!g6=G@>-M7M|0A*^c47bkMXiF2q?Y&cX^v02 zfp*Tb_<8I6+7b<(jwIeYY8p&@GzGjN2WKxV)}!dJ^e0tcKO?n7f5pj1G{p<)b$J)a zg#`--qO1nsKrze_q@?iTLnNdS&ClJv=6&|#^yfXwk35+U-G$avyQehO*4nf^j#sbN z&!0t`jqyH{_EV#9hD&0Z{(r;itaRRqY`zKMPo#e^mY0wYIL5Orv4-)2On$&djsDDM z8^&?Mtc-uTZ=(S*(p|Wadrh-qBoEOIKm837pP)38$h)sNEdCHeZvq}i4bFg?^oSxj zN{W1?wM&tZhaG)F{e5_YhIAQirNYg}{B0!RFkKD61o(l>JpYRg*iHOY(%<>Ra4R%+ zy7a+O0Y=tM6<^XdLHf>0u-xA2c7-I@KNbl>g&>AOZXk%?deaXCqugl*=_B9LZ|S~O zlza#1x(GwyMP7+UaP#CY$s(l*|CY{=m5 zpE9DT4sJE;R1OxbxQ_)0g(Z+>@qOAi$$M)hXyR6Vp=84zOe1KfK_x&h)E3@gR4MZu z#As5SyhoMp+{{YZZjq?jSneVMp2n}So`YtSL>*M5ny=lPSzA+wzxdPCtHA(MsCO~2 zRO&MhM^o*w_}|<{-Ze(5(>eu4G0(rZRZ7u{&=icZAV2o7dS$3fv0B(lE9Gr0$XvDE zC#;UTZcT&4(H!xg^tP7pSQvJZ`~m=F=K9XDIs(IJ0aj%rvAu>IrVFNP25CSkZ#X6 z)+wKtdex;C(Db0Mmnjm~N-xKq8c@6qoZDgh(9p;R#@%3l%QMxyE)LU@Sh(2`*)k1K z&)yK#kK9{HkSqnKO4XEY>RN-$>745_^~)Yh})p6LN$a*<;Bh3cQQxsE}2WajdE9$x^b_n*(1xmG{R?vv2T9 zRwnop`xJ~nA}SL`AC98a#o61Uga39RPa&7!Wb}7}>V)VItulk^_piZqkA6HU_C%1? zJ&qp19v3Lh62h*66OQCDvKz2o8WzVn0~+N_Ht96sUzFba&>PX)p$^B8JW#Z4XXv=; zoQI0P^BhJLvBPJ}dz2AZ-|**)%orkzbpCAu?=i(`6wKipO;p@?Xpp62=V#JP)<@)eI1AJ*90LE_yGqt2jLv;8)>d8C-hw#b~$)}n2S6U@X? zjI+e_5X^Hsf~J~d8UD2glZAJ$a+}?I0p_!)=8&YeJ*8a3GmB^Sj7@yY@xV&i-$>JqpkZfyEBR2H|+1x zc_sRe2WB1$@vI%c=mui_X7D8K0g=n4Nx^Z9T*9Z%KZ2#aS(oj*`cr})2r2+?x^KDaXi{$^JEXq zRTKTRLF;1l>649zo2Ep1{T_+u+}wU_{Q{(Zm5{-jOSx7M)ms=+cKKOt$m$ioYgIm9u|t!mmKw0Jk9D z#q_%_sY@CQm>JHj@a)7|wR5^ett`tE730L27O%WlU zbc_4l>`@fBcWI{{Bz}7v?Yz_269H{TsMZkF#?WVc-{P3ZHboW`25d&(dxxf0TJRz9 zD@)JN9^dVQ&-JMN1nYt=G3nOuMIm|=Ka#YanqN72Y0PfOzzKB#30+pvdeSn-rhbyj zyG&egxCx&b@;Tyqs9*=d-Q#5wmyZ3#~7;7Y^Ls5zGupMMNUy&Qi30UcDG-59U4yr1uD&oy3 zrMr@bK4TXV%p}5&;h8(tTOC^dAWz|h+2y9yTHg;pF4>$wtuL8yU*ZnpN4r4?Lm|jn zDrO@-J8J4w+`8>+M!C`_ZZH@ywP&UGb3TJRPDSC|5S^wPs^QI(SP zY_zsSjJG9mrRfB^SSIVQWX)t|>BBJbB0KKSWiWZ>%jXRj*kJ zQ?hN97gc02E>|quY>P&|U&KI3fNB`8fa&1+ckl}17+MMpo3heNVdNhrUaqBQ4ha*F~9|R8!uKLvQLGs zH`wnp-}Llc4@Si?i@WOLykeo9P>Y?aq{<&Ps;5Z)zB2Bno?X(%d24Z)+rL z2)q&Nd(f{w>jFhedNM!cyALF2tMLK7=g;7i?T@j)b+0lr{Iw$Xc07dBB|$d2m&XjP?I?isVn(wZRyI;R;%rGpyffufV_V>qUh{e-3leCHF&;DR00YmLosg5AI>g5N z#=){t1f*C$mP401m8Bf(^>bO7_T6%1yk=Dk8U{S+ZGyKQ(y@Cme$e(psrL}#kfyNh zEKjuwW0D0)GTin~7ky7lao=B!^Q*4DOYWpR5z5lvwvMphE004zlSTfk3vcCWl|xCV zzk1Vah#*^*jb$BgK3t9M1)lI(|3uB99-HWcz4bBOqvz_&fZfW6pma6GJB%N`88h=q zv5otJ|);O5#u{Q;4sgiV)3rK<#1GG2jW)OQYty;a#W^m8AAyUAe_OCJ#lFJ=A3pnHUt{-uv_Ev z4>YjWQ`!8vmXAQ^3d6Wz{xns_MAk-A6NRC3-AZ$4gm;3nj!hcplXvl^muq{VC^puI z028Q0Ur7|IlDzEqqfiHUg4$v6+?00rW+o}czly2T>Yz6AjEj7LRjt(KtSo4w=v#M?&~ z+Yp64UIX#0s5At14M}j_m3*(JPY$l47(K1ZcsTtF?ejWY` zmhT#Se=L_lFKUl!*=X!BGVXx>G-uh+&o)LN7SRyNtGnCxNr!@;Krd$;q%a8{w(4F1 zo`5=pA?QyC<710cP!h!vKWD|32H%5ld@}uo%Im*m-Nho}_;^gBTy3$iivC|hI=msb zt=Q|($aS4Wgl86}OPJ}S0sqxVuWF^8FvQ(C)_LB6wqI4*18d+P97Uw9L zz#i!?(C%U4R5M>j{-Dt&CD48?J0j$hk_qH{_+$uH9Tm?T8z%g$3eu zFzdtOQ}j~YrgWX!)ZC^`*oGal;p?GoemU4|2E||a#$9_aV@;nvy3t?}QhpXdBL%zB zLsXpsHFm82jjV!GvcK>@Nc;NJbRQ{uoY^7V5ZCVU&lU09){=bmIrF5s#v$1}qbMD{ zS-L7;_{%Go%Di$`)HB1Ib-l9oWd_=r2E!W%sxz*Ny<^!_$W^Rr9=N_XIGVGkJB+dI zHcZq!^w<#6y-vjZ`2AFjx{2%C^-2!?g35TtRoxm1MKq;p5T9}B#EiOh;)eaI0Xb+< zdJFFaeOJJb-CKOA9fN;&X>;<_S9ndqvFPMI1HXBLG_z8`fmGrrXzoz2pl#cwp#}8w zroQI5k8llkQ~P35TTUGJ(M+_sK-=(OQ)15Ecm72Y3cA|{daNHODw&Eo%<1$Zsx{)? z$tO~dvSn=A4qh|^_vcP(JTqow1{obymp>40k_8J3Qg$~4MxV^UUOID$>GiL^S5f)c z!D~_9lx!DoPwX{j@uBC|{h5PHU5+(>*ig`UWn?{2-Z7Y@iBj2Cnj3`&C+G&e5Szf zYH|K#Rw#L*h*ZIDjSNc-#{tL7vw=h|alI5a-y^fhwYmNtqSz9|#_5nTt~yV4eBxwb zbUN^}+0dQw!pLVbVUOCoV0-|4I^q*Ltl0_Kcs<9&$Q2u&^I9LbGfBwr2G`8>c7tcr zA_>%~`@Sv>D{bFB+@w&+0Ebu=eW)5=Ou}2HfKHo%duMT7>^2{{GTk&ruga^1Imv#V z<^vTHiGfRDo(jR847l{zcAh!z=XwH+W3w=9cJ*>X&Z)4bHHB{*K-L?#BC?(xBCN<6 zi`E~}XO#R$wnpmn#Kcv;FhhsRnQmuI$$a4>&Fi;Y1ViFFrtdOfuWRFH z)KP5*QPcJ2od4R*d<2{aesx*T@5P`p!`@n)k>3K*Lf0Oyi7^_ z+$>XZJksJ@xGcP^%Xn7@b8PiJ{#um{lEie5oUo$zY`q*l&HKHK$yyRjZrk)o(A?EK z{<@tgqA!>3Ca^redfSNJ4u^9C9i7WRwH_?Bj;!wn-nJPzU0H(0l(NOsMXhwpg2N-#BGDrujN9k>zc= z`GWV@;l)+QEQK2UV;G0krojJj8Vz<(e6x!^LPz(}&Qr9lA@^)? z(sEZ;lz*dmatFD&4cVYs%^qy8tw^NvnbgjBib-@z7N{>M*zS%IE(TMMH4KQRtztB_ zGyZLDrIk|H>ISC8gBVJ$i?7IFI0#)^!^cU8ZN6j-g2!4#)!Y&Hs-K$7aw^&fMaOc? z(x8oT6ymsD%Kdb#O+3jC4%&YP-zb3MJX+!JKMQp4w6s`QW6q}8=gnD8vpGENi_zOJ z6W`UsjDTRvt66O++vZu?j_&pKJr<0EOogJ#=L!4fZ*`MOs!p0t+pz^YTvn@GQp~`g z^zdejKoG1`Xx?S8iFGQWuHYmLn3vkJYN<^_l>V^ztyAcip?-{7TK68H)hEh@{iX1XZy=b~0w-|s_pEU|BbaZqZ5wEO3NZGr`sk7r8?@+s+hi9JpL zBX)QA>{XDxG;I4T$DNJJ~)VSoQk6jVyxCtHZm=&Xt^jz97 zJ=XkNUvT-W4u_K*l_urco91K{aA$w~bb*m{^!~_mJbZXH-=9R6wKty{l++?9%g2MQ zBCuDxUf=AqNTYNp#`~U#j*X!U;|Ys-{)U6Mm~=J}`x>=o>V2Q%f~xKLvt0HmL)F-B zrlIzV8)atR5!^V#DizN=XB61A`bu8@hLEo~;l2uKAH_?}CMxdl?E+aX_>SoLs#A(f zTHH=FLc%YHNw*ai_tB|-6|FhN>){!)-9_w--IBh_{V;!Ih#uJVO4y$BBm+0nMC;I0G3`~;i9{QY-Hxsb{lgZ77%0t9iwj3Kv2leF2G(}4u^I-v- zai}(YHH<(`2UH==k0xOo0Z-XJhu0tFTS!_YOw~ib65SJ1Z+6Ob{JeRjCw9zU)pJ{& z{7_%-)H3;vGsn|K|DEl5(AU(1t!P&r+b{6=_z{|g)Z4mlvV<{y&}Z(v0LR%Whvi~X zvDi|7_ST%MITCT#$)}L?D*P^C4sKtY2i1VK+U2^fKjwi;H!I0JhjN6!yePTL5ss4X zwfAk0=dW_MQ(g8qrvPuHS#qQNL*YAmv}PWDF|kAl)mV3R)RQq=n+xO+zY=+eSN=Ds zh*py-;fJhydFY^50bN~RvKsSVXL*K`gF%f>0iqZW7a@%j+pN$*Gp*T>warQNvDT|_ zix83VxN zEzdTlk)yZJ!2~6<)$znR?K7Lq*)`Kn{9I=R56rSN*7r@_;;Yi`V&PvZhO)G)Jtk*4 z>%cB(+k97CT4g+EvPkZlDs6VF+^ZgU+|;K8ibb=teSUs9T*o1{+Ro#eBVbG;jyo9} z|KmUSTXQ)TiO19XF9q{;zg{^;dQc5I-dS8eKwkJF)Q9lIxEZA`0CD$B(9(7_9Fn2z z^`fXv)(Ddjia!V(e75Zg11=Eg&f_#THQNW~5g8B_g5Tt-dcGd4jf-0uap%i-dR}2b zEtzoIdnDxV*6K-1yury+wp5VkMM%7^%K@Bgm{-DgZ60MDv`a76Uo`?ZUP_Lqry+{e zgpdTO;W?HW$!cVMD^svf4ml_E<3JBJl1+=8P5muy%C=|&MB)hzA&p`qyeBwOhrPB* zvkZ_evsc6HqXK4zc#Wxfns@2%@lPlQ8>b6La-07xfaCYs$|vve6s0X-I}kmE_4CU$ z@qqQZTYvl+_~jXzGwr?@L^kL|i+%xFN;Au&u0X+U-{eDeXHJ2oK49k0L}@=yT7AK* z4zCTDHUXd1_gJByw>G|oUS8y)cClUf%ju91xQwetIy55-YeU)4dZU?fj5=7BoN2sU z;K#O+1ou(ZS!Ge}M+#*L^0=Dyzs3k_rbq(f$iuWjU*kKOFG)gm5A)OvBmIP}>j_YR ztv}W1NnwNNSs&VLnNd$_Z@e?uLYYc62Y!{W4aUYi_&HzWREl*6kt}z;yZazGkAvNM zoJ|~n(46q>f4UHctw6atr}KMmC~k2{vr*-MABgmHFnrDPHjGq>$=C?wXKlz8A_T2x z?U;AKA8p(W`KswaEfJfXP{uC#?DL+Xgq{)a|Fi7xk0pxtvF6_6N)gybS*>n?_q2EM%0TW zz()MG(zQbTyQG0KHTk(>aCz$vC<+MN650$*ai6Su`Rb$|EONQ0<%klm#00SP60eE` z5TjE{{xCX_PmHt=z9UTKDo)#> zh#}s*y~m>Td|tZa`=pJB<-G9?(}sm!K{J1G`PU{(;6UwZ(^sR0liw&(%m7BKpc#%@|CskS=I+-2AhQ)TXfMd?e<3P14i@e{&K7|GR0Vc+v=Xn=QT-orRJ2|w z04J{ip8!8MgrCb&%uf9U!TnbpO&ebe07ObEIbZDL#ia8uleUHez|zLv;${0_2S;~% zCo8a}iKmU3lcO8>zb^*NZNg`1$|q=I4&gWF-D7;mbsgg2={uiv^e{=u< literal 0 HcmV?d00001 diff --git a/applications/launchpad/backend/icons/apple-icon-144x144.png b/applications/launchpad/backend/icons/apple-icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..0546994fae0404f553429d2e158ab3bbecac1512 GIT binary patch literal 10542 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 P=og@(pebJ`YX$yaNNYvc literal 0 HcmV?d00001 diff --git a/applications/launchpad/backend/icons/apple-icon-180x180.png b/applications/launchpad/backend/icons/apple-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..874e750cf18b8e27aea92969dd277d85ddb420e9 GIT binary patch literal 14189 zcmbumbx>SE(>DsiEhM-sZV9@$LvV)>+*vd@EV8(}y95gsLa;@G+u{~9xGfe4EUrO6 zp0~cL`_x-?|GBqL&2-Joue)c?Or7cOITQ0yT>%f90vibl2~SB;_R|Y({7=F}f62vv zq4T^DR9h)EDI}!2B%B8j+DjSP{gZ+;Qq2V5?@NK!Qt^`-5|S@75>jwD64KpERq#F% zk|z)e>A)NbNhBKyiPSZ(O;hZp0o_7HK^E!xKhM|B^0b#4ELTMX_ZO=8KS_SXK>`Vh z53VFDrR}|Z)alb=tdsHd>;utRqq~uQ6%Isy6aIlY6^Rb(UD(BMufxeYx8Pu*qH3>_ zrn|DaV=sF-xwjZoUXD&v@)4+VMZ^@yGQG6qWW3U}ggM6_J+JQ`>l}pkepj@`tmgW; zd^)-Kt>qc{L&Uc5rt0GO=e#MU;pd_VlK;;c2w1c!5j-7Q2QQ`N$IP(Cxs#tN7uN74eEwj6vV}A~+i+HhH4 zx1ZURt-QkMX`c|dyQkaxd{gk(rsMT30P`fdnkl2Y4uCD<8+fBNJCrXWmq9`Zc1#jix zp*j+4@q##}=l~rjV5LJxLMR4mv+{#!;yw7$k&Z?n@F-DN>jbOOP&ndcSclXReTlnd z@!cq<_<6Vizul0Ux$zMHbwffxJ8b0>`v z3zK-Gz*se2EkmYR^)|LkIfIT-3f{1LK|gHW^lS@9pZC}r^;2sjW~+TRb0TksrJ4mz zX@zKnP=u1dNF&vctPYE?M4PPCzFT~^jT{r9zM9TU%~K-Dg5c$-9sX)w=rHhalDAie z28fM5WSNK2q3+7}QBiQ5)94SnmF{ir=-#_;4K85U61WtGXkH&1He{y!czKWW*9)uN z&$tPJD%39g--&(hNP}^~|Ipo0O-ieIg69OazYM<_Mv!Ii)H#_#wN6{&bMtRA!kBoP zMm1BVI5F}q;f02p!zP0g)1NLTfxvwUf~MLc6rs1?x#YFPfY&=)3Dd*$dYOd%j_lkA zO=;_sKl+bJt2|xf;8~&VOacixAA%+c;l?eq64Uj|C>FIYML3gu<6!_{UgqqxPw^Ka zv#3XB0?{gA9@~8Nqr10C7Dmbzd}%aiSsA;-zA&dyGm#dQ?Ga1upej8+So1Uu{RS_p4{ z_8;+3>xCR$S_;Dyo;&o++PW$HtSdXV*%??vWhW>JL-ar$ctQr+7LX;XZh76-^YzB< ztU9WCtbAJcv=gKi)HpO8)MoRl&s@+l?S9wO>C6Fj^IC_5e;4r6=E=Y@KzcdZ0z{ipPDfSwJU5PlXnw8n4Xeu3~IFocA#LtmYAZyS(n+z znFMx387FoKssp!OxYvyGV_ z2{l6NMk5g&GGx;nZH1Hn>ycRXS!J7eDCP~*@k%`FS?bBf0v);;$WjmU;F}xVhcH>Y z^lOFk0>%e~}he0T1e@EHMhZe<8cCd+$${*f>v| zLE439FDoxEN;<^9uKP>n1EdGb>R-AYHRH%kN5(D~ADnNFd`gG`QT^56ZrA^|r-H{c z+U*-$mYnME2Dt9o<#UdfNFWjx!G>)<+!@VcBa?8fV_M6H{jslDGav_oQ*y4l0jZgu z#kdSUv3fPA^2?hSh`-1+%i2ImC3z6NfV0YU8`B?ZOAXpxv<$m246QbT2fL{PCq2mb zFel!s>ipB65ghtp<$PJHSUa}3X9o)iedZ{KuDiT7(mb{94x%}Yk8k7cFn69Bb#iKy zdt06v^MEbAXoxq`#`d<`F$VhS)E#cy3b^srNCLb1IDVfiyO0*@BqiG>XR%C$`-GB? z24A%Q0uLnjU*4jp(s1aguvOct7c6d*)+tBr6!X+9)PaiqqIePuTln^Y6Sv}SZx)YS zAM4yl#2UaUgtonloj)H_f4VUF$%0R;mdF=P11U&X5!5*#toskM7GPXY`qr<%P)QhH zCbR@^-F%P|t93O0FX3lqZVJQQ^Db+87dpaylFab)Zu-s(!VBEkkL<8) zf#nX{4)e(PtP$@bxW2SkVZ9i+!B96Fm?^NprcNPrnyU`Eg;f9DZ8aci>u(nH<`~U1 z<*g4o=>)GBtxPm0{GZJ@#socso^T*Nisu7`eseL--#kgw8o8=?`q);0|E>Wu{CTD0 z>p!;IJO-{weV7uDsWMrmkkS-+^RnmA3jE z@Ryg1I;l9xtOq>gSEnZm9d^JU&v&c=wy^RCbhz*bqr0z_q)J!w99=Fb)d=EOjNQmJ zUaq#Uy@+7vKDRTp3yZhE{}x^7pHFQLBU_#VSiHFh+0bT#AA^mlawu=hXOB`^jh$%@ znDkLE)0yVgLMeAzXcp(Er79q{EhGfS54J;}d!p$sz*#oiYwMYAR_$fmMxy8 z`GXlvWAm(Yfs%FQgGeYFXG&$>KOfo!J)gq!Jw>`+NLv3~c;cr*LG}~4il3|OHR%LU zIUspbMq5@mWk?8D2xnWT=PwWQ2cC~<&S6#7-&rn#GXdU8!}@DcAr?(t)f$}v zN7O8569Wuci+#%b|1NNOhxc4lY+s#9^K#M>x&Iv(8E&!G{l~qmZNbQ~at(%W-V;2d zh%tc}%Bp(iF5=Y!K17EB;<-t^t^Yl~lY+E~{}|&o&XMNFwUL+dv zI12ZI>a3Zx9*II^hhySS$bI^$GuecLoR_N2iyVW=XUC9J7myUJsEnm8tQ;M7h7t^R zb$V*iHXs&CsAX*Or_qO81r|gA*@8N<@-Js#I6KU(N1sPz5D3+&aS?TZa;Q5OAd_Gj z(YEO9Zyvijk2P^a7Pyh7(b#4bCJk-b^m zjh5G&A2MsQt}dLON3G@6%~liS>cHm$fk;BX%h(CY2C*$egiFCvxS?AuqwEw9{tp9N zuDW~?=`12+w*{34?L>@I*_r)HV~>HVsTg*OMq!Z-Zmewp91XSm8kBxdVc?X$=A1B+ zr{C0KT#?#|UuQhX(R0E`vX>{W85^A!?*5{z7uq;S-Cj>x0BTV;ZcN+$<<0+-z$k}7 zacj(gs(W+~UDt;J)blqfuZ2H$aSMDp_trTDqc@|RLJr3|KvZPp>IR%gZi~d#BSa-+ zxXXiUa6~4t&@Nuj;jXX8%b0m)B->MB-puB$aGbho85=9t3jdSaT^f+oG@Wd=shr}v zM@A`^hxZ^3s|PIZe?YGv&Df1kG#i0E_5`6wmWL77;A_3^>d2aN>e~7ZPSq7G@l!>#@rfZrCIxCZ)2ryXxVzW=G@PQ zyp!sqYfG_hEO{*pBT>F0;%sq>N-()!(RMKAiibq`L3S(gDZ1JRgQ0a>knHxLiWcWJ z4aQ-U>-W$Ji6~$X2wPt-07pN}t65)?X~m*^VNQkAh^s|!u{zW!+z+Yv==JdKd7fZD zg`Z;0^#eGW5o0@G|568>F=X@TLzQC5`Az=ib#`I%b3C!1S;kPFQ&q+LLazb-fm{uv zzg!2#PZ|B~F#z)eA=K*q-d#}ASLMlMooUl&VQY<}Bi1_IT6M=w1{T7n-Ju(Qro;!H zsB$lysE7a^K5jS3jeTFu&T#&ab1J~HvXS!?hIJ$&(epFqspBst@K)U%n4U1UyYut` z88`_+p6Q-<=!9m4#Qyi4ol{G&KpQVy*KhE$9sm?8!wWYW^6+IiiR=@Y!7G6E%ZmLN zl*(Im@fnMR{#fWNy5wq z-9*p3J4RB;A`x1uc5;gNS=-&-Am#d0+hSFmHNn!_UKVnE&w1s>MS$K@a>MCO<| zZu&YeP6u1tkoBV_-bns~@$?!=dspUdLi*J)p(9e)`@e^KYt0+qU}AePW)H#Bz*j}N z7)oR<+j@ErP@AHAECaBEl^CKw40}MI8VohHXvgI`CHMo8E@F5n7>lB5aip19K+>DQ zv{ti5S4Yc9=yT*b3x zG(i?L?BGc)Aj(7%!PNag1iW`qZ$!;M2Of`7q|%M=pG5z}Gus)(xT@x|1F?J?2|7@+c(U5c)y%F#b@C z;CtLmr{hg-bHb^({iImg=RoD^6cg&#*_fne?Kde8#pkY-m9`X2abm*FX{lykAim#s zj`Xr81{T&u&J8)DzT58;kVG#O<$s7C4LVQq(}dat z)|ZBuND8vnoWxMeRi!t60OB|3A-h`v-dDvjQ}u)l1F~o+LTv!r(t8!Zu0LGu*e@nb zGmbc^l`4$pFMKC7Fwo;ZKH_1fXMQy~v`<_m=q(F!Tnl(jty{n!suu0^X!O^C5=H1X zNh`hsCW$}`Q=av{qLOk5a>~gY!_1M_DE?LIHS=6%pnFesWWvapSKhJHBqg5koMvLz|A84s6l4(opY0G)ic~04Zr3_g01%*RkqyGr?pnfKDPW3im-aa3{5kjQmKPDbRzmY$WG2s$N|FozJZ4c<5 zgiRouav-#&SaeTzKihP!DV`7w0?6vZGy=BRf ze_H>p?azvP`m==Xo|z#!;X<76)}Q)|dXaTJyPbT;THR>QMg=0xEo=%7nLRNmv^#z7 zK@LR;PQz>i6AluhC!w$@4`RneVZP7Ma9ka|b~B;Vr1|;_zNKkscI?@FZ1(sNmIjeE zr^I9!thfo}I}O#&QizFk{xd*p#CrLjNDe^^DAMQ7X^j7#`?WkKV~8S+1fAJuUV{7) z86%#n``cUWRF_u;sJdUyrWQGMk=TMW2sDmP5iJ(qbS7CQ_Ze@Ej*qsYW((e%O;F^p zJ?;IW>Kl~^i<8O%7>uE$PA<~9<@YkCv%K3;)d0J8z=82~%5MSawC)X_c>YUxNq)f> zDgm5GQE&X=EDXNf1;_<_`c8xAucW>qCD92ua!g0GB{OIx-eOIv4{%!3$yV{fKqMUJ*a@si?w}AH23UwIHLpnbKJ? zbm6L(C~ED&_FG?~1L2d+ETjYrrBV0kf>kA&tWMzV><%xNhY(MgW_2mCUx-?c*2;ub znA;L|ywgCbv|^VN3$6or6D{TqWp#0vgu53-`J5?^O4eobtEUK8EAY;kK%HPbw@urcZnb|^Ef4Cp!~8ydc^2bWY>ZT-7tkGc3_ zz1Dk^MXpJ-Ab@&kxt3g-&)m;k(N=N)$&;-hgb2Ex%n+7k`$C9{S?Xlj!B~Jr;FBtBcR4S*NPAKo! z0j4K{ce9M|TP7#T6pN!iKU zZVfUq7_=<-RwY`Nmw5?%->G8T~~vCC|#-6R1RKV^4`gH@YG?CMAP)&>`t8 zN5UWIWJL`uDCmB96idJD7l^W~AE8Wu`~8|E@^dxzq8&|O@1&?#* z)V05CDP!}C2SW;GEP>s3R3W>>H6WHjZ}V7Ctq$g86$*8~eyIMRxB&$skpl6rPr1!p z905Uh0)R+HfV_fVL3g{u4SMyD;}&+C(u1_rAAtvS7MF0t{cI-ZFWSG&SImoG{m1Bw zyA8kmCV6cf(Wq0m1Aq;Q<{NJncO70=NmU5apET~nbXAd@NFz) z>}+tLUHY`8ad>p^yMJN=I7C+89}3)eZugK8oE?`@I*^Z6qjW^l8*ljjdrUX<(9w== zsFpzk;$u;ql!3x{buqwynw`8@Ezy!}Ajw%La!)VVrg=c`@^hMz^;uVHu&Adf`z5-I zDnKUostI>H`Ix)}>H&rF!hA!@x&0Qc#$eQ|sT=jipYayaOPvmazU|p+3I3K>MXGIm zhA##Qiqt53Z`k)IQEd;O5XIgp7V$U#cE(iTdf@jq6E6S9##_zJwY_KD>{yWAr+~*O z|7HAFO#Z5ER<3Ys2XGXn-%2ibn>L&>f|Nx7^L=16NNYSnQGAcgKp;o zt>GUPcXNdCgnDz&Dh7M!0(%NAJKrx(1eD*=_u1o5Gwd7WYeY6G7CM0QrN|m?$w1n7 zDdyW1s_#KRX&j8_8d@`IXnd$POjj~FXLTgcMIPHTy6ZW6QPn2t#?e~U7JZ>Z+`8Fy z9q?6|uXA62!rjj-Ra*+N)zZhd+e|JMH3D1wcB^N zP<&dlI(wRbF{@5I!8!etu+qdgUGcQx3`>`(R@Fxr8)#`qQiwN)n(L%<8| z#8}(m&PDB_(Nq3*IJU=zX6a8D{!Sf-QR8s#8to#Dko1<2H1nqRt0jEWc`QZU3hFPr zQ4{I}KYn)41#y-1Ee)e(GkWt@<}u&FE%zCRkgO(Bsm#9E`n$@`LnbB?RSIs*XdZos z9!G3fZq(W8>{P;~Gv=PUhFy+FTj!{a!f%-d1F`mW7)Y7tX0bzCBp+OyA%?BLz=BEfX z8Jw&)8c7+{{@iWxygxLa{v-27jq+g%qC1nw&%|q;aBF|kItjaa(Rde?`#bi1v`wb4 z`kxjfr*~)b13zUSPbL@Dr?W8AK2Dtg9@iW4KN9YE35)FTBR_EWej|*m%>N4P>(vKQ z>C<`(HRDby#v)=>;^gO->a7&dZOG38_fd14NUJ=YXt2IvN`x(6DMrysTE?NxQ^@7XDh_dT-zEv+`Oja<)2EWcLw7HWZ>ptcoG34w}fQ z!!EJJrf0ObGBkIn%Gs7UZG$Vb69}`4L>QEG@ord#q%R7v2oZ0~y!N7Xe%@kd3;5ik z=)`}c^B|OVwQ`UZWyU^tde=V4lz7QfE5KH@T94vQ=1sQblDA5B;Z>?S6sATZfQQhB zZSH5x35ueXYkz2wYd7#a=Z&E5#&kta8`vC*2!iDaxmrPE5t|Iv4!@EQXo zC~RwlaSuSxn6mNC+LnOnp$5H4|B(kpw`y8sYsv>=O&tQ)mu4sX(c<7^eqVlh{L;=Gz*4?~r|!*C+MwJpO>J3)Rkoe6_FrS2M8zqk9oSlC zz?CrykB^~}6!U_RC8e-H>ab(%hsCwtuNyE9f-Ib4Vvyqb2ZB=MK@?JpJTu3=-~^-1 zSaFMrF;2?L=Fz{82QlJp?3W2?dMF}2_cK1(kCmsjB!SP4h3>`{r6my|t4fusj1BE* zh3ElgL`$($0rk9@_!2pw&;Bb97xbX1!~Rz+UF`Y=Wf`-jk-ipLS@>w{5ob4R`5xUj z?x%AGG8z=`pBAg|-~8rc@w;W9!YQxeNXywXpT@Ah=7tKt#GdIZ=j=91Gi!|Sc~-El z*6J6S&LlLU^YH8a7-jP)@nhaZQ(VewxH!ip z6^sQe?96SsM?R*pb=i%ZU|nObSZN>Rof56=n08wSr{pR4ymJ&?GIG6V@leuB)a4{2 z2^C-~Cf115ko4Uae@=;`WT{2lKVR>rXqd$G6JL~CQc}2T%RXpoR2Q)NgEq$WnA^X% z3_c1vE0`f4i<)2^;@+{|YQK)^%6IfSHHoQ2qhwvF_i)dDP*na@4kW#bvhMgG|8&S3 z6)To$7c*N=f8Am{Mrtwac1|+_)^f@9guk&YSvot{=tP7d}M4x#Ys!x`0Tfail@B4yn zL9c=K5Tzz2u^7*a(%kWtCWaxJ52k)z_6g$WE;MaM8F#!IivDt^?$X1=pKJ1Yo1@fNfk@)>T~6| zFFYKo{vlkkr9v(9sv*{MmyqmU)0|9E?- z_?_5okNB%iCS9R3a_Q&}Nowx+63r&lV7h%&zt)_9VFf@r;O?3h!}Oqjg!P1+ge_pT zFM_hXius&r2P|B?RcD@sR5<9EDUG#`%O!VUJkHZWhGkc;1A7-B#PUeg=(Ap*hH$L0 zIi6AK^E&qPKZb(;7^ALoof*KK$jXFpD10RBzndWS0-qPMm;5*^wi2%%{cQ(nlb62- zU8W*#=WJ8(g3Na#wF+^Mm==ypX8xLIA=4x;rSzslp=TG$YuV(&WKz7jIpzs)dkmVD zZr+=2#ej>Gze!3SOi6eIW1(M_wC6b0@wz;Lr0QG-wEskbP80M_R9xi=F=a2f)WF z9rXsQi*{%)xGV+ao|%Zt(+7M@@q@6P)OwZm7C**MDW?e;h3mtw?H-spY4*|zKxChi zx4^{4;;46s3w+z%XkAIIVp82E9)+f*+W^v{$(*E$Sdv4Hantp=RH`OiK^Py<2k!o5 z8;=^%43m8z#n^!9OF{;$)VmP1^Xe&tvm{-OS1Qh*7ze6hNtCbGJD8i3^ zatBVr5S={F%^wy7Z67>Kozq__U3D^ZrE0{Avj{$kxfA0s*GkWj(a3RONW?6ySb4dc ztb-%XT2sXp!j5(?%o1(+@3a%RE=K* z3sn~M! zq%#62x6;g=Z>6JBaeG@io>0lVTa;6~qRR1x`imZbI}M=KD)O!L=ir-lhFCcP`X?<{ z{za_}CnYXv3+s3*HwUbq5grM~2KV45mtXrEzZlNn(+`;#*x@ZZzUhHm!qWL~6GP7v z(}IIo6&`J{#^!8cQVf&mIV4N2i@NY`#`_j`V;o1j!|+*>q`V0;hIle*6hyZqk=J=C z;Rbpjreh5xETa=Mlac4Qk1PPV0#(5a5=rj%72Hwyb$)klDSVWq?k8rS>GMtng)6Tf zy|igHv8&-1Vm9049pbzF2Syo-51kLg<94qPb;APWwzU5FAA9lM^$0nQ3^$Dv$G?*{ zb8X+>z#oJ(P~1jB3sF|K!6ni=_FJFG|1#d6gQ**MxjBiyyl$z4%zZNYRB7wW|A}gF z*}D&x1;F`M1A^`7AX%PGQ|=sXSatBUuy0dI7D5NFVzkIjDcH*WM~_o3xd`+wH>nfp zPx8Z3mXXJMqv>BJ4-%Ik+OtXX*5AODVJZze%1z@oI+k*tNJe+kXBz!a1y588-X-b| zFLKP_(TPche2eCrNgXtS%52Iz2Q~7}}04KOvy52ln8VCe7ubpy;aLB@d_y(3A;* z^x+J(qETKQpeI7B&6!8fi&EgV&qA<)UVXYAJL(CvT^e2(Gaz##X$!q!9|6(HcIlrA z!>B&IO)W8eue_npTFM3bmBYXGy*`2~lv|A@l@hB<)NebBqNnr| zvuAe@Fxswb^sM+pCqu7N>cA*kDMKKh zmUy3p>Ed=M8(JaK@h3XHFAW|9?h39uE)edm7p>?-0C8%Qy0SBn=^S$WG96 ziG)A@*$M^@fq{eJuK+Qzeu#B&ps17^5e%mF*ku%`Si^oNk7QyuvztPkFInWwhI`0`;Js*>}BSP}xRO=}!!3k|O4 z_Q}icWi!S(0e}XTa4ISmoAFT_#dt(6XVWtUjGuspCTI#-FxS9s;=D6!95{-JcY56p zc4XXw%YZe6FFA@%!kk7}f8bdea%BNJ^H6f}{NFr?xsRHO2KeRcB>Cyggv5EkdP9hY zdMntLMqV=xT3k1Wzq!su#jx7Z`E6%Ifv)*u%diD>;xR0y%;J+iK zcoAuoydaH&1Puj`Kkg2B2xX8YidQLChTNZE3aQbZNgPoeL>T9J!@B1NIrpowi?3rP zrPT%cKc}e@>Rb<4i>rmfJIr5hNG*-g^Ej%0=_uuBo=(*_m$?MPQ@5Fm#sICAu=%|a zUR$m+3*2zc+4rj3p>k+lq757A%?jE(4(4k;4#A04!=@ds%9%Cj%U0L)=JyNV*6!Yq z4|TjdQ`faN2~)Q~dH=YQ;}CtvV9dE!B`UHM|F72+2Vj`NVb#7h1E%jX10PuU8J^<6 zAjYO~B~RZO_p;k9PMTjnuyPKu(>vrx;95OgYCca^Qm5>B`-+yRus#ZQ(#%# zFmEz|3Xpe<1lC??+5+~}wDjIy$q!e|lB#eat-nXGN901C6}1OSHV>Y-L^r>8bi8UY zoS94%gWjM0%x&iVa~hU?79|sP&vT?1Z!e8v3~dQJ$?xDzZNWf*$J>J4t#)Rdf8Nn5 z*%ZhNE>ebg_6}+;NrJF=(E+7_<)IO2dfeNqC<XxJ?{?aXOigk;KCkFoLolHGW$b*1M>Y7`u{p9FyaxpTgIHdh z!jqG;wKeuf_evdVIkgK$a}@2DvppXZdTD1H!V|J`6n8?cl;TU})Rp5;-@S2sh8~im9aYDO(43khkW4-+4f*-gljktRGO9gC0dQ?7t#>+WXXLtt z=`yXrEt&+B5*dtD>!&U!>=(Wkap^g-7F}mK@#Yux z&t~)5*(tk@%_leWvY)Rx@iqBYOqq0Z#63lXn>sZE-I%c6tKh3#iHNG%WIdS%NL(<3 z7D6~PW+&rvOQ^tpkGsC}ihD;f0V!_X3 z_4U^WYtg%}5!=#|nI39JM#ptepRBfRJh`1 zxgwt-F45n{FS~pn+!L0JJBeAh!M>sR*dtEIp(`o)@F#DK+b=zXfJ`01KteG{j1RI6 zOyk;dk5d_#*$d$|x5Y8GDUkiL|32p9TITS^@S<%`?$^8fm;aQJ17=4ar*lu-8@c_+ zDmRnl5xg(PiCJDp$g5G(k{O)7{Wp>r-!H(WC>#|b$XIdtyPd=1`4df}Z;AsY3EP-8 zj$x@6fo4iK07ry-IC@Lq-E8nl&%K`cHTSrUz$)Sz)K$_o zVW(!TuEN%20hwxiDK1J8kN;Xp8s%ZK@oJ}z^W@P1c>f)mc952Jpb*KIk33dy?59h5 zz!}u7=UNG86%IU6TRBG?vcqp&1y7>ivlk)P6gH9g9C1BtjJ0SlavOyI8Vw#h0M6qL z*b7mzQHC6%Zjh`xU=tVpX_Q`^q_|ft2jUzBO8SvitQbrqQaP z{7az&b-=k}Dy{F_DF5jM5LL_V!1^SdijV`vAK$+ofz%hdT!6AWF&g5~wsZe(R(0y#wlQz59jX~UfRk-k3uYIIZR$n}ArwGLX2}w;Gnm5;8pzZpLqBPAO z-{OVVZB?krVuG|@cH^+o?_8~rStAfaN+E8_dX>+KpTtKPAv7+*+OQDjS>A9+OMVtd zxTfP0eBgzD9bQUZUv=()6ZgdA7x1XE}FFvv15+`@ZC9DKl?3A>h6t#J@sy5KM*B4*G z-l8DiTo5Ho`3@QCHl`)ayJu)cZPCc?fwC%KTNY~+JBjhE6z|iEo%~idrHtV0$PVV& zqZ5k3lws4{LFR|cfwP8$K_xjTauFek9k32k377kuV^B$)(0exw1H(v}ZfZA7+=c=| zNpfz0h9qrR$JzA+Cn^!c%C#`WcJDXyv%j=ot8)BMAy_6%EwECjhDkAOlgE zjtw{ zy25-FyuU=9wQ)Db*Y_@9ERMT=ivH61g(>qD{4}o(pH$BA|IhWH|KSDw-h9R=IPoT9 zv>g+9x%9;3A*b(Q1@f>Ku>@Pc5F{QT50C@M$HC2~&CMqQ6iOe z|Ha_sVr6IJ^Z(8e>ux9X!XW=24el;B9uN@N8cE3sWNWPkvbD2xpcUX0^~BU>V5&3LwXZzU$iCdTl9|;`sf+77cIsX@E|O)a;zBJ$ziPk^ZMwT&~WxlJ&ak|4WXV_6rJ$n_oykNRSsO$YUen zp!ov9|1UXOcD~j~KxygpVhO}clkR^t>3mW`vaxftei=TOle34Ti!GN8$ji>s#o3+f z|CtyrUXXx|g@7=~3MgnLAi!;5X>9?r-~-x#ta+`tZ3HbiUpP2l`d7f}ME9ZrNl8v! Kwno}K^#1_8u2S9r literal 0 HcmV?d00001 diff --git a/applications/launchpad/backend/icons/apple-icon-57x57.png b/applications/launchpad/backend/icons/apple-icon-57x57.png new file mode 100644 index 0000000000000000000000000000000000000000..0ce9b1b437881201e9a481bdf74e886faca86596 GIT binary patch literal 3620 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 literal 0 HcmV?d00001 diff --git a/applications/launchpad/backend/icons/apple-icon-72x72.png b/applications/launchpad/backend/icons/apple-icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..86a4c7210d308731fff2187ca3dc3ca4e1d523f9 GIT binary patch literal 4499 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 literal 0 HcmV?d00001 diff --git a/applications/launchpad/backend/icons/apple-icon-76x76.png b/applications/launchpad/backend/icons/apple-icon-76x76.png new file mode 100644 index 0000000000000000000000000000000000000000..7b29c60b9682369c37d8ec024c70330aef2cc0a1 GIT binary patch literal 4708 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 literal 0 HcmV?d00001 diff --git a/applications/launchpad/backend/icons/favicon-32x32.png b/applications/launchpad/backend/icons/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..bbe1e1bb6be10d52a1ca7fe1db2b6aa86bc0c305 GIT binary patch literal 2103 zcmZ{l2~d;C632%Hxs|sSA&4S~NE9LY0x^(ag4{#|B@#h_Ckgp-2q7HdbX|}mf`CGh zOOBO8Q9**RD(H&ILQo=dNGXS_Ai7UMKwU(X#pQiiTlK81dNtM4HPgTTcTY{#Ox8Xh zkJZ{n+5mvnG*4GL;!RgfQyrOOl9E0kPL1p2?F7Kp(>hDcRmfT;hVJ1E8hbZPu8^Ug zbZ-EXEC5JJ2VfD|N_h=HECj$*2ms^~0ML=;H+^>^0d03NnyLlV$P{f*w z-sS1}&yelRKJl8lTD>olg7TQ=j|cC3nYlJJ@~-i(yUlVnX$eMccA`eTc*7~}iT9MW z#h!5$>YZJLv!;gJribI%G(tA7jvSr^>T6(btDhszt%4993I!5n~ zxGYh#53}DptTPTf+!~ix@BWOmw*-7@k{?NfvF;e2#ryi*U3wIbKS=ZWYix<4kq z$m}ghzGa`zI1wI_qCcmmVpwooYGf6Mx01i1g-0cP(tq_@LzOsf`}o0H#U}j-&!(-} z4!Ts9nL~ONx?*_tVc!Fu>cngZV;N9dHmd(1AHT2uA~5Pu~4{fiGM#3a#7zA9H1~L@9C2iBeo_-~JQs zmam=XDq~uMRBbihvE!xHv*OMkHQV5jNO@-z>h6Xw^8=IcjT$t*ce7~dxo&@3qH-iy zW>`S2*cx5i-gsN9-|Sy`H&t#1h3nV{$eYZ&FnE$Y-HHlB@=nbYBVvxjuWMiF8ppc@ z(toCq<|k%rqj!4D?c~^`)m6>x$T&jK^H+p``~!_38^a8@w!Q%1!Hwym+P>&5&J#@a5&SuCB?{*_n(gFY!i^ zNV%^bb%h4gEh1=^D2ehYDk_ZLw&PMB!Fz;<|B^OKQg(?!|U#UDk(D zZpyYKugQt0$^7YKNmHM1b4r|RBrFLERiJ#idw%9195gG=Lk&n(wep5b6|-t{l2*r@ zPVKc52kjEwp0{LBrxGmgdla`(88$7#~&7+Q8z=>FYX ztx?;C?upEfNR*zM)uh$Cd%F3Wzr0dvHy>$M!bP(s2@>e2BhRIJsfkXxPCsV({ep$U z&U0>63HxPa^_4u6D;a_h5`$LVOLu315j?2qv zbAcI(Q?zAp25#@scdYlrgX07`?D)r>|VEZ%z6QGelQJg|S(NMSgK`;ovE1nV--4#o_+f1Q$IEh2UVUPba>(o#9)#Eui!XwKV>r zL#07w$*2=vdYSj5wQqaHTI;OWdn{cf%2M%^$(F*tEiCr~S86}y)?D-U@(^F{Zuq!O zw^pUkr>w5rZMeT-@px@3#+Tl=XxB2;*bp6jLDV|od%{Ggw3c>}Hv>tcH zM&g^FRb>D=R1$+wmcr5fDGg?XaN`<7!DtJ|(sofRLke3ZPW^I_Zk z{k`_OcNB2EkaorJ>FLtbsLMdTJBVlzcBIW!tZ9I%0GAZv(VjVJiw31o;swzb&~L1YN} z6FY$X6yGEWgls-1@&6~BjN#iO3GOQuVuTz~JTn>wGy#(fdo#KG&@fXX)(&fLO)|BC z@C0jUhc({D)E7@Q<%vX*WE?I&J|4?op%Fu9tT3AUn|KBh1cob$e!N%#i%fPEhQfG64Lf#?i`L4Tw3H{;J|i+C%@V8bR&1X=eD z;>{PpqQpoTeC-Ms8NqdIKH&2Y9dAE`0{9*FM0-11$j*jC4f911y>E2(^OIlzIXj=J zrcNWF1K)%gbQ<9B!(rt3I6;IcT*$?7m~s42VMGk>e;0$ZWfD0oB8ka{?ASyio)rqS km@ERsVZyd-JjafOMKZ8Rf0dSkO-KbmbMtX+bPh@VF9dal?EnA( literal 0 HcmV?d00001 diff --git a/applications/launchpad/backend/icons/favicon-96x96.png b/applications/launchpad/backend/icons/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..6cbdcfe045d1f965a79cc8a26ef3e9abcc7c6a1c GIT binary patch literal 6117 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 UE0PWnIqd)#>tpn4bzJcO54>Ruq5uE@ literal 0 HcmV?d00001 diff --git a/applications/launchpad/backend/icons/icon.ico b/applications/launchpad/backend/icons/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b3636e4b22ba65db9061cd60a77b02c92022dfd6 GIT binary patch literal 86642 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 AKmY&$ literal 0 HcmV?d00001 diff --git a/applications/launchpad/backend/icons/icon.png b/applications/launchpad/backend/icons/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..329808c6074b795d92814e5bed0c2f099ba13d0b GIT binary patch literal 194402 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
LfT<@s zbXDZVxR#V&t*f_MD%+_(6Q2DQT~!VEMT2s{`V&r0Bc+W8va5DQT{8dvjg|i~Yr6Gr zbS_Hj&kZ{H8Xo#%xBf?GKmHH=9!9LTJ|-lPvc}+~vJX}6ZAM-Mdi$N)2&Ti5=e7^@ zZ`7wkYtWWRVCOkTYl}G9d#Vxh{x!MZYaq?$nR3mD4AKUendZ_#x<;_-nrG*uJ6xwsXt7t+w)2;sVEfmx zDx-(~>6HalC%ymGCUEt?^!;wj<~jNm0C*(b2))gFHP!dqTDu~27ecIsb9hHt_ZGeS z4G!pWA>J#y81^t4T*k?&dT`hWto!lpG8__ZDud`49SmSu;T?3KYXA;E&YU`t-K9J> zqypEWerN@?mb_mSO4bE%EMlhKf>;$S&L!Ms1G`F9M37uL8gua6zFsDzC?n@?O$O#5 zh^=w7BZB7w%R)rUPH%OkXmLWxjvS>V>!dImU|0ZX96O40{Oc{%1kBLJjVfO>jY%pz zT#&m7Me`ZzxJQ1N)By8~fX=YRe|j@NC*{91TXRAcKvg=y&H9lSZn<8(wvqFJ>FmA0 z%6=!qs&Ol}|D!Pm`TtGJo7Re&_0_$PT~1&4Av`2XY5&^Cm3Qx4Vaov7UBn(ifTgat z%TeL9?xVd;+A^il2<$SMgmEPtp||pX3`zfvHLqRh$+TeTqKu6|5TrBJA+%9lt#hcL z;C34pbOhuc%90w*!P0PFB}~n;!JZa|0t5sQV#J@c8IY9;8_KQZdLDzfv{znLD6B}o zK61E%pO|v5x>|I%d`sQ;Ey73!-l%j)tj&CIa?;QP?ZY_s3w) zGrP8W;Mp1frD>h8yj$^0{$KTb|EgfT5atWpYP-aET>APKu20Z3 z=x`IT4r`3wE7M7K(*U_m%TBwl1czOpoa@)FMDLGN$1L(KerdT^uAYk#87!V1^ec{$)%_V$5jw4!( zP@$fE(4m1Crloe#F#+vfYc8H~h8lQwIl2y~pJsXC2_w(pC(W@h(J`y8d7(NO zM}Kgc3Z90Hx%+K{H!ed$W1V6C#{&lbE02wN!-B}KfX@BgTaR5~z4?Z)xwOk&rVGZW z%NI3I$brdM{x)8H&(VsxFw~_jqqP{ll;OCdbv~SRJ^-)QVD(z09!#qjy`#CHf*syz zO}t4G&N%C+nmH7)#YWa(&cLcZ0v#+!=e8Z=RIPR8a-$(NB*mWG)y#O2mYkyOU&&RC zY-)QbF=%O)ri11_;+tEy9~%Dr-3HVyJHKX8;Aj8)K z`|w2)OO0WBpnCANs6!E{T}`Fxhy5IGsAueapOoboV7?964VFC?Q&=obVUA2EU&V$6 zkgq-8$IhrSW_=*%|167E`T2y{J`N4R_bM%6=^MVA2>| z95GUjCF;^b7DQEFX8%oV6{?ybnP@Mvb0VX!}bBK`>^i0|`dq;$?>=F^S zdR~9LpR4XBHzGS0d?Q1rA7aHjkTEnu^DQuf)4KA>1z8RI&jK9 zXh20C11W%Yosv{BT~1fb9h%D-6`_gA49X@;3|9bU-(BjETqJY#vFBRM=)P*Y-4+a3 z^Zb}gAJT2Bpz3~`ocniO$AA#Vj!&-+8nKa-{#||UV>5#5+(v%`*e_(6cE6MLac4RH zNhw>6xK18(cp2-uW<>Gm=Q>Toy`iyj7-#<{&!sP*rEf^gYX5!2E1VQE-=vUnNH!YD zCKoQ5y67J%<{Ti0yxbE+(PIYZXFhuC$_Pt~=$s}T@ys@ZLq#{Fo!0tEg3n^4n`TM+ z(+TV<#ul)>C)XsD)o2Okz2oN3wMw|W6eEp&KUH$wPX{{2cF@7=KEL47Z;w+K&~39< zr4gf8RMX%r<+~cdwhIn`=+mVfIbeHvH54CYh@Ibo7(R5z&$R^7<_fqE>jbou;Rr8W z@jb-O>rN@7_6VoG2xkdHt~sl_ufuYE)`Bf*kv>$S-b#SbL00!3ZL7afNS<%MGl#x2 zQgbv$G#~PI6xpNVQ;n9t?FzA7Le+3kj2NqM@^xgRW=*+d+sU4xrw=fW5Z;IrDR8zSj&>Yw5Kpv$tJSuPYnUqaGY5QIJ zn{cp-e*Ar1^zh+5SJ%{A%+X#e;i~gW5R^#N3IW^BLxjBYF@yx;yW5JQctFn9I5T8p z9VXXVjCzpma*hk8OS^|3GxK1$+CR$#i0)xug-bPULFd)C3SI7^&=i< z8Aam{Q@)*nOVws*l7WTD3Sxi2*q#Wc;*MIvy?Sx6>`N*D4a*pK^*n^&Fis+dnGM{^ zocM?lgWl)>{Q*OMmHM6?kA`87vgqHXkJR)8)t}Z``MPPr;sI(s`q& zH;YZT_i4b>(=I0Tf1P|->Vrf*?mRf#tK0DOu5cc*A0v=HaPV%!vcVcY1iIT?RHU7^ zd|wu&JXZ_Q7sYLBs}wT)(&k9uAPgdI{>KAr_Xm`8RL+~pvE)QW(hJiZT7pWV?28QZ zn)h{+wQ_wW?5AqOU-=wvW{a>0%hwZEL2_6Wxe#xE1Bi{Ksx7{Z1$rYke4 zf+9pKPeAd&_9wHA%&mkw#r_k!irS`7>vsPDoms>O!&a^{{7`}^*1RN*aOlVI*BQsPU=Mp${dDhaKd=I>9c-&0KeL!3|JSZA1J*ms8*=#91eIooRAXJ) zGKJdmJzj4ZwT2vKX##giiL*v^d-eyjoqUgZJWKR*?!YYGo2Rkrw^%<@U9ZXQ`KL{2bXe7>tX-=CohIc*C&;B0!f5M8AC zfoO=~G%f`)f?t3S&1FE+r3>L~I;DR*W5fE`pudkl4UH7WYXITKmhw|x{rifpg%-N* zU{;xP>*dcc){&E6ym!dX*?S6^=rnr2RK4)>8ep&u3aluMQ-vAF*TAq}_;XE(DZ|Y7 z@U^f$>3GOy{U8Bf%E$;~8FN0Y!|Wj_+|J@^!1cMY!Vl#4=*WZZT?HY3`gY7}-wG`Z zx*-3M%kT_8X6G*D4~5VJhX=C{m)9W5|9Ob_--*`6j?Iev#@T2}R)^!w{N|>M$4bee zg+4b^&HC0hQNU(Hj$=pUx*<<%1&)3}W|8odqem%l*lU!S-Ra;DpvlWAVv@|}*d~sE6e<0gafYL`LnL#!N+?ZMvoCDS|@a8K#|3L8pa4({6pb*@8O6e7K70u zTVq1%{_YmI;k>G6Y&qF7ABNJUE_U8dAdB>??sOHBAt<^<-vO;JR(5*8-XB74pmt5# zQN|=>iLxg#L1fyGgx7nl3cX>5RW2WKac?R?RBPrg!>aPHI}q;b?ZBliRgK`TUFP#fZ2h-QBhD z2~@Q!z9c&L8ENq}`Dz4cm*BRcnK5`qmPe|oG=oY!7C;d%t~S5x^}Fs2X4y{mqtNf<@@p@ z0~e=_Tk^4*a;jG-Nq+}@A9ju!;AhqeYOKGz?hqw(2q-mQ^CBRH^brOAh1`OWEe~PN z5Ge8e5Nqt^R0M57odHt+oU!s@p#9@bS;|uXMxfM}9iKwJ=1t3EU5+{k_)R+#5ZEXJ zmomUOy`FVn$9=8ud7ef9p z;f0l6ttE8&R+xhvXa%N7J9mE!wk>qUpt>6JH*QC);F5oM;t_2iMGENTDR^S2o}Igk zi>`PN%=GXklM&Gy4)YfnTr5Hjspb=~Yjt^NuGRwXJ5*al!MALXo~?(xo^$e3i?3R+ zE+3Nkxo`PLmQgnfZ?{KhVa~bD;=gaU&7~Q7zEnkR*YXa=DC8zKcA6!5^(CjZewE9! zX7L%j>vBh4AXxvjT%i)2&;C6gO_uwc58JQC;B}xn&(WMB9zU2-hj2y(tE8`^7al-K34^nz`6D&}!Q{@H=E%Qb9l&RWYcC|w3vum0 z2+6MeVgQ3Z4-I*&ws?1r4eDiitpVLT2%Dp36UpVBeCwoE`cxMc99XWwO4AAz^f-6| zr(tYz9BHl2Hl|U9%g{idm>W{Zb~oRIc=bgbyi#Nfwj;b-x<6RE1dmq1nyt%bmA%T= z$oH<2HCMl`u+{%|clK5(vB@=m&GCPv9-vLj^~z=JcF1%b;L=IJRa~TjO$Y_-SaXH` z(J@z@td_;6X-Wj|Fp(~np)as9RuV`VT&Z9>i2hDbSwnE8%c0pwGBYLoa)f6z_An4A zQfbioJhV^(a)G7wWuu0Pb|x=Q>nuTEtBs>Aj+^gk3%Obux!D=Tg&J;(S76e&?cNwG z-To$C--auT&e;^gpb|wIeqZ!%I49iL&v7|{oy=6K|a1^9wp; z#>jW!fK7SLAb{<7>ti8VZgpDfYuX&88%ORvxr1GK1|e76=hPiQ#9D?E45c@AT3s{8 zuu4FnruLcmjj|EBIn%IF{jiu4gCTBJ0|kT}CQ|rd!PClyq}tXjUpD0;Zm>xJ&L2^% zp}+Fw)}KWmk|*XB&$bY^_O6NS zQWaX6)>hE5($_OE71cP$>qe;KB|wtGqQo+-H4sl{#4Qymk7+~G4vGIB_#+~~N%yDU z^y9C14}!nIT`^uHPW(&>s|#j&G>VrF={p$!q_60_%l~dG4>AGY_^PGxG1f-@H`Zo9 zs8~}1t`fI;F84;&(;(aoPgRwz-?+z$?1uhiD;X8n#c3bAh+{u-`zp!jBTOvAAJ;}1 zz=vyePYk2oK_}4&ame(>&$jf}upO~NUy@^lv8knsy-Z?9Glzy8E+KqPYC1fUZhs58 z0Y(eniU+JokzQ05=6lw^=?G=_9f}loQl1L4J@?tUHuhOjL#wO{fU@ zh>$N(a`jCd>KPdp05a9W8Wq40sY-q{rZl@YxA>t+IMKs(Bm)bCfV6T8ZUDM=d)C#gAhI+E(t=x;v!>7dq@1!ZXC< zZj2z(8w(r#fODwYYP>3OkU+Xk91h=WQSPS+x8^{fh|8nXm<79#&aeAQ%J=7BqC6_B zj<+E?E$^_>QI>I=yLSI7K1%`JGvI)`=6xZIL)BthL;?*gQI6aJX&W2b?+yKZZ6o8U zW@%wItJ2eosP+OvVeV7dQ}(#tCUm=s!B?~lICUcc$xJC1$Md4LrLRYk5|4crTJhm< zgw2WPwKct}au~hVa8isv@A<1HBXKe`^On+ua50%Ug%A#O3^G>E`f!VMvl#e(jMW_J zJI3WhGOZvjwgRthJ$K)g1#fi#dmdlJMbthFAk+;X_&=~kruLNfxp1)pGQ)%}D#inT zSE0-U7{@KTC>cw>w+-)p?S1b}RDj3ESz)}h@j~!e6^+9Pjs#gU^uox7*`|3U0F@Lm zRo;JPLe2PIU{SiuwHb>#kw1a^v6M~n_b&=S2zhNu#OH>E42ymUPohkiIGa)gJRy{} z0aO@Mk26AzC!F6C`y+i;?l;);>hI8#RVeAos8RUPn0D z+ah;1W?lj1n^f4V-+p=Qwktb)3_;_)nB`pPh?YrXZ} zVc%o^zNfjxT;dbLSTphVJdv43T96{TTMMn49Oeo5DNg5MbaM{~yX4&U+mWIBbGB$F zDj#*!e;XgHJ_Lx<$vHmBJb^`kwjGj|Dlc3-*cf8EGlc~3kwFY(Q6(XWPL8H|l2 zgSQ&o;K`EsN@GxVb{B#e{24t6M&WJBbCIUAkt!`EwC^Cp`q(Vl*WgdLWSV?uDkted zy@i&{H@I@+_-q}(Ifu>V>8X@mbsLKif@0QL7GJYB z5J&n;^-%Z57e)?Vb-0Z0zq)U0JVC-8i)?wLgr= zW@~f!<#?L<@F{VLYPp^-LwaoBHr~$Nsple*yEpLr+E?7+yz7M{-8Jgc>a6P>YjlQJ zpz-_Xzn5<%LFij&=kL%s&sVGLsW52=D1JEFE0^bZzjQ|VgGfTK3V!JJNB@l@I&*}W zi$6&sT34BB0jO~6(h9f>IM4_y5XP$xD=rJ^na|(Exv@9DdlNH_Mhw1;`8?2YqtVJn z+ci@MduW=BQzIUlS_&qpsX>ti9S>vKL2o*%OL(aLHSQ(2>|+eV8Mz>ng)U;EkfFhG z;RUj#wqb~{HfA$ib;h=fJ?N3Sf)c!l5MHzhg$t+VKe={wUb{@F7w`JC z4HK50a$QQ2B5B3w>@h?-(oe-pf)M*560}AdKoOkl)3?%4vcKvH=tBp|w{#<|EI#nM zH9&oW4Y3Q#hS*Qg409pU-XkK6`y~B3|C$W5{T!QxkOrc!6TG0aVD(Cj}_eOoVJeU zH8~W#G)s|+@yY4_z02U)YKz)iEKvqE!w1SR;wGm~3%jYZ;X;T#i`M+FqlQWN4 z*yyOUw@P9qVaSYmNi{eMN&5hL^PQ|h3ihvg>M0b3ec`bhhP*`#<%}54ZB2}!B*)#1 zxpn?dm(;|eW%jIH51V>DM{JwU7Z*lCLLLhS9pSyPjTZko>3+N33JWQc?Qy5^zwhJw zzt4`>`i^O#o4r<1wPr{JPP{V%Jd9a?{Xh~@%((rq6Hp|%prC%j^w>5xa-HH7qx{B= z12EStT3{>9uhYgz2~Z&7>cFKk;Ctpy`DXh*&+f8cY!ydkoR~@ISW7j!WWQSxKH-OR zmpta9JQ0XLg_&yNqOA{&dOf~3y(Y{DH!W0NAsU=e??MU?B!S*euj)++akUH z%YQfAsl zy4AKz`h0J`N`WFHW)ufOXXT3LtDSQ6N7n_ztHO-W1uP`g3Jk*G?S*Q3AF%G>D&Edp ziS%1t*=PP1O_l<4_3^+BS*G%39RWvLb#F>wdP{5Q0W0Sq?ftG=S*R>dGLAsos*;JQ z?)RhDe`1|q2f@Ew3>(J3Ugbz^axsgkfP zE&RDdlnL9jIbVTVn%SA z-HGIGG*RJ_C2~uaBwB}P&nEC9abX+26#&TY>mF%citV6Xc7Lp;s@!n}E{j%wnk2^I zPFNLsoxC_rd3aU1@VCefIs`3+GZM@>Y_u!yu_IAak++4TVWwqR+R?%=NNxztQc%L{ z0ErW^(yaNoVqup#uuKg3D`G!U=zp4g7&Z1IN*M`0983G$m`j6YzN)qA%&kzJ8JLE{ zW(?e7I?7_BKR`!Mw0!TK_nIa96jNwcJ8J;fX?Te1;x}SUN)*ke^2>%Y5B3^T=F1!| z%v&-uV8|t_!ZNT;FV?)Lak~yrgJHvS;thRdEvOtpk;Nq@0zE166g2&3l*gY_lg3MT2 z+1ms=)Rmh(f{o7dg9n<{!E{)*T!x0Te+C&dSxqH!y{sA{FA4UGesR7Pyb4Y89kZQ- z&PM;w_xY%;CkMLha#QVp&wHC;%j>)-6%;Wc7-D0iY5~x9q}-Waqhjk1+!T^MXknR< zeIf`AX9ycow)i^-^+kX}@u_Wr;d&#QYw!1yp#Tgn!Gzcl^h`X?ccn<=ceq5S!h~w{W8vw5{Lym|#tg1@@xJSnSi`cM{6tA~ ziagS={cVypCIS^rJY*#WE%9Qs$2qX%O*kSvKIhVH$tAB%j`%`AsK3oNrr~cX{kPkD z-l2KD9xK@2Nk19`I&42bnqquK(13PLpFk@6`kla3HDY#v^thp-U%;ejFKRyFF>YzwGniXO|)~J`zL@M6(>?|&aHP+RD?S~o+7Q(@X>DJSicJIEt zIzm$e&`3jlKaOH9xIL3B+rmTW77q@(H zrO9h6UQ#zI`gQJf!H*&F)M*i0GqOa6LRKML5nA8$8n*X)^dc}jbU6hL2A&e%ArLb8 z0^e9`oi{35vgR+!Iq9*{=FG=Ac_1(g`-3Z4Y1M>hOoZpYdw$IOQ9^vTe3?M*N2Z{j zKYMmh8Ted3&PqZzKb_rZ5^?eR^Xp+RqH@AnVG2Cn-l?|OuxwZCw+T0x3oZ}A0A zT~}LX+myJb)i$^mP`P0UL@qfI+GhoNSBQk$TdZ8_9@{lDYp7x4@%J^x`t%sb?P#Mx zraelVh12}AuaS*!l+0h|z2_*R6zmnm$43BP$e&~q?{itSoj7RjlUM^>Jjsyi(U5>^AmJoh2V2KNe*FLIG#$X2(mrN?Vq(zzu*!)B2b6X_yv#fu`nPA87 z%ii%rlUXp}oH&68m}wl@7!YhT1O>4bT`a)^2vJb$kd>RMfmx`| zVk?`tAwYVwH7jpP>!%gRxo-QR*Q}l^Oy$<4mf1{Q58KOt--&>&#`7Pz%+H5g@7`s~ zdF^}H(qp#;t-nTYkP>~nk!tI6s|8=c+&Yk4_D?$H%nzIt{Rcn!1?<1NQF`(P*NoTj z104dymR+3${xR=4{~({HFPA%_<%KpN2=*pcpa67z>kPrT5n;}klrB1j#X)e^Q2F4}!CjMlQfb$7Ex2Wpn{fupN zzG#=k%4LvY!~DiH^-zZH&+OZ8eU3>PJXghXWUPunhL!$cujuVkQ;+#9_^8K#N7)BS zcraG_COylX()e6%?-mEM-LCq51nFDEsV$w{5vaAJ;Bo;;d;^;>R~yc=vs}m>J&XJ~ zJkM_z#~9weKOxF1}wJ;=f((5ls|MkuQbWK*q<2L{z zrCe|+>G-i(@~9~x6Rpz~$<}W|OO%Ln(gY>j+DGJ~<5F_YUtHam=8_W=hbZ5Al1(k) z4URO?aUbpIva1%TMPLFlaa?G68--H$)4{o%RQX}ga?0;EaJKd096)8cZ$6JLQJ21q z_{eXFhg#m>#J<2YM+&E?q{>mz0vDgzEd6%uVGDN<6p<4P!-kNcrts7IXOnbrk2^uS zgE(3Hjh|5j_shZ3GUfWUW=|9We))FFhJL4MZ!zAr9tX&q^}f5-4o?qD21i0V3G2;} ziq&?XHBJr30wPk&d!L!()Nvm5+SE_V$lA6Bd% zjTn4bNJBs7X#UXohw>wQ!j_G2yff>X!HARx@iI6tHky9dDmIzRos-R zNr~)xUw6lHHkjm{3J=gNdgo6_aYmoV2yz_l&eN;qlYQ`0=2(Bv)iWhM^Op1N)HyzP zUjJBUdpBHqj^nBT z-jeRr3eI^!HG8fl1w7&mPSf-+OwGT^`P}W^B07|EeAkFYb_mgvbqS6ubUv(?4b=#} z-lYc7SMY$>IsbczmOi+3&5+M#h^*dH$?66?Qvu2zRu?~von1mN z{RQ0xmN6Eke6T~%h=j2UnV&p62FE8* z&LlRqL{=)*vdRpUC}6VB$lkIfxY*Wn6Q0=QCTu5jf`2zq|K0YlSlo~^*5q0T#`g>! zXYB%^`pl04@u+fh+nuprxGn#>?@>`Y{eD}yPmv3LCL{^_psq4kb=ns@H8xqLmXCMI zE4~hNs(Z1O9uMZqxn5?1jt>WHFE8$$*J*Y_e+2zs(x;vP7SpSXZhgP)Qr-QN!aOzx zSC@Pyw@C8dHMedY>1tc|>=!D8ylV)Yol;QDUVy3F_n(;yT#<|@e4fxa*0vf+S?_Y% z<8%TES&lo9kJb#=?zb$MMCoRLZf}cx@c}qomw^j=<4bO@18SoFK*3^ z5UwBn(o2@3(T)3m4d3b&5=$+#WF}*XkNsRq?RQBK6~q2V#V~=%U=jGoTZ9Y|rVsZM zO;7hw=7$KAuxEXByAt{6gRq#FJqNM#XteVal?3>SK5G`JRNs%sCuUuNT zu)Lgd-kU80(FNt+4(nofh832X*ErJwo%Glwlm}-*zuf%j6rIF787r2;S^gcWh^muM zYiB*f9Lib5r68uEXNsL&=E0L$!ogZX_g2BP*}o@E(Nai_M%G{*InKqF!k3FNhZE_g zE?pJ)d4xuBO9fX{RUTZ!Gs2X6v(u9Oj1KmB!LyZyT6~EAFcEJ;&I|MX0Up{=pS`2i-_}D!lEE^Y13H6p1v&inU9P z7!^q(8z_8aLr2)PS!UJqtS73A#y6>Y07ly&1vu03#0>~ zbZc}{8vaC0#$k>~8vcLg*1#Jip^n0KC-F1`a%=Kp9+FgX!-dLD?R?R8-|^G;ZR+m3 zfiip1kABPp`N-VPYF3cD{f91q4!Ef`d^uebxj4}4aUmF*wpOf}vEeRb|0L0fGc+)@ zBe`>8DWBv}Ix&8^55vVeUmyJ1)rj-pwv`=WuZ6ixTdw6Z*VWKt!B_|wk0?h1)p)j>+l;nNKo$WlG;|*iy zyNdO?Uj2JLn?-P@NP0#wu(G}8>TL~SY>>&{#|-If>iuPoblBwk}n*?VEz zB=f&D7R%}Hf;AfGNzWNvunT81S(8by=pLiHl+8eOqPSTx3wT$2{svAac;GF(z>4sM z8iZ_%JUlGNgoD7%v_=sux_z!dU|! zqsUh^>^_-Py8Anjm6A|{ujydgX`=N2;M!MSX`-W84MU4Z~*`K zk^YcPExwSgYPdLXP0Dt|VKKJRI6nwtsW?q_G#*V;&SHNx4D%H9QeY zU|43(KL=gaFeva(<0}yP``EN91Ens-F&HN?!$C9gM?aO2$b%__bshVdQ|t1SSkUhfvt5NfSr>SYEeOmhqQtvd8TD+AFnd1jb~fK54y`N4MXDaRh#>YM@sceh zTB-fk@kU{|)3ETyJ3Przcjp>h47Vg6!wcY+q6(v4HAmlHzhHyS-DrqdViNnh9>|g{ z`x9wb1jjwOz-QUqz7sNLUDI*7sQfbiNOtCX<#Mslw&4o=71_Jm`G2_`^m=}HEBeeP z3T{2E@qb;i8M>*cbc%cven}H9MjLg{V)onackqbah5w*i!I9viwa+UkbqXBYFnkir zp9V=*hh|X&=HYdLY#-=VIphef;tM2cMIrk$44$UkH>9BcFd!);c7?=RL%cBav zq?@fbK|MYBlFp8SH-tzd^JtJQV8Ejd}?OwiRVaU~*1BSZLK2nNFw433uC@+n@5k5^pwWuS4# zMHdcyF#@=RQ4`RAe)e%;@wzX$^q+$)`L0A=2zo78w;XQ04nt%k)Ghye1u}zx~VMfL<&}Oh8CPvoSPqkPzyy*FE`NRz}pmTVgNG+VHxw2YB z+8;pVF4$~L*_nX7Jux>!)D-B~>vJ(s`y2+;TDC>-zuH`XaIWnq&dt;7U;a5y*gn9y zwJHLSv9>AzfA;o3*8k$?fBDH*-*)W{xBe~2@OdIQ4Il(n3HUT$C0jc@WIgmO!P$h< zDJ+M?QYMiw3wz$0ozorRrRmVm#J4Q`1xvs5!YVFt4IX;TAjcBLIY)gK+{cJ^B|1ya z!fs(3&QX4EafoX8Wf_V$H!RX9^M|>r9YNrsJZmpbGiC+AI0L!IiVkn{9lCI)n!+)Y z;zMCaD?i8X``l)u@#Cdj3Sfe=CrA*3R5zE=FnnR9si`3bFc0bE-! z-~AdwMn9k>V1Bn=t;bxa-At4e>Wl&?W-)V5mmx54FRCM^02twLES9T(T#`Mx-)d9K z2LKoJK-vpKFZAOsoD!D$FlZDeN_$i6-W`S0MMOyjlTL{#OIEE=0j8VQ6oQzI_XRou zv-){Gn{|dDjzi>85KSnI_FNW2>70dTlP{%U7|Xp-{6gK<7uQ*T{={(qTYviReOAM- z{ShwERz=`3(pC<@pRGNR^}l%iJO1l$U2@YcPx>M$!xszWYWGEB>6czWg4nUp5mweB z1dIZ|#7#XxjE2QQOJ+e|gTfd$<;2jPx&O_r~sAQkc`dn!_6Nn1J9Nj0rIi>vhi{C=1eJu*~g{XI^;TQ#&Ni z9Qa80$q+x+6$m6CuhDLlH&KVI80NJkmq54}X?}CDqXD6`ot-P*da%X8)O_D?uJYU~ zx>7T{HLl+8!30z07#z*;0!mZj3ouy|JL5=)vFbYmzR&wujELybB)x;J$HqHZu3uX{ zOtV`2y{AH!jz)M?LSpt8kp(HRwXUVAFe{+#jX`~%r0GR5En1oO7lO@3dXz*<3a3V& zz-)<}yA*M-86}bmNhC_*vmixmzlp7H*Mx1i+1e{aaZ(je!MJ%&8QSefx_9ojkNFGt zoqFQe9Nzu&KM3H=?iseW$3R;ZfInM%CX*K0 z-T9`Mfz=S$tSXin_Q$Ng)H3_N$GP|BKKUJMgZHK{*5l}Dp=aT}BVc#Qet-#Mgz%$P zNcfbNm7@&^0Wau>p$jUczGTEhm*eFaBpveET|gn}ijXYtnZpY6_Xr77Sy;@!S$6&U zvUnfn17~e}st`a3<&5yql5`~{DR~1Gtc(QMeTv40qY}o{$O@|nC^1hIGKAbS>eHaO zZ<_J;!)>pWmtbiiTtiM^)DFQ9Ly+($6IAYYNPA4s6}`a(c~t95$|~TRkw>&}y=+Zt zGlCxXtX*9#8lbPStC@Z7O^`FhlggY6VU4{}TX$vfv2#U{Xi(a}P++c6{6~!eD(Pe; zf=85Y7?K;L8ZW^5!(vH8vCvb?0$8hJ9K{fYC_JPI9RW-sNXSKN=p~F{Xhdz751ZlX z(uU^^&?`4LjAw56{I9;Rop|QJ>Fhp%YkMDV>jMAj+d~R}0Q%BjKJ&zr`zQa7 zV)!f(oXo8ws9aD0Qh8I>T!?bMoapxk#86jYQWM_UkpW$x~1z@*2Ul+~_(eC-Duv17v9MoL|ASW9R3Uytuuw9x(g_yNpn+-rZmpll{p|X z4!WDcl)YYMFkC?y&Eo%s?f~|yb5$LEE=tB$ z_>2PBjN<1{t-!b$FbeKR!7px)^k+7k>6b?6AAI^J-+bolj;9u0m4NrLwz>e`^>#7B zU%u^M{`lU_w?6sv$}s*Vh1@L3{hI|TLw$DR>9hYkA0jz<4~2wh^h;U#cB_=RK;g9{ zkqeVhw95t`fP#b96)c1GpfWMi zv)D;;S>)BzBs9~S?B+7ae=pLzny^=w;6V^vWZ<(_(nNM)#soytL-o?8%IoHHwlnv; zh)J-~;~su3DkWHc{-{>md49rK(io-t;T-wFjkxGW{HQoE5H&0 z38D6=W1w2V>VaMHNtyjR$-qNFtAz}TB8C83iu5a#TI^xvzQX`a(0#Z$XwP2p{a_F^v5 zu;^A;KS0NHg4Qg<18E&E2yX~s&*VyC-x<>0JE#put)VqF#3K}# zoSUI0Yn}76-F8cz<$y)ii{B6?7nns3EW+xzUd+i)s2b=>NVU&1#=clyi|q_Z>w?tt zPMGD6Mi+uE))3nH2Z~5cHQG2B)k1DSZ5`EN3Sk$%NQ6`ENqERB7>o_l!xuFY`wWtz zRn!%Q&c~79`S3a78kcx>)t+Pb&ZqLq9Jbc3cDeyT7X{+yF!pdl5)12AA*G>+T%xUf zm_lybJEx3nCb;|BNW?#Az=q*FEAP> z9%crA7N{ALPgWpPzPeH%aWLj=Zc>gzl+G1MRw>7<-iaWr4c4EU#>8275+5z!EWme= z2oIq{%nOx+(dL+y1-;^4vU)xD0Ft7W6ch=uw`vt= z5^%jF0fZ!wQn;vR$wRC+;XW!8 ziH0~%S5*BVh`mUmuW4NFNhnc3soFuq&sGu=MKEm2G(g`t)%HKNwwD0%OP9at&VwKQ z+Gp*8S$>3IZI8OPDgYPP0_t#H9>9!C0ip^&Dx~6h#Yu&X+zq(4QkDkqR zBWmbmdpVksq7i7;xO*VGT&Qqlw1x?Vl8-toJ~>+; z61$)4NJSu9=Zp_va-j@yJKsRHyB83BV|2jQ=4GTJRRU@!N-?BX*KfBf0*|V;DgYPPF3S49{g&t9 zUwrS+e*B63&Hr9Ro(*862A_-fxIdC#q|iy>b8L%(I!V9-ODlQj*SIc{KmwfoToS9_ z{rhFd^4B1EWyQe-A(pVZUmqc)b|V(ZBzN)~lGR$%=^>$LI5cms(~_4RrC>o+M0`G5 z&7K;Vg>72+o2fAQ=kt02t!@mOId3FV|Iu+@fFo;ioN9&ByA>U)Q%RkZ>*RMZ5 z1*@66v{JJBfJ%U;|Fzk45>}dlXN|3gaT#{ZCJAb<(Cpx`I&jf zE8cm4yALO9j2Sdrnm}5I(@e`>(X60Nt?H0HeaaB?&x=^z0rf0_3nF77Jf7wdolg)- zTPM%)z7tdTO1Hih=2kFt4WdqPB;v+Rq_vlPjs!|-?zO%^+#|64J4l2=mNb`B1;!yC z3+j8TrEzfGouywQDG{(#6q~t5HX9ShTXPS%8zLDGlF|;h9Yo8N2?47iF7pB`4lgRX zjqBZ&iQ-y|%|H5DO3&DIrU1V(PwgdA@INkj{~O-$<4-;oEr7-3tnCro)+m4nZx;jo z0|375U;Ot=Zo2JBpT5~_zDQMWq)#qG#T0J-M9^BKu#_Nq9apHA$^sBDyPr+Ty7Lmb zgtOB@CJ46zt@5SBjqB|a06iDHh9Jt5lC5Gk9}|}D1zwj~{CbA9rK^C~-Azl9=9t&j)@qOMSBQycm#+>J2xS&E0Gb5@BQRf&8MV$NK zNQtH~z##S=LoCPKJ7T1v2oaeef${!n!kf=es3t&JS#K~X*xB&fUms0)1EIKauQ0uC zLC=^sTY{cpP|vwft_B4dq3p&|yf%@wYeWWB_dyq9D3K_W;_Z<#=*C4n0}(MWghC*qvR^BnAVof0Rh~4z?JREl zg1>&}>tFK`hj`2P;sR|oG9SThRRA8i$wR#7O2A+Hrhhv=`y)R6xtqQHuP&uLb0`>S zsR1clS&EOQ*3XABOS}yK@v~lY9SIJ%@96~uvBSOXxMlDCNs)T!j<$^u- zftmDNdC`cMZ=I1pj1v3?6U0OZJWJsa>4TdI^pdnkwYlxCtA5|1^pM2C5V_hq`axua z&^VP|PsywC{4(PnpNq`%;r{awQzizgVrwmKy*t@Y4HaM_rHVyZEPpnTgAv&XMY<)= z5X>cUCi+E`fH^LhUb&+N8himk=Q%X)D-i)s*D6n)D?Y4%XCt@h_<2N{4+DAu8v4FUkMR z#*jSv;vrG`lLpSBtZw%2w|JefGT&o%!ECu}{$3g-i~sDp0sH_r=rLFA^Ta;skPCs; zKW9-;P=imI7T8@L9J9?4{j2l5?7L?}OmpPQ!p?%_dzPLA-! zPgOA%@yLPAsP32VdnvTetel0?sg~%*DlUjRN|0SP-0xM@_os7IT7uP$%^%G8{<;_A z*-*(KDH7rh^AK zKUbH)BdDzkz=hjI34Z|i`~Ui9E_wRXp7Uv^PoMr9BJvCcB!~1YLg^4L05=vB6b&RR zA0cc=L|dQ$$ui9coooE%xRArn^?-QYedo#2IaaoJ$MPqsF8i`MJ2{pv)+ontqw}((xDy-@uXg)?+&UdwiapB$)?dWF&`*lSyk^o*%3<*k3brg)W?( z{Y%6m)}w4o!7By&U)xlF0%zXz>YxA04>|ORfn{42fk!}F6@cSS9^yTru=>Vt`nQ{p z{md_W&StasHw5yD5ZUAT;IMM`7gOs`F~)rG2z6%2kZqm=;>`YTMSO=uznt$rGw}Ji zWkrMsM9!M$mO$#$Zj8D6m#vSCXmAo=LMfoH800`@qq)9fuPDqvtjHGMl zTnikdy9jJPa}k#XG0*PjA#-JU4KD_i`b$O1iGs;e&z=B|A9g8 z8U$#fq5RPTmu~$Qa}7)eb!Rt^C%Z|)eJH^F^MpUV{~Yc)tPw$B2R&GFHz|=8^1eu3 zL+cpQ6X0~KSX{}0&G9tBQJ$ue!7qFl{aQp%Y6~m5B_zNV3UVxz1j;mF=3*&IWvx%R zBRB}8%IBD`;=(^NE~aZC+;`4(q2gkpiftB#sve5UuSn7FJF5D_ z_3WK@{^nPGV9nb+wN(*#7~84<9B&V1{rh|G|AY^gzw`h5@jI@%`l`P&48s@ClUzj$ z1PE({R(tl-X9o9z5zPlUSu0LS2y>Yf0z88 zhC9R)G0E}MDqq9>(1Jx69~A_z0g=}vAv23L)tx>%5)fk?MLR5On`pENBEhXfEHh&# z2|7tHjd>`*n-8~m#XaY6*qW2YC`hsfl9dAAPYJzZ(x78ur@FiM)a%&OqV^bh0qPX% zo1dvJMAgSJwBuC)H#?~UAFnfB+~%YI^~xgmyz`50N;M#lJxXhP zFSnHhxNPzeulvux`_F#j%B!!t>9fXR^JN0L(c|MySh2z%kl1V#F1lA7$V z5vrs0tpT%VNE?9X3&;X9^9Hid9;werpJmu02kkD6o$qGrxeRfjWHJ)~pe>(pj@jYV zjD{qohY+Ku`b~$?oGeQo(7Px_c1^VOT84i)HXt$q^7Hwpf4&8&Z(%W~@ns~0O#g+o z?;i}yJi8HmOxyiGo_E~SlyI%f9f4ieC|ExK_}gnBCgjkhR@sOSucTbdn{JR3ziHn^u7@MxxgSpvs zG(iL>w8;m^uz5~_+|MuRO$@V3_W|P#%&M%)@Kp(nv@H=f)v&jo10T%vff|IcNA2 zSxBLl^rO-zOrb9&TnO~LQ?O7W%6{Nl&1GP2gdwy4ca*LilIZ?^i9S)lQy{ovlB`i4 z(#LomMwoOZQB3e5qZC@#k@tF55-D#;YV&7+3Tg@ElY52xi!Lum$cW0M zNE9;N*%nHmMt%#Qe-n_?6g398_S-3xVk&o?3~5DrtemhH&$7O=)&gODcdwYzOY572 zTq;e)G#^zevRx3jCcSopuy~UdDr#`S&j=kscVmzb;|HH14TJlS;(0Z142o^cp6?_g z8(P&XrEH#2hT*xjZZ5y%vL~In=FffQeZ%uUY(DdIFMY7Hc5UzBwkiP8E=u@6`2#+< z{P{2a<|ki%#pPcy48zB@iW5Lsty(io7#CR(m?RE_mP|v2;4L71!rIKCZh|PsbPJY3 z0w!<>&t^fJ4}TtNIh1b~`d!2w%kr~}eDs>`g*5(j*aFGQErA+%7+g}KfSrTcUyRQa zI^}iqD(2b)h~e~k<`~i(fIl?)Tz2kVkv^NO%LVM5tu20!7Cu6NDk3{z9#d9!GLn-E z5qUQkYiFYW06U+H(q6N?iy9dwZc|6ImEGvF}=qXEo;#;CEcILsPw0%jQEx z$}{&*o!VS;=`Ck&`;@P`?{z=&ujl2iJ@)(B-a~DjN}XOv~C zUrBR{G#(0KA~sn#W8ZiOdd@9;bYrN$U?t$Gj1^g}%Q$7{R4RbriT{(a4p zkgaClkJ?=XP_H-$>6P`kWPE`ITS$v`8(yY>KtLN7{-2Jh&3Hu>Qa4|N9?Ke!w$6_M`Xq_Wz=)JcYS3=!>I| zOiE|P0>>?3AReCl@bh4FGFpN)DM;LkXNQt7=H)%Jo&D{;<7^Efe$T#sTJbskY3^Un zh(}9T(sv|}4dDvNBrvxuN^)PcAO_|HJo#Fg7m;JQ9m3zS_7@1sjsT-V!bT;4D1=+$ zd7Kh`ci59CNr`!t+z-2lqbPhIOGV2W`U&yKh|4HTav;%zT`mI_<7cAWC9=?!rp^af z2;P2J@#b?|%&H5QQb&oz6Xyt0UWzmaLsrn(g`~XZedNk#3jt1oUe5#21qc=0EMzE5 zN0z9z@w#G_6v%wfjFf0Iw@yMZ2FpL-(Ibv(z+rQNaT_Y!nunPGyTyKObh#n+IMTC3 z>Hz)wgwA0|1JZXzV|{xP9`nofo?9PIA^?;>SvJ0OA%Ls&0LV@r}O4j;up_3F9B*iDD z$*sSVK9`AlejOej>AK=3|8muw%$O~I3fE+1x$m+B%vlqQdJ(3FrNs?<-OKDs+;2#3 z8P;p3{L2v=5OdX}!`*$%iPyj}QD{&RSVWO+XBnds@z&NQw=XJR;Wo zVEJIWN=Oc+qE{Q0)z~}a96%Likjn(}0V3stODWeq{)0dK+*4lo*UrA-{XXre{ox-0 z2XDI2dAzoFQ(GtW!gG*;Z8?1s^6&riYi_^#`kP-=hT%(8-5xUm*(VWf>);Zw%))}4&kb7!Q%4O#fNYAyfa7}4K1N!Ff~^%S@-reSq1;pgKd4GP~+yBO+ZB!?=sCen z!x!@(y5CRy{PzQm{&qh&lMwe#rTgR*!n|hFM5s%jBlm#BJBKUndkg6g5-orn)X(0y^^6OWs~dVB*mnVagVTn%+k1F*Zg6}@YR3yAAHp5OD_4_ zrIhDs!vOQ2<^y+e1&sqkYqGQ@_Ptwr=nuQ6wY6(F2?%f>H4sAH56B#Xm#lnAhi~@( zFH#L_`j-ls=#DkDn5kridaOTE=;IKUMJ_y(t$GT+tQY`6ymH@u`h1=Pxj^4C>)$KO z;W&E0`G$v0!J`2vtl3wF0WuvdfXJ>VOJVE>YFcB?6A6}-gI?bOrg-4^nWl#052-)C zX0a4*WqR%j-g^hBU}d^opWxm);pO)n;B2jNkf(jKH379Z_8a?qZ8;Zg8EN4@8j9uK zPYO@Ab{PsNYV$+olQI8^E5ZzPGk^m1brwWafJl_L=KPHI#AadbrKr`EkZszZnw3NK zRJ(niO<+#TjFDWwEc6=LxCjB7!*031XsP>iL^gj?P_vtbwH@dpabYmZe0Kpy0EzE^;v|Lw=`x#QI7 zOa8i)@&!=2BwOO1E8m27hP6F5oQFMyQ-V1?ERXOoJ3%3$iOIi1-lG)-!1D+!*!zY= zczmyf03}?zI3P@eZ+5Q>xiA)oku3W}2%Un+E#w3XX2Hlqk_QWrLgj2OsshE34gT%^ z$RrRshB5p9kzndHb|B_?7(;j%61*Tya@-{y+z$WpcTEu&gx@n_k~UWQ$b!Y5BMgk^ z)miEipLH}K?TKM$eLb-bBJ?m@j6f(YBEXvtkMN3j9^icKsbL30p_liSh}X#>eZu*~&i+VyiD{0Bh>*EYVjGolrl!@(Inq!_lctr) zsnBqNWD??Rp?^^Wpl`fl4|guq`WV65JkBF%Sy<~gc3>%Kkv_UMkEy2+aU5fAaYeO z)wnB&%K5YV7g3Jb1SvZe`6*MP76xs)zOrft99U{-M#+L6vU z7rNnwQ`-O?!HDOBzH_22v46$y$%Ue;Ed1OdC<*_&@vDKHW#b@|b=ATQ`3%#_@9QJ3 zR5@WZ!R@Y~YPYcIE^)=!`k$3eqKD162i$*sUd7jfISs@#2Hy%)r~oh(b%w8Y!%JhV z;+&A)AAyL>0Nw!ApKfSBtec~sfAuf@_PICxn@_=mv{e~+i1t{E0=O8!J9+S&SmXN%+C?7K%gAOt~% z{&RTXP!cq|v%rf(6ltz({wRFJ{&ts3Mm%JB9s1{UR6%BjyE0_AaY2Dl;Bu&64*$%r z?T#Z8`;f*G30RIp&?OzjZfPU->cOmd!?`WaOx?NM!?t42@~4yc4E`-8h-lN?1wR$d z*^>BlcZgVZ!XAB~O)yCRy&y5(Syd5neR2kvk&?u{#XQ*_QC(W7KoAyZBX$rmE=4_e zzA8{>OM`1s0Lp+`m*@5I1cGt z;{9#>Al^q@S@r^leO`+yu7t=3v^qSi9gVkKdDE@;J@vEy&f71$_WJhL z-}(t$pgk51+;^$13P8N>d+;ew`7HdEzxwx|vbWj)8bJOWfIT2tMM;omh}kWjA{|~X zOKY6Ma3}#kXGquu0EG=L{TkN*l8{1T3+F*da0P&+<k7x|jLA}ouFdmAz(M*xzG}TSP5`W*0yV_Y(-lA;SI!(>xjbP6c9Xa4x1MBn)I#`}GoWe7#Y zks{-aY=$nF2irV#PJ7NG4no;f3)=*s1*J$wi&~r)entruWb2pB-C)Wq37h@8jvx$0 zpWkzcjMFFJl_2D`|kaXAH0yopU?KS?X>aX?!bGoU99!5-}-I;{OX~M zpDhI+FM?AUde4?y7JLhcUg5FSJdE7$4}*8-I4f}x?f8V+ec`k|r0M;L5w#xay5AQA2m>*9)~$I!=qkMHzv zNa>0MqbJZhxv~tsI8T?1G*Ik2=$Qf;g}`uQW>0L|Lqeq(36jr-DF%ZrGLb7mxLmSA z$rQzExeio#_dYjANAb+iWk%GkR#}`C8BLAQNr`i+0#zG^0Vjt+KX@zUDbVru+urYE z{_dZszVQJv3Fh;Ebql2SSWy7vBHj}K`1XJLvnQ^)=Ejd7H{<7s$TitoREN^weqV;4 zEqvh(i>!bw#n}a?gvncA5h>M<*w=DYr zM8A2^dO1_O4x#Lvs+Piuvzg&^#56{9Lt^~9b(@fek`77trP~2QxRqo_Cpx7=bWYZO zkuJD6M~l?7Nue7!M?47AfyI9m+RUz&L$JKq4BbSDS-3!Xcui}W#Ks~`MQojsh*C*8 zqJoo^KPP!}4rQs(5yd#H4YO$_1;E}Ahkr(0v`PO|Q6GPi5JaVza$sX&h@=`O&Eiv| z#4|CDCN!xuN+?-g^>UQ>8(n}gZ7r2m*gA{*iX+T$+`%?;7DLe>N_whbpu6sDBTU;+ z*0}FHjW?FajMUiE+*h@A(%;@*|IoMr=t5*}1+G&uWwIk7_88VB0#K=eQOOwNIqZCk z9^3ELE=3k78Pj94{P&R=7g}Ntn=SJ&h?j-tGe-9e5UwpRv&={gbC2Xb2qf1);u6fY z*9n+4Tmk$J>k4GTqK65Vt^~BXM}v$-FByv5GVkr3O6T}0A-g_{q>pSPl7bcA;4=a4U@iWRchf%R}2OS0GY`W@Q9+ zaHb4{im<{N2TrSF5jMy}V(1UP_lt*qg6U|vQ83l?o)@#Rq2&ZWj_M_TLWeTrU^N-x z#4R3<3=^WTqGjU>jtRg;=$@v2+h=KkW+ec;hrzGT#!m`?YCm9jp~$J86fH!bkNI>< z+{-QL6rqq)0QVGKHfaH85*(G6jzqYPe z45szhnecpv>Wh6>ins#Ixe_cBB4t9~JcpsgItuPCR9NApIB(r`VhT4ENIrYBLK<2& z{vS*USQUiS9t#S9TRYuEp+!e@&ME51Bq3;jQo;V*Gy@fxeA_* zG->U_aQyqUMoIYcgN$>XEDO(s#;%j##sjy86_G=`ypkSboHi%|dA=wcAT3Vo?oa#b})!HYlj0SDn1Tge%yOl_- zY}U5B8$HP^v5D^sxcOStJ0{fl9KP&DmiA>=n z=*n1a34Sl}*`zP~dbXy%f2nAXhJc8u3C#ZYI7ld{B7QA*K_ZZrGQ=2p-XP5nGYMve zpjwEhz}BF3<*in6rKdK*{$w`5a|V*dz}|E+R)S$iB&|3e;&GFNXMy{_cT?={X3t|^gv{H5 zu2dvcf@9^Oxhu?c=aA$a@Nl7Z&N)!d5rxnW0nrf=*r8_DPN4vzWg*FO%a)U*5IVKF z(6Ice&;Y4C?Xc`0$M3$$bUoOdsX;M$4c!XXow@;OT>e@)Zh6t)oKXs|1egSUUO=wX zf`gGhmx*^IeCAAmr2rEewx*3x824m9;(ce*AkSo1BH{t)!pxOMTi2kHj8GZZEGZ0W3n{1buE=?TQA4IKS8Dx);)EtrLjd-Jyb!krvJJ z4lwehhJbf8Mhtl{G+{EXLjehcf^pLkk7JT|m*9GHH(8z_o;I4#cew9_6)*sn?e-uD#%d63ur zy?^`BXr-Pj&D;KZ` zNSDwZB>bj+NDx9#zWkE<>4Je4@!StX3h~Hy4rim&kw;~K$%=p^fHbUPk6e&AjEGho z!=PhoyicQ{8pq&C`yZin&dGvNPlyl!-RF|L&F0!e_VOW*Wt2gVf6vtrsmRdkb+TL< zXLh0F5GVFQeR4xd;n;v6{3W8dD?8rrf`!W?L)BDlXbCFfpypV{0vv1`&K|a|IH_?h zG$}}C8BR{9Q&;S`H#hcNOesrV84~1Ox+Up_h0JnW^jV{BL=lFmit}EmU@;HCA~BM7 z%bDeGDGZBk5>5MH-y(9H2S6l7lG59{ORw2{R2bpUpn9TrBsFG|Wl8%!Hf2wQR0ctv zd;j(}U9i>)Y&Mw{Z)8JO;Hy#VLeL`^SfhZP5AIhI2xk+dB=_ZzU7|Hw#X|E;X%(?C zb|sAG9QR3-OqNAeQupbbQchRnJO_%`R2FU<7A8}BerHVz0@rT{r7O@8+Zz)sVk0Tv zc8(4OG7b|@jSC6(RoFj3dtX)n*(ZxDXU zP@fb4mf?yCb0{o$sQ68jrRHb=;5o(lFwvLl2R=dwxfRT7masr-4W_a8u`CQOcOmfn zaH1l@_#^ZuSo+}IpP!Hrq_MI7p-V43~r7&V{sL;6Lgs}Rz8e`@D z;a)3tAWw6w3H|%zPLSEodE8C<)U9;I!CajHCosh;aY4G^Q47tplDSYPjuumHI#eCs z8;W+p(c;;eEHTz*6Obs zt_CN|DMCqSU5J{WL4>=7g_2bJ0qQw6Z2dPITCL)HfK?zjLkL{wC74p*1-LkxQid+* zrfn#Gn=$hLbGvW1_PZ%Jp2<+M0xwRAEfPt2X!SSiTk&VWApao*I2FHX?&IAsbdZSA z$Y)J_&hz{;Vt^Vml`<-X{;a3{PWN2S5kke#L#zSREl=vj8J~szsu*0Ly{{?&axw3p zI62@ie&x4byV*bS*+VHGuN9ZJ#JZ=|yqh2cR^*4)Oor!y`X&$&BT0kq(`bjHzk*J7=XbS?N!?=L^?6VSJXR{xe zo}ZoXYY1*vXsGe;tXSp`5QgTuIBT2NPF6IN7Jv=j21TLyQQBr0csL!T#IjJiT)|WGR%Wm=F*m0s-lk;@L^j zpdPF5I#*JL0AM4!AhlA7D@X`fQgG%8U0~S0_wY>{F9o}w(rGWxMy%_WX$SyU;=C-b zItrG#B)-w8G}(74L@0Q>P|}FSPl{s`KrD`(<606MW1S_<7nN`3yC;u=p>tVy4Q44r zjmXyme)l;uLCgLRB@_VG5AgG4hdWT{e$hS_W+-fxXi~Tz=$fGtyxsOHf16>+vmh!Z zFs04LNB7k<^~LmJW;TXw6cB~zL`d;7ghWC<=LJa-uxA%4?!uw5Ri{4RYHNnJZ~^eq z0r1!s@DJ7AR~3K(5xP~!;AfJ+D%T9Q;sfjji2Y<7hqWkJKi%XI6miqhf^)?$u%T2o8VFQgQ$z9?`HDa zf{dB&=ZtjzOGrcxQymI0RmH(pQO!zozr02qITg7aX~0y-*`i|^UN!5HiDCwHE1JZ~ zh@saAmrOO~(Eu?%OOCteocgJ5nM5*aIYxKoJL`3zqb=rLnlX06|vD+y?saJVybM z7VDBD6dDgW;n(O~+*bvQVn{i`j6 zNeUnN8U~*-L=DTZq za4S4N^#cGE>Bt)5*#iu&PeN$)44BKZwq7$p&G)UxrA$^ZOOc54N4WQ#HE;7*O<3+3 znUQrkvLdn>dNx1`&Q9W!2x}#3!SzdLgd<1V&k^n^?q`PeWfx;>KpVP{aITRRCt^tO zI3l2w$=5nI)`QRulAn(*ix1Yxu<}3`(--`#u#{I#q#jP@BT>wIX2vV$LEn}R)a?)(a<3pnUh!v`bOn*yPcA|4t?%sQ?9x~Esn5kCmxi&pJUo< ztsW%`^zmbCZ5M9uOA5e63;+N0Z+`F8_1E3_aeF5=Us8(PK2PQjOrOdb>D;O$JT)ei zz|BU$LkGzK2i$*2SAkp1SQ6Y6-4&2f%3yp`=wv88a|4EcI`AOp!ISd|xUk^Cmp+3e z2pHI`E9xs z5FAb=B0}e^qyP*Bnkvps71cuRI9{eSrt&f+|qNmYAs34zIZT0I|lKF|tQesmURq z9?oX3xm%(2zKJT@6xsaxd~vSD6YI=dU6kY&QzXdSD1c|^^XE@3Nf6?B8-_?aY&QK~u7sL` z)oeY0*yB|Jg}5R`bW9+aXGq;PNhf5&F)r9vrNG+zk^*osO}^np|Gqr#rrSPX@5J!A zQsilM?$EzytfIx3tO+$?=WwnGkwqw4;sW^LlAtj@bh%hew!UCL=@)iuj1L6jun_Zw zyT1{URZI#{quSZ_2Qbc??Ax2t!b=tQkWKQvyw7VO0vWSi~1Bp2_?kq-)Og(9Tlkv z!Eb9hCPignRm27e!X;6so}edCAay@A3l|A=QLHPJZf*!8=GnS4gs#?@ zoRXza0n4+iuS-|fe4iVvPp*Y47q+LG26utbKF^5Ey;xM`%L*uvl-*FOs^vx5n7e~K zhMd2n@W5(IT2j4tzccfNQuO3T8sl4-Hz;$;au5U;vMqZ|R^eb|^D8 z++*nx50Y%)Ry1lH=CoSbSI-d+c*q+M`(|;qWelivnJ#q4@-*Sum4`HAL^u+B2krM~ zs?}`iIP{nb7P+F4=1X@J1{W$koe=jV@n=EGLh`RBWkLj=xQBTGoXF{B69Ns%%29%e zz3@*9VebA?4dKo8&Vo6|f;+=Jp&SA-&11eiHl3Ta#9H%j7orm5$|w=+b0&r2ne;7ynW|-S#!stFuH^uCxsPj;zQeS@c{Akt z=KNf?|!+Pf!5yEEHc=+aMx*cKZD|j*VH^xt4t<{B^-CJsB6> z4bg2^zKgAU8BGyZ%TQ?1LbSGrF_agkAok)wh&X?`i<~IiB*H$^o}yCZd?XwGNae|M zlvq|lK2mlqPovE7ClrQCy4MkbSb5-7s4R)wv{Y!-*!~CwQCS8&oke_xSsr+{%!4dC z<(WavjiVJ1OEfeN1p@@oNwC~@4w&t~9V)vPy9iLX3GSr@ zZ!Up`<5o$l5|y+Pw4Difd?JRF)CEWa+QtZpP^DaMmm!fv9oT0l>Sg7Iiika`gP8C_ z%FS-1OXd&f(@eC0SrNAuQt1%_>=!E+?vyU}dF8tEh)5}iOPbeO;SNxyO?DnfLPkm^ zj%w@+TBRaOi!qZweVz~p;v(@dU>K&)pgm9A0J(mVF2~sh^rf5|l2I+`dgFqlzttrX~ z6hu-Rk{0W{^hw7vWUdAngB;?5vnICy1v8a+N4QeqBM+?{A`P+o&}}US>1TqcOXhQ* z&Lt=7aemQD8e)#YTF(w9QotLP=xEt2(`6Ww4(pm@TSVhrqLEvj}O zBo7Twk((Y+-h+K~t7j8^bIsh+zw$f&)U}v1A|U`gr#uiA2kX1LwVec}Ae04Hx~d(x z3isFN41%n~P9ODP){?^V7m(nUgm<&~rL~#eJRaFWC4lq8eUjGFeW(b54J713Qi2%v zjeAXjVj19a{e;B@HHe}^x_7R8*wSGfRTC9wr-r#Uh)VZaYa)Lk`k7rTssV=&u(j5R zg-0`iq^=+NdRAl74<*Lzp=Sji%TDXu1-bj{;}I`|qNL1!VkK++NvEPhL746rYZz&L zbEL#Hg<_WXJS}*yLYElykv}03UtREpLhoeY7SB1?DU(ujDqsp!=2FOY2WZ#Mb8L&< zDv4@P9gP!iTk->>m`jp-lg}=nM^>Gjdzj&D=Nwu7)J7O8$;bxo_nveq@|C!&5&asR zvprA!8&=3(3hCu|qVi&=46>ZE&-JX(dEP|;E`$PTdVOtpbSnT4))q>@Klr;pb;adZ zUiE3v@~K*IX-NmUO5gbIYc>I}>-Pr|>`ekzGH2-jE@KdNfDqtWZ~*XH1Clb7d5Df3 zI19_!M#F~}2i8!fP!t$ZFpnotZA{xz*dR$`pkX2M=t zpe5hE%bKqrDR<~|eJhB5J4Y)xym zgP)K&`5l_p1G>m+$gxSf7N0MF9t7C4bl!{cO7y=eAm*O(>~@G}gy#ke*UV^oH+B|f_tK^;vyG}sa0+Y>42ZMM^%aiYp7W8)iiD-U2#chf zA)y=O!sG~`?mFs-$~5=uay~pSO6td0`h6nQv7=28#WV?qq3=b`t=OV?f+?Phu6Q{I zAU*M`uz#rbzNP?V=m!As4PW~mdw1ONjOT9l$IsO!H?{frj>r)Iu8-fzP&I@S(~V|} zKKz+*=+)EB0xqCH0Wv0npmZVIl43EW!-SUWVBc@-7vdpspT6~-4`0i|E~!QIp^@|? zgTw=sCest-w6KIA%g{(wpiMw4DG~r_+z4ff-^uW_BOU&MxIX}A>_dWJiF6Q=KuCeh zWIwc|iFC}&f>vVgsN^soJE7x}=NBQg=zq>6L`_28v*$^=4#%002zNJKU@zvRE`)8l zwV05{{nqJ-qc1tH9|h#OZNs^(dTxF~x+C{DiEHRt@jPX*!oyxOI-s^LelH>oNg#5M zhzYBTsQ(ZJgJKWuS)P05es3+g8xZqFi#KvSXjHFDI&Joc1AxwpM_|d7VT3{YF8eSh z1+P%R*4T&SE(rSb7UVwZsgZ4dXM_0}v(L1-1HughBm^t*9`Zn(6C~ZzCRvio4Gjm@ zC?JWCkrZV6t43{!%^)5Lk@t}&*GlIMY>lYADP$1|;%krue~>7Fsfzpc1=?K{4X98^ z1qM?@#l|-`agrq6U(EZ#GoeWJWsMX3m=drm1Uv1~ssPBveCC>~A6Gv1d7uBJll!N? z08*Z*JsYV%y!_|Z05$u(ftjn{EPS%A6bQDtB&)df1Jl8Qbb9B)KMMh(Nt>pBEPcL= zw1UFY+J)zfvGaLP`nVlE(9rU82w;Cpx}sol%3k%a#Wk~anOXBr;29EhO@V0dd!G~w zi`V_!=<_=a-J)y_9+F6Sv=Avt>qWGtDf*#gmt`(MS=5E!_gd! zet}h-1Kh1Mm}xco1=0b*@$Lvb68@OifMeiKj+=4o&?xf5FvJB}lh>$;FM$vu&O2z` zKU|7-k{##22ElC?2rh^$hTNj=elp?CES)3|68-1`+1w0q40r`aKHq{s9Q^s$@Z0;k zB&5ZsSOWR!Q5sQ}mvck3is^&79}DNZb(a#WDF!+cXF%t=h-cAMyWrjiIBH3evbE*4 zk>;d`1mDEoW14iNz1J>q77X@4csQX&nq-s-D#&S>sjzrfPe*9Pcpw>TJl15{gH;h= zd$cM57iw8g769_k|IUwHbIGMwel}|PxLR=nFo8{|R}zF~@FNe{oc`4z-jsmEUr&le z4r_A-V&}p4jADQvEN<tiPYBtZDElU3vkzA?tJ?nkju zEPg*-BfB{k1jPp2e@HTwc#L&+B{AQ+S6wte^1?NPNMJ+1xf9@IDUdh^nfoxn%GOFe zD@<-Pa?et!=ANKCq(qEAADKcy!7Xg#8B07rt`ysT9Zfl(lZ$SUe%(P#(Qj#=rgH){ z_7nFA5h%Kqa;jkNN1|R1I3(pAh`Jiw4^5>r^OLfXNrxVFA>s2(8WjL}h}Q&weACzen-kYP?#UlLVDo}f^t79o5-6fhm zNSlBV0n5iN%keS!5D$XIqtM{7|5-V3_BsV*#{)cpkspZW-|IEHO~_Q6tAsKXBw@K& z9W2O1zz!nPVlAdQ4q%TRwgZnA4xxP>ko46Sn6ku-ZuWjfvLq^;{FK+1WJUM0x21LJ zNWji}oMS44{Jc$_BMX`Yi@TYyR7QM`059M|!**k@Ggh0HG0`g^l!QTg4S-3TGqlOC zXbl)OAsVd<$DDnx`92d9vg)7bycL8{AXG013p)!bhxeIu3Cr+H&f{Q;C=nr_FLa-= zqVGA6-YAF+b{dv6-y^Reb2Uir%r3RXo+V;LBu5kZlFQvvU4S91^o^kjOe^da_9!%M zfiq#2p`k4C%h1uBd6MJhT)UrK;E_FiZ&LsjS!4k9?0s|-YU1+nvCRJUL4rpiOSeLu z`%j{7%<#u~^Fn87K1&ftZCX<&eHIN)0Ey1?ymT!M(hZd@>roV-6qRvUC;$&8^z(a< zdF9~IrT{#c@b~vV=mS4aKJwXL@U;EClYhRH@>I9VNgCROC7ILky5-4YJ-dfEg{x_? zjwIOTZU$|VEzg|Q{Jyil#}FDM50W3yp~fBl0F{&>?oI7C$KyxZ)0CK~r9)$k1CTOpy(-#vK^~50buO~Qe>te~R>KhR&TZC4tFzD>jI!K2DS#m&L@0oD=>};K3@v={&eM^Y6IVKIJUMHp_s6c!IQ(gj z=RWVP*2Mcq1cITZg9b|H;j=BCnLbaww6BjN!}v((!W`cxdO#&Ix0c3URUlA|BA(tC z5Z^CsepaS^qKJ@BPh?~$QJX#8*RCRvAIG)rv`3QyAQ$nT?BNvt_BVd#4VRq0^z%z8 z&(nsH2d4X|2oGleW3tld14QYE6}4GfD}sQNsR+XCVda473{Xu% zEn!zkcCrW(0$=1Ppp|3&c0w88sZU9GqNVD}gJKbCr}opyb#|da(8EBjU(Ot-MM(ES z+YuTP3feG)QUW9^UE;foy!|}DU{*HLftiZzc(Iz&4?4PsYdI+spV0Su#gT9 z6=zZjV4#n!m+1s^*A|OHUQ(Yk8YE&+dW-p;Yoy$TWI~xPa`Tgn=8B@moKvB2 z;w(au%$yV|Y_%qTa_P@0n~gA6G6?ieF6`vKD#elTgSO@nAxQo7vOI+F>$|CS1**m$?ca_LB}g!k3;z zCZ#&gwZ2{WC&<$U3}=>eWYf)D=etc|2XTw!C;-Cu&3@79=Y2|KMq`Oo&IQo~4-I6v zpqk~W-3`I9`hk=nQD387iy9$pT|u+&`TDTGX}5WDmc&oUX_cL*WH-tgAG1}>P&c=d zC1C%Ch#3dnMY)axQ6&?WDPiB@@Fh%qI5iwi>i5E8jm0trDw^ekZw5z{bX<~Wz{4DA z-bO}PBqf2qdn%o*OV3a~DjThKUW&_h1xnF{zuXC|3>BkNmUtC8yXJz7*p?}GccUya zIh9C2l+z8LxVz3|Xa7*>A@1QtmFDDvvpJk5cp;`-x?9uyvX5#RvbfheFUD#$%w2#I z)!NWdkr4Wh5{g;c2~l$;nNWIqCaEwnA(xjcCo0G1p}Jn=?n{o{$(8nc-_K%h*EqK6 zQpxVWTrylCQ5lm63(qA!Qw`9GxZE*wXl)PD9?c5CF^%u*{`@~FkH6_@A3T=vg=Li6 zGg-#jsz{b-ivyjOyoVg|q295k7k+kLEIkFqLYWHSaptV2PHQ*kK=;F_;TYVOW6a&J zpY_*#h$TTK6qMPbu6E$;STdT%;T9B-LIhJEhzRhSh`Dl0G#z%D4xoIEe5m{P^ZX#j znnSth+s&joUTfq|rZR`HG=~EB&3aO!Au`pu-(|vL2#pp7Spf@r;6nH6r+3NJ>CumM;~lT!e`Y} z`6ky8iF-r_s1$f|Alt(X#iIh6^D?mICroNsOpm7$Y+j9lCO0rY@S~L zv9?4Xb1n-O{>f{?^O$o!_?q|4DqaZ0ABWY_zlio|Q2-uFo09_Ilb`<;w~xd4`6A^* zU?G3507$@BE;#u`pg(98UivCm-s53J3lE6D9TFyFOMzhTyKkR@mt{o}7Ct*8UeJBn zPap~T76OXC>&z&2tBczF3`Zy=TP*guO4kD?M57Pxho@pBN#o`k7bYJ0S+v(yHRnQYOes; zG>{vvAzdjXT3+n_*W zKQ;69o3g+?wdNOdm5%>^xY0% zvO_%a1!&p&1DZ1Vxsm{c%K_FWdx*zPOaP%kKTLBPVOmsUOcKv1TDtCM*Ek#ic%E+{ z!KzeH)DE1I`i=ge7v^?vJ+A;!h?WjTLZS9S|kB# z>Vk?2r$2MFh$YrrThDXPIjXh0_1I_kMJHjoKpFDkLBZk*jU02|IAVxIkZduJnXtp7c{@n7so%dV&|=BG6h~7R zwj-$6s4KA~hL)mUoJxw7I<~m|{!EG~_G0U!-Q8p1nHhb_XjNSxLgJyQBf26xw>Vq! z_lrI7bTxWyied4wwOwR;G$;V_P_O;Vzx!jG>n^|fIpa9KKtvwT>|sa`qzh{Mj?U>o zD{;ViqK*O&0VFvO1Am<@k4qxFZGoZi6xM^-tNryZS>&*H`i9^k6d#C!?KzgVs z5Se@3_yTIgIEFc8H%Km-%W-?iPT~ak0Z9ulS@U&HLfK>IV`;p$0q<-6>b!bhkh?L=vInp`5J)ikf*~yS2Y^_;)fWnL85j6r{zPC+&COYLD4hun_ z4|YR`^5X6CDM$?CN8DOU${7i&6jJW*O%^UKuBwXjlNxlNO8xepFXHp-j_VSdd}j(?cXPSJP0uEArumX@KO=a z;#cjO8CC}1iIa9+5B^@dKjD4Pn}AqD@^BofK`2I?7sZk&myH0ls5?L#!d;e0;Mep_ zEfjU`2Rjh@-qB;%DE9h1i-j|)C)YwXl*b-euj!!TWXK!_*&`Mr3t;m-B8v!;To1$1 zCz!P_k+$4x9Uv51SNc*ZQYN9|H5-7seL%VYKuW=?EZ~u^06dWJ_x1m%=YAfZ@wAV5 z`hd-spvp597<1J&W|1PPE+_NxmVN8m53cNwZgU_BIs2bmTFH&zzITJwC~!s+@qlF| zx&*}`y3qUCmW07fsH5+bTDEf*vW3V#OBx@RmSfHr;K~9Li<;AA2eW6>n`6AR>J}V{ z^p7OB?6c00sV5bp;7kfqenfMevy(e*t%s!K@O>UEyq{vnADrhsLB3S_a{dHK`^g1- zN&71af^6svrQ+v1`S5UsFc_3AYQUjZT|D{qcC#JvQxBPD{Sx)_63iKFs~Bp_jhk|55#%~reV z<4e~Et#1=B%w@p+z9H(6kholi*WEQ5!U{Y4hwGWMFVbJl{R4<2N>t#o0tJK{h|eI9 zo^L*%sW6U6=ebmKRniU8?S~@=O=4ObDynvM?g*ZkBoHSdTNCHhO#D6z{{R{cZKwQD#`HJF)`NmVC|8r0LX*9 z?)&MsTkp_sdC|YSS;oCDP?b-VhD-U-`omPZZ@RPV%}?zoXunXls25fl56W!ymp}~c z;{g+w_#Oo~7&@4gfkHxBe(;i|9$N46GhWD}Szh&2zBj{%d`NtpDMA6dyuM2ljw>M) z*-CLAoQ;i#(gIaThbH^w)9fZ!`dm_e_&xWz&N0u$EFZU?5ek3;i#iP%nc;0c;S;BM zhlrP>BAU$wAz#n6UsAsJ9Uh4b4j$Nc<4g*4GG!7JoZ}qg2wZ@r&hhS)9i|XvdRBg) z7W_0T?mcMO*5;5h1*vF+lI0AL8A}43|A_-Aufpd7apr@Bk$O@mY9A1hh z9{)a1;ilm=UFhb6zz~%JEaK!zF!O?6NjUTQrUH?`DqlCEg{~l{HTHEN0wLi7$q_fI zk>5W*a|_->;$!$YsYG(V=dL)34Yt{*1yqE4RE|Hx5QE?q+o^v~IL?9xvVluyxyt2{9U;4$Q?l8RCY+SGSdNu_Op zB#>zFl{h3A)1Toq7mSHimMviV-ZN|3(Slv;I$4mJ*dqmyO?qHb3_1x{lKSeYG1Gxa z|934*NSB9Mu7%+F4^p2TwnMsRjs61Zz{Ju5_DWzHuQ~Lcs=T;t(9|d1FDohhkt|e6 z2MPPK;2I=il7~R$6vD=^JAN>74-2e%WfC|HuxCANOFnqApRiqxWvvxdcfjM2|I zNtPJ*w{s0jQXaTYHs?ivqe*e*sC6H13W4GE2F@4nxHHFudc|I4?ta40?%Os6t?1IF z)Ayc4H9-x4Ps=lt*E$#VI#S}mVD?#Ueh z3Lms=dHRFqq`eM<_2M#C5*KkOx`mcXbkhG1gn-J#J!kV0=1=fFivwj#+m(czXWJf} zW6*c9$Ta)LlQryF49B>p3;3ZY6Ve7?WA7*8qoix)!b150r}DwSnbw$uHCB65?Wlyv zlH`+>jj+BYh<#&NNWAyLPmh!-&aTz4OdspYO^G$|%4qZ}Cu=`}HH(5Xd@WmSF61oZ zTV}R%Pw;-s;wA#<5X3s}nY=f1=0V@!?kw&f62kjbDBJR2bvgjybObt6TSozUNfnu7PCogN#!{f{VV9tqJHL`?iPspP2Inf+0qJ3e$&zel9cy~se18!*?nl<1!~Q*sHPj|r8a zqCkX&mbb@`)3VP(QNw@lbtl+w3bvH+1?eZPOb?Mm2uPv^NP>etb`R_0UQPX{Qk3uE z$#>AX2<*2Px=GK0^LeP8sC2Ys)XusW?Zt)$H55TGl)m5L^KVJElnRTO9@rOoGj@e- zo&}YYfJm?;rSm!Ft+@N8RmCuhC;x(qhb21Mvc|qrdq_A}#=?=ET(I z>%$NT1dwW-CsLvSk^ChcObhFYLfh^yVpcN|2D$)hBGg%bh+eqBP7ex&aTz)>$~gvV z{o%o9pCtlOcOEwPn<7fR5}u}zbGJ!yW6*l!!Nb(2jfewss8IjhWT=CeAJ%|t-S3WA z-(7x2&ZnO@SB|jo$c)5@C)Ah=-tcvYmL*vEUbxAWziL8{xdmir-WI5iSUQS?{)nZw z_3cptkpX~~_8!^xXU?}C0g(0xlAs&}7(^Vx4aUFv;l42DGzoSmdx|45YV)%hLc!tl zLjl{;eUSXWlAb51Iti6?>*@9r`HiJ=-4&%>`ErF{qtEOF6-*))TzBUhAdn>@Lo7Vw zNu(CxL^1DTnyVy%NueH)zuPgvi^$&v!fj$k$}n_Ag3o1Z(n~kn+_27qz^VZ@%c=

O{mUb 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

ia?N8W1^&qfp<+t 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 z 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°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

u;_pT73<@OaYqC#8)$5 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 Y^W^BgDfX?;0Jz^fMU6M5uPs9U9|^{o+W-In literal 0 HcmV?d00001 diff --git a/applications/launchpad/backend/package.json b/applications/launchpad/backend/package.json new file mode 100644 index 0000000000..0e8324338f --- /dev/null +++ b/applications/launchpad/backend/package.json @@ -0,0 +1,7 @@ +{ + "name": "tari_launchpad", + "version": "1.0.0", + "scripts": { + "tauri": "node ../../tooling/cli.js/bin/tauri" + } +} \ No newline at end of file diff --git a/applications/launchpad/backend/src/build.rs b/applications/launchpad/backend/src/build.rs new file mode 100644 index 0000000000..d860e1e6a7 --- /dev/null +++ b/applications/launchpad/backend/src/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/applications/launchpad/backend/src/commands/create_workspace.rs b/applications/launchpad/backend/src/commands/create_workspace.rs new file mode 100644 index 0000000000..95b6a6cac3 --- /dev/null +++ b/applications/launchpad/backend/src/commands/create_workspace.rs @@ -0,0 +1,67 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +use std::path::Path; + +use log::*; +use tauri::{ + api::path::{resolve_path, BaseDirectory}, + AppHandle, + Config, + Manager, + PackageInfo, + Wry, +}; + +use crate::{commands::AppState, docker::create_workspace_folders, error::LauncherError}; + +/// Create a new workspace environment by creating a folder hierarchy (if required) at the `root_folder`, and copying +/// the default config files into it. +#[tauri::command] +pub fn create_new_workspace(app: AppHandle, root_path: String) -> Result<(), String> { + let config = app.config(); + let package_info = &app.state::().package_info; + let _ = create_workspace_folders(root_path.as_str()).map_err(|e| e.chained_message()); + let path = Path::new(&root_path); + copy_config_file(path, config.as_ref(), package_info, "log4rs.yml").map_err(|e| e.chained_message())?; + copy_config_file(path, config.as_ref(), package_info, "config.toml").map_err(|e| e.chained_message())?; + info!("Workspace at {} complete!", root_path); + Ok(()) +} + +pub fn copy_config_file>( + root_path: S, + config: &Config, + package_info: &PackageInfo, + file: &str, +) -> Result<(), LauncherError> { + let path = Path::new("assets").join(file); + let config_path = resolve_path(config, package_info, &path, Some(BaseDirectory::Resource))?; + let cfg = std::fs::read_to_string(&config_path).expect("The config assets were not bundled with the App"); + info!("Log Configuration file ({}) loaded", file); + debug!("{}", cfg); + let dest = root_path.as_ref().join("config").join(file); + std::fs::write(&dest, &cfg)?; + info!("Log configuration file ({}) saved to workspace", file); + Ok(()) +} diff --git a/applications/launchpad/backend/src/commands/events.rs b/applications/launchpad/backend/src/commands/events.rs new file mode 100644 index 0000000000..2ab0097251 --- /dev/null +++ b/applications/launchpad/backend/src/commands/events.rs @@ -0,0 +1,65 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +use futures::StreamExt; +use log::*; +use tauri::{AppHandle, Manager, Wry}; + +use crate::commands::AppState; + +/// Subscribe to system-level docker events, such as container creation, volume, network events etc. +/// This function does not actually return a result, but async commands have a [bug](https://github.com/tauri-apps/tauri/issues/2533) +/// which is avoided by returning a `Result`. +/// +/// A side effect of this command is that events are emitted to the `tari://docker-system-event` channel. Front-ends +/// can listen to this event stream to read in the event messages. +#[tauri::command] +pub async fn events(app: AppHandle) -> Result<(), ()> { + info!("Setting up event stream"); + let state = app.state::(); + let docker = state.docker.read().await; + let mut stream = docker.events().await; + let app_clone = app.clone(); + tauri::async_runtime::spawn(async move { + while let Some(event_result) = stream.next().await { + match event_result { + Ok(event) => { + debug!("Event received: {:?}", event); + if let Err(err) = app_clone.emit_all(event_name(), event) { + warn!("Could not emit event to front-end, {:?}", err); + } + }, + Err(err) => { + warn!("Error in event stream: {:#?}", err) + }, + }; + } + info!("Event stream has closed."); + }); + Ok(()) +} + +/// Extract data from the event object so we know which channel to emit the payload to +pub fn event_name() -> &'static str { + "tari://docker-system-event" +} diff --git a/applications/launchpad/backend/src/commands/launch_docker.rs b/applications/launchpad/backend/src/commands/launch_docker.rs new file mode 100644 index 0000000000..3f9a70be0e --- /dev/null +++ b/applications/launchpad/backend/src/commands/launch_docker.rs @@ -0,0 +1,192 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +use std::{convert::TryFrom, path::PathBuf, time::Duration}; + +use log::*; +use serde::{Deserialize, Serialize}; +use tauri::{AppHandle, Manager, Wry}; + +use crate::{ + commands::AppState, + docker::{ + helpers::create_password, + BaseNodeConfig, + DockerWrapperError, + LaunchpadConfig, + MmProxyConfig, + Sha3MinerConfig, + TariNetwork, + TariWorkspace, + WalletConfig, + XmRigConfig, + DEFAULT_MINING_ADDRESS, + }, + error::LauncherError, +}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct WorkspaceLaunchOptions { + root_folder: String, + tari_network: String, + has_base_node: bool, + has_wallet: bool, + has_sha3_miner: bool, + has_mm_proxy: bool, + has_xmrig: bool, + wait_for_tor: Option, + wallet_password: Option, + sha3_mining_threads: Option, + monerod_url: Option, + monero_username: Option, + monero_password: Option, + monero_use_auth: Option, + monero_mining_address: Option, + docker_registry: Option, + docker_tag: Option, +} + +impl TryFrom for LaunchpadConfig { + type Error = LauncherError; + + fn try_from(options: WorkspaceLaunchOptions) -> Result { + let tari_network = TariNetwork::try_from(options.tari_network.to_lowercase().as_str())?; + let tor_control_password = create_password(16); + let tor_delay = Duration::from_secs(options.wait_for_tor.unwrap_or(10)); + let base_node = match options.has_base_node { + false => None, + true => Some(BaseNodeConfig { delay: tor_delay }), + }; + let wallet = match options.has_wallet { + false => None, + true => { + if options.wallet_password.is_none() { + return Err(LauncherError::ConfigVariableRequired( + "wallet".to_string(), + "wallet_password".to_string(), + )); + } + Some(WalletConfig { + delay: tor_delay, + password: options.wallet_password.unwrap(), + }) + }, + }; + let sha3_miner = match options.has_sha3_miner { + false => None, + true => Some(Sha3MinerConfig { + delay: Duration::from_secs(options.wait_for_tor.unwrap_or(15)), + num_mining_threads: options.sha3_mining_threads.unwrap_or(1), + }), + }; + let mm_proxy = match options.has_mm_proxy { + false => None, + true => { + let mut config = MmProxyConfig { + delay: Duration::from_secs(options.wait_for_tor.unwrap_or(15)), + ..Default::default() + }; + if let Some(val) = options.monerod_url { + config.monerod_url = val; + } + if let Some(val) = options.monero_username { + config.monero_username = val; + } + if let Some(val) = options.monero_password { + config.monero_password = val; + } + if let Some(val) = options.monero_use_auth { + config.monero_use_auth = val; + } + Some(config) + }, + }; + let xmrig = match options.has_xmrig { + false => None, + true => { + let monero_mining_address = options + .monero_mining_address + .unwrap_or_else(|| DEFAULT_MINING_ADDRESS.to_string()); + Some(XmRigConfig { + delay: Duration::from_secs(options.wait_for_tor.unwrap_or(20)), + monero_mining_address, + }) + }, + }; + Ok(LaunchpadConfig { + data_directory: PathBuf::from(options.root_folder), + tari_network, + tor_control_password, + base_node, + wallet, + sha3_miner, + mm_proxy, + xmrig, + registry: options.docker_registry, + tag: options.docker_tag, + }) + } +} + +/// This is an example of how we might launch a recipe. It's not currently used in the front-end, but essentially it +/// launches all the containers in a choreographed fashion to stand up the entire mining infra. +#[tauri::command] +pub async fn launch_docker(app: AppHandle, name: String, config: WorkspaceLaunchOptions) -> Result<(), String> { + launch_docker_impl(app, name, config) + .await + .map_err(|e| e.chained_message()) +} + +async fn launch_docker_impl( + app: AppHandle, + name: String, + config: WorkspaceLaunchOptions, +) -> Result<(), LauncherError> { + debug!("Starting docker launch sequence"); + let state = app.state::(); + let docker = state.docker_handle().await; + let should_create_workspace = { + let wrapper = state.workspaces.read().await; + !wrapper.workspace_exists(name.as_str()) + }; // drop read-only lock + { + let mut wrapper = state.workspaces.write().await; + // Now that we have a write lock, we can create a new workspace if required + if should_create_workspace { + let config = LaunchpadConfig::try_from(config)?; + info!( + "Docker workspace does not exist. Creating one with config, {:#?}", + config + ); + wrapper.create_workspace(name.as_str(), config)?; + } + info!("Launching Tari workspace, {}", name); + let workspace: &mut TariWorkspace = wrapper + .get_workspace_mut(name.as_str()) + .ok_or(DockerWrapperError::UnexpectedError)?; + // Pipe docker container logs to Tauri using namespaced events + workspace.start_recipe(docker.clone()).await?; + } // Drop write lock + info!("Tari system, {} has launched", name); + Ok(()) +} diff --git a/applications/installer/src/config/base_node.rs b/applications/launchpad/backend/src/commands/mod.rs similarity index 66% rename from applications/installer/src/config/base_node.rs rename to applications/launchpad/backend/src/commands/mod.rs index d3ab644bcc..1810a984a5 100644 --- a/applications/installer/src/config/base_node.rs +++ b/applications/launchpad/backend/src/commands/mod.rs @@ -19,27 +19,26 @@ // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// -use crate::config::common::{InstallLocation, SourceLocation}; - -pub struct BaseNodeOptions { - // Where do we get the base node code from? - source: SourceLocation, - // Where do the base node and related files live? - install_location: InstallLocation, - // Tor setup - tor_options: TorOptions, -} - -pub enum TorLocation { - // Use the globally instaled system version of tor - System, - // Run Tor from a docker image - Docker, - // Install a new version of Tor in the base node executable folder - Local, -} +/// ! This module defines all the Tauri commands we expose to the front-end. +/// ! These are generally constructed as wrappers around the lower-level methods in the `docker` module. +/// ! All the commands follow roughly the same pattern: +/// ! - handle input parameters +/// ! - call the the underlying function +/// ! - Map results to JSON and errors to String. +mod create_workspace; +mod events; +mod launch_docker; +mod pull_images; +mod service; +mod shutdown; +mod state; -pub struct TorOptions { - location: TorLocation, -} +pub use create_workspace::create_new_workspace; +pub use events::events; +pub use launch_docker::launch_docker; +pub use pull_images::{image_list, pull_images}; +pub use service::{create_default_workspace, start_service, stop_service}; +pub use shutdown::shutdown; +pub use state::AppState; diff --git a/applications/launchpad/backend/src/commands/pull_images.rs b/applications/launchpad/backend/src/commands/pull_images.rs new file mode 100644 index 0000000000..8a7bc990a3 --- /dev/null +++ b/applications/launchpad/backend/src/commands/pull_images.rs @@ -0,0 +1,99 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +use bollard::models::CreateImageInfo; +use futures::{future::join_all, stream::StreamExt, TryFutureExt}; +use serde::Serialize; +use tauri::{AppHandle, Manager, Wry}; + +use crate::{ + commands::AppState, + docker::{ImageType, TariWorkspace}, + error::LauncherError, +}; + +#[derive(Debug, Clone, Serialize)] +pub struct Payload { + image: String, + name: String, + info: CreateImageInfo, +} + +pub static DEFAULT_IMAGES: [ImageType; 8] = [ + ImageType::BaseNode, + ImageType::Wallet, + ImageType::Sha3Miner, + ImageType::Tor, + ImageType::MmProxy, + ImageType::XmRig, + ImageType::Monerod, + ImageType::Frontail, +]; + +/// Provide a list of image names in the Tari "ecosystem" +#[tauri::command] +pub fn image_list() -> Vec { + DEFAULT_IMAGES + .iter() + .map(|&image| image.image_name().to_string()) + .collect() +} + +/// Pulls all the images concurrently using the docker API. +#[tauri::command] +pub async fn pull_images(app: AppHandle) -> Result<(), String> { + let futures = DEFAULT_IMAGES + .iter() + .map(|image| pull_image(*image, app.clone()).map_err(|e| e.chained_message())); + let results: Vec> = join_all(futures).await; + let errors = results + .into_iter() + .filter(|r| r.is_err()) + .map(|e| e.unwrap_err()) + .collect::>(); + if !errors.is_empty() { + return Err(errors.join("\n")); + } + Ok(()) +} + +async fn pull_image(image: ImageType, app: AppHandle) -> Result<(), LauncherError> { + let state = app.state::().clone(); + let docker = state.docker.read().await; + let image_name = TariWorkspace::fully_qualified_image(image, None, None); + let mut stream = docker.pull_image(image_name.clone()).await; + while let Some(update) = stream.next().await { + match update { + Ok(progress) => { + let payload = Payload { + image: image_name.clone(), + name: image.image_name().to_string(), + info: progress, + }; + app.emit_all("image-pull-progress", payload)? + }, + Err(err) => return Err(err.into()), + }; + } + Ok(()) +} diff --git a/applications/launchpad/backend/src/commands/service.rs b/applications/launchpad/backend/src/commands/service.rs new file mode 100644 index 0000000000..2292235e6c --- /dev/null +++ b/applications/launchpad/backend/src/commands/service.rs @@ -0,0 +1,348 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +use std::{convert::TryFrom, path::PathBuf, time::Duration}; + +use bollard::Docker; +use futures::StreamExt; +use log::*; +use serde::{Deserialize, Serialize}; +use tauri::{AppHandle, Manager, State, Wry}; + +use crate::{ + commands::{create_workspace::copy_config_file, AppState}, + docker::{ + create_workspace_folders, + helpers::create_password, + BaseNodeConfig, + ContainerId, + DockerWrapperError, + ImageType, + LaunchpadConfig, + MmProxyConfig, + Sha3MinerConfig, + TariNetwork, + TariWorkspace, + WalletConfig, + XmRigConfig, + DEFAULT_MINING_ADDRESS, + DEFAULT_MONEROD_URL, + }, + error::LauncherError, +}; + +/// "Global" settings from the launcher front-end +#[derive(Clone, Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ServiceSettings { + pub tari_network: String, + pub root_folder: String, + pub wallet_password: String, + pub monero_mining_address: Option, + pub num_mining_threads: i64, + pub docker_registry: Option, + pub docker_tag: Option, + pub monerod_url: Option, + pub monero_username: Option, + pub monero_password: Option, + pub monero_use_auth: Option, +} + +impl TryFrom for LaunchpadConfig { + type Error = LauncherError; + + fn try_from(settings: ServiceSettings) -> Result { + let tari_network = TariNetwork::try_from(settings.tari_network.to_lowercase().as_str())?; + let tor_control_password = create_password(16); + // Since most services are launched manually, we set the delay value to zero. + let zero_delay = Duration::from_secs(0); + let base_node = BaseNodeConfig { delay: zero_delay }; + let wallet = WalletConfig { + delay: zero_delay, + password: settings.wallet_password, + }; + let sha3_miner = Sha3MinerConfig { + delay: zero_delay, + num_mining_threads: settings.num_mining_threads as usize, + }; + let mut mm_proxy = MmProxyConfig { + delay: zero_delay, + monerod_url: settings.monerod_url.unwrap_or_else(|| DEFAULT_MONEROD_URL.to_string()), + ..Default::default() + }; + if let Some(val) = settings.monero_use_auth { + mm_proxy.monero_use_auth = val; + mm_proxy.monero_username = settings.monero_username.unwrap_or_else(|| "".to_string()); + mm_proxy.monero_password = settings.monero_password.unwrap_or_else(|| "".to_string()); + } + let monero_mining_address = settings + .monero_mining_address + .unwrap_or_else(|| DEFAULT_MINING_ADDRESS.to_string()); + let xmrig = XmRigConfig { + delay: Duration::from_secs(15), // Needs to wait for mm_proxy to be ready + monero_mining_address, + }; + Ok(LaunchpadConfig { + data_directory: PathBuf::from(settings.root_folder), + tari_network, + tor_control_password, + base_node: Some(base_node), + wallet: Some(wallet), + sha3_miner: Some(sha3_miner), + mm_proxy: Some(mm_proxy), + xmrig: Some(xmrig), + registry: settings.docker_registry, + tag: settings.docker_tag, + }) + } +} + +/// [`start_service`] returns some useful info that the front-end can use to control the docker environment. +/// In particular, the log and stats event names tell the front end which channels events will be broadcast on. +#[derive(Clone, Debug, Serialize)] +#[serde(rename_all(serialize = "camelCase"))] +pub struct StartServiceResult { + /// The name of the service that was created + name: String, + /// The docker id of the container. Some commands need an id rather than the name. + id: String, + /// What action was taken. Currently not used. + action: String, + /// The name of the event stream to subscribe to for log events. These are the _docker_ logs and not the base node + /// _et. al._ logs. Those are saved to disk and accessible using the usual means, or with frontail. + log_events_name: String, + /// The name of the event stream to subscribe to for resource events (CPU, memory etc). + stats_events_name: String, +} + +/// Starts the specified service +/// +/// The workspace will be created if this is the first call to `start_service`. Otherwise, the settings from the first +/// call will be used and `settings` will be ignored. +/// +/// Starting a service also: +/// - creates a new workspace, if required +/// - creates a network for the network, if required +/// - creates new volumes, if required +/// - creates new node identities, if required +/// - launches the container +/// - creates the log stream +/// - creates the resource stats stream +#[tauri::command] +pub async fn start_service( + app: AppHandle, + service_name: String, + settings: ServiceSettings, +) -> Result { + start_service_impl(app, service_name, settings).await.map_err(|e| { + let error = e.chained_message(); + error!("{}", error); + error + }) +} + +/// Stops the specified service +/// +/// Stops the container, if it is running. action is " +/// Then, deletes the container. +/// Returns the container id +#[tauri::command] +pub async fn stop_service(state: State<'_, AppState>, service_name: String) -> Result<(), String> { + stop_service_impl(state, service_name).await.map_err(|e| e.to_string()) +} + +/// The "default" workspace is one that is used in the manual front-end configuration (each container is started and +/// stopped manually) +#[tauri::command] +pub async fn create_default_workspace(app: AppHandle, settings: ServiceSettings) -> Result { + create_default_workspace_impl(app, settings).await.map_err(|e| { + let error = e.chained_message(); + error!("{}", error); + error + }) +} + +async fn create_default_workspace_impl(app: AppHandle, settings: ServiceSettings) -> Result { + let config = LaunchpadConfig::try_from(settings)?; + let state = app.state::(); + let app_config = app.config(); + let should_create_workspace = { + let wrapper = state.workspaces.read().await; + !wrapper.workspace_exists("default") + }; // drop read-only lock + if should_create_workspace { + let package_info = &state.package_info; + let _ = create_workspace_folders(&config.data_directory).map_err(|e| e.chained_message()); + copy_config_file(&config.data_directory, app_config.as_ref(), package_info, "log4rs.yml")?; + copy_config_file(&config.data_directory, app_config.as_ref(), package_info, "config.toml")?; + // Only get a write-lock if we need one + let mut wrapper = state.workspaces.write().await; + wrapper.create_workspace("default", config)?; + } + Ok(should_create_workspace) +} + +async fn start_service_impl( + app: AppHandle, + service_name: String, + settings: ServiceSettings, +) -> Result { + let state = app.state::(); + let docker = state.docker_handle().await; + let _ = create_default_workspace_impl(app.clone(), settings).await?; + let mut wrapper = state.workspaces.write().await; + debug!("Starting {} service", service_name); + // We've just checked this, so it should never fail: + let workspace: &mut TariWorkspace = wrapper + .get_workspace_mut("default") + .ok_or(DockerWrapperError::UnexpectedError)?; + // Check the identity requirements for the service + let ids = workspace.create_or_load_identities()?; + for id in ids.values() { + debug!("Identity loaded: {}", id); + } + // Check network requirements for the service + if !workspace.network_exists(&docker).await? { + workspace.create_network(&docker).await?; + } + // Launch the container + let registry = workspace.config().registry.clone(); + let tag = workspace.config().tag.clone(); + let image = ImageType::try_from(service_name.as_str())?; + let container_name = workspace.start_service(image, registry, tag, docker.clone()).await?; + let state = workspace + .container_mut(container_name.as_str()) + .ok_or(DockerWrapperError::UnexpectedError)?; + let id = state.id().to_string(); + let stats_events_name = stats_event_name(state.id()); + let log_events_name = log_event_name(state.name()); + // Set up event streams + container_logs( + app.clone(), + log_events_name.as_str(), + container_name.as_str(), + docker.clone(), + workspace, + ); + container_stats( + app.clone(), + stats_events_name.as_str(), + container_name.as_str(), + docker.clone(), + workspace, + ); + // Collect data for the return object + let result = StartServiceResult { + name: service_name, + id, + action: "unimplemented".to_string(), + log_events_name, + stats_events_name, + }; + info!("Tari service {} has launched", image.container_name()); + Ok(result) +} + +pub fn log_event_name(container_name: &str) -> String { + format!("tari://docker_log_{}", container_name) +} + +pub fn stats_event_name(container_id: &ContainerId) -> String { + format!("tari://docker_stats_{}", container_id.as_str()) +} + +fn container_logs( + app: AppHandle, + event_name: &str, + container_name: &str, + docker: Docker, + workspace: &mut TariWorkspace, +) { + info!("Setting up log events for {}", container_name); + if let Some(mut stream) = workspace.logs(container_name, docker) { + let event_name = event_name.to_string(); + tauri::async_runtime::spawn(async move { + while let Some(message) = stream.next().await { + trace!("log event: {:?}", message); + let emit_result = match message { + Ok(payload) => app.emit_all(event_name.as_str(), payload), + Err(err) => app.emit_all(format!("{}_error", event_name).as_str(), err.chained_message()), + }; + if let Err(err) = emit_result { + warn!("Error emitting event: {}", err.to_string()); + } + } + info!("Log stream for {} has closed.", event_name); + }); + info!("Container log events configured."); + } else { + info!( + "Log events could not be configured: {} is not a running container", + container_name + ); + } +} + +fn container_stats( + app: AppHandle, + event_name: &str, + container_name: &str, + docker: Docker, + workspace: &mut TariWorkspace, +) { + info!("Setting up Resource stats events for {}", container_name); + if let Some(mut stream) = workspace.resource_stats(container_name, docker) { + let event_name = event_name.to_string(); + tauri::async_runtime::spawn(async move { + while let Some(message) = stream.next().await { + trace!("log event: {:?}", message); + let emit_result = match message { + Ok(payload) => app.emit_all(event_name.as_str(), payload), + Err(err) => app.emit_all(format!("{}_error", event_name).as_str(), err.chained_message()), + }; + if let Err(err) = emit_result { + warn!("Error emitting event: {}", err.to_string()); + } + } + info!("Resource stats stream for {} has closed.", event_name); + }); + info!("Resource stats events configured."); + } else { + info!( + "Resource stats events could not be configured: {} is not a running container", + container_name + ); + } +} + +async fn stop_service_impl(state: State<'_, AppState>, service_name: String) -> Result<(), LauncherError> { + let docker = state.docker_handle().await; + let mut wrapper = state.workspaces.write().await; + debug!("Stopping {} service", service_name); + // We've just checked this, so it should never fail: + let workspace: &mut TariWorkspace = wrapper + .get_workspace_mut("default") + .ok_or_else(|| DockerWrapperError::WorkspaceDoesNotExist("default".into()))?; + workspace.stop_container(service_name.as_str(), true, &docker).await; + Ok(()) +} diff --git a/applications/installer/src/config/mining.rs b/applications/launchpad/backend/src/commands/shutdown.rs similarity index 64% rename from applications/installer/src/config/mining.rs rename to applications/launchpad/backend/src/commands/shutdown.rs index f344d57c5a..d5c1031dd4 100644 --- a/applications/installer/src/config/mining.rs +++ b/applications/launchpad/backend/src/commands/shutdown.rs @@ -19,31 +19,29 @@ // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// -use crate::config::{InstallLocation, SourceLocation}; - -pub enum PoolStrategy { - Solo, - Pool, -} - -pub enum Miners { - None, - Sha3Only(PoolStrategy), - MergeMineOnly(PoolStrategy), - Both { - sha3: PoolStrategy, - merge_mine: PoolStrategy, - }, -} +use log::*; +use tauri::State; -pub struct MiningOptions { - source: SourceLocation, - install_location: InstallLocation, - miners: Miners, -} +use crate::commands::AppState; -pub struct XmRigOptions { - source: SourceLocation, - install_location: InstallLocation, +/// Gracefully shutdown all containers and delete them. Blockchain volumes are preserved. +#[tauri::command] +// Return a Result until https://github.com/tauri-apps/tauri/issues/2533 is fixed +pub async fn shutdown(state: State<'_, AppState>) -> Result { + info!("Shutting down"); + let docker = state.docker_handle().await; + let mut workspaces = state.workspaces.write().await; + let msg = match workspaces.shutdown(&docker).await { + Ok(()) => { + info!("Docker has shut down"); + "Docker has shut down" + }, + Err(e) => { + warn!("Docker may not have shut down gracefully. {}", e.chained_message()); + "Docker was not cleanly shut down. See logs for details" + }, + }; + Ok(msg.to_string()) } diff --git a/applications/launchpad/backend/src/commands/state.rs b/applications/launchpad/backend/src/commands/state.rs new file mode 100644 index 0000000000..fbd1a39c4d --- /dev/null +++ b/applications/launchpad/backend/src/commands/state.rs @@ -0,0 +1,56 @@ +use bollard::Docker; +use tauri::PackageInfo; +use tokio::sync::RwLock as AsyncLock; + +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the +// following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY +// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +use crate::docker::{DockerWrapper, Workspaces}; + +/// The state variables that are managed by Tauri. Since the whole app is asynchronous, we need to store +/// * the [`Workspaces`] object. This tracks global config settings, which containers we are running, and what their +/// status is. +/// * A handle to the docker API, via the [`DockerWrapper`] struct. The convenience function [`docker_handle`] gives you +/// a cheap, thread-safe clone to the underlying docker API. +/// * Package info, because Tauri doesn't give us an easy way to get at that in command callbacks for some reason. +/// +/// Things that are mutable (docker, workspaces) are behind an [`AsyncLock`] for thread safety. +pub struct AppState { + pub docker: AsyncLock, + pub workspaces: AsyncLock, + pub package_info: PackageInfo, +} + +impl AppState { + pub fn new(docker: DockerWrapper, workspaces: Workspaces, package_info: PackageInfo) -> Self { + Self { + docker: AsyncLock::new(docker), + workspaces: AsyncLock::new(workspaces), + package_info, + } + } + + pub async fn docker_handle(&self) -> Docker { + let wrapper = self.docker.read().await; + wrapper.handle() + } +} diff --git a/applications/installer/src/config/common.rs b/applications/launchpad/backend/src/docker/error.rs similarity index 52% rename from applications/installer/src/config/common.rs rename to applications/launchpad/backend/src/docker/error.rs index 8c26809355..07f4b8a864 100644 --- a/applications/installer/src/config/common.rs +++ b/applications/launchpad/backend/src/docker/error.rs @@ -19,62 +19,44 @@ // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// -use std::path::PathBuf; - -#[cfg(target_os = "windows")] -const TARI_FOLDER: &str = "tari"; -#[cfg(any(target_os = "macos", target_os = "unix"))] -const TARI_FOLDER: &str = ".tari"; - -pub enum SourceLocation { - SourceCode(SourceCodeOptions), - Docker(DockerOptions), -} - -pub struct SourceCodeOptions {} - -pub struct DockerOptions {} - -pub struct InstallLocation { - config_folder: PathBuf, - executable_folder: PathBuf, - data_folder: PathBuf, +use std::error::Error; + +use tari_app_utilities::common::exit_codes::ExitCodes; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum DockerWrapperError { + #[error("Something went wrong with the Docker API")] + DockerError(#[from] bollard::errors::Error), + #[error("Something went wrong on your filesystem")] + FileSystemError(#[from] std::io::Error), + #[error("The requested container id, {0} is not being managed by the wrapper")] + ContainerNotFound(String), + #[error("The designated workspace, {0}, already exists")] + WorkspaceAlreadyExists(String), + #[error("The designated workspace, {0}, does not exist")] + WorkspaceDoesNotExist(String), + #[error("The network is not supported")] + UnsupportedNetwork, + #[error("It should not be possible to be in this error state")] + UnexpectedError, + #[error("Could not create an identity file")] + IdentityError(#[from] ExitCodes), + #[error("The specified image type is not supported")] + InvalidImageType, } -impl Default for InstallLocation { - fn default() -> Self { - let mut home = dirs::home_dir().expect("No default home folder"); - let mut bin: PathBuf; - let data = dirs::data_dir().expect("No default data folder"); - #[cfg(target_os = "windows")] - { - home.push(TARI_FOLDER); - bin = PathBuf::from("C:\\Program Files"); - } - #[cfg(any(target_os = "macos", target_os = "unix"))] - { - bin = dirs::home_dir().expect("No default home folder"); - bin.push("bin"); - home.push(TARI_FOLDER); - } - - Self { - config_folder: home, - executable_folder: bin, - data_folder: data, +impl DockerWrapperError { + /// Combine all error messages down the chain into one string. + pub fn chained_message(&self) -> String { + let mut messages = vec![self.to_string()]; + let mut this = self as &dyn Error; + while let Some(next) = this.source() { + messages.push(next.to_string()); + this = next; } + messages.join(" caused by:\n") } } - -pub enum TariConfig { - Default, - Supplied(PathBuf), - Inline(String), -} - -pub enum Network { - Stibbons, - Weatherwax, - Mainnet, -} diff --git a/applications/launchpad/backend/src/docker/filesystem.rs b/applications/launchpad/backend/src/docker/filesystem.rs new file mode 100644 index 0000000000..d1a02d29ba --- /dev/null +++ b/applications/launchpad/backend/src/docker/filesystem.rs @@ -0,0 +1,72 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +//! This module does setup and clean up of the host's file system. +//! +//! The docker environment places some files in a volume, e.g. the blockchain db, but other files need to be accessible +//! from the host system, such as logs, and identity files. These all live in a 'workspace' folder, with several sub- +//! directories for the individual components living under it. + +use std::{fs, path::Path}; + +use log::*; +use strum::IntoEnumIterator; + +use crate::docker::{DockerWrapperError, ImageType}; + +/// Creates the folders required for a new workspace off of the given root folder. +/// IF the folders already exist, then nothing happens. +/// On Linux, the permissions are also set to allow world access +pub fn create_workspace_folders>(root: P) -> Result<(), DockerWrapperError> { + if !root.as_ref().exists() { + info!("Creating new workspace at {}", root.as_ref().to_str().unwrap_or("???")); + fs::create_dir(&root)? + } + let make_subfolder = |folder: &str| -> Result<(), std::io::Error> { + let p = root.as_ref().join(folder); + let p_str = p.as_path().to_str().unwrap_or("???"); + match p.exists() { + true => { + debug!("{} already exists", p_str); + Ok(()) + }, + false => { + info!("Creating new data folder, {}", p_str); + fs::create_dir(&p)?; + #[cfg(any(target_os = "linux", target_os = "macos"))] + { + use std::os::unix::fs::PermissionsExt; + let mut perms = std::fs::metadata(&p)?.permissions(); + perms.set_mode(0o777); + fs::set_permissions(&p, perms)?; + } + Ok(()) + }, + } + }; + let _ = make_subfolder("config")?; + for image in ImageType::iter() { + let _ = make_subfolder(image.data_folder())?; + } + Ok(()) +} diff --git a/applications/installer/src/config/mod.rs b/applications/launchpad/backend/src/docker/helpers.rs similarity index 84% rename from applications/installer/src/config/mod.rs rename to applications/launchpad/backend/src/docker/helpers.rs index 284fb5100d..3c32bbb1e9 100644 --- a/applications/installer/src/config/mod.rs +++ b/applications/launchpad/backend/src/docker/helpers.rs @@ -19,15 +19,12 @@ // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// -mod base_node; -mod combined; -mod common; -mod mining; -mod wallet; +use rand::distributions::{Alphanumeric, Distribution}; -pub use base_node::BaseNodeOptions; -pub use combined::InstallerOptions; -pub use common::{InstallLocation, SourceLocation}; -pub use mining::{Miners, MiningOptions}; -pub use wallet::WalletOptions; +/// Create a cryptographically secure password on length `len` +pub fn create_password(len: usize) -> String { + let mut rng = rand::thread_rng(); + Alphanumeric.sample_iter(&mut rng).take(len).map(char::from).collect() +} diff --git a/applications/installer/src/config/combined.rs b/applications/launchpad/backend/src/docker/mod.rs similarity index 73% rename from applications/installer/src/config/combined.rs rename to applications/launchpad/backend/src/docker/mod.rs index c0bfb17542..a1814e2eb9 100644 --- a/applications/installer/src/config/combined.rs +++ b/applications/launchpad/backend/src/docker/mod.rs @@ -19,23 +19,29 @@ // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// -use crate::config::{ - common::{Network, TariConfig}, - BaseNodeOptions, - MiningOptions, - WalletOptions, -}; +mod error; +mod filesystem; +mod models; +mod settings; +mod workspace; +mod wrapper; -pub struct InstallerOptions { - // Selects the netowrk to run - network: Network, - // A way of getting at the tari global configuration files - tari_config: TariConfig, - // Installer options for a base node - base_node_options: Option, - // Installer options for the console wallet - wallet_options: Option, - // Installer options for mining - mining_options: Option, -} +pub mod helpers; + +pub use error::DockerWrapperError; +pub use filesystem::create_workspace_folders; +pub use models::{ContainerId, ContainerState, ContainerStatus, ImageType, LogMessage, TariNetwork}; +pub use settings::{ + BaseNodeConfig, + LaunchpadConfig, + MmProxyConfig, + Sha3MinerConfig, + WalletConfig, + XmRigConfig, + DEFAULT_MINING_ADDRESS, + DEFAULT_MONEROD_URL, +}; +pub use workspace::{TariWorkspace, Workspaces}; +pub use wrapper::DockerWrapper; diff --git a/applications/launchpad/backend/src/docker/models.rs b/applications/launchpad/backend/src/docker/models.rs new file mode 100644 index 0000000000..9a5798dfc6 --- /dev/null +++ b/applications/launchpad/backend/src/docker/models.rs @@ -0,0 +1,261 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +use std::{ + convert::TryFrom, + fmt::{Display, Formatter}, +}; + +use bollard::{container::LogOutput, models::ContainerCreateResponse}; +use serde::{Deserialize, Serialize}; +use strum_macros::EnumIter; + +use crate::docker::DockerWrapperError; + +//------------------------------------------- ContainerId ---------------------------------------------- +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct ContainerId(pub String); + +impl From for ContainerId { + fn from(s: String) -> Self { + Self(s) + } +} + +impl AsRef for ContainerId { + fn as_ref(&self) -> &str { + self.0.as_str() + } +} + +impl Display for ContainerId { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.write_str(self.0.as_str()) + } +} + +impl ContainerId { + pub fn as_str(&self) -> &str { + self.0.as_str() + } +} + +//------------------------------------------- ContainerStatus ---------------------------------------------- + +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum ContainerStatus { + Created, + Running, + Stopped, + Deleted, +} + +//------------------------------------------- ContainerState ---------------------------------------------- + +pub struct ContainerState { + name: String, + id: ContainerId, + info: ContainerCreateResponse, + status: ContainerStatus, +} + +impl ContainerState { + pub fn new(name: String, id: ContainerId, info: ContainerCreateResponse) -> Self { + Self { + name, + id, + info, + status: ContainerStatus::Created, + } + } + + pub fn running(&mut self) { + self.status = ContainerStatus::Running; + } + + pub fn set_stop(&mut self) { + self.status = ContainerStatus::Stopped; + } + + pub fn set_deleted(&mut self) { + self.status = ContainerStatus::Deleted; + } + + pub fn name(&self) -> &str { + self.name.as_str() + } + + pub fn info(&self) -> &ContainerCreateResponse { + &self.info + } + + pub fn id(&self) -> &ContainerId { + &self.id + } + + pub fn status(&self) -> ContainerStatus { + self.status + } +} + +//------------------------------------------- LogMessage ---------------------------------------------- + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct LogMessage { + pub message: String, + pub source: String, +} + +impl From for LogMessage { + fn from(log: LogOutput) -> Self { + let (source, message) = match log { + LogOutput::StdErr { message } => ("StdErr".to_string(), String::from_utf8_lossy(&message).into_owned()), + LogOutput::StdOut { message } => ("StdOut".to_string(), String::from_utf8_lossy(&message).into_owned()), + LogOutput::Console { message } => ("Console".to_string(), String::from_utf8_lossy(&message).into_owned()), + LogOutput::StdIn { message } => ("StdIn".to_string(), String::from_utf8_lossy(&message).into_owned()), + }; + Self { source, message } + } +} + +//------------------------------------------- TariNetwork ---------------------------------------------- + +/// Supported networks for the launchpad +#[derive(Serialize, Debug, Deserialize, Clone, Copy)] +pub enum TariNetwork { + Weatherwax, + Igor, + Mainnet, +} + +impl TariNetwork { + pub fn lower_case(&self) -> &'static str { + match self { + Self::Weatherwax => "weatherwax", + Self::Igor => "igor", + Self::Mainnet => "mainnet", + } + } + + pub fn upper_case(&self) -> &'static str { + match self { + Self::Weatherwax => "WEATHERWAX", + Self::Igor => "IGOR", + Self::Mainnet => "MAINNET", + } + } +} + +/// Default network is Weatherwax. This will change after mainnet launch +impl Default for TariNetwork { + fn default() -> Self { + Self::Weatherwax + } +} + +impl TryFrom<&str> for TariNetwork { + type Error = DockerWrapperError; + + fn try_from(value: &str) -> Result { + match value { + "weatherwax" => Ok(TariNetwork::Weatherwax), + "igor" => Ok(TariNetwork::Igor), + "mainnet" => Ok(TariNetwork::Mainnet), + _ => Err(DockerWrapperError::UnsupportedNetwork), + } + } +} + +//------------------------------------------- ImageType ---------------------------------------------- + +#[derive(Clone, Copy, EnumIter, PartialEq, Eq, Hash, Serialize)] +pub enum ImageType { + Tor, + BaseNode, + Wallet, + XmRig, + Sha3Miner, + MmProxy, + Monerod, + Frontail, +} + +impl ImageType { + pub fn image_name(&self) -> &str { + match self { + Self::Tor => "tor", + Self::BaseNode => "tari_base_node", + Self::Wallet => "tari_console_wallet", + Self::XmRig => "xmrig", + Self::Sha3Miner => "tari_sha3_miner", + Self::MmProxy => "tari_mm_proxy", + Self::Monerod => "monerod", + Self::Frontail => "frontail", + } + } + + pub fn container_name(&self) -> &str { + match self { + Self::Tor => "tor", + Self::BaseNode => "base_node", + Self::Wallet => "wallet", + Self::XmRig => "xmrig", + Self::Sha3Miner => "sha3_miner", + Self::MmProxy => "mm_proxy", + Self::Monerod => "monerod", + Self::Frontail => "frontail", + } + } + + pub fn data_folder(&self) -> &str { + match self { + Self::Tor => "tor", + Self::BaseNode => "base_node", + Self::Wallet => "wallet", + Self::XmRig => "xmrig", + Self::Sha3Miner => "sha3_miner", + Self::MmProxy => "mm_proxy", + Self::Monerod => "monerod", + Self::Frontail => "frontail", + } + } +} + +impl TryFrom<&str> for ImageType { + type Error = DockerWrapperError; + + fn try_from(value: &str) -> Result { + let s = value.to_lowercase(); + match s.as_str() { + "tor" => Ok(Self::Tor), + "base_node" | "base node" => Ok(Self::BaseNode), + "wallet" => Ok(Self::Wallet), + "xmrig" => Ok(Self::XmRig), + "sha3_miner" | "sha3 miner" => Ok(Self::Sha3Miner), + "mm_proxy" | "mm proxy" => Ok(Self::MmProxy), + "monerod" | "monero" => Ok(Self::Monerod), + "frontail" => Ok(Self::Frontail), + _ => Err(DockerWrapperError::InvalidImageType), + } + } +} diff --git a/applications/launchpad/backend/src/docker/settings.rs b/applications/launchpad/backend/src/docker/settings.rs new file mode 100644 index 0000000000..7b1f718121 --- /dev/null +++ b/applications/launchpad/backend/src/docker/settings.rs @@ -0,0 +1,532 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +use std::{collections::HashMap, path::PathBuf, time::Duration}; + +use bollard::models::{Mount, MountTypeEnum, PortBinding, PortMap}; +use config::ConfigError; +use serde::{Deserialize, Serialize}; +use thiserror::Error; +use tor_hash_passwd::EncryptedKey; + +use crate::docker::{models::ImageType, TariNetwork}; + +// TODO get a proper mining address for each network +pub const DEFAULT_MINING_ADDRESS: &str = + "5AJ8FwQge4UjT9Gbj4zn7yYcnpVQzzkqr636pKto59jQcu85CFsuYVeFgbhUdRpiPjUCkA4sQtWApUzCyTMmSigFG2hDo48"; + +pub const DEFAULT_MONEROD_URL: &str = "http://monero-stagenet.exan.tech:38081"; + +#[derive(Default, Debug, Serialize, Deserialize)] +pub struct BaseNodeConfig { + /// The time delay before starting the container and running the base node executable + pub delay: Duration, +} + +#[derive(Default, Debug, Serialize, Deserialize)] +pub struct WalletConfig { + /// The time delay before starting the container and running the wallet executable + pub delay: Duration, + /// The password to de/en-crypt the wallet database + pub password: String, +} + +#[derive(Default, Debug, Serialize, Deserialize)] +pub struct XmRigConfig { + /// The time delay before starting the container and running the monero miner executable + pub delay: Duration, + /// The address that will accept Monero mining rewards + pub monero_mining_address: String, +} + +#[derive(Default, Debug, Serialize, Deserialize)] +pub struct Sha3MinerConfig { + /// The time delay before starting the container and running the SHA3 CPU miner executable + pub delay: Duration, + /// The number of threads to employ for SHA3 mining + pub num_mining_threads: usize, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct MmProxyConfig { + /// The time delay before starting the container and running the proxy executable + pub delay: Duration, + /// A URL specifying the Monero daemon to connect to + pub monerod_url: String, + /// If required, the monero username for the monero daemon + pub monero_username: String, + /// If required, the password needed to access the monero deamon + pub monero_password: String, + /// If true, provide the monero username and password to the daemon. Otherwise those strings are ignored. + pub monero_use_auth: bool, +} + +impl Default for MmProxyConfig { + fn default() -> Self { + MmProxyConfig { + delay: Duration::from_secs(5), + monerod_url: DEFAULT_MONEROD_URL.to_string(), + monero_username: "".to_string(), + monero_password: "".to_string(), + monero_use_auth: false, + } + } +} + +impl MmProxyConfig { + pub fn monero_use_auth(&self) -> usize { + if self.monero_use_auth { + 1 + } else { + 0 + } + } +} + +/// Tari Launchpad configuration struct. This will generally be populated from some front-end or persistent storage +/// file and is used to generate the environment variables needed to configure and run the various docker containers. +#[derive(Default, Debug, Serialize, Deserialize)] +pub struct LaunchpadConfig { + /// The directory to use for config, id files and logs + pub data_directory: PathBuf, + /// The Tri network to use. Default = weatherwax + pub tari_network: TariNetwork, + /// The tor control password to share among containers. + pub tor_control_password: String, + /// Whether to spin up a base node or not, with the given configuration. Usually you want this. + pub base_node: Option, + /// Whether to spin up a console wallet daemon, with the given configuration. Optional. + pub wallet: Option, + /// Whether to spin up a SHA3 miner or not, with the given configuration. If you want to mine Tari natively, + /// include this. + pub sha3_miner: Option, + /// Whether to spin up a merge-mine proxy or not, with the given configuration. If included, you must also include + /// xmrig + pub mm_proxy: Option, + /// Whether to spin up a Monero miner or not, with the given configuration. If included you should also include + /// mm_proxy + pub xmrig: Option, + /// The Docker registry to use to download images. By default we use quay.io + pub registry: Option, + /// The docker tag to use. By default, we use 'latest' + pub tag: Option, +} + +impl LaunchpadConfig { + pub fn load() -> Result { + unimplemented!() + } + + /// Returns a list of environment variables that need to be set in the running container. For Tari containers, we + /// use this to override settings in the `config.yml` file that are generated on the fly here (the tor control + /// port password for example). + pub fn environment(&self, image_type: ImageType) -> Vec { + match image_type { + ImageType::BaseNode => self.base_node_environment(), + ImageType::Wallet => self.wallet_environment(), + ImageType::XmRig => self.xmrig_environment(), + ImageType::Sha3Miner => self.sha3_miner_environment(), + ImageType::MmProxy => self.mm_proxy_environment(), + ImageType::Tor => self.tor_environment(), + ImageType::Monerod => self.monerod_environment(), + ImageType::Frontail => self.common_envars(), + } + } + + /// Provides a hashmap that bollard needs to mount the volumes we want for each image type. + pub fn volumes(&self, image_type: ImageType) -> HashMap> { + match image_type { + ImageType::BaseNode => self.build_volumes(true, true), + ImageType::Wallet => self.build_volumes(true, false), + ImageType::XmRig => self.build_volumes(true, false), + ImageType::Sha3Miner => self.build_volumes(true, false), + ImageType::MmProxy => self.build_volumes(true, false), + ImageType::Tor => self.build_volumes(false, false), + ImageType::Monerod => self.build_volumes(false, false), + ImageType::Frontail => self.build_volumes(true, false), + } + } + + /// Similar to [`volumes`], provides a bollard configuration for mounting volumes. + pub fn mounts(&self, image_type: ImageType, volume_name: String) -> Vec { + match image_type { + ImageType::BaseNode => self.build_mounts(true, true, volume_name), + ImageType::Wallet => self.build_mounts(true, true, volume_name), + ImageType::XmRig => self.build_mounts(false, true, volume_name), + ImageType::Sha3Miner => self.build_mounts(false, true, volume_name), + ImageType::MmProxy => self.build_mounts(false, true, volume_name), + ImageType::Tor => self.build_mounts(false, false, volume_name), + ImageType::Monerod => self.build_mounts(false, false, volume_name), + ImageType::Frontail => self.build_mounts(false, true, volume_name), + } + } + + fn build_mounts(&self, blockchain: bool, general: bool, volume_name: String) -> Vec { + let mut mounts = Vec::with_capacity(2); + if general { + #[cfg(not(target_os = "linux"))] + let host = format!("/host_mnt{}", self.data_directory.to_string_lossy()); + #[cfg(target_os = "linux")] + let host = self.data_directory.to_string_lossy().to_string(); + let mount = Mount { + target: Some("/var/tari".to_string()), + source: Some(host), + typ: Some(MountTypeEnum::BIND), + bind_options: None, + ..Default::default() + }; + mounts.push(mount); + } + if blockchain { + let mount = Mount { + target: Some("/blockchain".to_string()), + source: Some(volume_name), + typ: Some(MountTypeEnum::VOLUME), + volume_options: None, + ..Default::default() + }; + mounts.push(mount); + } + mounts + } + + /// Returns a map of ports to expose to the host system. TODO - remove the hardcoding so that multiple workspaces + /// don't have colliding exposed ports. + pub fn ports(&self, image_type: ImageType) -> HashMap> { + match image_type { + ImageType::BaseNode => create_port_map(&["18142", "18189"]), + ImageType::Wallet => create_port_map(&["18143", "18188"]), + ImageType::XmRig => create_port_map(&[]), + ImageType::Sha3Miner => create_port_map(&[]), + ImageType::MmProxy => create_port_map(&[]), + ImageType::Tor => create_port_map(&[]), + ImageType::Monerod => create_port_map(&[]), + ImageType::Frontail => create_port_map(&["18130"]), + } + } + + /// As for [`ports`] returns a bollard configuration for port mappings. + pub fn port_map(&self, image_type: ImageType) -> PortMap { + let ports = self.ports(image_type); + ports + .into_iter() + .map(|(k, _)| { + let binding = vec![PortBinding { + host_ip: Some("".to_string()), + host_port: Some(k.clone()), + }]; + (k, Some(binding)) + }) + .collect() + } + + /// Return the command line arguments we want for the given container execution. + pub fn command(&self, image_type: ImageType) -> Vec { + match image_type { + ImageType::BaseNode => vec!["--non-interactive-mode".to_string()], + ImageType::Wallet => vec!["--non-interactive-mode".to_string()], + ImageType::XmRig => self.xmrig_cmd(), + ImageType::Sha3Miner => vec![], + ImageType::MmProxy => vec![], + ImageType::Tor => self.tor_cmd(), + ImageType::Monerod => self.monerod_cmd(), + ImageType::Frontail => self.frontail_cmd(), + } + } + + /// Returns the canonical path to the id files. The canonical path is defined as + /// `{root_path}/config/{network}/{image_type}_id.json` + pub fn id_path(&self, root_path: &str, image_type: ImageType) -> Option { + match image_type { + ImageType::BaseNode | ImageType::Wallet => Some( + PathBuf::from(root_path) + .join("config") + .join(self.tari_network.lower_case()) + .join(format!("{}_id.json", image_type.image_name())), + ), + _ => None, + } + } + + fn frontail_cmd(&self) -> Vec { + let args = vec![ + "-p", + "18130", + "base_node/log/core.log", + "wallet/log/core.log", + "sha3_miner/log/core.log", + "mm_proxy/log/core.log", + ]; + args.into_iter().map(String::from).collect() + } + + fn xmrig_cmd(&self) -> Vec { + let address = match &self.xmrig { + Some(config) => config.monero_mining_address.as_str(), + None => DEFAULT_MINING_ADDRESS, + }; + let address = format!("--user={}", address); + let args = vec![ + "--url=mm_proxy:18081", + address.as_str(), + "--coin=monero", + "--daemon", + "--log-file=/var/tari/xmrig/xmrig.log", + "--verbose", + // "--background" + ]; + args.into_iter().map(String::from).collect() + } + + fn monerod_cmd(&self) -> Vec { + let network = match self.tari_network { + TariNetwork::Mainnet => "--mainnet", + _ => "--stagenet", + }; + let args = vec![ + "--non-interactive", + "--restricted-rpc", + "--rpc-bind-ip=0.0.0.0", + "--confirm-external-bind", + "--enable-dns-blocklist", + "--log-file=/home/monerod/monerod.log", + "--fast-block-sync=1", + "--prune-blockchain", + network, + ]; + args.into_iter().map(String::from).collect() + } + + fn tor_cmd(&self) -> Vec { + let hashed_password = EncryptedKey::hash_password(self.tor_control_password.as_str()).to_string(); + let args = vec![ + "/usr/bin/tor", + "--SocksPort", + "0.0.0.0:9050", + "--ControlPort", + "0.0.0.0:9051", + "--CookieAuthentication", + "0", + "--ClientOnly", + "1", + "--ClientUseIPv6", + "1", + "--HashedControlPassword", + hashed_password.as_str(), + ]; + args.into_iter().map(String::from).collect() + } + + /// Returns the bollard configuration map. You can specify any/all of the host-mounted data folder, of the + /// blockchain folder to map. + pub fn build_volumes(&self, general: bool, tari_blockchain: bool) -> HashMap> { + let mut volumes = HashMap::new(); + if general { + volumes.insert("/var/tari".to_string(), HashMap::<(), ()>::new()); + } + if tari_blockchain { + volumes.insert("/blockchain".to_string(), HashMap::new()); + } + volumes + } + + fn common_envars(&self) -> Vec { + vec![ + format!("TARI_NETWORK={}", self.tari_network.lower_case()), + format!("DATA_FOLDER={}", self.data_directory.to_str().unwrap_or("")), // TODO deal with None + "TARI_LOG_CONFIGURATION=/var/tari/config/log4rs.yml".to_string(), + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin".to_string(), + ] + } + + /// Generate the vector of ENVAR strings for the docker environment + fn base_node_environment(&self) -> Vec { + let mut env = self.common_envars(); + if let Some(base_node) = &self.base_node { + env.append(&mut vec![ + format!("WAIT_FOR_TOR={}", base_node.delay.as_secs()), + format!( + "TARI_BASE_NODE__{}__TOR_CONTROL_AUTH=password={}", + self.tari_network.upper_case(), + self.tor_control_password + ), + format!( + "TARI_BASE_NODE__{}__DATA_DIR=/blockchain/{}", + self.tari_network.upper_case(), + self.tari_network.lower_case() + ), + format!( + "TARI_BASE_NODE__{}__TOR_FORWARD_ADDRESS=/dns4/base_node/tcp/18189", + self.tari_network.upper_case() + ), + format!( + "TARI_BASE_NODE__{}__TCP_LISTENER_ADDRESS=/dns4/base_node/tcp/18189", + self.tari_network.upper_case() + ), + format!( + "TARI_BASE_NODE__{}__TOR_SOCKS_ADDRESS_OVERRIDE=/dns4/tor/tcp/9050", + self.tari_network.upper_case() + ), + format!( + "TARI_BASE_NODE__{}__TOR_CONTROL_ADDRESS=/dns4/tor/tcp/9051", + self.tari_network.upper_case() + ), + format!("TARI_BASE_NODE__{}__GRPC_ENABLED=1", self.tari_network.upper_case()), + format!( + "TARI_BASE_NODE__{}__GRPC_BASE_NODE_ADDRESS=0.0.0.0:18142", + self.tari_network.upper_case() + ), + "APP_NAME=base_node".to_string(), + ]); + } + env + } + + fn wallet_environment(&self) -> Vec { + let mut env = self.common_envars(); + if let Some(config) = &self.wallet { + env.append(&mut vec![ + "APP_NAME=wallet".to_string(), + "APP_EXEC=tari_console_wallet".to_string(), + format!("WAIT_FOR_TOR={}", config.delay.as_secs() + 3), + "SHELL=/bin/bash".to_string(), + "TERM=linux".to_string(), + format!("TARI_WALLET_PASSWORD={}", config.password), + format!( + "TARI_WALLET__{}__TOR_CONTROL_AUTH=password={}", + self.tari_network.upper_case(), + self.tor_control_password + ), + format!( + "TARI_WALLET__{}__TOR_CONTROL_ADDRESS=/dns4/tor/tcp/9051", + self.tari_network.upper_case() + ), + format!( + "TARI_WALLET__{}__TOR_SOCKS_ADDRESS_OVERRIDE=/dns4/tor/tcp/9050", + self.tari_network.upper_case() + ), + format!( + "TARI_WALLET__{}__TOR_FORWARD_ADDRESS=/dns4/wallet/tcp/18188", + self.tari_network.upper_case() + ), + format!( + "TARI_WALLET__{}__TCP_LISTENER_ADDRESS=/dns4/wallet/tcp/18188", + self.tari_network.upper_case() + ), + format!( + "TARI_BASE_NODE__{}__GRPC_CONSOLE_WALLET_ADDRESS=0.0.0.0:18143", + self.tari_network.upper_case() + ), + "TARI_WALLET__GRPC_ADDRESS=0.0.0.0:18143".to_string(), + ]); + } + env + } + + fn xmrig_environment(&self) -> Vec { + let mut env = self.common_envars(); + if let Some(config) = &self.xmrig { + env.append(&mut vec![format!("WAIT_FOR_TOR={}", config.delay.as_secs() + 9)]); + } + env + } + + fn sha3_miner_environment(&self) -> Vec { + let mut env = self.common_envars(); + if let Some(config) = &self.sha3_miner { + env.append(&mut vec![ + format!("WAIT_FOR_TOR={}", config.delay.as_secs() + 6), + "APP_NAME: sha3_miner".to_string(), + "APP_EXEC: tari_mining_node".to_string(), + format!("TARI_MINING_NODE__NUM_MINING_THREADS: {}", config.num_mining_threads), + "TARI_MINING_NODE__MINE_ON_TIP_ONLY: 1".to_string(), + format!( + "TARI_BASE_NODE__{}__GRPC_BASE_NODE_ADDRESS=/dns4/base_node/tcp/18142", + self.tari_network.upper_case() + ), + "TARI_WALLET__GRPC_ADDRESS=/dns4/wallet/tcp/18143".to_string(), + ]); + } + env + } + + fn mm_proxy_environment(&self) -> Vec { + let mut env = self.common_envars(); + if let Some(config) = &self.mm_proxy { + env.append(&mut vec![ + format!("WAIT_FOR_TOR={}", config.delay.as_secs() + 6), + "APP_NAME=mm_proxy".to_string(), + "APP_EXEC=tari_merge_mining_proxy".to_string(), + format!( + "TARI_BASE_NODE__{}__GRPC_BASE_NODE_ADDRESS=/dns4/base_node/tcp/18142", + self.tari_network.upper_case() + ), + "TARI_WALLET__GRPC_ADDRESS=/dns4/wallet/tcp/18143".to_string(), + format!( + "TARI_MERGE_MINING_PROXY__{}__MONEROD_URL={}", + self.tari_network.upper_case(), + config.monerod_url + ), + format!( + "TARI_MERGE_MINING_PROXY__{}__MONEROD_USERNAME={}", + self.tari_network.upper_case(), + config.monero_username + ), + format!( + "TARI_MERGE_MINING_PROXY__{}__MONEROD_PASSWORD={}", + self.tari_network.upper_case(), + config.monero_password + ), + format!( + "TARI_MERGE_MINING_PROXY__{}__MONEROD_USE_AUTH={}", + self.tari_network.upper_case(), + config.monero_use_auth() + ), + format!( + "TARI_MERGE_MINING_PROXY__{}__PROXY_HOST_ADDRESS=0.0.0.0:18081", + self.tari_network.upper_case() + ), + ]); + } + env + } + + fn tor_environment(&self) -> Vec { + self.common_envars() + } + + fn monerod_environment(&self) -> Vec { + self.common_envars() + } +} + +#[derive(Debug, Error)] +pub enum LaunchpadConfigError {} + +fn create_port_map(ports: &[&'static str]) -> HashMap> { + let mut result = HashMap::new(); + for &port in ports { + result.insert(format!("{}/tcp", port), HashMap::new()); + } + result +} diff --git a/applications/launchpad/backend/src/docker/workspace.rs b/applications/launchpad/backend/src/docker/workspace.rs new file mode 100644 index 0000000000..d16998f07c --- /dev/null +++ b/applications/launchpad/backend/src/docker/workspace.rs @@ -0,0 +1,611 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +use std::collections::HashMap; + +use bollard::{ + container::{ + Config, + CreateContainerOptions, + LogsOptions, + NetworkingConfig, + Stats, + StatsOptions, + StopContainerOptions, + }, + models::{ContainerCreateResponse, EndpointSettings, HostConfig, Network}, + network::{ConnectNetworkOptions, CreateNetworkOptions, InspectNetworkOptions}, + volume::CreateVolumeOptions, + Docker, +}; +use futures::{Stream, StreamExt, TryStreamExt}; +use log::*; +use strum::IntoEnumIterator; +use tari_app_utilities::identity_management::setup_node_identity; +use tari_comms::{peer_manager::PeerFeatures, NodeIdentity}; + +use crate::docker::{ + models::{ContainerId, ContainerState}, + DockerWrapperError, + ImageType, + LaunchpadConfig, + LogMessage, +}; + +static DEFAULT_REGISTRY: &str = "quay.io/tarilabs"; +static DEFAULT_TAG: &str = "latest"; + +/// `Workspaces` allows us to spin up multiple [TariWorkspace] recipes or configurations at once. Most users will only +/// ever need one at a time, and the default one at that, but developers and testers will likely find this useful. +/// +/// For example, you might want to run a node and wallet on two different networks concurrently. +/// Or, you might want to spin up two wallets on the same network to test some new feature. Here you would have one +/// recipe with just a base node and a wallet, and another recipe with just a wallet. +/// +/// Workspaces are referenced by a name, which is an arbitrary string, but by convention, you'll want to keep workspace +/// names short and do not use spaces in workspace names. +/// +/// Docker containers are named using a `{workspace_name}_{image_type}` convention. See [TariWorkspace] for more +/// details. +/// +/// Each workspace should also have a unique data folder to keep logs and configuration separate, but this is not a hard +/// requirement. +#[derive(Default)] +pub struct Workspaces { + workspaces: HashMap, +} + +impl Workspaces { + /// Returns a mutable reference to the `name`d workspace. For an immutable reference, see [workspace_mut]. + pub fn get_workspace_mut(&mut self, name: &str) -> Option<&mut TariWorkspace> { + self.workspaces.get_mut(name) + } + + /// Returns an immtable reference to the `name`d workspace. For a mutable reference, see [get_workspace_mut]. + pub fn get_workspace(&self, name: &str) -> Option<&TariWorkspace> { + self.workspaces.get(name) + } + + /// Checks if a workspace with the given name exists. + pub fn workspace_exists(&self, name: &str) -> bool { + self.workspaces.contains_key(name) + } + + /// Create a new Tari workspace. It must not previously exist + pub fn create_workspace(&mut self, name: &str, config: LaunchpadConfig) -> Result<(), DockerWrapperError> { + if self.workspaces.contains_key(name) { + return Err(DockerWrapperError::WorkspaceAlreadyExists(name.to_string())); + } + let new_system = TariWorkspace::new(name, config); + self.workspaces.insert(name.to_string(), new_system); + Ok(()) + } + + /// Gracefully shut down the docker images and delete them + /// The volumes are kept, since if we restart, we don't want to re-sync the entire blockchain again + pub async fn shutdown(&mut self, docker: &Docker) -> Result<(), DockerWrapperError> { + for (name, system) in &mut self.workspaces { + info!("Shutting down {}", name); + system.stop_containers(true, docker).await; + } + Ok(()) + } +} + +/// A TariWorkspace is a configuration of docker images (node, wallet, miner etc), configuration files and secrets, +/// and log files. +/// +/// ### Data locations +/// A workspace manages data in several places +/// * **Blockchain data** is stored in a [Docker volume](https://docs.docker.com/storage/volumes/) that is not directly +/// accessible to the host system. This is primarily done for performance reasons, but should not be a major issue +/// since you seldom need direct access to the LMDB database. If you do need the database for some reason, you can +/// mount the volume and run a bash command, for instance: `docker run --rm -v $(pwd):/backup -v +/// blockchain:/blockchain ubuntu tar czvf /backup/backup.tar.gz /blockchain`. As currently written, the blockchain +/// data is namespaced by workspace but it is also possible in principle for different workspaces to (TODO) share +/// blockchain data (for the same network), thereby preventing the need to keep multiple copies of the blockchain. In +/// this case, you need to be careful not to introduce contention from multiple nodes running against the same LMDB +/// database, leading to corrupt db files. +/// * **Configuration** and log files are stored of the workspace `root_folder`. A typical folder structure looks like +/// ```text +/// {root_folder} +/// ├── base_node +/// │ └── log +/// │ ├── core.log +/// │ ├── network.log +/// │ └── other.log +/// ├── config +/// │ ├── config.toml +/// │ ├── log4rs.yml +/// │ └── weatherwax +/// │ ├── base_node_tor.json +/// │ ├── tari_base_node_id.json +/// │ └── tari_console_wallet_id.json +/// ├── mm_proxy +/// ├── monerod +/// ├── sha3_miner +/// │ └── log +/// │ ├── core.log +/// │ ├── network.log +/// │ └── other.log +/// ├── tor +/// ├── wallet +/// │ ├── log +/// │ │ ├── core.log +/// │ │ ├── network.log +/// │ │ └── other.log +/// │ └── wallet +/// │ ├── console-wallet.dat +/// │ ├── console-wallet.dat-shm +/// │ └── console-wallet.dat-wal +/// └── xmrig +/// ``` +/// the `{root_folder}` is mounted into the docker filesystem and is accessible to all containers in the workspace. +/// TODO - investigate security issues for this. In particular, we almost certainly want to isolate the wallet data +/// This means that changes to `config/log4rs.yml` take effect in all running containers immediately. +/// * **Docker containers** are ephemeral and are created and destroyed at will. +/// +/// ### Networking +/// Tor is used by several other containers. The control password for Tor is randomly generated when the workspace is +/// set up, and shared as an environment variable between containers. +/// +/// A dedicated, namespaced network is created for each workspace. This means that each container in the network can +/// talk to any other container in the same workspace, but not to containers in other workspaces. +/// +/// We also expose some ports to the host system for host-container communication. +/// +/// * Base node - ports 18142 and 18149. TODO - currently the same port is mapped to the host. For multiple Workspaces +/// we'd need to expose a different port to the host. e.g. 1n142 where n is the workspace number. +/// * Wallet - 18143 and 18188 +/// * Frontail - 18130 +pub struct TariWorkspace { + name: String, + config: LaunchpadConfig, + containers: HashMap, +} + +impl TariWorkspace { + /// Create a new Tari system using the provided configuration + pub fn new(name: &str, config: LaunchpadConfig) -> Self { + Self { + name: name.to_string(), + config, + containers: HashMap::new(), + } + } + + /// Return a reference to the immutable configuration object for this workspace. + pub fn config(&self) -> &LaunchpadConfig { + &self.config + } + + /// Returns the name of this system, which is generally used as the workspace name when running multiple Tari + /// systems + pub fn name(&self) -> &str { + self.name.as_str() + } + + /// Returns the full image name for the given image type. for the default registry this is typically something like + /// `quay.io/tarilabs/tari_base_node:latest`. One should be able to use this string to do a successful + /// `docker pull {image_name}`. + /// + /// It also lets power users customise which version of docker images they want to run in the workspace. + pub fn fully_qualified_image(image: ImageType, registry: Option<&str>, tag: Option<&str>) -> String { + let reg = registry.unwrap_or(DEFAULT_REGISTRY); + let tag = tag.unwrap_or(DEFAULT_TAG); + format!("{}/{}:{}", reg, image.image_name(), tag) + } + + /// Starts the Tari workspace recipe. + /// + /// This is an MVP / PoC version that starts everything in one go, but TODO, should really take some sort of recipe + /// object to allow us to build up different recipes (wallet only, full miner, SHA3-mining only etc) + pub async fn start_recipe(&mut self, docker: Docker) -> Result<(), DockerWrapperError> { + // Create or load identities + let _ids = self.create_or_load_identities()?; + // Set up the local network + if !self.network_exists(&docker).await? { + self.create_network(&docker).await?; + } + // Create or restart the volume + + let registry = self.config.registry.clone(); + let tag = self.config.tag.clone(); + for image in self.images_to_start() { + // Start each container + let name = self + .start_service(image, registry.clone(), tag.clone(), docker.clone()) + .await?; + info!( + "Docker container {} ({}) successfully started", + image.image_name(), + name + ); + } + Ok(()) + } + + /// Bootstraps a node identity for the container, typically a base node or wallet instance. If an identity file + /// already exists at the canonical path location, it is loaded and returned instead. + /// + /// The canonical path is defined as `{root_path}/config/{network}/{image_type}_id.json` + pub fn create_or_load_identity( + &self, + root_path: &str, + image: ImageType, + ) -> Result, DockerWrapperError> { + if let Some(id_file_path) = self.config.id_path(root_path, image) { + debug!("Loading or creating identity file {}", id_file_path.to_string_lossy()); + let id = setup_node_identity(id_file_path, &None, true, PeerFeatures::COMMUNICATION_NODE)? + .as_ref() + .clone(); + Ok(Some(id)) + } else { + Ok(None) + } + } + + /// A convenience method that calls [create_or_load_identity] for each image type. + pub fn create_or_load_identities(&self) -> Result, DockerWrapperError> { + let root_path = self.config.data_directory.to_string_lossy().to_string(); + let mut ids = HashMap::new(); + for image in ImageType::iter() { + if let Some(id) = self.create_or_load_identity(root_path.as_str(), image)? { + let _ = ids.insert(image, id); + } + } + Ok(ids) + } + + /// Create and return a [`Stream`] of [`LogMessage`] instances for the `name`d container in the workspace. + pub fn logs( + &self, + container_name: &str, + docker: Docker, + ) -> Option>> { + let options = LogsOptions:: { + follow: true, + stdout: true, + stderr: true, + ..Default::default() + }; + self.containers.get(container_name).map(move |container| { + let id = container.id(); + docker + .logs(id.as_str(), Some(options)) + .map(|log| log.map(LogMessage::from).map_err(DockerWrapperError::from)) + }) + } + + /// Returns a [`Stream`] of resource stats for the container `name`, if it exists + pub fn resource_stats( + &self, + name: &str, + docker: Docker, + ) -> Option>> { + if let Some(container) = self.containers.get(name) { + let options = StatsOptions { + stream: true, + one_shot: false, + }; + let id = container.id(); + let stream = docker + .stats(id.as_str(), Some(options)) + .map_err(DockerWrapperError::from); + Some(stream) + } else { + None + } + } + + /// Create and run a docker container. + /// + /// ## Arguments + /// * `image`: The type of image to start. See [`ImageType`]. + /// * `registry`: An optional docker registry path to use. The default is `quay.io/tarilabs` + /// * `tag`: The image tag to use. The default is `latest`. + /// * `docker`: a [`Docker`] instance. + /// + /// ## Return + /// + /// The method returns a future that resolves to a [`DockerWrapperError`] on an error, or the container name on + /// success. + /// + /// `start_service` creates a new docker container and runs it. As part of this process, + /// * it pulls configuration data from the [`LaunchConfig`] instance attached to this [`DockerWRapper`] to construct + /// the Environment, Volume configuration, and exposed Port configuration. + /// * creates a new container + /// * starts the container + /// * adds the container reference to the current list of containers being managed + /// * Returns the container name + pub async fn start_service( + &mut self, + image: ImageType, + registry: Option, + tag: Option, + docker: Docker, + ) -> Result { + let args = self.config.command(image); + let image_name = TariWorkspace::fully_qualified_image(image, registry.as_deref(), tag.as_deref()); + let options = Some(CreateContainerOptions { + name: format!("{}_{}", self.name, image.image_name()), + }); + let envars = self.config.environment(image); + let volumes = self.config.volumes(image); + let ports = self.config.ports(image); + let port_map = self.config.port_map(image); + let mounts = self.config.mounts(image, self.tari_blockchain_volume_name()); + let mut endpoints = HashMap::new(); + let endpoint = EndpointSettings { + aliases: Some(vec![image.container_name().to_string()]), + ..Default::default() + }; + endpoints.insert(self.network_name(), endpoint); + let config = Config:: { + image: Some(image_name.clone()), + attach_stdin: Some(false), + attach_stdout: Some(false), + attach_stderr: Some(false), + exposed_ports: Some(ports), + open_stdin: Some(true), + stdin_once: Some(false), + tty: Some(true), + env: Some(envars), + volumes: Some(volumes), + cmd: Some(args), + host_config: Some(HostConfig { + binds: Some(vec![]), + network_mode: Some("bridge".to_string()), + port_bindings: Some(port_map), + mounts: Some(mounts), + ..Default::default() + }), + networking_config: Some(NetworkingConfig { + endpoints_config: endpoints, + }), + ..Default::default() + }; + info!("Creating {}", image_name); + debug!("{} has configuration object: {:#?}", image_name, config); + let container = docker.create_container(options, config).await?; + let name = image.container_name(); + let id = container.id.clone(); + self.add_container(name, container); + info!("Starting {}.", image_name); + docker.start_container::(id.as_str(), None).await?; + self.mark_container_running(name)?; + info!("{} started with id {}", image_name, id); + + Ok(name.to_string()) + } + + // helper function for start recipe. This will be overhauled to be more flexible in future + fn images_to_start(&self) -> Vec { + let mut images = Vec::with_capacity(6); + // Always use Tor for now + images.push(ImageType::Tor); + if self.config.base_node.is_some() { + images.push(ImageType::BaseNode); + } + if self.config.wallet.is_some() { + images.push(ImageType::Wallet); + } + if self.config.xmrig.is_some() { + images.push(ImageType::XmRig); + } + if self.config.sha3_miner.is_some() { + images.push(ImageType::Sha3Miner); + } + if self.config.mm_proxy.is_some() { + images.push(ImageType::MmProxy); + } + // TODO - add monerod support + images + } + + /// Returns a reference to the set of managed containers. You can only retrieve immutable references from this + /// hash map. If you need a mutable reference tot a container's state, see [`container_mut`]. + pub fn managed_containers(&self) -> &HashMap { + &self.containers + } + + /// Return a mutable reference to the named container's [`ContainerState`]. + pub fn container_mut(&mut self, container_name: &str) -> Option<&mut ContainerState> { + self.containers.get_mut(container_name) + } + + /// Add the container info to the list of containers the wrapper is managing + fn add_container(&mut self, name: &str, container: ContainerCreateResponse) { + let id = ContainerId::from(container.id.clone()); + let state = ContainerState::new(name.to_string(), id, container); + self.containers.insert(name.to_string(), state); + } + + // Tag the container with id `id` as Running + fn mark_container_running(&mut self, name: &str) -> Result<(), DockerWrapperError> { + if let Some(container) = self.containers.get_mut(name) { + container.running(); + Ok(()) + } else { + Err(DockerWrapperError::ContainerNotFound(name.to_string())) + } + } + + /// Stop the container with the given `name` and optionally delete it + pub async fn stop_container(&mut self, name: &str, delete: bool, docker: &Docker) { + let container = match self.container_mut(name) { + Some(c) => c, + None => { + info!( + "Cannot stop container {}. It was not found in the current workspace", + name + ); + return; + }, + }; + let options = StopContainerOptions { t: 0 }; + let id = container.id().clone(); + match docker.stop_container(id.as_str(), Some(options)).await { + Ok(_res) => { + info!("Container {} stopped", id); + container.set_stop(); + }, + Err(err) => { + warn!("Could not stop container {} due to {}", id, err.to_string()); + }, + } + // Even if stopping failed (maybe it was already stopped), try and delete it + if delete { + match docker.remove_container(id.as_str(), None).await { + Ok(()) => { + info!("Container {} deleted", id); + container.set_deleted(); + }, + Err(err) => { + warn!("Could not delete container {} due to: {}", id, err.to_string()) + }, + } + } + } + + /// Stop all running containers and optionally delete them + pub async fn stop_containers(&mut self, delete: bool, docker: &Docker) { + let names = self.containers.keys().cloned().collect::>(); + for name in names { + // Stop the container immediately + self.stop_container(name.as_str(), delete, docker).await; + } + } + + /// Returns the network name + pub fn network_name(&self) -> String { + format!("{}_network", self.name) + } + + /// Returns the name of the volume holding blockchain data. Currently this is namespaced to the workspace. We might + /// want to change this to be shareable across networks, i.e. only namespace across the network type. + pub fn tari_blockchain_volume_name(&self) -> String { + format!("{}_{}_volume", self.name, self.config.tari_network.lower_case()) + } + + /// Checks if the network for this docker configuration exists + pub async fn network_exists(&self, docker: &Docker) -> Result { + let name = self.network_name(); + let options = InspectNetworkOptions { + verbose: false, + scope: "local", + }; + let network = docker.inspect_network(name.as_str(), Some(options)).await; + // hardcore pattern matching yo! + if let Ok(Network { + name: Some(name), + id: Some(id), + .. + }) = network + { + info!("Network {} (id:{}) exists", name, id); + Ok(true) + } else { + info!("Network {} does not exist", name); + Ok(false) + } + } + + /// Create a network in docker to allow the containers in this workspace to communicate with each other. + pub async fn create_network(&self, docker: &Docker) -> Result<(), DockerWrapperError> { + let name = self.network_name(); + let options = CreateNetworkOptions { + name: name.as_str(), + check_duplicate: true, + driver: "bridge", + internal: false, + attachable: false, + ingress: false, + ipam: Default::default(), + enable_ipv6: false, + options: Default::default(), + labels: Default::default(), + }; + let res = docker.create_network(options).await?; + if let Some(id) = &res.id { + info!("Network {} (id:{}) created", name, id); + } + if let Some(warn) = res.warning { + warn!("Creating {} network had warnings: {}", name, warn); + } + Ok(()) + } + + /// Checks whether the blockchain data volume exists + pub async fn volume_exists(&self, docker: &Docker) -> Result { + let name = self.tari_blockchain_volume_name(); + let volume = docker.inspect_volume(name.as_str()).await?; + trace!("Volume {} exists at {}", name, volume.mountpoint); + Ok(true) + } + + /// Tries to create a new blockchain data volume for this workspace. + pub async fn create_volume(&self, docker: &Docker) -> Result<(), DockerWrapperError> { + let name = self.tari_blockchain_volume_name(); + let config = CreateVolumeOptions { + name, + driver: "local".to_string(), + ..Default::default() + }; + let volume = docker.create_volume(config).await?; + info!("Docker volume {} created at {}", volume.name, volume.mountpoint); + Ok(()) + } + + /// Connects a container to the workspace network. This is not typically needed, since the container will + /// automatically be connected to the network when it is created in [`start_service`]. + pub async fn connect_to_network( + &self, + id: &ContainerId, + image: ImageType, + docker: &Docker, + ) -> Result<(), DockerWrapperError> { + let network = self.network_name(); + let options = ConnectNetworkOptions { + container: id.as_str(), + endpoint_config: EndpointSettings { + aliases: Some(vec![image.container_name().to_string()]), + ..Default::default() + }, + }; + info!( + "Connecting container {} ({}) to network {}...", + image.image_name(), + id, + network + ); + docker.connect_network(network.as_str(), options).await?; + info!( + "Docker container {} ({}) connected to network {}", + image.image_name(), + id, + network + ); + Ok(()) + } +} diff --git a/applications/launchpad/backend/src/docker/wrapper.rs b/applications/launchpad/backend/src/docker/wrapper.rs new file mode 100644 index 0000000000..13de2c22f4 --- /dev/null +++ b/applications/launchpad/backend/src/docker/wrapper.rs @@ -0,0 +1,93 @@ +// Copyright 2021. The Tari Project +// +// Redistribution and use in source and binary forms, with or without modification, are permitted provided that the +// following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following +// disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the +// following disclaimer in the documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote +// products derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, +// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE +// USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +use std::collections::HashMap; + +use bollard::{ + image::CreateImageOptions, + models::{CreateImageInfo, SystemEventsResponse}, + system::EventsOptions, + Docker, +}; +use futures::{Stream, TryStreamExt}; + +use crate::docker::DockerWrapperError; + +/// A wrapper around a [`bollard::Docker`] instance providing some opinionated convenience methods for Tari workspaces. +pub struct DockerWrapper { + handle: Docker, +} + +impl DockerWrapper { + /// Create a new wrapper + pub fn new() -> Result { + let handle = Docker::connect_with_local_defaults()?; + Ok(Self { handle }) + } + + /// Returns the version of the _docker client_. + pub fn version(&self) -> String { + self.handle.client_version().to_string() + } + + /// Create a (cheap) clone of the [`Docker`] instance, suitable for passing to threads and futures. + pub fn handle(&self) -> Docker { + self.handle.clone() + } + + /// Pull an image from a repository. + /// + /// image_name: The fully qualified name of the image, {registry}/{name}:{tag} + /// To use the default registry and tag, you can call `Self::fully_qualified_image(image, registry, tag)` + /// to build a default full-qualified image name. + pub async fn pull_image( + &self, + image_name: String, + ) -> impl Stream> { + let opts = Some(CreateImageOptions { + from_image: image_name, + ..Default::default() + }); + let stream = self.handle.create_image(opts, None, None); + stream.map_err(DockerWrapperError::from) + } + + /// Returns a stream of relevant events. We're opinionated here, so we filter the stream to only return + /// container, image, network and volume events. + pub async fn events(&self) -> impl Stream> { + let docker = self.handle.clone(); + let mut type_filter = HashMap::new(); + type_filter.insert("type".to_string(), vec![ + "container".to_string(), + "image".to_string(), + "network".to_string(), + "volume".to_string(), + ]); + let options = EventsOptions { + since: None, + until: None, + filters: type_filter, + }; + docker.events(Some(options)).map_err(DockerWrapperError::from) + } +} diff --git a/applications/installer/src/config/wallet.rs b/applications/launchpad/backend/src/error.rs similarity index 56% rename from applications/installer/src/config/wallet.rs rename to applications/launchpad/backend/src/error.rs index 9f2d6fe6fa..cc2907a8e5 100644 --- a/applications/installer/src/config/wallet.rs +++ b/applications/launchpad/backend/src/error.rs @@ -19,12 +19,40 @@ // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// + +use std::error::Error; + +use tauri::{api::Error as TauriApiError, Error as TauriError}; +use thiserror::Error; -use crate::config::{InstallLocation, SourceLocation}; +use crate::docker::DockerWrapperError; + +#[derive(Debug, Error)] +pub enum LauncherError { + #[error("Something went wrong with the Docker Wrapper")] + DockerWrapperError(#[from] DockerWrapperError), + #[error("Something went wrong on your filesystem")] + FileSystemError(#[from] std::io::Error), + #[error("Something went screwy with Tauri")] + TauriError(#[from] TauriError), + #[error("Something went awry with the Tauri API")] + TauriApiError(#[from] TauriApiError), + #[error("A workspace configuration object is required")] + MisingConfig, + #[error("{1} is required because we are creating a {0}")] + ConfigVariableRequired(String, String), +} -pub struct WalletOptions { - // Where to pull the wallet source or binary from - source: SourceLocation, - // Where the wallet and its data will live. SQLite installation will follow the settings chosen here. - install_location: InstallLocation, +impl LauncherError { + /// Combine all error messages down the chain into one string. + pub fn chained_message(&self) -> String { + let mut messages = vec![self.to_string()]; + let mut this = self as &dyn Error; + while let Some(next) = this.source() { + messages.push(next.to_string()); + this = next; + } + messages.join(" caused by:\n") + } } diff --git a/applications/installer/src/utils/mod.rs b/applications/launchpad/backend/src/lib.rs similarity index 96% rename from applications/installer/src/utils/mod.rs rename to applications/launchpad/backend/src/lib.rs index a1a28eef6f..6a771f9b15 100644 --- a/applications/installer/src/utils/mod.rs +++ b/applications/launchpad/backend/src/lib.rs @@ -19,5 +19,8 @@ // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE // USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// - +pub mod commands; +pub mod docker; +pub mod error; diff --git a/applications/launchpad/backend/src/main.rs b/applications/launchpad/backend/src/main.rs new file mode 100644 index 0000000000..1622ab7ccc --- /dev/null +++ b/applications/launchpad/backend/src/main.rs @@ -0,0 +1,85 @@ +#![cfg_attr(all(not(debug_assertions), target_os = "windows"), windows_subsystem = "windows")] + +use log::*; +use tari_launchpad::{ + __cmd__create_default_workspace, + __cmd__create_new_workspace, + __cmd__events, + __cmd__image_list, + __cmd__launch_docker, + __cmd__pull_images, + __cmd__shutdown, + __cmd__start_service, + __cmd__stop_service, + commands::*, + docker::{DockerWrapper, Workspaces}, +}; +use tauri::{api::cli::get_matches, async_runtime::block_on, utils::config::CliConfig, Event, Manager}; + +fn main() { + env_logger::init(); + let context = tauri::generate_context!(); + let cli_config = context.config().tauri.cli.clone().unwrap(); + + // Handle --help and --version. Exits after printing + handle_cli_options(&cli_config); + + let docker = match DockerWrapper::new() { + Ok(docker) => docker, + Err(err) => { + error!("Could not launch docker backend. {}", err.chained_message()); + std::process::exit(-1); + }, + }; + + // TODO - Load workspace definitions from persistent storage here + let workspaces = Workspaces::default(); + // We're going to attach this to the AppState because Tauri does not expose it for some reason + let package_info = context.package_info().clone(); + info!("Using Docker version: {}", docker.version()); + + let app = tauri::Builder::default() + .manage(AppState::new(docker, workspaces, package_info)) + .invoke_handler(tauri::generate_handler![ + image_list, + pull_images, + create_new_workspace, + create_default_workspace, + events, + launch_docker, + start_service, + stop_service, + shutdown + ]) + .build(context) + .expect("error while running Launchpad"); + + app.run(|app, event| { + if let Event::Exit = event { + info!("Received Exit event"); + block_on(async move { + let state = app.state(); + let _ = shutdown(state).await; + }); + } + }); +} + +fn handle_cli_options(cli_config: &CliConfig) { + match get_matches(cli_config) { + Ok(matches) => { + if let Some(arg_data) = matches.args.get("help") { + debug!("{}", arg_data.value.as_str().unwrap_or("No help available")); + std::process::exit(0); + } + if let Some(arg_data) = matches.args.get("version") { + debug!("{}", arg_data.value.as_str().unwrap_or("No version data available")); + std::process::exit(0); + } + }, + Err(e) => { + error!("{}", e.to_string()); + std::process::exit(1); + }, + } +} diff --git a/applications/launchpad/backend/tauri.conf.json b/applications/launchpad/backend/tauri.conf.json new file mode 100644 index 0000000000..3b61075814 --- /dev/null +++ b/applications/launchpad/backend/tauri.conf.json @@ -0,0 +1,80 @@ +{ + "package": { + "productName": "tari-launchpad", + "version": "0.1.0" + }, + "build": { + "distDir": "../gui-vue/dist", + "devPath": "http://localhost:8080", + "beforeDevCommand": "cd ../gui-vue && npm run start", + "beforeBuildCommand": "cd ../gui-vue && npm run build" + }, + "tauri": { + "cli": { + "description": "A simple single-click UI to launch a Tari node, wallet and miner", + "args": [ + { + "short": "c", + "name": "config-file", + "description": "The path to the configuration file to use for the launcher", + "takesValue": true + } + ], + "subcommands": {} + }, + "bundle": { + "active": true, + "targets": "all", + "identifier": "com.tari.launchpad", + "icon": [ + "icons/favicon-32x32.png", + "icons/apple-icon-120x120.png", + "icons/android-icon-192x192.png" + ], + "resources": ["assets/*"], + "externalBin": [], + "copyright": "(c) The Tari Development community 2021", + "category": "DeveloperTool", + "shortDescription": "", + "longDescription": "", + "deb": { + "depends": [], + "useBootstrapper": false + }, + "macOS": { + "frameworks": [], + "minimumSystemVersion": "", + "useBootstrapper": false, + "exceptionDomain": "", + "signingIdentity": null, + "entitlements": null + }, + "windows": { + "certificateThumbprint": null, + "digestAlgorithm": "sha256", + "timestampUrl": "" + } + }, + "updater": { + "active": false + }, + "allowlist": { + "dialog": { + "open": true + }, + "all": true + }, + "windows": [ + { + "title": "Tari Launchpad", + "width": 1600, + "height": 2400, + "resizable": true, + "fullscreen": false + } + ], + "security": { + "csp": "default-src blob: data: filesystem: ws: wss: http: https: tauri: 'unsafe-eval' 'unsafe-inline' 'self' img-src: 'self'" + } + } +} \ No newline at end of file diff --git a/applications/launchpad/build_images.sh b/applications/launchpad/build_images.sh new file mode 100755 index 0000000000..d8b09f7b94 --- /dev/null +++ b/applications/launchpad/build_images.sh @@ -0,0 +1,28 @@ +#!/bin/bash +source versions.txt + +build_image() { + echo "Building $1 image v$VERSION.." + docker build -f docker_rig/$1 --build-arg ARCH=native --build-arg FEATURES=avx2 --build-arg VERSION=$VERSION $3 $4 -t quay.io/tarilabs/$2:latest ./../.. + docker tag quay.io/tarilabs/$2:latest quay.io/tarilabs/$2:$VERSION + docker push quay.io/tarilabs/$2:latest + docker push quay.io/tarilabs/$2:$VERSION +} + +build_image base_node.Dockerfile tari_base_node +build_image console_wallet.Dockerfile tari_console_wallet +build_image mm_proxy.Dockerfile tari_mm_proxy +build_image sha3_miner.Dockerfile tari_sha3_miner +build_image tor.Dockerfile tor +build_image monerod.Dockerfile monerod + +echo "Building XMRig image v$VERSION (XMRig v$XMRIG_VERSION)" +docker build -f docker_rig/xmrig.Dockerfile --build-arg VERSION=$VERSION --build-arg XMRIG_VERSION=$XMRIG_VERSION -t quay.io/tarilabs/xmrig:latest ./../.. +docker tag quay.io/tarilabs/xmrig:latest quay.io/tarilabs/xmrig:$VERSION +docker push quay.io/tarilabs/xmrig:latest +docker push quay.io/tarilabs/xmrig:$VERSION + +docker build -f docker_rig/frontail.Dockerfile -t quay.io/tarilabs/frontail ./docker_rig +docker tag quay.io/tarilabs/frontail:latest quay.io/tarilabs/frontail:$VERSION +docker push quay.io/tarilabs/frontail:latest +docker push quay.io/tarilabs/frontail:$VERSION diff --git a/applications/launchpad/docker_rig/base_node.Dockerfile b/applications/launchpad/docker_rig/base_node.Dockerfile index 14ac002eff..378480a905 100644 --- a/applications/launchpad/docker_rig/base_node.Dockerfile +++ b/applications/launchpad/docker_rig/base_node.Dockerfile @@ -1,17 +1,18 @@ -FROM quay.io/tarilabs/rust_tari-build-with-deps:nightly-2021-09-18 as builder - +FROM quay.io/tarilabs/rust_tari-build-with-deps:nightly-2021-11-01 as builder WORKDIR /tari # Adding only necessary things up front and copying the entrypoint script last # to take advantage of layer caching in docker -ADD Cargo.lock . ADD Cargo.toml . ADD applications applications ADD base_layer base_layer +ADD clients clients ADD common common +ADD common_sqlite common_sqlite ADD comms comms ADD infrastructure infrastructure ADD meta meta +ADD Cargo.lock . ADD rust-toolchain.toml . ARG ARCH=native @@ -27,6 +28,7 @@ RUN cargo build --bin tari_base_node --release --features $FEATURES --locked # Create a base minimal image for the executables FROM quay.io/bitnami/minideb:bullseye as base +ARG VERSION=1.0.1 # Disable Prompt During Packages Installation ARG DEBIAN_FRONTEND=noninteractive RUN apt update && apt -y install \ @@ -50,8 +52,9 @@ RUN mkdir -p "/var/tari/base_node/weatherwax" \ && mkdir -p "/var/tari/base_node/mainnet" \ && chown -R tari.tari "/var/tari/base_node" +RUN mkdir /blockchain && chown tari.tari /blockchain && chmod 777 /blockchain USER tari - +ENV dockerfile_version=$VERSION ENV APP_NAME=base_node APP_EXEC=tari_base_node COPY --from=builder /tari/target/release/$APP_EXEC /usr/bin/ diff --git a/applications/launchpad/docker_rig/console_wallet.Dockerfile b/applications/launchpad/docker_rig/console_wallet.Dockerfile index 0fc7c456a8..b890dfaa88 100644 --- a/applications/launchpad/docker_rig/console_wallet.Dockerfile +++ b/applications/launchpad/docker_rig/console_wallet.Dockerfile @@ -1,17 +1,18 @@ -FROM quay.io/tarilabs/rust_tari-build-with-deps:nightly-2021-09-18 as builder - +FROM quay.io/tarilabs/rust_tari-build-with-deps:nightly-2021-11-01 as builder WORKDIR /tari # Adding only necessary things up front and copying the entrypoint script last # to take advantage of layer caching in docker -ADD Cargo.lock . ADD Cargo.toml . ADD applications applications ADD base_layer base_layer +ADD clients clients ADD common common +ADD common_sqlite common_sqlite ADD comms comms ADD infrastructure infrastructure ADD meta meta +ADD Cargo.lock . ADD rust-toolchain.toml . ARG ARCH=native @@ -27,6 +28,7 @@ RUN cargo build --bin tari_console_wallet --release --features $FEATURES --locke # Create a base minimal image for the executables FROM quay.io/bitnami/minideb:bullseye as base +ARG VERSION=1.0.1 # Disable Prompt During Packages Installation ARG DEBIAN_FRONTEND=noninteractive RUN apt update && apt -y install \ @@ -45,7 +47,7 @@ RUN apt update && apt -y install \ RUN groupadd -g 1000 tari && useradd -s /bin/bash -u 1000 -g 1000 tari USER tari - +ENV dockerfile_version=$VERSION ENV APP_NAME=wallet APP_EXEC=tari_console_wallet COPY --from=builder /tari/target/release/$APP_EXEC /usr/bin/ diff --git a/applications/launchpad/docker_rig/docker-compose.yml b/applications/launchpad/docker_rig/docker-compose.yml index f7c0924d27..bacb0b0b6c 100644 --- a/applications/launchpad/docker_rig/docker-compose.yml +++ b/applications/launchpad/docker_rig/docker-compose.yml @@ -11,42 +11,6 @@ services: # - 9050:9050 # - 9051:9051 - - wallet: - image: quay.io/tarilabs/tari_console_wallet:latest - build: - context: ./../../.. - dockerfile: applications/launchpad/docker_rig/console_wallet.Dockerfile - args: - ARCH: native - FEATURES: avx2 - environment: - TARI_LOG_CONFIGURATION: "/var/tari/config/log4rs.yml" - APP_NAME: wallet - APP_EXEC: tari_console_wallet - WAIT_FOR_TOR: ${WAIT_FOR_TOR:-0} - SHELL: "/bin/bash" - TERM: "linux" - TARI_WALLET_PASSWORD: ${TARI_WALLET_PASSWORD:-tari} - TARI_NETWORK: ${TARI_NETWORK:-weatherwax} - TARI_WALLET__WEATHERWAX__TOR_CONTROL_AUTH: "password=${TOR_CONTROL_AUTH:-tari}" - TARI_WALLET__WEATHERWAX__TOR_CONTROL_ADDRESS: "/dns4/tor/tcp/9051" - TARI_WALLET__WEATHERWAX__TOR_SOCKS_ADDRESS_OVERRIDE: "/dns4/tor/tcp/9050" - TARI_WALLET__WEATHERWAX__TOR_FORWARD_ADDRESS: "/dns4/wallet/tcp/18188" - TARI_WALLET__WEATHERWAX__TCP_LISTENER_ADDRESS: "/dns4/wallet/tcp/18188" - TARI_WALLET__GRPC_ADDRESS: "0.0.0.0:18143" - command: ["--non-interactive"] - ports: - - 18188:18188 - - 18143:18143 - depends_on: - - tor - volumes: - - ${DATA_FOLDER}:/var/tari/ - #stdin_open: true - #tty: true - - base_node: image: quay.io/tarilabs/tari_base_node:latest build: @@ -83,6 +47,39 @@ services: stdin_open: true tty: true + wallet: + image: quay.io/tarilabs/tari_console_wallet:latest + build: + context: ./../../.. + dockerfile: applications/launchpad/docker_rig/console_wallet.Dockerfile + args: + ARCH: native + FEATURES: avx2 + environment: + TARI_LOG_CONFIGURATION: "/var/tari/config/log4rs.yml" + APP_NAME: wallet + APP_EXEC: tari_console_wallet + WAIT_FOR_TOR: ${WAIT_FOR_TOR:-0} + SHELL: "/bin/bash" + TERM: "linux" + TARI_WALLET_PASSWORD: ${TARI_WALLET_PASSWORD:-tari} + TARI_NETWORK: ${TARI_NETWORK:-weatherwax} + TARI_WALLET__WEATHERWAX__TOR_CONTROL_AUTH: "password=${TOR_CONTROL_AUTH:-tari}" + TARI_WALLET__WEATHERWAX__TOR_CONTROL_ADDRESS: "/dns4/tor/tcp/9051" + TARI_WALLET__WEATHERWAX__TOR_SOCKS_ADDRESS_OVERRIDE: "/dns4/tor/tcp/9050" + TARI_WALLET__WEATHERWAX__TOR_FORWARD_ADDRESS: "/dns4/wallet/tcp/18188" + TARI_WALLET__WEATHERWAX__TCP_LISTENER_ADDRESS: "/dns4/wallet/tcp/18188" + TARI_BASE_NODE__WEATHERWAX__GRPC_CONSOLE_WALLET_ADDRESS: "0.0.0.0:18143" + command: ["--non-interactive"] + ports: + - 18188:18188 + - 18143:18143 + depends_on: + - tor + volumes: + - ${DATA_FOLDER}:/var/tari/ + #stdin_open: true + #tty: true sha3_miner: image: quay.io/tarilabs/tari_sha3_miner:latest @@ -101,6 +98,7 @@ services: TARI_MINING_NODE__NUM_MINING_THREADS: 2 TARI_MINING_NODE__MINE_ON_TIP_ONLY: 1 TARI_BASE_NODE__WEATHERWAX__GRPC_BASE_NODE_ADDRESS: "/dns4/base_node/tcp/18142" + TARI_BASE_NODE__WEATHERWAX__GRPC_CONSOLE_WALLET_ADDRESS: "/dns4/wallet/tcp/18143" TARI_WALLET__GRPC_ADDRESS: "/dns4/wallet/tcp/18143" command: [ ] depends_on: @@ -158,6 +156,7 @@ services: WAIT_FOR_TOR: 0 TARI_NETWORK: ${TARI_NETWORK} TARI_BASE_NODE__WEATHERWAX__GRPC_BASE_NODE_ADDRESS: "/dns4/base_node/tcp/18142" + TARI_BASE_NODE__WEATHERWAX__GRPC_CONSOLE_WALLET_ADDRESS: "/dns4/wallet/tcp/18143" TARI_WALLET__GRPC_ADDRESS: "/dns4/wallet/tcp/18143" TARI_MERGE_MINING_PROXY__WEATHERWAX__MONEROD_URL: ${TARI_MONEROD_URL:-["http://stagenet.community.xmr.to:38081","http://monero-stagenet.exan.tech:38081","http://stagenet.xmr-tw.org:38081","http://xmr-lux.boldsuck.org:38081","http://singapore.node.xmr.pm:38081"]} TARI_MERGE_MINING_PROXY__WEATHERWAX__MONEROD_USERNAME: ${TARI_MONEROD_USERNAME} diff --git a/applications/launchpad/docker_rig/frontail.Dockerfile b/applications/launchpad/docker_rig/frontail.Dockerfile new file mode 100644 index 0000000000..7951a1a6ae --- /dev/null +++ b/applications/launchpad/docker_rig/frontail.Dockerfile @@ -0,0 +1,9 @@ +FROM node:16-alpine + +RUN npm install -g frontail + +ADD run_frontail.sh /usr/bin/ +WORKDIR /var/tari +ENTRYPOINT ["/usr/bin/run_frontail.sh"] +EXPOSE 9001 +CMD ["--help"] \ No newline at end of file diff --git a/applications/launchpad/docker_rig/mm_proxy.Dockerfile b/applications/launchpad/docker_rig/mm_proxy.Dockerfile index 0454105599..c1e35828b9 100644 --- a/applications/launchpad/docker_rig/mm_proxy.Dockerfile +++ b/applications/launchpad/docker_rig/mm_proxy.Dockerfile @@ -1,17 +1,18 @@ -FROM quay.io/tarilabs/rust_tari-build-with-deps:nightly-2021-09-18 as builder - +FROM quay.io/tarilabs/rust_tari-build-with-deps:nightly-2021-11-01 as builder WORKDIR /tari # Adding only necessary things up front and copying the entrypoint script last # to take advantage of layer caching in docker -ADD Cargo.lock . ADD Cargo.toml . ADD applications applications ADD base_layer base_layer +ADD clients clients ADD common common +ADD common_sqlite common_sqlite ADD comms comms ADD infrastructure infrastructure ADD meta meta +ADD Cargo.lock . ADD rust-toolchain.toml . ARG ARCH=native @@ -29,6 +30,7 @@ RUN cargo build --bin tari_merge_mining_proxy --release --locked --features "$FE # Create a base minimal image for the executables FROM quay.io/bitnami/minideb:bullseye as base # Disable Prompt During Packages Installation +ARG VERSION=1.0.1 ARG DEBIAN_FRONTEND=noninteractive RUN apt update && apt -y install \ apt-transport-https \ @@ -42,6 +44,7 @@ FROM base RUN groupadd -g 1000 tari && useradd -s /bin/bash -u 1000 -g 1000 tari USER tari +ENV dockerfile_version=$VERSION ENV APP_NAME=mm_proxy APP_EXEC=tari_merge_mining_proxy COPY --from=builder /tari/target/release/$APP_EXEC /usr/bin/ diff --git a/applications/launchpad/docker_rig/monerod.Dockerfile b/applications/launchpad/docker_rig/monerod.Dockerfile index bbf2103b00..34419dbe54 100644 --- a/applications/launchpad/docker_rig/monerod.Dockerfile +++ b/applications/launchpad/docker_rig/monerod.Dockerfile @@ -1,6 +1,5 @@ # Usage: docker run --restart=always -v /var/data/blockchain-xmr:/root/.bitmonero -p 18080:18080 -p 18081:18081 --name=monerod -td kannix/monero-full-node FROM quay.io/bitnami/minideb:bullseye AS build - ENV MONERO_VERSION=0.17.2.3 MONERO_SHA256=8069012ad5e7b35f79e35e6ca71c2424efc54b61f6f93238b182981ba83f2311 @@ -16,6 +15,7 @@ RUN curl https://dlsrc.getmonero.org/cli/monero-linux-x64-v$MONERO_VERSION.tar.b rm -r monero-* FROM quay.io/bitnami/minideb:bullseye +ARG VERSION=1.0.1 RUN groupadd -g 1000 tari && useradd -ms /bin/bash -u 1000 -g 1000 tari \ && mkdir -p /home/tari/.bitmonero \ @@ -27,6 +27,7 @@ COPY --chown=tari:tari --from=build /root/monerod /home/tari/monerod # blockchain location VOLUME /home/tari/.bitmonero +ENV dockerfile_version=$VERSION EXPOSE 18080 18081 diff --git a/applications/launchpad/docker_rig/push_bundle.sh b/applications/launchpad/docker_rig/push_bundle.sh deleted file mode 100755 index 051b8767dd..0000000000 --- a/applications/launchpad/docker_rig/push_bundle.sh +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright 2021. The Tari Project -# -# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the -# following conditions are met: -# -# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following -# disclaimer. -# -# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the -# following disclaimer in the documentation and/or other materials provided with the distribution. -# -# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote -# products derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE -# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - - #!/usr/local/bin/bash -export DATA_FOLDER="/tmp/push_bundle" - -check_data_folder() { - if [[ ! -d "$DATA_FOLDER" ]]; then - echo "Creating data folder $DATA_FOLDER.." - mkdir -p "$DATA_FOLDER" - mkdir -p "$DATA_FOLDER/tor" - mkdir -p "$DATA_FOLDER/xmrig" - mkdir -p "$DATA_FOLDER/monerod" - mkdir -p "$DATA_FOLDER/mm_proxy" - cp torrc "$DATA_FOLDER/tor" - CREATE_CONFIG=1 - CREATE_ID=1 - echo "Done." - else - echo "Using existing data folder $DATA_FOLDER" - fi -} - -check_data_folder - -declare -A versions - -versions["tari_base_node"]="$(docker compose run --rm base_node --version | awk '/tari_common /{print $NF}')" -versions["wallet"]="$(docker compose run --rm wallet --version | awk '/tari_common /{print $NF}')" -versions["sha3_miner"]="$(docker compose run --rm sha3_miner --version | awk '/tari_common /{print $NF}')" -versions["mm_proxy"]="$(docker compose run --rm mm_proxy --version | awk '/tari_common /{print $NF}')" -versions["xmrig"]="$(docker compose run --rm xmrig --version | awk '/XMRig /{print $NF}')" -versions["tor"]="$(docker compose run --rm tor tor --version | awk '/Tor version /{print $NF}')" -versions["monerod"]="$(docker compose run --rm monerod --version | sed 's/Monero .*(\(.*\)-.*)/\1/')" - -echo "${versions[@]}" - -for i in tari_base_node wallet sha3_miner mm_proxy_ver xmrig_ver tor_ver monerod; do - docker image tag quay.io/tarilabs/$i:latest quay.io/tarilabs/$i:${versions[$i]} - docker push quay.io/tarilabs/$i:${versions[$i]} - docker push quay.io/tarilabs/$i:latest -done \ No newline at end of file diff --git a/applications/launchpad/docker_rig/run_frontail.sh b/applications/launchpad/docker_rig/run_frontail.sh new file mode 100755 index 0000000000..7687a3ceb3 --- /dev/null +++ b/applications/launchpad/docker_rig/run_frontail.sh @@ -0,0 +1,3 @@ +#!/bin/sh +echo Starting frontail log viewer: $@ +frontail $@ \ No newline at end of file diff --git a/applications/launchpad/docker_rig/sha3_miner.Dockerfile b/applications/launchpad/docker_rig/sha3_miner.Dockerfile index 365dbe4418..bba6690c53 100644 --- a/applications/launchpad/docker_rig/sha3_miner.Dockerfile +++ b/applications/launchpad/docker_rig/sha3_miner.Dockerfile @@ -1,17 +1,19 @@ -FROM quay.io/tarilabs/rust_tari-build-with-deps:nightly-2021-09-18 as builder +FROM quay.io/tarilabs/rust_tari-build-with-deps:nightly-2021-11-01 as builder WORKDIR /tari # Adding only necessary things up front and copying the entrypoint script last # to take advantage of layer caching in docker -ADD Cargo.lock . ADD Cargo.toml . ADD applications applications ADD base_layer base_layer +ADD clients clients ADD common common +ADD common_sqlite common_sqlite ADD comms comms ADD infrastructure infrastructure ADD meta meta +ADD Cargo.lock . ADD rust-toolchain.toml . ARG ARCH=native @@ -27,6 +29,7 @@ RUN cargo build --bin tari_mining_node --release --features $FEATURES --locked # Create a base minimal image for the executables FROM quay.io/bitnami/minideb:bullseye as base +ARG VERSION=1.0.1 # Disable Prompt During Packages Installation ARG DEBIAN_FRONTEND=noninteractive RUN apt update && apt -y install \ @@ -43,6 +46,7 @@ FROM base RUN groupadd -g 1000 tari && useradd -s /bin/bash -u 1000 -g 1000 tari USER tari +ENV dockerfile_version=$VERSION ENV APP_NAME=sha3_miner APP_EXEC=tari_mining_node COPY --from=builder /tari/target/release/$APP_EXEC /usr/bin/ diff --git a/applications/launchpad/docker_rig/tor.Dockerfile b/applications/launchpad/docker_rig/tor.Dockerfile index 856b5f25d2..a532913eb1 100644 --- a/applications/launchpad/docker_rig/tor.Dockerfile +++ b/applications/launchpad/docker_rig/tor.Dockerfile @@ -1,4 +1,5 @@ FROM alpine:latest +ARG VERSION=1.0.1 RUN apk update \ && apk upgrade \ @@ -8,7 +9,7 @@ RUN apk update \ EXPOSE 9050 EXPOSE 9051 -ADD torrc /etc/tor +ENV dockerfile_version=$VERSION USER tor CMD /usr/bin/tor -f /etc/tor/torrc diff --git a/applications/launchpad/docker_rig/xmrig.Dockerfile b/applications/launchpad/docker_rig/xmrig.Dockerfile index 1205749449..a86ec8ebd9 100644 --- a/applications/launchpad/docker_rig/xmrig.Dockerfile +++ b/applications/launchpad/docker_rig/xmrig.Dockerfile @@ -1,6 +1,6 @@ FROM alpine:latest as build -ARG VERSION="v6.15.3" +ARG XMRIG_VERSION="v6.15.3" RUN apk add \ git \ @@ -14,7 +14,7 @@ RUN apk add \ autoconf \ linux-headers -RUN git clone --branch ${VERSION} https://github.com/xmrig/xmrig.git +RUN git clone --branch ${XMRIG_VERSION} https://github.com/xmrig/xmrig.git RUN mkdir xmrig/build WORKDIR /xmrig/scripts RUN ./build_deps.sh @@ -23,13 +23,16 @@ RUN cmake .. -DXMRIG_DEPS=scripts/deps -DBUILD_STATIC=ON RUN make -j$(nproc) FROM alpine:latest as base +ARG VERSION=1.0.1 COPY --from=build /xmrig/build/xmrig /usr/bin/ # Create a user & group -RUN groupadd -g 1000 tari && useradd -ms /bin/bash -u 1000 -g 1000 tari - +RUN addgroup -g 1000 tari && adduser -u 1000 -g 1000 -S tari -G tari +RUN mkdir -p /home/tari && chown tari.tari /home/tari # Chown all the files to the app user. USER tari +ENV dockerfile_version=$VERSION +ENV xmrig_version=$XMRIG_VERSION RUN echo -e "\ {\ @@ -41,6 +44,6 @@ RUN echo -e "\ { \"coin\": \"monero\", \"url\": \"127.0.0.1:18081\", \"user\": \"44\", \"daemon\": true }\ ]\ }\ -" > /home/xmrig/.xmrig.json +" > /home/tari/.xmrig.json ENTRYPOINT [ "/usr/bin/xmrig" ] diff --git a/applications/launchpad/gui-vue/.gitignore b/applications/launchpad/gui-vue/.gitignore new file mode 100644 index 0000000000..403adbc1e5 --- /dev/null +++ b/applications/launchpad/gui-vue/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +node_modules +/dist + + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/applications/launchpad/gui-vue/README.md b/applications/launchpad/gui-vue/README.md new file mode 100644 index 0000000000..06c4379054 --- /dev/null +++ b/applications/launchpad/gui-vue/README.md @@ -0,0 +1,24 @@ +# gui-vue + +## Project setup +``` +npm install +``` + +### Compiles and hot-reloads for development +``` +npm run serve +``` + +### Compiles and minifies for production +``` +npm run build +``` + +### Lints and fixes files +``` +npm run lint +``` + +### Customize configuration +See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/applications/launchpad/gui-vue/babel.config.js b/applications/launchpad/gui-vue/babel.config.js new file mode 100644 index 0000000000..e9558405fd --- /dev/null +++ b/applications/launchpad/gui-vue/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/cli-plugin-babel/preset' + ] +} diff --git a/applications/launchpad/gui-vue/package-lock.json b/applications/launchpad/gui-vue/package-lock.json new file mode 100644 index 0000000000..e047e03dcc --- /dev/null +++ b/applications/launchpad/gui-vue/package-lock.json @@ -0,0 +1,15810 @@ +{ + "name": "gui-vue", + "version": "0.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/compat-data": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true + }, + "@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", + "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", + "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", + "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", + "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", + "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", + "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", + "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "requires": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + } + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==" + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", + "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", + "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", + "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", + "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", + "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.4.tgz", + "integrity": "sha512-RESBNX16eNqnBeEVR5sCJpnW0mHiNLNNvGA8PrRuK/4ZJ4TO+6bHleRUuGQYDERVySOKtOhSya/C4MIhwAMAgg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-decorators": "^7.16.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", + "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", + "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", + "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", + "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", + "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", + "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", + "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", + "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", + "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", + "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", + "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", + "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.0.tgz", + "integrity": "sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz", + "integrity": "sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", + "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", + "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", + "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", + "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", + "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", + "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", + "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", + "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", + "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", + "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", + "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", + "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", + "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", + "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", + "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", + "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.16.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", + "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", + "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", + "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", + "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", + "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", + "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", + "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", + "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", + "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz", + "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", + "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", + "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", + "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", + "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", + "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", + "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", + "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", + "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.4", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-class-static-block": "^7.16.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.0", + "@babel/plugin-proposal-export-namespace-from": "^7.16.0", + "@babel/plugin-proposal-json-strings": "^7.16.0", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-object-rest-spread": "^7.16.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.0", + "@babel/plugin-transform-async-to-generator": "^7.16.0", + "@babel/plugin-transform-block-scoped-functions": "^7.16.0", + "@babel/plugin-transform-block-scoping": "^7.16.0", + "@babel/plugin-transform-classes": "^7.16.0", + "@babel/plugin-transform-computed-properties": "^7.16.0", + "@babel/plugin-transform-destructuring": "^7.16.0", + "@babel/plugin-transform-dotall-regex": "^7.16.0", + "@babel/plugin-transform-duplicate-keys": "^7.16.0", + "@babel/plugin-transform-exponentiation-operator": "^7.16.0", + "@babel/plugin-transform-for-of": "^7.16.0", + "@babel/plugin-transform-function-name": "^7.16.0", + "@babel/plugin-transform-literals": "^7.16.0", + "@babel/plugin-transform-member-expression-literals": "^7.16.0", + "@babel/plugin-transform-modules-amd": "^7.16.0", + "@babel/plugin-transform-modules-commonjs": "^7.16.0", + "@babel/plugin-transform-modules-systemjs": "^7.16.0", + "@babel/plugin-transform-modules-umd": "^7.16.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", + "@babel/plugin-transform-new-target": "^7.16.0", + "@babel/plugin-transform-object-super": "^7.16.0", + "@babel/plugin-transform-parameters": "^7.16.3", + "@babel/plugin-transform-property-literals": "^7.16.0", + "@babel/plugin-transform-regenerator": "^7.16.0", + "@babel/plugin-transform-reserved-words": "^7.16.0", + "@babel/plugin-transform-shorthand-properties": "^7.16.0", + "@babel/plugin-transform-spread": "^7.16.0", + "@babel/plugin-transform-sticky-regex": "^7.16.0", + "@babel/plugin-transform-template-literals": "^7.16.0", + "@babel/plugin-transform-typeof-symbol": "^7.16.0", + "@babel/plugin-transform-unicode-escapes": "^7.16.0", + "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.0", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.19.1", + "semver": "^6.3.0" + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + } + }, + "@fortawesome/free-brands-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.4.tgz", + "integrity": "sha512-f1witbwycL9cTENJegcmcZRYyawAFbm8+c6IirLmwbbpqz46wyjbQYLuxOc7weXFXfB7QR8/Vd2u5R3q6JYD9g==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + } + }, + "@fortawesome/free-regular-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", + "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + } + }, + "@fortawesome/vue-fontawesome": { + "version": "3.0.0-5", + "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.0-5.tgz", + "integrity": "sha512-aNmBT4bOecrFsZTog1l6AJDQHPP3ocXV+WQ3Ogy8WZCqstB/ahfhH4CPu5i4N9Hw0MBKXqE+LX+NbUxcj8cVTw==" + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "dev": true, + "requires": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + } + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@oruga-ui/oruga-next": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@oruga-ui/oruga-next/-/oruga-next-0.4.8.tgz", + "integrity": "sha512-gIN26oHacUcJTeNfQEmgnDWSa0EKOAzGfBqLslFnHpTIHvow/NIiO5raI7N6SqNOvw0q+BU5PKw7AYC2ecAQRw==" + }, + "@sindresorhus/is": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", + "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==", + "dev": true + }, + "@soda/friendly-errors-webpack-plugin": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", + "integrity": "sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "error-stack-parser": "^2.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.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": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "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" + } + } + } + }, + "@soda/get-current-script": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz", + "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "@tauri-apps/api": { + "version": "1.0.0-beta.8", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.0.0-beta.8.tgz", + "integrity": "sha512-a56lXB7XvQ4+fKtT0pxpkjTSKhyrQ1Vmjyvt2ox3mT9xw3l7s8IOKHJ1WuqW6TA6xdoy3Cyja3Z3prw8hflS7g==" + }, + "@tauri-apps/cli": { + "version": "1.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.0.0-beta.10.tgz", + "integrity": "sha512-T0cvV5Y5vCeEw6tQ7DfuGhXxxe26AwW9i3oYT/AQZlwrLG9Xk02Pp0/lKqd/WeddE3X/IFfSm8YMRCz3VElIWQ==", + "dev": true, + "requires": { + "@tauri-apps/toml": "2.2.4", + "chalk": "4.1.2", + "cross-env": "7.0.3", + "cross-spawn": "7.0.3", + "fs-extra": "10.0.0", + "global-agent": "3.0.0", + "got": "11.8.2", + "imagemin": "8.0.1", + "imagemin-optipng": "8.0.0", + "imagemin-zopfli": "7.0.0", + "inquirer": "8.1.2", + "is-png": "3.0.0", + "minimist": "1.2.5", + "ms": "2.1.3", + "png2icons": "2.0.1", + "read-chunk": "3.2.0", + "semver": "7.3.5", + "sharp": "0.28.3", + "update-notifier": "5.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "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 + }, + "inquirer": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.2.tgz", + "integrity": "sha512-DHLKJwLPNgkfwNmsuEUKSejJFbkv0FMO9SMiQbjI3n5NQuCrSIBqP66ggqyz2a6t2qEolKrMjhQ3+W/xXgUQ+Q==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.3.0", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, + "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" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "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 + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "rxjs": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", + "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "dev": true, + "requires": { + "tslib": "~2.1.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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 + }, + "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" + } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@tauri-apps/toml": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/toml/-/toml-2.2.4.tgz", + "integrity": "sha512-NJV/pdgJObDlDWi5+MTHZ2qyNvdL0dlHqQ72nzQYXWbW1LHMPXgCJYl0pLqL1XxxLtxtInYbtVCGVAcwhGxdkw==", + "dev": true + }, + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/cacheable-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz", + "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.25.tgz", + "integrity": "sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/keyv": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", + "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "@types/node": { + "version": "16.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", + "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack": { + "version": "4.41.32", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz", + "integrity": "sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/webpack-dev-server": { + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz", + "integrity": "sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==", + "dev": true, + "requires": { + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/serve-static": "*", + "@types/webpack": "^4", + "http-proxy-middleware": "^1.0.0" + } + }, + "@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.2.1.tgz", + "integrity": "sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==", + "dev": true + }, + "@vue/babel-helper-vue-transform-on": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", + "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "dev": true + }, + "@vue/babel-plugin-jsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", + "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "@vue/babel-helper-vue-transform-on": "^1.0.2", + "camelcase": "^6.0.0", + "html-tags": "^3.1.0", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.2.1.tgz", + "integrity": "sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + } + } + }, + "@vue/babel-preset-app": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.15.tgz", + "integrity": "sha512-J+YttzvwRfV1BPczf8r3qCevznYk+jh531agVF+5EYlHF4Sgh/cGXTz9qkkiux3LQgvhEGXgmCteg1n38WuuKg==", + "dev": true, + "requires": { + "@babel/core": "^7.11.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.0", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.2.4", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5", + "semver": "^6.1.0" + } + }, + "@vue/babel-preset-jsx": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.2.4.tgz", + "integrity": "sha512-oRVnmN2a77bYDJzeGSt92AuHXbkIxbf/XXSE3klINnh9AXBmVS1DGa1f0d+dDYpLfsAKElMnqKTQfKn7obcL4w==", + "dev": true, + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/babel-sugar-composition-api-inject-h": "^1.2.1", + "@vue/babel-sugar-composition-api-render-instance": "^1.2.4", + "@vue/babel-sugar-functional-vue": "^1.2.2", + "@vue/babel-sugar-inject-h": "^1.2.2", + "@vue/babel-sugar-v-model": "^1.2.3", + "@vue/babel-sugar-v-on": "^1.2.3" + } + }, + "@vue/babel-sugar-composition-api-inject-h": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.2.1.tgz", + "integrity": "sha512-4B3L5Z2G+7s+9Bwbf+zPIifkFNcKth7fQwekVbnOA3cr3Pq71q71goWr97sk4/yyzH8phfe5ODVzEjX7HU7ItQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-composition-api-render-instance": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.2.4.tgz", + "integrity": "sha512-joha4PZznQMsxQYXtR3MnTgCASC9u3zt9KfBxIeuI5g2gscpTsSKRDzWQt4aqNIpx6cv8On7/m6zmmovlNsG7Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-functional-vue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.2.2.tgz", + "integrity": "sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-inject-h": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.2.2.tgz", + "integrity": "sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-v-model": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.2.3.tgz", + "integrity": "sha512-A2jxx87mySr/ulAsSSyYE8un6SIH0NWHiLaCWpodPCVOlQVODCaSpiR4+IMsmBr73haG+oeCuSvMOM+ttWUqRQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "dev": true + } + } + }, + "@vue/babel-sugar-v-on": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.2.3.tgz", + "integrity": "sha512-kt12VJdz/37D3N3eglBywV8GStKNUhNrsxChXIV+o0MwVXORYuhDTHJRKPgLJRb/EY3vM2aRFQdxJBp9CLikjw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "camelcase": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "@vue/cli-overlay": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-4.5.15.tgz", + "integrity": "sha512-0zI0kANAVmjFO2LWGUIzdGPMeE3+9k+KeRDXsUqB30YfRF7abjfiiRPq5BU9pOzlJbVdpRkisschBrvdJqDuDg==", + "dev": true + }, + "@vue/cli-plugin-babel": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.15.tgz", + "integrity": "sha512-hBLrwYfFkHldEe34op/YNgPhpOWI5n5DB2Qt9I/1Epeif4M4iFaayrgjvOR9AVM6WbD3Yx7WCFszYpWrQZpBzQ==", + "dev": true, + "requires": { + "@babel/core": "^7.11.0", + "@vue/babel-preset-app": "^4.5.15", + "@vue/cli-shared-utils": "^4.5.15", + "babel-loader": "^8.1.0", + "cache-loader": "^4.1.0", + "thread-loader": "^2.1.3", + "webpack": "^4.0.0" + } + }, + "@vue/cli-plugin-eslint": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.15.tgz", + "integrity": "sha512-/2Fl6wY/5bz3HD035oSnFRMsKNxDxU396KqBdpCQdwdvqk4mm6JAbXqihpcBRTNPeTO6w+LwGe6FE56PVbJdbg==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.5.15", + "eslint-loader": "^2.2.1", + "globby": "^9.2.0", + "inquirer": "^7.1.0", + "webpack": "^4.0.0", + "yorkie": "^2.0.0" + } + }, + "@vue/cli-plugin-router": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-4.5.15.tgz", + "integrity": "sha512-q7Y6kP9b3k55Ca2j59xJ7XPA6x+iSRB+N4ac0ZbcL1TbInVQ4j5wCzyE+uqid40hLy4fUdlpl4X9fHJEwuVxPA==", + "dev": true, + "requires": { + "@vue/cli-shared-utils": "^4.5.15" + } + }, + "@vue/cli-plugin-vuex": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.15.tgz", + "integrity": "sha512-fqap+4HN+w+InDxlA3hZTOGE0tzBTgXhKLoDydhywqgmhQ1D9JA6Feh94ze6tG8DsWX58/ujYUqA8jAz17FJtg==", + "dev": true + }, + "@vue/cli-service": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-4.5.15.tgz", + "integrity": "sha512-sFWnLYVCn4zRfu45IcsIE9eXM0YpDV3S11vlM2/DVbIPAGoYo5ySpSof6aHcIvkeGsIsrHFpPHzNvDZ/efs7jA==", + "dev": true, + "requires": { + "@intervolga/optimize-cssnano-plugin": "^1.0.5", + "@soda/friendly-errors-webpack-plugin": "^1.7.1", + "@soda/get-current-script": "^1.0.0", + "@types/minimist": "^1.2.0", + "@types/webpack": "^4.0.0", + "@types/webpack-dev-server": "^3.11.0", + "@vue/cli-overlay": "^4.5.15", + "@vue/cli-plugin-router": "^4.5.15", + "@vue/cli-plugin-vuex": "^4.5.15", + "@vue/cli-shared-utils": "^4.5.15", + "@vue/component-compiler-utils": "^3.1.2", + "@vue/preload-webpack-plugin": "^1.1.0", + "@vue/web-component-wrapper": "^1.2.0", + "acorn": "^7.4.0", + "acorn-walk": "^7.1.1", + "address": "^1.1.2", + "autoprefixer": "^9.8.6", + "browserslist": "^4.12.0", + "cache-loader": "^4.1.0", + "case-sensitive-paths-webpack-plugin": "^2.3.0", + "cli-highlight": "^2.1.4", + "clipboardy": "^2.3.0", + "cliui": "^6.0.0", + "copy-webpack-plugin": "^5.1.1", + "css-loader": "^3.5.3", + "cssnano": "^4.1.10", + "debug": "^4.1.1", + "default-gateway": "^5.0.5", + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^4.2.0", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "hash-sum": "^2.0.0", + "html-webpack-plugin": "^3.2.0", + "launch-editor-middleware": "^2.2.1", + "lodash.defaultsdeep": "^4.6.1", + "lodash.mapvalues": "^4.6.0", + "lodash.transform": "^4.6.0", + "mini-css-extract-plugin": "^0.9.0", + "minimist": "^1.2.5", + "pnp-webpack-plugin": "^1.6.4", + "portfinder": "^1.0.26", + "postcss-loader": "^3.0.0", + "ssri": "^8.0.1", + "terser-webpack-plugin": "^1.4.4", + "thread-loader": "^2.1.3", + "url-loader": "^2.2.0", + "vue-loader": "^15.9.2", + "vue-loader-v16": "npm:vue-loader@^16.1.0", + "vue-style-loader": "^4.1.2", + "webpack": "^4.0.0", + "webpack-bundle-analyzer": "^3.8.0", + "webpack-chain": "^6.4.0", + "webpack-dev-server": "^3.11.0", + "webpack-merge": "^4.2.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": 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, + "optional": true + }, + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "optional": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "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, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.8.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", + "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + } + } + } + }, + "@vue/cli-shared-utils": { + "version": "4.5.15", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-4.5.15.tgz", + "integrity": "sha512-SKaej9hHzzjKSOw1NlFmc6BSE0vcqUQMQiv1cxQ2DhVyy4QxZXBmzmiLBUBe+hYZZs1neXW7n//udeN9bCAY+Q==", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.1", + "chalk": "^2.4.2", + "execa": "^1.0.0", + "launch-editor": "^2.2.1", + "lru-cache": "^5.1.1", + "node-ipc": "^9.1.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "read-pkg": "^5.1.1", + "request": "^2.88.2", + "semver": "^6.1.0", + "strip-ansi": "^6.0.0" + } + }, + "@vue/compiler-core": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.22.tgz", + "integrity": "sha512-uAkovrVeTcjzpiM4ECmVaMrv/bjdgAaLzvjcGqQPBEyUrcqsCgccT9fHJ/+hWVGhyMahmBwLqcn4guULNx7sdw==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/shared": "3.2.22", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@vue/compiler-dom": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.22.tgz", + "integrity": "sha512-VZdsw/VuO1ODs8K7NQwnMQzKITDkIFlYYC03SVnunuf6eNRxBPEonSyqbWNoo6qNaHAEBTG6VVcZC5xC9bAx1g==", + "requires": { + "@vue/compiler-core": "3.2.22", + "@vue/shared": "3.2.22" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.22.tgz", + "integrity": "sha512-tWRQ5ge1tsTDhUwHgueicKJ8rYm6WUVAPTaIpFW3GSwZKcOEJ2rXdfkHFShNVGupeRALz2ET2H84OL0GeRxY0A==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.22", + "@vue/compiler-dom": "3.2.22", + "@vue/compiler-ssr": "3.2.22", + "@vue/ref-transform": "3.2.22", + "@vue/shared": "3.2.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "postcss": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.1.tgz", + "integrity": "sha512-WqLs/TTzXdG+/A4ZOOK9WDZiikrRaiA+eoEb/jz2DT9KUhMNHgP7yKPO8vwi62ZCsb703Gwb7BMZwDzI54Y2Ag==", + "requires": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@vue/compiler-ssr": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.22.tgz", + "integrity": "sha512-Cl6aoLJtXzzBkk1sKod8S0WBJLts3+ugVC91d22gGpbkw/64WnF12tOZi7Rg54PPLi1NovqyNWPsLH/SAFcu+w==", + "requires": { + "@vue/compiler-dom": "3.2.22", + "@vue/shared": "3.2.22" + } + }, + "@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2 || ^2.0.0", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "@vue/devtools-api": { + "version": "6.0.0-beta.20.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.0-beta.20.1.tgz", + "integrity": "sha512-R2rfiRY+kZugzWh9ZyITaovx+jpU4vgivAEAiz80kvh3yviiTU3CBuGuyWpSwGz9/C7TkSWVM/FtQRGlZ16n8Q==" + }, + "@vue/preload-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", + "dev": true + }, + "@vue/reactivity": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.22.tgz", + "integrity": "sha512-xNkLAItjI0xB+lFeDgKCrSItmrHTaAzSnt8LmdSCPQnDyarmzbi/u4ESQnckWvlL7lSRKiEaOvblaNyqAa7OnQ==", + "requires": { + "@vue/shared": "3.2.22" + } + }, + "@vue/ref-transform": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/ref-transform/-/ref-transform-3.2.22.tgz", + "integrity": "sha512-qalVWbq5xWWxLZ0L9OroBg/JZhzavQuCcDXblfErxyDEH6Xc5gIJ4feo1SVCICFzhAUgLgQTdSFLpgjBawbFpw==", + "requires": { + "@babel/parser": "^7.15.0", + "@vue/compiler-core": "3.2.22", + "@vue/shared": "3.2.22", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.22.tgz", + "integrity": "sha512-e7WOC55wmHPvmoVUk9VBe/Z9k5bJfWJfVIlkUkiADJn0bOgQD29oh/GS14Kb3aEJXIHLI17Em6+HxNut1sIh7Q==", + "requires": { + "@vue/reactivity": "3.2.22", + "@vue/shared": "3.2.22" + } + }, + "@vue/runtime-dom": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.22.tgz", + "integrity": "sha512-w7VHYJoliLRTLc5beN77wxuOjla4v9wr2FF22xpZFYBmH4U1V7HkYhoHc1BTuNghI15CXT1tNIMhibI1nrQgdw==", + "requires": { + "@vue/runtime-core": "3.2.22", + "@vue/shared": "3.2.22", + "csstype": "^2.6.8" + } + }, + "@vue/server-renderer": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.22.tgz", + "integrity": "sha512-jCwbQgKPXiXoH9VS9F7K+gyEvEMrjutannwEZD1R8fQ9szmOTqC+RRbIY3Uf2ibQjZtZ8DV9a4FjxICvd9zZlQ==", + "requires": { + "@vue/compiler-ssr": "3.2.22", + "@vue/shared": "3.2.22" + } + }, + "@vue/shared": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.22.tgz", + "integrity": "sha512-qWVav014mpjEtbWbEgl0q9pEyrrIySKum8UVYjwhC6njrKzknLZPvfuYdQyVbApsqr94tf/3dP4pCuZmmjdCWQ==" + }, + "@vue/web-component-wrapper": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz", + "integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "CBuffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/CBuffer/-/CBuffer-2.2.0.tgz", + "integrity": "sha512-dbfGsL/kaEA07tNX4NdUPwToq/elfc+4IbDnq5INOl+LmYlaAqfTXqwnDCfvUeYtO78Ts2WhaCOUn3bSZgDwZA==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "requires": { + "string-width": "^4.1.0" + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, + "archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "dev": true, + "requires": { + "file-type": "^4.2.0" + }, + "dependencies": { + "file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=", + "dev": true + } + } + }, + "are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "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": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "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": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "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 + }, + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, + "babel-eslint": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz", + "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.7.0", + "@babel/traverse": "^7.7.0", + "@babel/types": "^7.7.0", + "eslint-visitor-keys": "^1.0.0", + "resolve": "^1.12.0" + } + }, + "babel-loader": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", + "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.0", + "semver": "^6.1.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", + "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.0", + "core-js-compat": "^3.18.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", + "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.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": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "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 + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bfj": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", + "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "check-types": "^8.0.3", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "bin-build": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", + "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", + "dev": true, + "requires": { + "decompress": "^4.0.0", + "download": "^6.2.2", + "execa": "^0.7.0", + "p-map-series": "^1.0.0", + "tempfile": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "bin-check": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "executable": "^4.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "bin-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", + "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "find-versions": "^3.0.0" + } + }, + "bin-version-check": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", + "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", + "dev": true, + "requires": { + "bin-version": "^3.0.0", + "semver": "^5.6.0", + "semver-truncate": "^1.1.2" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "bin-wrapper": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz", + "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", + "dev": true, + "requires": { + "bin-check": "^4.1.0", + "bin-version-check": "^4.0.0", + "download": "^7.1.0", + "import-lazy": "^3.1.0", + "os-filter-obj": "^2.0.0", + "pify": "^4.0.1" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "dev": true + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", + "dev": true, + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "download": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", + "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", + "dev": true, + "requires": { + "archive-type": "^4.0.0", + "caw": "^2.0.1", + "content-disposition": "^0.5.2", + "decompress": "^4.2.0", + "ext-name": "^5.0.0", + "file-type": "^8.1.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^8.3.1", + "make-dir": "^1.2.0", + "p-event": "^2.1.0", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "file-type": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", + "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "dev": true + }, + "p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "dev": true, + "requires": { + "p-timeout": "^2.0.1" + } + }, + "p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + } + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true + }, + "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" + } + }, + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boolean": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz", + "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==", + "dev": true + }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "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" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "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" + } + } + } + }, + "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": "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": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "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": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", + "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + } + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + } + } + }, + "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" + } + }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "dev": true, + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + } + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", + "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001283", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz", + "integrity": "sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==", + "dev": true + }, + "case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "caw": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "dev": true, + "requires": { + "get-proxy": "^2.0.0", + "isurl": "^1.0.0-alpha5", + "tunnel-agent": "^0.6.0", + "url-to-options": "^1.0.1" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "check-types": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", + "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "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": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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 + } + } + }, + "clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.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" + } + } + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "clipboardy": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz", + "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==", + "dev": true, + "requires": { + "arch": "^2.1.1", + "execa": "^1.0.0", + "is-wsl": "^2.1.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" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "console-stream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", + "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=", + "dev": true + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "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" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "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": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + } + } + }, + "core-js": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.1.tgz", + "integrity": "sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==" + }, + "core-js-compat": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", + "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", + "dev": true, + "requires": { + "browserslist": "^4.17.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + }, + "dependencies": { + "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" + } + }, + "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 + }, + "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 + }, + "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" + } + } + } + }, + "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" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.6.0.tgz", + "integrity": "sha512-M5lSukoWi1If8dhQAUCvj4H8vUt3vOnwbQBH9DdTm/s4Ym2B/3dPMtYZeJmq7Q3S3Pa+I94DcZ7pc9bP14cWIQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.32", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^2.7.0", + "semver": "^6.3.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "csstype": { + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dev": true, + "requires": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + }, + "dependencies": { + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } + } + }, + "decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dev": true, + "requires": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + } + } + }, + "decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "dependencies": { + "file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "dev": true + } + } + }, + "decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dev": true, + "requires": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "dependencies": { + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + } + } + }, + "decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "dev": true, + "requires": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "dependencies": { + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "dev": true + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true + }, + "default-gateway": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-5.0.5.tgz", + "integrity": "sha512-z2RnruVmj8hVMmAnEJMTIJNijhKCDiGjbLP+BHJFOT7ld3Bo5qcIBpVYDniqhbMIIf+jZDlkP2MkPXiQy/DBLA==", + "dev": true, + "requires": { + "execa": "^3.3.0" + }, + "dependencies": { + "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" + } + }, + "execa": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", + "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "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" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "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 + }, + "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 + }, + "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" + } + } + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "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" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "dotenv": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", + "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "download": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", + "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", + "dev": true, + "requires": { + "caw": "^2.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.0.0", + "ext-name": "^5.0.0", + "file-type": "5.2.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^7.0.0", + "make-dir": "^1.0.0", + "p-event": "^1.0.0", + "pify": "^3.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dev": true, + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "^1.0.1" + } + } + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "easy-stack": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz", + "integrity": "sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.1.tgz", + "integrity": "sha512-9ldvb6QMHiDpUNF1iSwBTiTT0qXEN+xIO5WlCJrC5gt0z74ofOiqR698vaJqYWnri0XZiF0YmnrFmGq/EmpGAA==", + "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" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "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" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "dev": true, + "requires": { + "stackframe": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-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" + } + }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "eslint-loader": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz", + "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==", + "dev": true, + "requires": { + "loader-fs-cache": "^1.0.0", + "loader-utils": "^1.0.2", + "object-assign": "^4.0.1", + "object-hash": "^1.1.4", + "rimraf": "^2.6.1" + } + }, + "eslint-plugin-vue": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz", + "integrity": "sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==", + "dev": true, + "requires": { + "eslint-utils": "^2.1.0", + "natural-compare": "^1.4.0", + "semver": "^6.3.0", + "vue-eslint-parser": "^7.10.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "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 + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-pubsub": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz", + "integrity": "sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-buffer": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/exec-buffer/-/exec-buffer-3.2.0.tgz", + "integrity": "sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==", + "dev": true, + "requires": { + "execa": "^0.7.0", + "p-finally": "^1.0.0", + "pify": "^3.0.0", + "rimraf": "^2.5.4", + "tempfile": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "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" + } + }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "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": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "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": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "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": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dev": true, + "requires": { + "mime-db": "^1.28.0" + } + }, + "ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dev": true, + "requires": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "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": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "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": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "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": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "requires": { + "flat-cache": "^2.0.1" + } + }, + "file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + } + }, + "file-type": { + "version": "16.5.3", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.3.tgz", + "integrity": "sha512-uVsl7iFhHSOY4bEONLlTK47iAHtNsFHWP5YE4xJfZ4rnX7S1Q3wce09XgqSC7E/xh8Ncv/be1lNoyprlUH/x6A==", + "dev": true, + "requires": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.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 + }, + "filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "dev": true + }, + "filenamify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "dev": true, + "requires": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "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": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dev": true, + "requires": { + "semver-regex": "^2.0.0" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", + "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-proxy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "dev": true, + "requires": { + "npm-conf": "^1.1.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "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" + } + }, + "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": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, + "global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "dev": true, + "requires": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "dependencies": { + "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.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "requires": { + "ini": "2.0.0" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globalthis": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.2.tgz", + "integrity": "sha512-ZQnSFO1la8P7auIOQECnm0sSuoMeaSq0EEdXMBFF2QJO4uNcwbyhSgG3MruWNbFTqCLmxVwGOl7LZ9kASvHdeQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "got": { + "version": "11.8.2", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.2.tgz", + "integrity": "sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.1", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "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-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dev": true, + "requires": { + "has-symbol-support-x": "^1.4.1" + } + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "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": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "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" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, + "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 + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true + }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "imagemin": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-8.0.1.tgz", + "integrity": "sha512-Q/QaPi+5HuwbZNtQRqUVk6hKacI6z9iWiCSQBisAv7uBynZwO7t1svkryKl7+iSQbkU/6t9DWnHz04cFs2WY7w==", + "dev": true, + "requires": { + "file-type": "^16.5.3", + "globby": "^12.0.0", + "graceful-fs": "^4.2.8", + "junk": "^3.1.0", + "p-pipe": "^4.0.0", + "replace-ext": "^2.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true + }, + "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" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "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" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.0.2.tgz", + "integrity": "sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ==", + "dev": true, + "requires": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.8", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "dependencies": { + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "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 + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "imagemin-optipng": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/imagemin-optipng/-/imagemin-optipng-8.0.0.tgz", + "integrity": "sha512-CUGfhfwqlPjAC0rm8Fy+R2DJDBGjzy2SkfyT09L8rasnF9jSoHFqJ1xxSZWK6HVPZBMhGPMxCTL70OgTHlLF5A==", + "dev": true, + "requires": { + "exec-buffer": "^3.0.0", + "is-png": "^2.0.0", + "optipng-bin": "^7.0.0" + }, + "dependencies": { + "is-png": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-png/-/is-png-2.0.0.tgz", + "integrity": "sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==", + "dev": true + } + } + }, + "imagemin-zopfli": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/imagemin-zopfli/-/imagemin-zopfli-7.0.0.tgz", + "integrity": "sha512-nmffj58rVb0O3AlCZLBBVKGyZ5MYPZZfKxUhvA7bwPGougHl/F7EUKSse9jkgXjdvtJYG2ojJeh5N67mYgBM9g==", + "dev": true, + "requires": { + "exec-buffer": "^3.0.0", + "is-png": "^2.0.0", + "zopflipng-bin": "^6.0.0" + }, + "dependencies": { + "is-png": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-png/-/is-png-2.0.0.tgz", + "integrity": "sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==", + "dev": true + } + } + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.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-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": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "dependencies": { + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dev": true, + "requires": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "dev": true + }, + "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-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-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-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "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.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "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-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-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-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "dependencies": { + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + } + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-png": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-png/-/is-png-3.0.0.tgz", + "integrity": "sha512-waa2qEuqgLjjYT14KOUQqAEIRRIv7ttkzPVctY/qv+IAKnzXf+JAPKQas50RgO0ECPDUG/iB1zQmwpyB9kkZtQ==", + "dev": true + }, + "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-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dev": true, + "requires": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + } + }, + "javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true + }, + "js-message": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", + "integrity": "sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==", + "dev": true + }, + "js-queue": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/js-queue/-/js-queue-2.0.2.tgz", + "integrity": "sha512-pbKLsbCfi7kriM3s1J4DDCo7jQkI58zPLHi0heXPzPlj0hjUsm+FesPUbE0DSbIVIK503A36aUBoCN7eMFedkA==", + "dev": true, + "requires": { + "easy-stack": "^1.0.1" + } + }, + "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" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true + }, + "keyv": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", + "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "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 + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "launch-editor": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.2.1.tgz", + "integrity": "sha512-On+V7K2uZK6wK7x691ycSUbLD/FyKKelArkbaAMSSJU8JmqmhwN2+mnJDNINuJWSrh2L0kDk+ZQtbC/gOWUwLw==", + "dev": true, + "requires": { + "chalk": "^2.3.0", + "shell-quote": "^1.6.1" + } + }, + "launch-editor-middleware": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz", + "integrity": "sha512-s0UO2/gEGiCgei3/2UN3SMuUj1phjQN8lcpnvgLSz26fAzNWPQ6Nf/kF5IFClnfU2ehp6LrmKdMU/beveO+2jg==", + "dev": true, + "requires": { + "launch-editor": "^2.2.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "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": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-fs-cache": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", + "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", + "dev": true, + "requires": { + "find-cache-dir": "^0.1.1", + "mkdirp": "^0.5.1" + }, + "dependencies": { + "find-cache-dir": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "^1.0.0" + } + } + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha1-hImxyw0p/4gZXM7KRI/21swpXDY=", + "dev": true + }, + "lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.transform": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.transform/-/lodash.transform-4.6.0.tgz", + "integrity": "sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "logalot": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", + "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", + "dev": true, + "requires": { + "figures": "^1.3.5", + "squeak": "^1.0.0" + }, + "dependencies": { + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + } + } + }, + "loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "lpad-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", + "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1", + "indent-string": "^2.1.0", + "longest": "^1.0.0", + "meow": "^3.3.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" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "dev": true, + "requires": { + "escape-string-regexp": "^4.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + } + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "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" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minipass": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", + "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true, + "optional": true + }, + "nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + }, + "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" + } + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-abi": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz", + "integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==", + "dev": true, + "requires": { + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-ipc": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/node-ipc/-/node-ipc-9.2.1.tgz", + "integrity": "sha512-mJzaM6O3xHf9VT8BULvJSbdVbmHUKRNOH7zDDkCrA1/T+CVjq2WVIDfLt0azZRXpgArJtl3rtmEozrbXPZ9GaQ==", + "dev": true, + "requires": { + "event-pubsub": "4.3.0", + "js-message": "1.0.7", + "js-queue": "2.0.2" + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "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 + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dev": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "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": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "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": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "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": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-hash": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", + "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==", + "dev": true + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "optipng-bin": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-7.0.1.tgz", + "integrity": "sha512-W99mpdW7Nt2PpFiaO+74pkht7KEqkXkeRomdWXfEz3SALZ6hns81y/pm1dsGZ6ItUIfchiNIP6ORDr1zETU1jA==", + "dev": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0" + } + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-filter-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", + "dev": true, + "requires": { + "arch": "^2.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true + }, + "p-event": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", + "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", + "dev": true, + "requires": { + "p-timeout": "^1.1.1" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-map-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", + "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", + "dev": true, + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-pipe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-4.0.0.tgz", + "integrity": "sha512-HkPfFklpZQPUKBFXzKFB6ihLriIHxnmuQdK9WmLDwe4hf2PdhhfWT/FJa+pc3bA1ywvKXtedxIRmd4Y7BTXE4w==", + "dev": true + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dev": true, + "requires": { + "p-finally": "^1.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 + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + } + } + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + }, + "dependencies": { + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + } + } + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + } + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "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" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "peek-readable": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.0.1.tgz", + "integrity": "sha512-7qmhptnR0WMSpxT5rMHG9bW/mYSR1uqaPFj2MHvT+y/aOUu6msJijpKt5SkTDKySwg65OWG2JwTMBlgcbwMHrQ==", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "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" + } + }, + "png2icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/png2icons/-/png2icons-2.0.1.tgz", + "integrity": "sha512-GDEQJr8OG4e6JMp7mABtXFSEpgJa1CCpbQiAR+EjhkHJHnUL9zPPtbOrjsMD8gUbikgv3j7x404b0YJsV3aVFA==", + "dev": true + }, + "pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "dev": true, + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", + "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "prebuild-install": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", + "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", + "dev": true, + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.21.0", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz", + "integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==", + "dev": true, + "optional": true + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "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" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + } + } + }, + "read-chunk": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz", + "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "with-open-file": "^0.1.6" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "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" + } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dev": true, + "requires": { + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + }, + "dependencies": { + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + } + } + }, + "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": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-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.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "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": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "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": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "replace-ext": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", + "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-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 + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "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 + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "dev": true, + "requires": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dev": true, + "requires": { + "commander": "^2.8.1" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "requires": { + "node-forge": "^0.10.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 + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, + "semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "dev": true + }, + "semver-truncate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", + "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", + "dev": true, + "requires": { + "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "requires": { + "type-fest": "^0.13.1" + }, + "dependencies": { + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "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": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "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": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "sharp": { + "version": "0.28.3", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.28.3.tgz", + "integrity": "sha512-21GEP45Rmr7q2qcmdnjDkNP04Ooh5v0laGS5FDpojOO84D1DJwUijLiSq8XNNM6e8aGXYtoYRh3sVNdm8NodMA==", + "dev": true, + "requires": { + "color": "^3.1.3", + "detect-libc": "^1.0.3", + "node-addon-api": "^3.2.0", + "prebuild-install": "^6.1.2", + "semver": "^7.3.5", + "simple-get": "^3.1.0", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "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.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "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": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "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.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "dev": true, + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "requires": { + "mimic-response": "^2.0.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true + } + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "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": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "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": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "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": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, + "sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "dev": true, + "requires": { + "sort-keys": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==" + }, + "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.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "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 + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "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.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "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": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "squeak": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", + "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "console-stream": "^0.1.1", + "lpad-align": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "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": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "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": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "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 + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dev": true, + "requires": { + "is-natural-number": "^4.0.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "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-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "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 + }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "strtok3": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.2.4.tgz", + "integrity": "sha512-GO8IcFF9GmFDvqduIspUBwCzCbqzegyVKIsSymcMgiZKeCfrN9SowtUoi8+b59WZMAjIzVZic/Ft97+pynR3Iw==", + "dev": true, + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.0.1" + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "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" + } + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + }, + "dependencies": { + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + } + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + } + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + }, + "dependencies": { + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + } + } + }, + "tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dev": true, + "requires": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "dev": true, + "requires": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "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 + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "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" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "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": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "thread-loader": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", + "integrity": "sha512-wNrVKH2Lcf8ZrWxDF/khdlLlsTMczdcwPA9VEK4c2exlEPynYWxi9op3nPTo5lAnDIkE0rQEB3VBP+4Zncc9Hg==", + "dev": true, + "requires": { + "loader-runner": "^2.3.1", + "loader-utils": "^1.1.0", + "neo-async": "^2.6.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "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": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "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": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "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": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "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": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "token-types": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.1.1.tgz", + "integrity": "sha512-hD+QyuUAyI2spzsI0B7gf/jJ2ggR4RjkAo37j3StuePhApJUwcWDjnHDOFdIWYSwNR28H14hpwm4EI+V1Ted1w==", + "dev": true, + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "dev": true + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + } + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "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": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + } + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "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": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "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": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "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": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dev": true, + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "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" + } + }, + "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 + }, + "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 + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "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" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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 + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + } + }, + "url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + } + } + }, + "url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "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": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "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" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + } + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "vue": { + "version": "3.2.22", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.22.tgz", + "integrity": "sha512-KD5nZpXVZquOC6926Xnp3zOvswrUyO9Rya7ZUoxWFQEjFDW4iACtwzubRB4Um2Om9kj6CaJOqAVRDSFlqLpdgw==", + "requires": { + "@vue/compiler-dom": "3.2.22", + "@vue/compiler-sfc": "3.2.22", + "@vue/runtime-dom": "3.2.22", + "@vue/server-renderer": "3.2.22", + "@vue/shared": "3.2.22" + } + }, + "vue-eslint-parser": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz", + "integrity": "sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.2.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^6.3.0" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + } + } + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "vue-loader": { + "version": "15.9.8", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz", + "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + } + } + }, + "vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + } + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "vuex": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz", + "integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==", + "requires": { + "@vue/devtools-api": "^6.0.0-beta.11" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "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-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "webpack-bundle-analyzer": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.9.0.tgz", + "integrity": "sha512-Ob8amZfCm3rMB1ScjQVlbYYUEJyEjdEtQ92jqiFUYt5VkEeO2v5UMbv49P/gnmCZm3A6yaFQzCBvpZqN4MUsdA==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.19", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "dev": true, + "requires": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "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" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "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 + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "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" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "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-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": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^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" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "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.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + } + }, + "with-open-file": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", + "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==", + "dev": true, + "requires": { + "p-finally": "^1.0.0", + "p-try": "^2.1.0", + "pify": "^4.0.1" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "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 + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "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" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "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 + }, + "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" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "yorkie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz", + "integrity": "sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==", + "dev": true, + "requires": { + "execa": "^0.8.0", + "is-ci": "^1.0.10", + "normalize-path": "^1.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.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" + } + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "normalize-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", + "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "zopflipng-bin": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zopflipng-bin/-/zopflipng-bin-6.0.1.tgz", + "integrity": "sha512-+aybvXv/xafL6I67uSH5yLHrSy4/OaSOV9tniw4yZFIHpINXUcctVHE/WzHxOONrL2GHzJ8Fd4iDrNyaS6TVbg==", + "dev": true, + "requires": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.1", + "logalot": "^2.1.0" + } + } + } +} diff --git a/applications/launchpad/gui-vue/package.json b/applications/launchpad/gui-vue/package.json new file mode 100644 index 0000000000..288b5ed967 --- /dev/null +++ b/applications/launchpad/gui-vue/package.json @@ -0,0 +1,53 @@ +{ + "name": "gui-vue", + "version": "0.1.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint", + "tauri": "tauri" + }, + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^1.2.36", + "@fortawesome/free-brands-svg-icons": "^5.15.4", + "@fortawesome/free-regular-svg-icons": "^5.15.4", + "@fortawesome/free-solid-svg-icons": "^5.15.4", + "@fortawesome/vue-fontawesome": "^3.0.0-5", + "@oruga-ui/oruga-next": "^0.4.8", + "@tauri-apps/api": "^1.0.0-beta.8", + "CBuffer": "^2.2.0", + "core-js": "^3.6.5", + "vue": "^3.0.0", + "vuex": "^4.0.2" + }, + "devDependencies": { + "@tauri-apps/cli": "^1.0.0-beta.10", + "@vue/cli-plugin-babel": "~4.5.0", + "@vue/cli-plugin-eslint": "~4.5.0", + "@vue/cli-service": "~4.5.0", + "@vue/compiler-sfc": "^3.0.0", + "babel-eslint": "^10.1.0", + "eslint": "^6.7.2", + "eslint-plugin-vue": "^7.0.0" + }, + "eslintConfig": { + "root": true, + "env": { + "node": true + }, + "extends": [ + "plugin:vue/vue3-essential", + "eslint:recommended" + ], + "parserOptions": { + "parser": "babel-eslint" + }, + "rules": {} + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ] +} diff --git a/applications/launchpad/gui-vue/public/favicon.ico b/applications/launchpad/gui-vue/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/applications/launchpad/gui-vue/public/index.html b/applications/launchpad/gui-vue/public/index.html new file mode 100644 index 0000000000..3e5a139621 --- /dev/null +++ b/applications/launchpad/gui-vue/public/index.html @@ -0,0 +1,17 @@ + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + + +

+ + + diff --git a/applications/launchpad/gui-vue/src/App.vue b/applications/launchpad/gui-vue/src/App.vue new file mode 100644 index 0000000000..3c8efdf85b --- /dev/null +++ b/applications/launchpad/gui-vue/src/App.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/applications/launchpad/gui-vue/src/assets/logo.png b/applications/launchpad/gui-vue/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3d2503fc2a44b5053b0837ebea6e87a2d339a43 GIT binary patch literal 6849 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