├── .gitignore ├── .github └── ISSUE_TEMPLATE │ └── enter-your-referral-code-link.md ├── Cargo.toml ├── src ├── main.rs └── duo_api.rs ├── README.md └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/enter-your-referral-code-link.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Enter Your Referral Code/Link 3 | about: Use this template when requesting for the repository owner to use this tool 4 | on your behalf. 5 | title: Remote CLI Usage Request 6 | labels: '' 7 | assignees: Lioness100 8 | 9 | --- 10 | 11 | # Referral Code/Link 12 | PLACE_YOUR_CODE_HERE 13 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "free-duolingo-plus" 3 | version = "1.0.10" 4 | authors = ["Lioness100 "] 5 | edition = "2021" 6 | description = "Simple CLI tool to create dummy accounts with referral links to give yourself free Plus." 7 | repository = "https://github.com/Lioness100/free-duolingo-plus" 8 | license = "Apache-2.0" 9 | keywords = ["duolingo", "language"] 10 | categories = ["command-line-utilities"] 11 | 12 | [dependencies] 13 | clap = { version = "3.2.14", features = ["derive"] } 14 | console = "0.15.0" 15 | fake = "2.5.0" 16 | indicatif = "0.17.0" 17 | rand = "0.8.5" 18 | reqwest = { version = "0.11.11", features = ["json", "blocking"] } 19 | serde = { version = "1.0.140", features = ["derive"] } 20 | uuid = { version = "1.1.2", features = ["v4"] } 21 | 22 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 23 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | //! A simple CLI tool to create dummy accounts with referral links to give yourself 2 | //! free Plus (max 24/41 weeks). 3 | //! 4 | //! > **⚠️ A VPN must used to run this tool as Duolingo will not 5 | //! > consider accounts created with the same IP as the original towards the referral 6 | //! > program.** 7 | //! 8 | //! ## Usage 9 | //! 10 | //! Follow [these 11 | //! instructions](https://support.duolingo.com/hc/en-us/articles/4404225309581-How-does-the-referral-program-work-) 12 | //! to get your referral link. 13 | //! 14 | //! ```sh 15 | //! free-duolingo-plus --help 16 | //! free-duolingo-plus --code BDHTZTB5CWWKTVW2UCDTY27MBE 17 | //! free-duolingo-plus --code https://invite.duolingo.com/BDHTZTB5CWWKTVW2UCDTY27MBE 18 | //! free-duolingo-plus --code https://invite.duolingo.com/BDHTZTB5CWWKTVW2UCDTY27MBE --num 10 19 | //! ``` 20 | 21 | use clap::{value_parser, AppSettings, Parser}; 22 | use console::style; 23 | use indicatif::{ProgressIterator, ProgressStyle}; 24 | 25 | pub mod duo_api; 26 | use crate::duo_api::DuoApi; 27 | 28 | /// Struct used to resolve CLI arguments. 29 | #[derive(Parser, Debug)] 30 | #[clap(author, version, about, long_about = None, global_setting(AppSettings::DeriveDisplayOrder))] 31 | struct Args { 32 | #[clap( 33 | short, 34 | long, 35 | help = "The referral code or link", 36 | value_parser = DuoApi::parse_code 37 | )] 38 | code: String, 39 | 40 | #[clap( 41 | short, 42 | long, 43 | help = "The number of accounts to generate (max 24)", 44 | default_value_t = 24, 45 | value_parser = value_parser!(u8).range(1..=24) 46 | )] 47 | num: u8, 48 | } 49 | 50 | /// CLI entrypoint. 51 | fn main() { 52 | let args = Args::parse(); 53 | let client = DuoApi::default(); 54 | 55 | let bar_style = ProgressStyle::default_bar() // 56 | .template("[{elapsed_precise}] [{pos}/{len}] {bar:70.cyan}") 57 | .unwrap(); 58 | 59 | for _ in (1..=args.num).progress_with_style(bar_style) { 60 | let data = client.create_account(&args.code); 61 | client.create_credentials(&data); 62 | } 63 | 64 | println!( 65 | "All accounts created! Enjoy your {} weeks of free Duolingo Plus.\n{}", 66 | style(args.num).green().bold(), 67 | style("https://www.duolingo.com/").dim() 68 | ); 69 | } 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |
3 | "You earned 19 weeks of free Duolingo
  5 | Plus!" 10 | "You earned 41 weeks of free Duolingo
 12 | Plus!" 17 | "You earned 36 weeks of free Duolingo
 19 | Plus!" 24 | "You earned 24 weeks of free Duolingo
 26 | Plus!" 31 | "You earned 24 weeks of free Duolingo
 33 | Plus!" 38 | "You earned 24 weeks of free Duolingo
 40 | Plus!" 45 |
46 |
47 | 48 | # Free Duolingo Plus 49 | 50 | A simple CLI tool to create dummy accounts with referral links to give yourself 51 | free Plus (max 24/41 weeks depending on whether you're part of the [tiered 52 | reward system](https://user-images.githubusercontent.com/65814829/180666541-8ceac559-37d8-4e5b-86f4-05b8b265b3b6.png)). 53 | 54 | **NOT WORKING** as of March 1st, 2023. I'm currently looking into this issue. 55 | > Please create a pull request to update this date if this tool works/doesn't work for you. 56 | 57 | ## Installation 58 | 59 | > _🎉 If you wouldn't like to go through the installation process, you can 60 | > [create an 61 | > issue](https://github.com/Lioness100/free-duolingo-plus/issues/new?assignees=Lioness100&labels=&template=enter-your-referral-code-link.md&title=Remote+CLI+Usage+Request) 62 | > or reach out to me on Discord (@lioness100) and I will run the tool on 63 | > your behalf._ 64 | 65 | Install [Rust](https://www.rust-lang.org/tools/install) using the recommended 66 | rustup installation method and then run: 67 | 68 | ```sh 69 | cargo install free-duolingo-plus 70 | ``` 71 | 72 | ## Usage 73 | 74 | Follow [these 75 | instructions](https://support.duolingo.com/hc/en-us/articles/4404225309581-How-does-the-referral-program-work-) 76 | to get your referral link. 77 | 78 | ⚠️ **A VPN must used to run this as Duolingo will not 79 | consider accounts created with the same IP as the original towards the referral 80 | program.** ⚠️ 81 | 82 | ```sh 83 | free-duolingo-plus --help 84 | free-duolingo-plus --code BDHTZTB5CWWKTVW2UCDTY27MBE 85 | free-duolingo-plus --code https://invite.duolingo.com/BDHTZTB5CWWKTVW2UCDTY27MBE 86 | free-duolingo-plus --code https://invite.duolingo.com/BDHTZTB5CWWKTVW2UCDTY27MBE --num 10 87 | ``` 88 | 89 | Please ⭐ this repository if it works for you! 90 | 91 | ## Acknowledgements 92 | 93 | The strategy was taken from https://github.com/JunkMeal/duolingo-plus and ported 94 | to Rust. 95 | 96 | ## Contributing 97 | 98 | This is the first project I've ever created with Rust. If you would like to 99 | improve the code, please open an issue or pull request! 100 | 101 | ## [Internal Documentation](https://docs.rs/free-duolingo-plus) 102 | -------------------------------------------------------------------------------- /src/duo_api.rs: -------------------------------------------------------------------------------- 1 | //! Exports [`DuoApi`] for all API related functionality. 2 | 3 | use fake::{ 4 | faker::internet::en::{FreeEmail, Password, UserAgent}, 5 | Fake, 6 | }; 7 | use reqwest::{ 8 | blocking::{Client, ClientBuilder, Response}, 9 | header::COOKIE, 10 | redirect::Policy, 11 | }; 12 | use serde::{Deserialize, Serialize}; 13 | use uuid::Uuid; 14 | 15 | /// The API used to create and patch users. This specific API version is the 16 | /// only one that supports this strategy. 17 | pub const BASE_USERS_URL: &str = "https://www.duolingo.com/2017-06-30/users"; 18 | pub const RECAPTCHA_SIGNAL_SIT_KEY: &str = "6LcLOdsjAAAAAFfwGusLLnnn492SOGhsCh-uEAvI"; 19 | 20 | /// Data used to bypass the reCAPTCHA check. 21 | #[derive(Serialize)] 22 | pub struct UserCreationSignal { 23 | site_key: String, 24 | token: String, 25 | vendor: u8, 26 | } 27 | 28 | impl Default for UserCreationSignal { 29 | /// Creates a new [`UserCreationSignal`] with the default values. 30 | fn default() -> Self { 31 | Self { 32 | site_key: RECAPTCHA_SIGNAL_SIT_KEY.to_string(), 33 | // At the moment, Duo doesn't check this value. 34 | token: String::from("-"), 35 | vendor: 2, 36 | } 37 | } 38 | } 39 | 40 | /// The data sent to the API to create a user. `timezone` and `from_language` 41 | /// are dummy values, but `invite_code` is the provided code and `distinct_id` 42 | /// is a UUIDv4. 43 | #[derive(Serialize, Default)] 44 | #[serde(rename_all = "camelCase")] 45 | pub struct UserCreationData { 46 | timezone: String, 47 | from_language: String, 48 | invite_code: String, 49 | distinct_id: String, 50 | signal: UserCreationSignal, 51 | } 52 | 53 | /// The data sent to the API to create credentials. All 3 of these fields are 54 | /// dummy values. 55 | #[derive(Serialize, Default)] 56 | pub struct UserCredentialsData { 57 | email: String, 58 | password: String, 59 | age: String, 60 | signal: UserCreationSignal, 61 | } 62 | 63 | /// The data returned from the API after creating the user with 64 | /// [`UserCreationData`]. `id` is the unique numerical identifier for the user 65 | /// that will be appended to the [`BASE_USERS_URL`] for all subsequent requests. 66 | #[derive(Deserialize)] 67 | pub struct UserCreationResponse { 68 | id: u32, 69 | } 70 | 71 | /// All relevant data from creating the user needed to create credentials. This 72 | /// includes the user ID and the JWT token returned from the API when creating 73 | /// the user. 74 | pub struct AccountData { 75 | id: u32, 76 | token: String, 77 | } 78 | 79 | impl From for AccountData { 80 | /// Finds the JWT token from the request to be reused on the next request as 81 | /// a form of authentication, and then deserializes the response as JSON to 82 | /// retrieve the user id. 83 | fn from(res: Response) -> Self { 84 | let token = res.headers()["jwt"] 85 | .to_str() 86 | .expect("JWT token was not found in the account creation response headers") 87 | .to_string(); 88 | 89 | let id = res 90 | .json::() 91 | .expect("Failed to parse user creation response") 92 | .id; 93 | 94 | Self { id, token } 95 | } 96 | } 97 | 98 | /// Stores the [`reqwest::Client`] used to make requests to the API and all 99 | /// functionality relevant to sending requests to the API. 100 | pub struct DuoApi { 101 | client: Client, 102 | } 103 | 104 | impl Default for DuoApi { 105 | /// Creates a new API client with a reusable User-Agent. 106 | fn default() -> Self { 107 | Self { 108 | client: ClientBuilder::new() 109 | // The user agent will make the request look less like a bot's. 110 | .user_agent(UserAgent().fake::<&str>()) 111 | // [`DuoApi::get_user_id`] makes a request that will try to redirect the user, which we don't want. 112 | .redirect(Policy::none()) 113 | .build() 114 | .unwrap(), 115 | } 116 | } 117 | } 118 | 119 | impl DuoApi { 120 | /// Validates a referral code. If a link is given, the base will be 121 | /// stripped, leaving (hopefully) just the code. It must be a 26-length string of 122 | /// ascii_alphanumeric characters. After validated, the string will be 123 | /// converted to uppercase. 124 | pub fn parse_code(code: &str) -> Result { 125 | let parsed_code = code.replace("https://invite.duolingo.com/", ""); 126 | if parsed_code.len() == 26 && parsed_code.chars().all(|char| char.is_ascii_alphanumeric()) { 127 | Ok(parsed_code.to_uppercase()) 128 | } else { 129 | Err(String::from("Invalid referral code/link")) 130 | } 131 | } 132 | 133 | /// Creates a new user via the provided referral code (see 134 | /// [`UserCreationData`]), and constructs a [`AccountData`] from it. 135 | pub fn create_account(&self, code: &str) -> AccountData { 136 | let creation_data = UserCreationData { 137 | timezone: String::from("America/Montreal"), 138 | from_language: String::from("en"), 139 | invite_code: code.to_string(), 140 | distinct_id: Uuid::new_v4().to_string(), 141 | ..Default::default() 142 | }; 143 | 144 | let res = self 145 | .client 146 | .post(format!("{BASE_USERS_URL}?fields=id")) 147 | .json(&creation_data) 148 | .send() 149 | .unwrap() 150 | .error_for_status() 151 | .expect("Failed to create account"); 152 | 153 | res.into() 154 | } 155 | 156 | /// Creates credentials for the user (see [`UserCredentialsData`]) from [`AccountData`]. 157 | pub fn create_credentials(&self, data: &AccountData) { 158 | let user_data = UserCredentialsData { 159 | age: String::from("5"), 160 | email: FreeEmail().fake(), 161 | password: Password(15..16).fake(), 162 | ..Default::default() 163 | }; 164 | 165 | self.client 166 | .patch(format!("{BASE_USERS_URL}/{}?fields=email,identifier,name,username", data.id)) 167 | .header(COOKIE, format!("jwt_token={}", data.token)) 168 | .json(&user_data) 169 | .send() 170 | .unwrap() 171 | .error_for_status() 172 | .expect("Failed to create credentials"); 173 | } 174 | } 175 | 176 | #[cfg(test)] 177 | mod tests { 178 | use super::*; 179 | 180 | #[test] 181 | fn valid_code() { 182 | let code = "A".repeat(26); 183 | assert_eq!(DuoApi::parse_code(&code), Ok(code.to_string())); 184 | } 185 | 186 | #[test] 187 | fn valid_link() { 188 | let code = "A".repeat(26); 189 | let link = format!("https://invite.duolingo.com/{code}"); 190 | 191 | assert_eq!(DuoApi::parse_code(&link), Ok(code)); 192 | } 193 | 194 | #[test] 195 | fn undercase_code() { 196 | let code = "a".repeat(26); 197 | assert_eq!(DuoApi::parse_code(&code), Ok(code.to_uppercase())); 198 | } 199 | 200 | #[test] 201 | fn incorrect_length_code() { 202 | let short_code = "A".repeat(25); 203 | let long_code = "A".repeat(27); 204 | 205 | assert!(DuoApi::parse_code(&short_code).is_err()); 206 | assert!(DuoApi::parse_code(&long_code).is_err()); 207 | } 208 | 209 | #[test] 210 | fn incorrect_characters_code() { 211 | let code = "_".repeat(26); 212 | assert!(DuoApi::parse_code(code.as_str()).is_err()); 213 | } 214 | } 215 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "atty" 7 | version = "0.2.14" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 10 | dependencies = [ 11 | "hermit-abi", 12 | "libc", 13 | "winapi", 14 | ] 15 | 16 | [[package]] 17 | name = "autocfg" 18 | version = "1.1.0" 19 | source = "registry+https://github.com/rust-lang/crates.io-index" 20 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 21 | 22 | [[package]] 23 | name = "base64" 24 | version = "0.13.0" 25 | source = "registry+https://github.com/rust-lang/crates.io-index" 26 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 27 | 28 | [[package]] 29 | name = "bitflags" 30 | version = "1.3.2" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 33 | 34 | [[package]] 35 | name = "bumpalo" 36 | version = "3.10.0" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" 39 | 40 | [[package]] 41 | name = "bytes" 42 | version = "1.2.0" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "f0b3de4a0c5e67e16066a0715723abd91edc2f9001d09c46e1dca929351e130e" 45 | 46 | [[package]] 47 | name = "cc" 48 | version = "1.0.73" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" 51 | 52 | [[package]] 53 | name = "cfg-if" 54 | version = "1.0.0" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 57 | 58 | [[package]] 59 | name = "clap" 60 | version = "3.2.14" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "54635806b078b7925d6e36810b1755f2a4b5b4d57560432c1ecf60bcbe10602b" 63 | dependencies = [ 64 | "atty", 65 | "bitflags", 66 | "clap_derive", 67 | "clap_lex", 68 | "indexmap", 69 | "once_cell", 70 | "strsim", 71 | "termcolor", 72 | "textwrap", 73 | ] 74 | 75 | [[package]] 76 | name = "clap_derive" 77 | version = "3.2.7" 78 | source = "registry+https://github.com/rust-lang/crates.io-index" 79 | checksum = "759bf187376e1afa7b85b959e6a664a3e7a95203415dba952ad19139e798f902" 80 | dependencies = [ 81 | "heck", 82 | "proc-macro-error", 83 | "proc-macro2", 84 | "quote", 85 | "syn", 86 | ] 87 | 88 | [[package]] 89 | name = "clap_lex" 90 | version = "0.2.4" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" 93 | dependencies = [ 94 | "os_str_bytes", 95 | ] 96 | 97 | [[package]] 98 | name = "console" 99 | version = "0.15.0" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31" 102 | dependencies = [ 103 | "encode_unicode", 104 | "libc", 105 | "once_cell", 106 | "regex", 107 | "terminal_size", 108 | "unicode-width", 109 | "winapi", 110 | ] 111 | 112 | [[package]] 113 | name = "core-foundation" 114 | version = "0.9.3" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" 117 | dependencies = [ 118 | "core-foundation-sys", 119 | "libc", 120 | ] 121 | 122 | [[package]] 123 | name = "core-foundation-sys" 124 | version = "0.8.3" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" 127 | 128 | [[package]] 129 | name = "encode_unicode" 130 | version = "0.3.6" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 133 | 134 | [[package]] 135 | name = "encoding_rs" 136 | version = "0.8.31" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" 139 | dependencies = [ 140 | "cfg-if", 141 | ] 142 | 143 | [[package]] 144 | name = "fake" 145 | version = "2.5.0" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | checksum = "4d68f517805463f3a896a9d29c1d6ff09d3579ded64a7201b4069f8f9c0d52fd" 148 | dependencies = [ 149 | "rand", 150 | ] 151 | 152 | [[package]] 153 | name = "fastrand" 154 | version = "1.8.0" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" 157 | dependencies = [ 158 | "instant", 159 | ] 160 | 161 | [[package]] 162 | name = "fnv" 163 | version = "1.0.7" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 166 | 167 | [[package]] 168 | name = "foreign-types" 169 | version = "0.3.2" 170 | source = "registry+https://github.com/rust-lang/crates.io-index" 171 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 172 | dependencies = [ 173 | "foreign-types-shared", 174 | ] 175 | 176 | [[package]] 177 | name = "foreign-types-shared" 178 | version = "0.1.1" 179 | source = "registry+https://github.com/rust-lang/crates.io-index" 180 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 181 | 182 | [[package]] 183 | name = "form_urlencoded" 184 | version = "1.0.1" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 187 | dependencies = [ 188 | "matches", 189 | "percent-encoding", 190 | ] 191 | 192 | [[package]] 193 | name = "free-duolingo-plus" 194 | version = "1.0.10" 195 | dependencies = [ 196 | "clap", 197 | "console", 198 | "fake", 199 | "indicatif", 200 | "rand", 201 | "reqwest", 202 | "serde", 203 | "uuid", 204 | ] 205 | 206 | [[package]] 207 | name = "futures-channel" 208 | version = "0.3.21" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" 211 | dependencies = [ 212 | "futures-core", 213 | ] 214 | 215 | [[package]] 216 | name = "futures-core" 217 | version = "0.3.21" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" 220 | 221 | [[package]] 222 | name = "futures-io" 223 | version = "0.3.21" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" 226 | 227 | [[package]] 228 | name = "futures-sink" 229 | version = "0.3.21" 230 | source = "registry+https://github.com/rust-lang/crates.io-index" 231 | checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" 232 | 233 | [[package]] 234 | name = "futures-task" 235 | version = "0.3.21" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" 238 | 239 | [[package]] 240 | name = "futures-util" 241 | version = "0.3.21" 242 | source = "registry+https://github.com/rust-lang/crates.io-index" 243 | checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" 244 | dependencies = [ 245 | "futures-core", 246 | "futures-io", 247 | "futures-task", 248 | "memchr", 249 | "pin-project-lite", 250 | "pin-utils", 251 | "slab", 252 | ] 253 | 254 | [[package]] 255 | name = "getrandom" 256 | version = "0.2.7" 257 | source = "registry+https://github.com/rust-lang/crates.io-index" 258 | checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" 259 | dependencies = [ 260 | "cfg-if", 261 | "libc", 262 | "wasi", 263 | ] 264 | 265 | [[package]] 266 | name = "h2" 267 | version = "0.3.13" 268 | source = "registry+https://github.com/rust-lang/crates.io-index" 269 | checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" 270 | dependencies = [ 271 | "bytes", 272 | "fnv", 273 | "futures-core", 274 | "futures-sink", 275 | "futures-util", 276 | "http", 277 | "indexmap", 278 | "slab", 279 | "tokio", 280 | "tokio-util", 281 | "tracing", 282 | ] 283 | 284 | [[package]] 285 | name = "hashbrown" 286 | version = "0.12.3" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 289 | 290 | [[package]] 291 | name = "heck" 292 | version = "0.4.0" 293 | source = "registry+https://github.com/rust-lang/crates.io-index" 294 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 295 | 296 | [[package]] 297 | name = "hermit-abi" 298 | version = "0.1.19" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 301 | dependencies = [ 302 | "libc", 303 | ] 304 | 305 | [[package]] 306 | name = "http" 307 | version = "0.2.8" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" 310 | dependencies = [ 311 | "bytes", 312 | "fnv", 313 | "itoa", 314 | ] 315 | 316 | [[package]] 317 | name = "http-body" 318 | version = "0.4.5" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" 321 | dependencies = [ 322 | "bytes", 323 | "http", 324 | "pin-project-lite", 325 | ] 326 | 327 | [[package]] 328 | name = "httparse" 329 | version = "1.7.1" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" 332 | 333 | [[package]] 334 | name = "httpdate" 335 | version = "1.0.2" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" 338 | 339 | [[package]] 340 | name = "hyper" 341 | version = "0.14.20" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" 344 | dependencies = [ 345 | "bytes", 346 | "futures-channel", 347 | "futures-core", 348 | "futures-util", 349 | "h2", 350 | "http", 351 | "http-body", 352 | "httparse", 353 | "httpdate", 354 | "itoa", 355 | "pin-project-lite", 356 | "socket2", 357 | "tokio", 358 | "tower-service", 359 | "tracing", 360 | "want", 361 | ] 362 | 363 | [[package]] 364 | name = "hyper-tls" 365 | version = "0.5.0" 366 | source = "registry+https://github.com/rust-lang/crates.io-index" 367 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 368 | dependencies = [ 369 | "bytes", 370 | "hyper", 371 | "native-tls", 372 | "tokio", 373 | "tokio-native-tls", 374 | ] 375 | 376 | [[package]] 377 | name = "idna" 378 | version = "0.2.3" 379 | source = "registry+https://github.com/rust-lang/crates.io-index" 380 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 381 | dependencies = [ 382 | "matches", 383 | "unicode-bidi", 384 | "unicode-normalization", 385 | ] 386 | 387 | [[package]] 388 | name = "indexmap" 389 | version = "1.9.1" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" 392 | dependencies = [ 393 | "autocfg", 394 | "hashbrown", 395 | ] 396 | 397 | [[package]] 398 | name = "indicatif" 399 | version = "0.17.0" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "fcc42b206e70d86ec03285b123e65a5458c92027d1fb2ae3555878b8113b3ddf" 402 | dependencies = [ 403 | "console", 404 | "number_prefix", 405 | "unicode-width", 406 | ] 407 | 408 | [[package]] 409 | name = "instant" 410 | version = "0.1.12" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 413 | dependencies = [ 414 | "cfg-if", 415 | ] 416 | 417 | [[package]] 418 | name = "ipnet" 419 | version = "2.5.0" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" 422 | 423 | [[package]] 424 | name = "itoa" 425 | version = "1.0.2" 426 | source = "registry+https://github.com/rust-lang/crates.io-index" 427 | checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" 428 | 429 | [[package]] 430 | name = "js-sys" 431 | version = "0.3.58" 432 | source = "registry+https://github.com/rust-lang/crates.io-index" 433 | checksum = "c3fac17f7123a73ca62df411b1bf727ccc805daa070338fda671c86dac1bdc27" 434 | dependencies = [ 435 | "wasm-bindgen", 436 | ] 437 | 438 | [[package]] 439 | name = "lazy_static" 440 | version = "1.4.0" 441 | source = "registry+https://github.com/rust-lang/crates.io-index" 442 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 443 | 444 | [[package]] 445 | name = "libc" 446 | version = "0.2.126" 447 | source = "registry+https://github.com/rust-lang/crates.io-index" 448 | checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" 449 | 450 | [[package]] 451 | name = "log" 452 | version = "0.4.17" 453 | source = "registry+https://github.com/rust-lang/crates.io-index" 454 | checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" 455 | dependencies = [ 456 | "cfg-if", 457 | ] 458 | 459 | [[package]] 460 | name = "matches" 461 | version = "0.1.9" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 464 | 465 | [[package]] 466 | name = "memchr" 467 | version = "2.5.0" 468 | source = "registry+https://github.com/rust-lang/crates.io-index" 469 | checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" 470 | 471 | [[package]] 472 | name = "mime" 473 | version = "0.3.16" 474 | source = "registry+https://github.com/rust-lang/crates.io-index" 475 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 476 | 477 | [[package]] 478 | name = "mio" 479 | version = "0.8.4" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" 482 | dependencies = [ 483 | "libc", 484 | "log", 485 | "wasi", 486 | "windows-sys", 487 | ] 488 | 489 | [[package]] 490 | name = "native-tls" 491 | version = "0.2.10" 492 | source = "registry+https://github.com/rust-lang/crates.io-index" 493 | checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" 494 | dependencies = [ 495 | "lazy_static", 496 | "libc", 497 | "log", 498 | "openssl", 499 | "openssl-probe", 500 | "openssl-sys", 501 | "schannel", 502 | "security-framework", 503 | "security-framework-sys", 504 | "tempfile", 505 | ] 506 | 507 | [[package]] 508 | name = "num_cpus" 509 | version = "1.13.1" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 512 | dependencies = [ 513 | "hermit-abi", 514 | "libc", 515 | ] 516 | 517 | [[package]] 518 | name = "number_prefix" 519 | version = "0.4.0" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" 522 | 523 | [[package]] 524 | name = "once_cell" 525 | version = "1.13.0" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" 528 | 529 | [[package]] 530 | name = "openssl" 531 | version = "0.10.41" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "618febf65336490dfcf20b73f885f5651a0c89c64c2d4a8c3662585a70bf5bd0" 534 | dependencies = [ 535 | "bitflags", 536 | "cfg-if", 537 | "foreign-types", 538 | "libc", 539 | "once_cell", 540 | "openssl-macros", 541 | "openssl-sys", 542 | ] 543 | 544 | [[package]] 545 | name = "openssl-macros" 546 | version = "0.1.0" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" 549 | dependencies = [ 550 | "proc-macro2", 551 | "quote", 552 | "syn", 553 | ] 554 | 555 | [[package]] 556 | name = "openssl-probe" 557 | version = "0.1.5" 558 | source = "registry+https://github.com/rust-lang/crates.io-index" 559 | checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" 560 | 561 | [[package]] 562 | name = "openssl-sys" 563 | version = "0.9.75" 564 | source = "registry+https://github.com/rust-lang/crates.io-index" 565 | checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f" 566 | dependencies = [ 567 | "autocfg", 568 | "cc", 569 | "libc", 570 | "pkg-config", 571 | "vcpkg", 572 | ] 573 | 574 | [[package]] 575 | name = "os_str_bytes" 576 | version = "6.2.0" 577 | source = "registry+https://github.com/rust-lang/crates.io-index" 578 | checksum = "648001efe5d5c0102d8cea768e348da85d90af8ba91f0bea908f157951493cd4" 579 | 580 | [[package]] 581 | name = "percent-encoding" 582 | version = "2.1.0" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 585 | 586 | [[package]] 587 | name = "pin-project-lite" 588 | version = "0.2.9" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" 591 | 592 | [[package]] 593 | name = "pin-utils" 594 | version = "0.1.0" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 597 | 598 | [[package]] 599 | name = "pkg-config" 600 | version = "0.3.25" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" 603 | 604 | [[package]] 605 | name = "ppv-lite86" 606 | version = "0.2.16" 607 | source = "registry+https://github.com/rust-lang/crates.io-index" 608 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 609 | 610 | [[package]] 611 | name = "proc-macro-error" 612 | version = "1.0.4" 613 | source = "registry+https://github.com/rust-lang/crates.io-index" 614 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 615 | dependencies = [ 616 | "proc-macro-error-attr", 617 | "proc-macro2", 618 | "quote", 619 | "syn", 620 | "version_check", 621 | ] 622 | 623 | [[package]] 624 | name = "proc-macro-error-attr" 625 | version = "1.0.4" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 628 | dependencies = [ 629 | "proc-macro2", 630 | "quote", 631 | "version_check", 632 | ] 633 | 634 | [[package]] 635 | name = "proc-macro2" 636 | version = "1.0.40" 637 | source = "registry+https://github.com/rust-lang/crates.io-index" 638 | checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7" 639 | dependencies = [ 640 | "unicode-ident", 641 | ] 642 | 643 | [[package]] 644 | name = "quote" 645 | version = "1.0.20" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804" 648 | dependencies = [ 649 | "proc-macro2", 650 | ] 651 | 652 | [[package]] 653 | name = "rand" 654 | version = "0.8.5" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 657 | dependencies = [ 658 | "libc", 659 | "rand_chacha", 660 | "rand_core", 661 | ] 662 | 663 | [[package]] 664 | name = "rand_chacha" 665 | version = "0.3.1" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 668 | dependencies = [ 669 | "ppv-lite86", 670 | "rand_core", 671 | ] 672 | 673 | [[package]] 674 | name = "rand_core" 675 | version = "0.6.3" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" 678 | dependencies = [ 679 | "getrandom", 680 | ] 681 | 682 | [[package]] 683 | name = "redox_syscall" 684 | version = "0.2.15" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "534cfe58d6a18cc17120fbf4635d53d14691c1fe4d951064df9bd326178d7d5a" 687 | dependencies = [ 688 | "bitflags", 689 | ] 690 | 691 | [[package]] 692 | name = "regex" 693 | version = "1.6.0" 694 | source = "registry+https://github.com/rust-lang/crates.io-index" 695 | checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" 696 | dependencies = [ 697 | "regex-syntax", 698 | ] 699 | 700 | [[package]] 701 | name = "regex-syntax" 702 | version = "0.6.27" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" 705 | 706 | [[package]] 707 | name = "remove_dir_all" 708 | version = "0.5.3" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 711 | dependencies = [ 712 | "winapi", 713 | ] 714 | 715 | [[package]] 716 | name = "reqwest" 717 | version = "0.11.11" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92" 720 | dependencies = [ 721 | "base64", 722 | "bytes", 723 | "encoding_rs", 724 | "futures-core", 725 | "futures-util", 726 | "h2", 727 | "http", 728 | "http-body", 729 | "hyper", 730 | "hyper-tls", 731 | "ipnet", 732 | "js-sys", 733 | "lazy_static", 734 | "log", 735 | "mime", 736 | "native-tls", 737 | "percent-encoding", 738 | "pin-project-lite", 739 | "serde", 740 | "serde_json", 741 | "serde_urlencoded", 742 | "tokio", 743 | "tokio-native-tls", 744 | "tower-service", 745 | "url", 746 | "wasm-bindgen", 747 | "wasm-bindgen-futures", 748 | "web-sys", 749 | "winreg", 750 | ] 751 | 752 | [[package]] 753 | name = "ryu" 754 | version = "1.0.10" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" 757 | 758 | [[package]] 759 | name = "schannel" 760 | version = "0.1.20" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" 763 | dependencies = [ 764 | "lazy_static", 765 | "windows-sys", 766 | ] 767 | 768 | [[package]] 769 | name = "security-framework" 770 | version = "2.6.1" 771 | source = "registry+https://github.com/rust-lang/crates.io-index" 772 | checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" 773 | dependencies = [ 774 | "bitflags", 775 | "core-foundation", 776 | "core-foundation-sys", 777 | "libc", 778 | "security-framework-sys", 779 | ] 780 | 781 | [[package]] 782 | name = "security-framework-sys" 783 | version = "2.6.1" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" 786 | dependencies = [ 787 | "core-foundation-sys", 788 | "libc", 789 | ] 790 | 791 | [[package]] 792 | name = "serde" 793 | version = "1.0.140" 794 | source = "registry+https://github.com/rust-lang/crates.io-index" 795 | checksum = "fc855a42c7967b7c369eb5860f7164ef1f6f81c20c7cc1141f2a604e18723b03" 796 | dependencies = [ 797 | "serde_derive", 798 | ] 799 | 800 | [[package]] 801 | name = "serde_derive" 802 | version = "1.0.140" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | checksum = "6f2122636b9fe3b81f1cb25099fcf2d3f542cdb1d45940d56c713158884a05da" 805 | dependencies = [ 806 | "proc-macro2", 807 | "quote", 808 | "syn", 809 | ] 810 | 811 | [[package]] 812 | name = "serde_json" 813 | version = "1.0.82" 814 | source = "registry+https://github.com/rust-lang/crates.io-index" 815 | checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" 816 | dependencies = [ 817 | "itoa", 818 | "ryu", 819 | "serde", 820 | ] 821 | 822 | [[package]] 823 | name = "serde_urlencoded" 824 | version = "0.7.1" 825 | source = "registry+https://github.com/rust-lang/crates.io-index" 826 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 827 | dependencies = [ 828 | "form_urlencoded", 829 | "itoa", 830 | "ryu", 831 | "serde", 832 | ] 833 | 834 | [[package]] 835 | name = "slab" 836 | version = "0.4.7" 837 | source = "registry+https://github.com/rust-lang/crates.io-index" 838 | checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" 839 | dependencies = [ 840 | "autocfg", 841 | ] 842 | 843 | [[package]] 844 | name = "socket2" 845 | version = "0.4.4" 846 | source = "registry+https://github.com/rust-lang/crates.io-index" 847 | checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" 848 | dependencies = [ 849 | "libc", 850 | "winapi", 851 | ] 852 | 853 | [[package]] 854 | name = "strsim" 855 | version = "0.10.0" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 858 | 859 | [[package]] 860 | name = "syn" 861 | version = "1.0.98" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd" 864 | dependencies = [ 865 | "proc-macro2", 866 | "quote", 867 | "unicode-ident", 868 | ] 869 | 870 | [[package]] 871 | name = "tempfile" 872 | version = "3.3.0" 873 | source = "registry+https://github.com/rust-lang/crates.io-index" 874 | checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" 875 | dependencies = [ 876 | "cfg-if", 877 | "fastrand", 878 | "libc", 879 | "redox_syscall", 880 | "remove_dir_all", 881 | "winapi", 882 | ] 883 | 884 | [[package]] 885 | name = "termcolor" 886 | version = "1.1.3" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" 889 | dependencies = [ 890 | "winapi-util", 891 | ] 892 | 893 | [[package]] 894 | name = "terminal_size" 895 | version = "0.1.17" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" 898 | dependencies = [ 899 | "libc", 900 | "winapi", 901 | ] 902 | 903 | [[package]] 904 | name = "textwrap" 905 | version = "0.15.0" 906 | source = "registry+https://github.com/rust-lang/crates.io-index" 907 | checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb" 908 | 909 | [[package]] 910 | name = "tinyvec" 911 | version = "1.6.0" 912 | source = "registry+https://github.com/rust-lang/crates.io-index" 913 | checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" 914 | dependencies = [ 915 | "tinyvec_macros", 916 | ] 917 | 918 | [[package]] 919 | name = "tinyvec_macros" 920 | version = "0.1.0" 921 | source = "registry+https://github.com/rust-lang/crates.io-index" 922 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 923 | 924 | [[package]] 925 | name = "tokio" 926 | version = "1.20.0" 927 | source = "registry+https://github.com/rust-lang/crates.io-index" 928 | checksum = "57aec3cfa4c296db7255446efb4928a6be304b431a806216105542a67b6ca82e" 929 | dependencies = [ 930 | "autocfg", 931 | "bytes", 932 | "libc", 933 | "memchr", 934 | "mio", 935 | "num_cpus", 936 | "once_cell", 937 | "pin-project-lite", 938 | "socket2", 939 | "winapi", 940 | ] 941 | 942 | [[package]] 943 | name = "tokio-native-tls" 944 | version = "0.3.0" 945 | source = "registry+https://github.com/rust-lang/crates.io-index" 946 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 947 | dependencies = [ 948 | "native-tls", 949 | "tokio", 950 | ] 951 | 952 | [[package]] 953 | name = "tokio-util" 954 | version = "0.7.3" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45" 957 | dependencies = [ 958 | "bytes", 959 | "futures-core", 960 | "futures-sink", 961 | "pin-project-lite", 962 | "tokio", 963 | "tracing", 964 | ] 965 | 966 | [[package]] 967 | name = "tower-service" 968 | version = "0.3.2" 969 | source = "registry+https://github.com/rust-lang/crates.io-index" 970 | checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" 971 | 972 | [[package]] 973 | name = "tracing" 974 | version = "0.1.35" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "a400e31aa60b9d44a52a8ee0343b5b18566b03a8321e0d321f695cf56e940160" 977 | dependencies = [ 978 | "cfg-if", 979 | "pin-project-lite", 980 | "tracing-core", 981 | ] 982 | 983 | [[package]] 984 | name = "tracing-core" 985 | version = "0.1.28" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | checksum = "7b7358be39f2f274f322d2aaed611acc57f382e8eb1e5b48cb9ae30933495ce7" 988 | dependencies = [ 989 | "once_cell", 990 | ] 991 | 992 | [[package]] 993 | name = "try-lock" 994 | version = "0.2.3" 995 | source = "registry+https://github.com/rust-lang/crates.io-index" 996 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 997 | 998 | [[package]] 999 | name = "unicode-bidi" 1000 | version = "0.3.8" 1001 | source = "registry+https://github.com/rust-lang/crates.io-index" 1002 | checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" 1003 | 1004 | [[package]] 1005 | name = "unicode-ident" 1006 | version = "1.0.2" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "15c61ba63f9235225a22310255a29b806b907c9b8c964bcbd0a2c70f3f2deea7" 1009 | 1010 | [[package]] 1011 | name = "unicode-normalization" 1012 | version = "0.1.21" 1013 | source = "registry+https://github.com/rust-lang/crates.io-index" 1014 | checksum = "854cbdc4f7bc6ae19c820d44abdc3277ac3e1b2b93db20a636825d9322fb60e6" 1015 | dependencies = [ 1016 | "tinyvec", 1017 | ] 1018 | 1019 | [[package]] 1020 | name = "unicode-width" 1021 | version = "0.1.9" 1022 | source = "registry+https://github.com/rust-lang/crates.io-index" 1023 | checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" 1024 | 1025 | [[package]] 1026 | name = "url" 1027 | version = "2.2.2" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 1030 | dependencies = [ 1031 | "form_urlencoded", 1032 | "idna", 1033 | "matches", 1034 | "percent-encoding", 1035 | ] 1036 | 1037 | [[package]] 1038 | name = "uuid" 1039 | version = "1.1.2" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" 1042 | dependencies = [ 1043 | "getrandom", 1044 | ] 1045 | 1046 | [[package]] 1047 | name = "vcpkg" 1048 | version = "0.2.15" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1051 | 1052 | [[package]] 1053 | name = "version_check" 1054 | version = "0.9.4" 1055 | source = "registry+https://github.com/rust-lang/crates.io-index" 1056 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1057 | 1058 | [[package]] 1059 | name = "want" 1060 | version = "0.3.0" 1061 | source = "registry+https://github.com/rust-lang/crates.io-index" 1062 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1063 | dependencies = [ 1064 | "log", 1065 | "try-lock", 1066 | ] 1067 | 1068 | [[package]] 1069 | name = "wasi" 1070 | version = "0.11.0+wasi-snapshot-preview1" 1071 | source = "registry+https://github.com/rust-lang/crates.io-index" 1072 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1073 | 1074 | [[package]] 1075 | name = "wasm-bindgen" 1076 | version = "0.2.81" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | checksum = "7c53b543413a17a202f4be280a7e5c62a1c69345f5de525ee64f8cfdbc954994" 1079 | dependencies = [ 1080 | "cfg-if", 1081 | "wasm-bindgen-macro", 1082 | ] 1083 | 1084 | [[package]] 1085 | name = "wasm-bindgen-backend" 1086 | version = "0.2.81" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "5491a68ab4500fa6b4d726bd67408630c3dbe9c4fe7bda16d5c82a1fd8c7340a" 1089 | dependencies = [ 1090 | "bumpalo", 1091 | "lazy_static", 1092 | "log", 1093 | "proc-macro2", 1094 | "quote", 1095 | "syn", 1096 | "wasm-bindgen-shared", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "wasm-bindgen-futures" 1101 | version = "0.4.31" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "de9a9cec1733468a8c657e57fa2413d2ae2c0129b95e87c5b72b8ace4d13f31f" 1104 | dependencies = [ 1105 | "cfg-if", 1106 | "js-sys", 1107 | "wasm-bindgen", 1108 | "web-sys", 1109 | ] 1110 | 1111 | [[package]] 1112 | name = "wasm-bindgen-macro" 1113 | version = "0.2.81" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "c441e177922bc58f1e12c022624b6216378e5febc2f0533e41ba443d505b80aa" 1116 | dependencies = [ 1117 | "quote", 1118 | "wasm-bindgen-macro-support", 1119 | ] 1120 | 1121 | [[package]] 1122 | name = "wasm-bindgen-macro-support" 1123 | version = "0.2.81" 1124 | source = "registry+https://github.com/rust-lang/crates.io-index" 1125 | checksum = "7d94ac45fcf608c1f45ef53e748d35660f168490c10b23704c7779ab8f5c3048" 1126 | dependencies = [ 1127 | "proc-macro2", 1128 | "quote", 1129 | "syn", 1130 | "wasm-bindgen-backend", 1131 | "wasm-bindgen-shared", 1132 | ] 1133 | 1134 | [[package]] 1135 | name = "wasm-bindgen-shared" 1136 | version = "0.2.81" 1137 | source = "registry+https://github.com/rust-lang/crates.io-index" 1138 | checksum = "6a89911bd99e5f3659ec4acf9c4d93b0a90fe4a2a11f15328472058edc5261be" 1139 | 1140 | [[package]] 1141 | name = "web-sys" 1142 | version = "0.3.58" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "2fed94beee57daf8dd7d51f2b15dc2bcde92d7a72304cdf662a4371008b71b90" 1145 | dependencies = [ 1146 | "js-sys", 1147 | "wasm-bindgen", 1148 | ] 1149 | 1150 | [[package]] 1151 | name = "winapi" 1152 | version = "0.3.9" 1153 | source = "registry+https://github.com/rust-lang/crates.io-index" 1154 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1155 | dependencies = [ 1156 | "winapi-i686-pc-windows-gnu", 1157 | "winapi-x86_64-pc-windows-gnu", 1158 | ] 1159 | 1160 | [[package]] 1161 | name = "winapi-i686-pc-windows-gnu" 1162 | version = "0.4.0" 1163 | source = "registry+https://github.com/rust-lang/crates.io-index" 1164 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1165 | 1166 | [[package]] 1167 | name = "winapi-util" 1168 | version = "0.1.5" 1169 | source = "registry+https://github.com/rust-lang/crates.io-index" 1170 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1171 | dependencies = [ 1172 | "winapi", 1173 | ] 1174 | 1175 | [[package]] 1176 | name = "winapi-x86_64-pc-windows-gnu" 1177 | version = "0.4.0" 1178 | source = "registry+https://github.com/rust-lang/crates.io-index" 1179 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1180 | 1181 | [[package]] 1182 | name = "windows-sys" 1183 | version = "0.36.1" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" 1186 | dependencies = [ 1187 | "windows_aarch64_msvc", 1188 | "windows_i686_gnu", 1189 | "windows_i686_msvc", 1190 | "windows_x86_64_gnu", 1191 | "windows_x86_64_msvc", 1192 | ] 1193 | 1194 | [[package]] 1195 | name = "windows_aarch64_msvc" 1196 | version = "0.36.1" 1197 | source = "registry+https://github.com/rust-lang/crates.io-index" 1198 | checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" 1199 | 1200 | [[package]] 1201 | name = "windows_i686_gnu" 1202 | version = "0.36.1" 1203 | source = "registry+https://github.com/rust-lang/crates.io-index" 1204 | checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" 1205 | 1206 | [[package]] 1207 | name = "windows_i686_msvc" 1208 | version = "0.36.1" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" 1211 | 1212 | [[package]] 1213 | name = "windows_x86_64_gnu" 1214 | version = "0.36.1" 1215 | source = "registry+https://github.com/rust-lang/crates.io-index" 1216 | checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" 1217 | 1218 | [[package]] 1219 | name = "windows_x86_64_msvc" 1220 | version = "0.36.1" 1221 | source = "registry+https://github.com/rust-lang/crates.io-index" 1222 | checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" 1223 | 1224 | [[package]] 1225 | name = "winreg" 1226 | version = "0.10.1" 1227 | source = "registry+https://github.com/rust-lang/crates.io-index" 1228 | checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" 1229 | dependencies = [ 1230 | "winapi", 1231 | ] 1232 | --------------------------------------------------------------------------------