diff --git a/Cargo.lock b/Cargo.lock index 36f8579..531d16e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2342,7 +2342,7 @@ checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" dependencies = [ "bitflags", "jni-sys", - "ndk-sys 0.4.0", + "ndk-sys 0.4.1+23.1.7779620", "num_enum", "raw-window-handle 0.5.0", "thiserror", @@ -2380,7 +2380,7 @@ dependencies = [ "ndk 0.7.0", "ndk-context", "ndk-macro", - "ndk-sys 0.4.0", + "ndk-sys 0.4.1+23.1.7779620", "once_cell", "parking_lot", ] @@ -2409,9 +2409,9 @@ dependencies = [ [[package]] name = "ndk-sys" -version = "0.4.0" +version = "0.4.1+23.1.7779620" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21d83ec9c63ec5bf950200a8e508bdad6659972187b625469f58ef8c08e29046" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" dependencies = [ "jni-sys", ] @@ -2633,9 +2633,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.42" +version = "0.10.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12fc0523e3bd51a692c8850d075d74dc062ccf251c0110668cbd921917118a13" +checksum = "020433887e44c27ff16365eaa2d380547a94544ad509aff6eb5b6e3e0b27b376" dependencies = [ "bitflags", "cfg-if", @@ -2674,9 +2674,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.77" +version = "0.9.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03b84c3b2d099b81f0953422b4d4ad58761589d0229b5506356afca05a3670a" +checksum = "07d5c8cb6e57b3a3612064d7b18b117912b4ce70955c2504d4b741c9e244b132" dependencies = [ "autocfg", "cc", @@ -5260,9 +5260,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.1+zstd.1.5.2" +version = "2.0.2+zstd.1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd07cbbc53846d9145dbffdf6dd09a7a0aa52be46741825f5c97bdd4f73f12b" +checksum = "24faa29d97c8ddca9b37b680e3bd2d5439d864a9cac3a0640d086b71c908bb83" dependencies = [ "cc", "libc", diff --git a/src/constants.rs b/src/constants.rs index 4c976c3..d2069d8 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -15,10 +15,10 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . -pub const GUPAX_VERSION: &'static str = concat!("v", env!("CARGO_PKG_VERSION")); -pub const P2POOL_VERSION: &'static str = "v2.4"; -pub const XMRIG_VERSION: &'static str = "v6.18.0"; -pub const COMMIT: &'static str = include_str!("../.git/refs/heads/main"); +pub const GUPAX_VERSION: &str = concat!("v", env!("CARGO_PKG_VERSION")); +pub const P2POOL_VERSION: &str = "v2.4"; +pub const XMRIG_VERSION: &str = "v6.18.0"; +pub const COMMIT: &str = include_str!("../.git/refs/heads/main"); // App frame resolution, [16:10] aspect ratio, height = width * 1.6 pub const APP_MIN_WIDTH: f32 = 768.0; @@ -35,9 +35,9 @@ pub const BYTES_ICON: &[u8] = include_bytes!("../images/icons/icon@2x.png"); #[cfg(not(target_os = "macos"))] pub const BYTES_ICON: &[u8] = include_bytes!("../images/icons/icon.png"); pub const BYTES_BANNER: &[u8] = include_bytes!("../images/banner.png"); -pub const P2POOL_BASE_ARGS: &'static str = ""; -pub const XMRIG_BASE_ARGS: &'static str = "--http-host=127.0.0.1 --http-port=18088 --algo=rx/0 --coin=Monero"; -pub const HORIZONTAL: &'static str = "--------------------------------------------"; +pub const P2POOL_BASE_ARGS: &str = ""; +pub const XMRIG_BASE_ARGS: &str = "--http-host=127.0.0.1 --http-port=18088 --algo=rx/0 --coin=Monero"; +pub const HORIZONTAL: &str = "--------------------------------------------"; // This is the typical space added when using // [ui.separator()] or [ui.group()] @@ -64,81 +64,81 @@ pub const OS: &'static str = " macOS"; pub const OS_NAME: &'static str = "macOS"; #[cfg(target_os = "linux")] -pub const OS: &'static str = "🐧 Linux"; +pub const OS: &str = "🐧 Linux"; #[cfg(target_os = "linux")] -pub const OS_NAME: &'static str = "Linux"; +pub const OS_NAME: &str = "Linux"; // Tooltips // Gupax -pub const GUPAX_UPDATE: &'static str = "Check for updates on Gupax, P2Pool, and XMRig via GitHub's API and upgrade automatically"; -pub const GUPAX_AUTO_UPDATE: &'static str = "Automatically check for updates at startup"; +pub const GUPAX_UPDATE: &str = "Check for updates on Gupax, P2Pool, and XMRig via GitHub's API and upgrade automatically"; +pub const GUPAX_AUTO_UPDATE: &str = "Automatically check for updates at startup"; #[cfg(not(target_os = "macos"))] -pub const GUPAX_UPDATE_VIA_TOR: &'static str = "Update through the Tor network. Tor is embedded within Gupax; a Tor system proxy is not required"; +pub const GUPAX_UPDATE_VIA_TOR: &str = "Update through the Tor network. Tor is embedded within Gupax; a Tor system proxy is not required"; #[cfg(target_os = "macos")] // Arti library has issues on macOS pub const GUPAX_UPDATE_VIA_TOR: &'static str = "WARNING: This option is unstable on macOS. Update through the Tor network. Tor is embedded within Gupax; a Tor system proxy is not required"; -pub const GUPAX_ASK_BEFORE_QUIT: &'static str = "Ask before quitting Gupax"; -pub const GUPAX_SAVE_BEFORE_QUIT: &'static str = "Automatically save any changed settings before quitting"; -pub const GUPAX_WIDTH: &'static str = "Set the width of the Gupax window"; -pub const GUPAX_HEIGHT: &'static str = "Set the height of the Gupax window"; -pub const GUPAX_LOCK_WIDTH: &'static str = "Automatically match the height against the width in a 16:10 ratio; aka HEIGHT = WIDTH / 1.6"; -pub const GUPAX_LOCK_HEIGHT: &'static str = "Automatically match the width against the height in a 16:10 ratio; aka WIDTH = HEIGHT * 1.6"; -pub const GUPAX_NO_LOCK: &'static str = "Allow individual selection of width and height"; -pub const GUPAX_SET: &'static str = "Set the width/height of the Gupax window to the current values"; -pub const GUPAX_SIMPLE: &'static str = +pub const GUPAX_ASK_BEFORE_QUIT: &str = "Ask before quitting Gupax"; +pub const GUPAX_SAVE_BEFORE_QUIT: &str = "Automatically save any changed settings before quitting"; +pub const GUPAX_WIDTH: &str = "Set the width of the Gupax window"; +pub const GUPAX_HEIGHT: &str = "Set the height of the Gupax window"; +pub const GUPAX_LOCK_WIDTH: &str = "Automatically match the height against the width in a 16:10 ratio; aka HEIGHT = WIDTH / 1.6"; +pub const GUPAX_LOCK_HEIGHT: &str = "Automatically match the width against the height in a 16:10 ratio; aka WIDTH = HEIGHT * 1.6"; +pub const GUPAX_NO_LOCK: &str = "Allow individual selection of width and height"; +pub const GUPAX_SET: &str = "Set the width/height of the Gupax window to the current values"; +pub const GUPAX_SIMPLE: &str = r#"Use simple Gupax settings: - Update button - Basic toggles"#; -pub const GUPAX_ADVANCED: &'static str = +pub const GUPAX_ADVANCED: &str = r#"Use advanced Gupax settings: - Update button - Basic toggles - P2Pool/XMRig binary path selector - Gupax resolution sliders"#; -pub const GUPAX_SELECT: &'static str = "Open a file explorer to select a file"; -pub const GUPAX_PATH_P2POOL: &'static str = "The location of the P2Pool binary: Both absolute and relative paths are accepted; A red [X] will appear if there is no file found at the given path"; -pub const GUPAX_PATH_XMRIG: &'static str = "The location of the XMRig binary: Both absolute and relative paths are accepted; A red [X] will appear if there is no file found at the given path"; +pub const GUPAX_SELECT: &str = "Open a file explorer to select a file"; +pub const GUPAX_PATH_P2POOL: &str = "The location of the P2Pool binary: Both absolute and relative paths are accepted; A red [X] will appear if there is no file found at the given path"; +pub const GUPAX_PATH_XMRIG: &str = "The location of the XMRig binary: Both absolute and relative paths are accepted; A red [X] will appear if there is no file found at the given path"; // P2Pool -pub const P2POOL_MAIN: &'static str = "Use the P2Pool main-chain. This P2Pool finds shares faster, but has a higher difficulty. Suitable for miners with more than 50kH/s"; -pub const P2POOL_MINI: &'static str = "Use the P2Pool mini-chain. This P2Pool finds shares slower, but has a lower difficulty. Suitable for miners with less than 50kH/s"; -pub const P2POOL_OUT: &'static str = "How many out-bound peers to connect to? (you connecting to others)"; -pub const P2POOL_IN: &'static str = "How many in-bound peers to allow? (others connecting to you)"; -pub const P2POOL_LOG: &'static str = "Verbosity of the console log"; -pub const P2POOL_AUTO_NODE: &'static str = "Automatically ping the community Monero nodes at Gupax startup"; -pub const P2POOL_AUTO_SELECT: &'static str = "Automatically select the fastest community Monero node after pinging"; -pub const P2POOL_SELECT_FASTEST: &'static str = "Select the fastest community Monero node"; -pub const P2POOL_PING: &'static str = "Ping the built-in community Monero nodes"; -pub const P2POOL_ADDRESS: &'static str = "You must use a primary Monero address to mine on P2Pool (starts with a 4). It is highly recommended to create a new wallet for P2Pool mining; wallet addresses are public on P2Pool!"; -pub const P2POOL_COMMAND: &'static str = "Start P2Pool with these arguments and override all below settings; If the [--data-api] flag is not given, Gupax will append it to the arguments automatically so that the [Status] tab can work"; -pub const P2POOL_SIMPLE: &'static str = +pub const P2POOL_MAIN: &str = "Use the P2Pool main-chain. This P2Pool finds shares faster, but has a higher difficulty. Suitable for miners with more than 50kH/s"; +pub const P2POOL_MINI: &str = "Use the P2Pool mini-chain. This P2Pool finds shares slower, but has a lower difficulty. Suitable for miners with less than 50kH/s"; +pub const P2POOL_OUT: &str = "How many out-bound peers to connect to? (you connecting to others)"; +pub const P2POOL_IN: &str = "How many in-bound peers to allow? (others connecting to you)"; +pub const P2POOL_LOG: &str = "Verbosity of the console log"; +pub const P2POOL_AUTO_NODE: &str = "Automatically ping the community Monero nodes at Gupax startup"; +pub const P2POOL_AUTO_SELECT: &str = "Automatically select the fastest community Monero node after pinging"; +pub const P2POOL_SELECT_FASTEST: &str = "Select the fastest community Monero node"; +pub const P2POOL_PING: &str = "Ping the built-in community Monero nodes"; +pub const P2POOL_ADDRESS: &str = "You must use a primary Monero address to mine on P2Pool (starts with a 4). It is highly recommended to create a new wallet for P2Pool mining; wallet addresses are public on P2Pool!"; +pub const P2POOL_COMMAND: &str = "Start P2Pool with these arguments and override all below settings; If the [--data-api] flag is not given, Gupax will append it to the arguments automatically so that the [Status] tab can work"; +pub const P2POOL_SIMPLE: &str = r#"Use simple P2Pool settings: - Remote community Monero node - Default P2Pool settings + Mini"#; -pub const P2POOL_ADVANCED: &'static str = +pub const P2POOL_ADVANCED: &str = r#"Use advanced P2Pool settings: - Overriding command arguments - Manual node list - P2Pool Main/Mini selection - Out/In peer setting - Log level setting"#; -pub const P2POOL_NAME: &'static str = "Add a unique name to identify this node; Only [A-Za-z0-9-_] and spaces allowed; Max length = 30 characters"; -pub const P2POOL_NODE_IP: &'static str = "Specify the Monero Node IP to connect to with P2Pool; It must be a valid IPv4 address or a valid domain name; Max length = 255 characters"; -pub const P2POOL_RPC_PORT: &'static str = "Specify the RPC port of the Monero node; [1-65535]"; -pub const P2POOL_ZMQ_PORT: &'static str = "Specify the ZMQ port of the Monero node; [1-65535]"; +pub const P2POOL_NAME: &str = "Add a unique name to identify this node; Only [A-Za-z0-9-_] and spaces allowed; Max length = 30 characters"; +pub const P2POOL_NODE_IP: &str = "Specify the Monero Node IP to connect to with P2Pool; It must be a valid IPv4 address or a valid domain name; Max length = 255 characters"; +pub const P2POOL_RPC_PORT: &str = "Specify the RPC port of the Monero node; [1-65535]"; +pub const P2POOL_ZMQ_PORT: &str = "Specify the ZMQ port of the Monero node; [1-65535]"; // Node/Pool list -pub const LIST_ADD: &'static str = "Add the current values to the list"; -pub const LIST_SAVE: &'static str = "Save the current values to the already existing entry"; -pub const LIST_DELETE: &'static str = "Delete the currently selected entry"; -pub const LIST_CLEAR: &'static str = "Clear all current values"; +pub const LIST_ADD: &str = "Add the current values to the list"; +pub const LIST_SAVE: &str = "Save the current values to the already existing entry"; +pub const LIST_DELETE: &str = "Delete the currently selected entry"; +pub const LIST_CLEAR: &str = "Clear all current values"; // XMRig -pub const XMRIG_SIMPLE: &'static str = +pub const XMRIG_SIMPLE: &str = r#"Use simple XMRig settings: - Mine to local P2Pool (localhost:3333) - CPU thread slider - HTTP API @ localhost:18088"#; -pub const XMRIG_ADVANCED: &'static str = +pub const XMRIG_ADVANCED: &str = r#"Use advanced XMRig settings: - Overriding config file - Custom payout address @@ -147,21 +147,21 @@ r#"Use advanced XMRig settings: - TLS setting - Keepalive setting - Custom HTTP API IP/Port"#; -pub const XMRIG_CONFIG: &'static str = "Start XMRig with this config file and override all below settings; If the [http-api] options are not set, the [Status] tab will not properly show XMRig stats. If they are set, Gupax will detect which automatically IP/Port you are using"; -pub const XMRIG_ADDRESS: &'static str = "Specify which Monero address to send payouts to; Must be a valid primary address (starts with 4)"; -pub const XMRIG_NAME: &'static str = "Add a unique name to identify this pool; Only [A-Za-z0-9-_] and spaces allowed; Max length = 30 characters"; -pub const XMRIG_IP: &'static str = "Specify the pool IP to connect to with XMRig; It must be a valid IPv4 address or a valid domain name; Max length = 255 characters"; -pub const XMRIG_PORT: &'static str = "Specify the port of the pool; [1-65535]"; -pub const XMRIG_RIG: &'static str = "Add a unique rig ID. This will be the name shown on the pool; Only [A-Za-z0-9-_] and spaces allowed; Max length = 30 characters"; -pub const XMRIG_PAUSE: &'static str = "THIS SETTING IS DISABLED IF SET TO [0]. Pause mining if user is active, resume after"; -pub const XMRIG_API_IP: &'static str = "Specify which IP to bind to for XMRig's HTTP API"; -pub const XMRIG_API_PORT: &'static str = "Specify which port to bind to for XMRig's HTTP API"; -pub const XMRIG_TLS: &'static str = "Enable SSL/TLS connections (needs pool support)"; -pub const XMRIG_KEEPALIVE: &'static str = "Send keepalived packet to prevent timeout (needs pool support)"; -pub const XMRIG_THREADS: &'static str = "Number of CPU threads to use for mining"; +pub const XMRIG_CONFIG: &str = "Start XMRig with this config file and override all below settings; If the [http-api] options are not set, the [Status] tab will not properly show XMRig stats. If they are set, Gupax will detect which automatically IP/Port you are using"; +pub const XMRIG_ADDRESS: &str = "Specify which Monero address to send payouts to; Must be a valid primary address (starts with 4)"; +pub const XMRIG_NAME: &str = "Add a unique name to identify this pool; Only [A-Za-z0-9-_] and spaces allowed; Max length = 30 characters"; +pub const XMRIG_IP: &str = "Specify the pool IP to connect to with XMRig; It must be a valid IPv4 address or a valid domain name; Max length = 255 characters"; +pub const XMRIG_PORT: &str = "Specify the port of the pool; [1-65535]"; +pub const XMRIG_RIG: &str = "Add a unique rig ID. This will be the name shown on the pool; Only [A-Za-z0-9-_] and spaces allowed; Max length = 30 characters"; +pub const XMRIG_PAUSE: &str = "THIS SETTING IS DISABLED IF SET TO [0]. Pause mining if user is active, resume after"; +pub const XMRIG_API_IP: &str = "Specify which IP to bind to for XMRig's HTTP API"; +pub const XMRIG_API_PORT: &str = "Specify which port to bind to for XMRig's HTTP API"; +pub const XMRIG_TLS: &str = "Enable SSL/TLS connections (needs pool support)"; +pub const XMRIG_KEEPALIVE: &str = "Send keepalived packet to prevent timeout (needs pool support)"; +pub const XMRIG_THREADS: &str = "Number of CPU threads to use for mining"; // CLI argument messages -pub const ARG_HELP: &'static str = +pub const ARG_HELP: &str = r#"USAGE: ./gupax [--flag] --help Print this help message @@ -178,7 +178,7 @@ r#"USAGE: ./gupax [--flag] To view more detailed console debug information, start Gupax with the environment variable [RUST_LOG] set to a log level like so: RUST_LOG=(trace|debug|info|warn|error) ./gupax"#; -pub const ARG_COPYRIGHT: &'static str = +pub const ARG_COPYRIGHT: &str = r#"Gupax is licensed under GPLv3. For more information, see link below: "#; diff --git a/src/disk.rs b/src/disk.rs index 61d8a8d..df022c9 100644 --- a/src/disk.rs +++ b/src/disk.rs @@ -49,23 +49,23 @@ use log::*; //---------------------------------------------------------------------------------------------------- Const // State file -const ERROR: &'static str = "Disk error"; -const PATH_ERROR: &'static str = "PATH for state directory could not be not found"; +const ERROR: &str = "Disk error"; +const PATH_ERROR: &str = "PATH for state directory could not be not found"; #[cfg(target_os = "windows")] const DIRECTORY: &'static str = r#"Gupax\"#; #[cfg(target_os = "macos")] const DIRECTORY: &'static str = "Gupax/"; #[cfg(target_os = "linux")] -const DIRECTORY: &'static str = "gupax/"; +const DIRECTORY: &str = "gupax/"; #[cfg(target_os = "windows")] pub const DEFAULT_P2POOL_PATH: &'static str = r"P2Pool\p2pool.exe"; #[cfg(target_family = "unix")] -pub const DEFAULT_P2POOL_PATH: &'static str = "p2pool/p2pool"; +pub const DEFAULT_P2POOL_PATH: &str = "p2pool/p2pool"; #[cfg(target_os = "windows")] pub const DEFAULT_XMRIG_PATH: &'static str = r"XMRig\xmrig.exe"; #[cfg(target_family = "unix")] -pub const DEFAULT_XMRIG_PATH: &'static str = "xmrig/xmrig"; +pub const DEFAULT_XMRIG_PATH: &str = "xmrig/xmrig"; //---------------------------------------------------------------------------------------------------- General functions for all [File]'s // get_file_path() | Return absolute path to OS data path + filename @@ -99,7 +99,7 @@ pub fn create_gupax_dir(path: &PathBuf) -> Result<(), TomlError> { // Convert a [File] path to a [String] pub fn read_to_string(file: File, path: &PathBuf) -> Result { - match fs::read_to_string(&path) { + match fs::read_to_string(path) { Ok(string) => { info!("{:?} | Read ... OK", file); Ok(string) @@ -111,8 +111,8 @@ pub fn read_to_string(file: File, path: &PathBuf) -> Result { } } -// Write [String] to console with [info!] surrounded by "---" -pub fn print_toml(toml: &String) { +// Write str to console with [info!] surrounded by "---" +pub fn print_toml(toml: &str) { info!("{}", HORIZONTAL); for i in toml.lines() { info!("{}", i); } info!("{}", HORIZONTAL); @@ -135,8 +135,7 @@ pub fn into_absolute_path(path: String) -> Result { impl State { pub fn new() -> Self { let max_threads = num_cpus::get(); - let current_threads; - if max_threads == 1 { current_threads = 1; } else { current_threads = max_threads / 2; } + let current_threads = if max_threads == 1 { 1 } else { max_threads / 2 }; Self { gupax: Gupax { simple: true, @@ -206,12 +205,12 @@ impl State { } } - // Convert [String] to [State] - pub fn from_string(string: &String) -> Result { - match toml::de::from_str(&string) { + // Convert [&str] to [State] + pub fn from_str(string: &str) -> Result { + match toml::de::from_str(string) { Ok(state) => { info!("State | Parse ... OK"); - print_toml(&string); + print_toml(string); Ok(state) } Err(err) => { @@ -229,19 +228,19 @@ impl State { pub fn get(path: &PathBuf) -> Result { // Read let file = File::State; - let string = match read_to_string(file, &path) { + let string = match read_to_string(file, path) { Ok(string) => string, // Create _ => { Self::create_new(path)?; - match read_to_string(file, &path) { + match read_to_string(file, path) { Ok(s) => s, Err(e) => return Err(e), } }, }; // Deserialize, attempt merge if failed - match Self::from_string(&string) { + match Self::from_str(&string) { Ok(s) => Ok(s), Err(_) => { warn!("State | Attempting merge..."); @@ -259,7 +258,7 @@ impl State { Ok(o) => o, Err(e) => { error!("State | Couldn't serialize default file: {}", e); return Err(TomlError::Serialize(e)) }, }; - fs::write(&path, &string)?; + fs::write(path, &string)?; info!("State | Write ... OK"); Ok(new) } @@ -280,7 +279,7 @@ impl State { }; match fs::write(path, string) { Ok(_) => { info!("State | Save ... OK"); Ok(()) }, - Err(err) => { error!("State | Couldn't overwrite TOML file ... FAIL"); return Err(TomlError::Io(err)) }, + Err(err) => { error!("State | Couldn't overwrite TOML file ... FAIL"); Err(TomlError::Io(err)) }, } } @@ -313,14 +312,12 @@ impl Node { } pub fn new_vec() -> Vec<(String, Self)> { - let mut vec = Vec::new(); - vec.push(("Local Monero Node".to_string(), Self::localhost())); - vec + vec![("Local Monero Node".to_string(), Self::localhost())] } // Convert [String] to [Node] Vec - pub fn from_string_to_vec(string: &String) -> Result, TomlError> { - let nodes: toml::map::Map = match toml::de::from_str(&string) { + pub fn from_str_to_vec(string: &str) -> Result, TomlError> { + let nodes: toml::map::Map = match toml::de::from_str(string) { Ok(map) => { info!("Node | Parse ... OK"); map @@ -345,7 +342,7 @@ impl Node { // Convert [Vec<(String, Self)>] into [String] // that can be written as a proper TOML file - pub fn to_string(vec: &Vec<(String, Self)>) -> Result { + pub fn to_string(vec: &[(String, Self)]) -> Result { let mut toml = String::new(); for (key, value) in vec.iter() { write!( @@ -368,16 +365,16 @@ impl Node { pub fn get(path: &PathBuf) -> Result, TomlError> { // Read let file = File::Node; - let string = match read_to_string(file, &path) { + let string = match read_to_string(file, path) { Ok(string) => string, // Create _ => { Self::create_new(path)?; - read_to_string(file, &path)? + read_to_string(file, path)? }, }; // Deserialize, attempt merge if failed - Self::from_string_to_vec(&string) + Self::from_str_to_vec(&string) } // Completely overwrite current [node.toml] @@ -386,13 +383,13 @@ impl Node { info!("Node | Creating new default..."); let new = Self::new_vec(); let string = Self::to_string(&Self::new_vec())?; - fs::write(&path, &string)?; + fs::write(path, &string)?; info!("Node | Write ... OK"); Ok(new) } // Save [Node] onto disk file [node.toml] - pub fn save(vec: &Vec<(String, Self)>, path: &PathBuf) -> Result<(), TomlError> { + pub fn save(vec: &[(String, Self)], path: &PathBuf) -> Result<(), TomlError> { info!("Node | Saving to disk..."); let string = Self::to_string(vec)?; match fs::write(path, string) { @@ -428,13 +425,11 @@ impl Pool { } pub fn new_vec() -> Vec<(String, Self)> { - let mut vec = Vec::new(); - vec.push(("Local P2Pool".to_string(), Self::p2pool())); - vec + vec![("Local P2Pool".to_string(), Self::p2pool())] } - pub fn from_string_to_vec(string: &String) -> Result, TomlError> { - let pools: toml::map::Map = match toml::de::from_str(&string) { + pub fn from_str_to_vec(string: &str) -> Result, TomlError> { + let pools: toml::map::Map = match toml::de::from_str(string) { Ok(map) => { info!("Pool | Parse ... OK"); map @@ -457,7 +452,7 @@ impl Pool { Ok(vec) } - pub fn to_string(vec: &Vec<(String, Self)>) -> Result { + pub fn to_string(vec: &[(String, Self)]) -> Result { let mut toml = String::new(); for (key, value) in vec.iter() { write!( @@ -475,28 +470,28 @@ impl Pool { pub fn get(path: &PathBuf) -> Result, TomlError> { // Read let file = File::Pool; - let string = match read_to_string(file, &path) { + let string = match read_to_string(file, path) { Ok(string) => string, // Create _ => { Self::create_new(path)?; - read_to_string(file, &path)? + read_to_string(file, path)? }, }; // Deserialize - Self::from_string_to_vec(&string) + Self::from_str_to_vec(&string) } pub fn create_new(path: &PathBuf) -> Result, TomlError> { info!("Pool | Creating new default..."); let new = Self::new_vec(); let string = Self::to_string(&Self::new_vec())?; - fs::write(&path, &string)?; + fs::write(path, &string)?; info!("Pool | Write ... OK"); Ok(new) } - pub fn save(vec: &Vec<(String, Self)>, path: &PathBuf) -> Result<(), TomlError> { + pub fn save(vec: &[(String, Self)], path: &PathBuf) -> Result<(), TomlError> { info!("Pool | Saving to disk..."); let string = Self::to_string(vec)?; match fs::write(path, string) { diff --git a/src/ferris.rs b/src/ferris.rs index 759e20b..ab9d5b4 100644 --- a/src/ferris.rs +++ b/src/ferris.rs @@ -41,7 +41,7 @@ pub const FERRIS_PANIC: &[u8] = include_bytes!("../images/ferris/panic.png"); // // The ANSI codes were generated with [https://docs.rs/ansipix], but there is no reason to include the library and // do the computation at runtime since [ansipix] outputs a [String], so why not just put the output here as a const :D // It's hidden below with whitespace because it makes my text editor crash... -pub const FERRIS_ANSI: &'static str = " \n \u{1b}[38;2;244;149;0m▄\u{1b}[0m\u{1b}[38;2;245;150;0m▄\u{1b}[0m \u{1b}[38;2;244;148;0m▄\u{1b}[0m\u{1b}[38;2;244;148;0m▄\u{1b}[0m \u{1b}[38;2;244;146;0m▄\u{1b}[0m \n \u{1b}[38;2;244;146;0m▄\u{1b}[0m\u{1b}[38;2;244;146;0m▄\u{1b}[0m \u{1b}[38;2;244;145;0m▄\u{1b}[0m\u{1b}[38;2;244;144;0;48;2;244;147;0m▄\u{1b}[0m\u{1b}[38;2;244;144;0;48;2;244;147;0m▄\u{1b}[0m\u{1b}[38;2;244;144;0m▄\u{1b}[0m \u{1b}[38;2;244;143;0;48;2;244;146;0m▄\u{1b}[0m\u{1b}[38;2;244;143;0;48;2;244;145;0m▄\u{1b}[0m\u{1b}[38;2;244;143;0;48;2;244;145;0m▄\u{1b}[0m\u{1b}[38;2;244;143;0;48;2;244;145;0m▄\u{1b}[0m \u{1b}[38;2;244;142;0m▄\u{1b}[0m\u{1b}[38;2;244;142;0;48;2;244;144;0m▄\u{1b}[0m\u{1b}[38;2;244;142;0;48;2;244;144;0m▄\u{1b}[0m\u{1b}[38;2;244;141;0;48;2;244;144;0m▄\u{1b}[0m \u{1b}[38;2;244;140;0m▄\u{1b}[0m \n \u{1b}[38;2;244;141;0;48;2;244;143;0m▄\u{1b}[0m\u{1b}[38;2;244;141;0;48;2;244;143;0m▄\u{1b}[0m\u{1b}[38;2;244;141;0;48;2;244;143;0m▄\u{1b}[0m\u{1b}[38;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;244;140;0;48;2;244;142;0m▄\u{1b}[0m\u{1b}[38;2;244;140;0;48;2;244;142;0m▄\u{1b}[0m\u{1b}[38;2;244;140;0;48;2;244;142;0m▄\u{1b}[0m\u{1b}[38;2;244;139;0;48;2;244;142;0m▄\u{1b}[0m\u{1b}[38;2;244;139;0;48;2;244;141;0m▄\u{1b}[0m\u{1b}[38;2;244;139;0;48;2;244;141;0m▄\u{1b}[0m\u{1b}[38;2;244;139;0;48;2;244;141;0m▄\u{1b}[0m\u{1b}[38;2;244;139;0;48;2;244;141;0m▄\u{1b}[0m\u{1b}[38;2;244;138;0;48;2;244;141;0m▄\u{1b}[0m\u{1b}[38;2;244;138;0;48;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;244;138;0;48;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;244;138;0;48;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0;48;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0;48;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0;48;2;244;139;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0;48;2;244;139;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m \n \u{1b}[38;2;244;138;0;48;2;243;140;0m▄\u{1b}[0m\u{1b}[38;2;245;138;0;48;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0m▄\u{1b}[0m \u{1b}[38;2;245;137;0;48;2;244;139;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;139;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;139;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;135;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;135;0;48;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;135;0;48;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;135;0;48;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;134;0;48;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;134;0;48;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;134;0;48;2;245;136;0m▄\u{1b}[0m\u{1b}[38;2;245;134;0;48;2;245;136;0m▄\u{1b}[0m\u{1b}[38;2;245;134;0;48;2;245;136;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;136;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;136;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;133;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;133;0m▄\u{1b}[0m \u{1b}[38;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;132;0m▄\u{1b}[0m \n \u{1b}[38;2;245;133;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;133;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;133;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;133;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;133;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;133;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0;48;2;245;131;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0;48;2;245;131;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0;48;2;245;131;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;131;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;127;0m▄\u{1b}[0m \n \u{1b}[38;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;131;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;131;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0m▄\u{1b}[0m \n \u{1b}[38;2;246;126;0m▀\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m \n \u{1b}[38;2;245;120;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;113;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;113;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;113;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;113;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;113;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;113;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;113;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0m▄\u{1b}[0m \n \u{1b}[38;2;245;119;0m▀\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;113;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;113;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;113;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;113;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;113;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;113;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m \n \u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;113;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;113;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m \n \u{1b}[38;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0m▄\u{1b}[0m \n \u{1b}[38;2;246;105;0m▀\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;92;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0m▀\u{1b}[0m \n \u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;248;248;248m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;145;145;145;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;203;203;203m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;92;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;88;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;246;88;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;247;88;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;247;88;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0m▀\u{1b}[0m \n \u{1b}[38;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;92;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;92;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;92;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;92;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0m▄\u{1b}[0m \n \u{1b}[38;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;88;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;246;88;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;247;88;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;247;88;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;88;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;247;81;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;247;81;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;247;81;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;81;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;81;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▄\u{1b}[0m \n \u{1b}[38;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m \n \u{1b}[38;2;247;80;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m \u{1b}[38;2;165;43;0m▀\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0m▀\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;232;71;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▀\u{1b}[0m\u{1b}[38;2;165;43;0m▀\u{1b}[0m \u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m \u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▀\u{1b}[0m \n \u{1b}[38;2;247;78;0m▀\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m \u{1b}[38;2;165;43;0m▀\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0m▄\u{1b}[0m \u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;231;69;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;242;74;0m▀\u{1b}[0m \u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0m▀\u{1b}[0m \u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▀\u{1b}[0m \n \u{1b}[38;2;247;76;0m▀\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m \u{1b}[38;2;165;43;0m▀\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0m▄\u{1b}[0m \u{1b}[38;2;242;74;0m▀\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0m▀\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;20;5;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;233;70;0m▀\u{1b}[0m \u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0m▀\u{1b}[0m \u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m \n \u{1b}[38;2;247;76;0m▀\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▄\u{1b}[0m \u{1b}[38;2;165;43;0m▀\u{1b}[0m\u{1b}[38;2;165;43;0m▄\u{1b}[0m \u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m \u{1b}[38;2;225;67;0m▀\u{1b}[0m \u{1b}[38;2;225;67;0m▀\u{1b}[0m\u{1b}[38;2;225;67;0m▀\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;225;67;0m▀\u{1b}[0m \u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m \u{1b}[38;2;247;76;0;48;2;248;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▀\u{1b}[0m \n \u{1b}[38;2;247;76;0m▀\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▄\u{1b}[0m \u{1b}[38;2;222;66;0m▀\u{1b}[0m\u{1b}[38;2;222;66;0m▀\u{1b}[0m\u{1b}[38;2;217;63;0;48;2;222;66;0m▄\u{1b}[0m\u{1b}[38;2;217;63;0;48;2;222;66;0m▄\u{1b}[0m\u{1b}[38;2;217;63;0;48;2;222;66;0m▄\u{1b}[0m\u{1b}[38;2;217;63;0;48;2;222;66;0m▄\u{1b}[0m\u{1b}[38;2;217;63;0;48;2;222;66;0m▄\u{1b}[0m\u{1b}[38;2;217;63;0m▄\u{1b}[0m\u{1b}[38;2;217;63;0m▄\u{1b}[0m \u{1b}[38;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;212;61;0;48;2;216;63;0m▄\u{1b}[0m\u{1b}[38;2;212;61;0;48;2;216;63;0m▄\u{1b}[0m\u{1b}[38;2;212;61;0;48;2;216;63;0m▄\u{1b}[0m\u{1b}[38;2;212;61;0;48;2;216;63;0m▄\u{1b}[0m\u{1b}[38;2;212;61;0;48;2;216;63;0m▄\u{1b}[0m\u{1b}[38;2;212;61;0;48;2;216;63;0m▄\u{1b}[0m\u{1b}[38;2;216;63;0m▀\u{1b}[0m \u{1b}[38;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▀\u{1b}[0m \n \u{1b}[38;2;247;76;0m▀\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m \u{1b}[38;2;212;61;0m▀\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;207;60;0m▄\u{1b}[0m \u{1b}[38;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0m▀\u{1b}[0m\u{1b}[38;2;207;59;0m▀\u{1b}[0m \u{1b}[38;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;75;0;48;2;247;76;0m▄\u{1b}[0m \n \u{1b}[38;2;247;76;0m▀\u{1b}[0m \u{1b}[38;2;204;58;0m▀\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0m▀\u{1b}[0m \u{1b}[38;2;204;58;0m▀\u{1b}[0m\u{1b}[38;2;204;58;0m▀\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0m▀\u{1b}[0m\u{1b}[38;2;204;58;0m▀\u{1b}[0m\u{1b}[38;2;204;58;0m▀\u{1b}[0m \u{1b}[38;2;247;76;0m▀\u{1b}[0m \n Thanks for using Gupax...!\n ( 〃 ω〃)"; +pub const FERRIS_ANSI: &str = " \n \u{1b}[38;2;244;149;0m▄\u{1b}[0m\u{1b}[38;2;245;150;0m▄\u{1b}[0m \u{1b}[38;2;244;148;0m▄\u{1b}[0m\u{1b}[38;2;244;148;0m▄\u{1b}[0m \u{1b}[38;2;244;146;0m▄\u{1b}[0m \n \u{1b}[38;2;244;146;0m▄\u{1b}[0m\u{1b}[38;2;244;146;0m▄\u{1b}[0m \u{1b}[38;2;244;145;0m▄\u{1b}[0m\u{1b}[38;2;244;144;0;48;2;244;147;0m▄\u{1b}[0m\u{1b}[38;2;244;144;0;48;2;244;147;0m▄\u{1b}[0m\u{1b}[38;2;244;144;0m▄\u{1b}[0m \u{1b}[38;2;244;143;0;48;2;244;146;0m▄\u{1b}[0m\u{1b}[38;2;244;143;0;48;2;244;145;0m▄\u{1b}[0m\u{1b}[38;2;244;143;0;48;2;244;145;0m▄\u{1b}[0m\u{1b}[38;2;244;143;0;48;2;244;145;0m▄\u{1b}[0m \u{1b}[38;2;244;142;0m▄\u{1b}[0m\u{1b}[38;2;244;142;0;48;2;244;144;0m▄\u{1b}[0m\u{1b}[38;2;244;142;0;48;2;244;144;0m▄\u{1b}[0m\u{1b}[38;2;244;141;0;48;2;244;144;0m▄\u{1b}[0m \u{1b}[38;2;244;140;0m▄\u{1b}[0m \n \u{1b}[38;2;244;141;0;48;2;244;143;0m▄\u{1b}[0m\u{1b}[38;2;244;141;0;48;2;244;143;0m▄\u{1b}[0m\u{1b}[38;2;244;141;0;48;2;244;143;0m▄\u{1b}[0m\u{1b}[38;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;244;140;0;48;2;244;142;0m▄\u{1b}[0m\u{1b}[38;2;244;140;0;48;2;244;142;0m▄\u{1b}[0m\u{1b}[38;2;244;140;0;48;2;244;142;0m▄\u{1b}[0m\u{1b}[38;2;244;139;0;48;2;244;142;0m▄\u{1b}[0m\u{1b}[38;2;244;139;0;48;2;244;141;0m▄\u{1b}[0m\u{1b}[38;2;244;139;0;48;2;244;141;0m▄\u{1b}[0m\u{1b}[38;2;244;139;0;48;2;244;141;0m▄\u{1b}[0m\u{1b}[38;2;244;139;0;48;2;244;141;0m▄\u{1b}[0m\u{1b}[38;2;244;138;0;48;2;244;141;0m▄\u{1b}[0m\u{1b}[38;2;244;138;0;48;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;244;138;0;48;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;244;138;0;48;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0;48;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0;48;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0;48;2;244;139;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0;48;2;244;139;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m \n \u{1b}[38;2;244;138;0;48;2;243;140;0m▄\u{1b}[0m\u{1b}[38;2;245;138;0;48;2;244;140;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;137;0m▄\u{1b}[0m \u{1b}[38;2;245;137;0;48;2;244;139;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;139;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;139;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;136;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;135;0;48;2;244;138;0m▄\u{1b}[0m\u{1b}[38;2;245;135;0;48;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;135;0;48;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;135;0;48;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;134;0;48;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;134;0;48;2;245;137;0m▄\u{1b}[0m\u{1b}[38;2;245;134;0;48;2;245;136;0m▄\u{1b}[0m\u{1b}[38;2;245;134;0;48;2;245;136;0m▄\u{1b}[0m\u{1b}[38;2;245;134;0;48;2;245;136;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;136;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;136;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;133;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;133;0m▄\u{1b}[0m \u{1b}[38;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;132;0m▄\u{1b}[0m \n \u{1b}[38;2;245;133;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;133;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;135;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;132;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;134;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;133;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;133;0m▄\u{1b}[0m\u{1b}[38;2;245;131;0;48;2;245;133;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;133;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;133;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;130;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0;48;2;245;131;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0;48;2;245;131;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0;48;2;245;131;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;131;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;127;0m▄\u{1b}[0m \n \u{1b}[38;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0;48;2;245;132;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;131;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;131;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;128;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;130;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;127;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;129;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;126;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;128;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0m▄\u{1b}[0m \n \u{1b}[38;2;246;126;0m▀\u{1b}[0m\u{1b}[38;2;245;125;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;127;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;124;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;126;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;123;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;125;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;122;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;124;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;121;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;123;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m \n \u{1b}[38;2;245;120;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;120;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;122;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;119;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;121;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;118;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;120;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;117;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;119;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;113;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;113;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;113;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;113;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;113;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;113;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;113;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0m▄\u{1b}[0m \n \u{1b}[38;2;245;119;0m▀\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;116;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;118;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;115;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;117;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;114;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;113;0;48;2;245;116;0m▄\u{1b}[0m\u{1b}[38;2;245;113;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;113;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;113;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;115;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;113;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;113;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m \n \u{1b}[38;2;246;112;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;114;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;113;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;245;113;0m▄\u{1b}[0m\u{1b}[38;2;246;111;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;113;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;110;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;112;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;109;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;111;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;108;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;110;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m \n \u{1b}[38;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;107;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;109;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;106;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;108;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;105;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;107;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;104;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;106;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0m▄\u{1b}[0m \n \u{1b}[38;2;246;105;0m▀\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;103;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;105;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;102;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;104;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;101;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;103;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;100;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;102;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;99;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;101;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;92;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0m▀\u{1b}[0m \n \u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;98;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;100;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;97;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;99;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;96;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;98;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;246;95;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;97;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;94;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;248;248;248m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;145;145;145;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;203;203;203m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;255;255;255;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;92;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;88;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;246;88;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;247;88;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;247;88;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0m▀\u{1b}[0m \n \u{1b}[38;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;96;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;93;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;95;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;92;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;94;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;91;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;93;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;92;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;92;0m▄\u{1b}[0m\u{1b}[38;2;246;90;0;48;2;246;92;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;92;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;255;255;255m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0m▄\u{1b}[0m \n \u{1b}[38;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;89;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;246;88;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;91;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;88;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;90;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;87;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;246;89;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;246;88;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;247;88;0m▄\u{1b}[0m\u{1b}[38;2;247;86;0;48;2;247;88;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;88;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;247;81;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;247;81;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;247;81;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;81;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;81;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▄\u{1b}[0m \n \u{1b}[38;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;85;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;87;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;84;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;86;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;83;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;85;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;82;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;84;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;81;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;79;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;78;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m \n \u{1b}[38;2;247;80;0;48;2;247;83;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m\u{1b}[38;2;247;80;0;48;2;247;82;0m▄\u{1b}[0m \u{1b}[38;2;165;43;0m▀\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0m▀\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;80;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;77;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;79;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;232;71;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▀\u{1b}[0m\u{1b}[38;2;165;43;0m▀\u{1b}[0m \u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m \u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▀\u{1b}[0m \n \u{1b}[38;2;247;78;0m▀\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;78;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;77;0m▄\u{1b}[0m \u{1b}[38;2;165;43;0m▀\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0m▄\u{1b}[0m \u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;246;76;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;231;69;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;238;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;242;74;0m▀\u{1b}[0m \u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0m▀\u{1b}[0m \u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▀\u{1b}[0m \n \u{1b}[38;2;247;76;0m▀\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m \u{1b}[38;2;165;43;0m▀\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0m▄\u{1b}[0m \u{1b}[38;2;242;74;0m▀\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0m▀\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;242;74;0m▄\u{1b}[0m\u{1b}[38;2;237;72;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;0;0;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;20;5;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;0;0;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;229;68;0;48;2;233;70;0m▄\u{1b}[0m\u{1b}[38;2;233;70;0m▀\u{1b}[0m \u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m\u{1b}[38;2;165;43;0m▀\u{1b}[0m \u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m \n \u{1b}[38;2;247;76;0m▀\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▄\u{1b}[0m \u{1b}[38;2;165;43;0m▀\u{1b}[0m\u{1b}[38;2;165;43;0m▄\u{1b}[0m \u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;227;68;0;48;2;232;70;0m▄\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m\u{1b}[38;2;232;70;0m▀\u{1b}[0m \u{1b}[38;2;225;67;0m▀\u{1b}[0m \u{1b}[38;2;225;67;0m▀\u{1b}[0m\u{1b}[38;2;225;67;0m▀\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;220;65;0;48;2;225;67;0m▄\u{1b}[0m\u{1b}[38;2;225;67;0m▀\u{1b}[0m \u{1b}[38;2;165;43;0;48;2;165;43;0m▄\u{1b}[0m \u{1b}[38;2;247;76;0;48;2;248;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▀\u{1b}[0m \n \u{1b}[38;2;247;76;0m▀\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▄\u{1b}[0m \u{1b}[38;2;222;66;0m▀\u{1b}[0m\u{1b}[38;2;222;66;0m▀\u{1b}[0m\u{1b}[38;2;217;63;0;48;2;222;66;0m▄\u{1b}[0m\u{1b}[38;2;217;63;0;48;2;222;66;0m▄\u{1b}[0m\u{1b}[38;2;217;63;0;48;2;222;66;0m▄\u{1b}[0m\u{1b}[38;2;217;63;0;48;2;222;66;0m▄\u{1b}[0m\u{1b}[38;2;217;63;0;48;2;222;66;0m▄\u{1b}[0m\u{1b}[38;2;217;63;0m▄\u{1b}[0m\u{1b}[38;2;217;63;0m▄\u{1b}[0m \u{1b}[38;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;212;61;0;48;2;216;63;0m▄\u{1b}[0m\u{1b}[38;2;212;61;0;48;2;216;63;0m▄\u{1b}[0m\u{1b}[38;2;212;61;0;48;2;216;63;0m▄\u{1b}[0m\u{1b}[38;2;212;61;0;48;2;216;63;0m▄\u{1b}[0m\u{1b}[38;2;212;61;0;48;2;216;63;0m▄\u{1b}[0m\u{1b}[38;2;212;61;0;48;2;216;63;0m▄\u{1b}[0m\u{1b}[38;2;216;63;0m▀\u{1b}[0m \u{1b}[38;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;76;0m▀\u{1b}[0m \n \u{1b}[38;2;247;76;0m▀\u{1b}[0m\u{1b}[38;2;247;76;0;48;2;247;76;0m▄\u{1b}[0m \u{1b}[38;2;212;61;0m▀\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0;48;2;212;61;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;207;60;0m▄\u{1b}[0m \u{1b}[38;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;207;59;0m▄\u{1b}[0m\u{1b}[38;2;207;59;0m▀\u{1b}[0m\u{1b}[38;2;207;59;0m▀\u{1b}[0m \u{1b}[38;2;247;76;0m▄\u{1b}[0m\u{1b}[38;2;247;75;0;48;2;247;76;0m▄\u{1b}[0m \n \u{1b}[38;2;247;76;0m▀\u{1b}[0m \u{1b}[38;2;204;58;0m▀\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0m▀\u{1b}[0m \u{1b}[38;2;204;58;0m▀\u{1b}[0m\u{1b}[38;2;204;58;0m▀\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0;48;2;204;58;0m▄\u{1b}[0m\u{1b}[38;2;204;58;0m▀\u{1b}[0m\u{1b}[38;2;204;58;0m▀\u{1b}[0m\u{1b}[38;2;204;58;0m▀\u{1b}[0m \u{1b}[38;2;247;76;0m▀\u{1b}[0m \n Thanks for using Gupax...!\n ( 〃 ω〃)"; diff --git a/src/gupax.rs b/src/gupax.rs index a77dad3..3c99008 100644 --- a/src/gupax.rs +++ b/src/gupax.rs @@ -20,7 +20,7 @@ use egui::{ TextStyle::Monospace, Checkbox,ProgressBar,Spinner,Button,Label,Slider, SelectableLabel, - RichText,Color32, + RichText, Vec2, }; use crate::constants::*; @@ -29,7 +29,7 @@ use crate::update::*; use std::{ thread, sync::{Arc,Mutex}, - path::PathBuf, + path::Path, }; use log::*; use serde::{Serialize,Deserialize}; @@ -75,7 +75,7 @@ pub enum Ratio { //---------------------------------------------------------------------------------------------------- Gupax impl Gupax { - pub fn show(&mut self, og: &Arc>, state_ver: &Arc>, update: &Arc>, file_window: &Arc>, state_path: &PathBuf, width: f32, height: f32, frame: &mut eframe::Frame, ctx: &egui::Context, ui: &mut egui::Ui) { + pub fn show(&mut self, og: &Arc>, state_ver: &Arc>, update: &Arc>, file_window: &Arc>, state_path: &Path, width: f32, height: f32, frame: &mut eframe::Frame, ctx: &egui::Context, ui: &mut egui::Ui) { // Update button + Progress bar ui.group(|ui| { // These are in unnecessary [ui.vertical()]'s @@ -150,7 +150,7 @@ impl Gupax { ui.spacing_mut().text_edit_width = ui.available_width() - SPACE; ui.set_enabled(!file_window.lock().unwrap().thread); if ui.button("Open").on_hover_text(GUPAX_SELECT).clicked() { - Self::spawn_file_window_thread(&file_window, FileType::P2pool); + Self::spawn_file_window_thread(file_window, FileType::P2pool); } ui.text_edit_singleline(&mut self.p2pool_path).on_hover_text(GUPAX_PATH_P2POOL); }); @@ -172,7 +172,7 @@ impl Gupax { ui.spacing_mut().text_edit_width = ui.available_width() - SPACE; ui.set_enabled(!file_window.lock().unwrap().thread); if ui.button("Open").on_hover_text(GUPAX_SELECT).clicked() { - Self::spawn_file_window_thread(&file_window, FileType::Xmrig); + Self::spawn_file_window_thread(file_window, FileType::Xmrig); } ui.text_edit_singleline(&mut self.xmrig_path).on_hover_text(GUPAX_PATH_XMRIG); }); @@ -190,12 +190,12 @@ impl Gupax { Ratio::None => (), Ratio::Width => { let width = self.selected_width as f64; - let height = self.selected_height as f64; + let _height = self.selected_height as f64; let height = (width / 1.6).round(); self.selected_height = height as u16; }, Ratio::Height => { - let width = self.selected_width as f64; + let _width = self.selected_width as f64; let height = self.selected_height as f64; let width = (height * 1.6).round(); self.selected_width = width as u16; diff --git a/src/main.rs b/src/main.rs index 197987d..aba5b10 100644 --- a/src/main.rs +++ b/src/main.rs @@ -27,7 +27,6 @@ use egui::{ TextStyle, Layout,Align, FontId,Label,RichText,Stroke,Vec2,Button,SelectableLabel, - special_emojis::GITHUB, Key,Modifiers, CentralPanel,TopBottomPanel, }; @@ -307,7 +306,7 @@ impl Default for Tab { } //---------------------------------------------------------------------------------------------------- [ErrorState] struct -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum ErrorButtons { YesNo, StayQuit, @@ -317,7 +316,7 @@ pub enum ErrorButtons { Quit, } -#[derive(Clone, Copy, Debug, PartialEq)] +#[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum ErrorFerris { Happy, Oops, @@ -441,14 +440,13 @@ fn init_text_styles(ctx: &egui::Context, width: f32) { fn init_logger(now: Instant) { use env_logger::fmt::Color; Builder::new().format(move |buf, record| { - let level; let mut style = buf.style(); - match record.level() { - Level::Error => { style.set_color(Color::Red); level = "ERROR" }, - Level::Warn => { style.set_color(Color::Yellow); level = "WARN" }, - Level::Info => { style.set_color(Color::White); level = "INFO" }, - Level::Debug => { style.set_color(Color::Blue); level = "DEBUG" }, - Level::Trace => { style.set_color(Color::Magenta); level = "TRACE" }, + let level = match record.level() { + Level::Error => { style.set_color(Color::Red); "ERROR" }, + Level::Warn => { style.set_color(Color::Yellow); "WARN" }, + Level::Info => { style.set_color(Color::White); "INFO" }, + Level::Debug => { style.set_color(Color::Blue); "DEBUG" }, + Level::Trace => { style.set_color(Color::Magenta); "TRACE" }, }; writeln!( buf, @@ -594,7 +592,7 @@ fn parse_args>(mut app: App, panic: S) -> App { pub fn get_exe() -> Result { match std::env::current_exe() { Ok(path) => { Ok(path.display().to_string()) }, - Err(err) => { error!("Couldn't get absolute Gupax PATH"); return Err(err) }, + Err(err) => { error!("Couldn't get absolute Gupax PATH"); Err(err) }, } } @@ -602,7 +600,7 @@ pub fn get_exe() -> Result { pub fn get_exe_dir() -> Result { match std::env::current_exe() { Ok(mut path) => { path.pop(); Ok(path.display().to_string()) }, - Err(err) => { error!("Couldn't get exe basepath PATH"); return Err(err) }, + Err(err) => { error!("Couldn't get exe basepath PATH"); Err(err) }, } } @@ -613,7 +611,7 @@ pub fn clean_dir() -> Result<(), anyhow::Error> { for entry in std::fs::read_dir(get_exe_dir()?)? { let entry = entry?; if ! entry.path().is_dir() { continue } - if Regex::is_match(®ex, entry.file_name().to_str().ok_or(anyhow::Error::msg("Basename failed"))?) { + if Regex::is_match(®ex, entry.file_name().to_str().ok_or_else(|| anyhow::Error::msg("Basename failed"))?) { let path = entry.path(); match std::fs::remove_dir_all(&path) { Ok(_) => info!("Remove [{}] ... OK", path.display()), @@ -626,7 +624,7 @@ pub fn clean_dir() -> Result<(), anyhow::Error> { // Print disk files to console fn print_disk_file(path: &PathBuf) { - match std::fs::read_to_string(&path) { + match std::fs::read_to_string(path) { Ok(string) => { print!("{}", string); exit(0); }, Err(e) => { error!("{}", e); exit(1); }, } @@ -994,7 +992,7 @@ impl eframe::App for App { ui.add_space(ui.available_height()/1.8); ui.hyperlink_to("Powered by egui", "https://github.com/emilk/egui"); - ui.hyperlink_to(format!("{}", "Made by hinto-janaiyo"), "https://gupax.io"); + ui.hyperlink_to("Made by hinto-janaiyo".to_string(), "https://gupax.io"); ui.label("egui is licensed under MIT & Apache-2.0"); ui.label("Gupax, P2Pool, and XMRig are licensed under GPLv3"); }); diff --git a/src/node.rs b/src/node.rs index 8d26e85..7de8544 100644 --- a/src/node.rs +++ b/src/node.rs @@ -34,26 +34,26 @@ use hyper::{ // Adding/removing nodes will need changes to pretty // much all the code in this file, and the code that // handles the actual Enum selector in the P2Pool tab. -pub const C3POOL: &'static str = "node.c3pool.com:18081"; -pub const CAKE: &'static str = "xmr-node.cakewallet.com:18081"; -pub const CAKE_EU: &'static str = "xmr-node-eu.cakewallet.com:18081"; -pub const CAKE_UK: &'static str = "xmr-node-uk.cakewallet.com:18081"; -pub const CAKE_US: &'static str = "xmr-node-usa-east.cakewallet.com:18081"; -pub const FEATHER_1: &'static str = "selsta1.featherwallet.net:18081"; -pub const FEATHER_2: &'static str = "selsta2.featherwallet.net:18081"; -pub const MAJESTICBANK_IS: &'static str = "node.majesticbank.is:18089"; -pub const MAJESTICBANK_SU: &'static str = "node.majesticbank.su:18089"; -pub const MONERUJO: &'static str = "nodex.monerujo.io:18081"; -pub const PLOWSOF_1: &'static str = "node.monerodevs.org:18089"; // ZMQ = 18084 -pub const PLOWSOF_2: &'static str = "node2.monerodevs.org:18089"; // ZMQ = 18084 -pub const RINO: &'static str = "node.community.rino.io:18081"; -pub const SETH: &'static str = "node.sethforprivacy.com:18089"; -pub const SUPPORTXMR: &'static str = "node.supportxmr.com:18081"; -pub const SUPPORTXMR_IR: &'static str = "node.supportxmr.ir:18081"; -pub const SINGAPORE: &'static str = "singapore.node.xmr.pm:18089"; -pub const XMRVSBEAST: &'static str = "p2pmd.xmrvsbeast.com:18081"; +pub const C3POOL: &str = "node.c3pool.com:18081"; +pub const CAKE: &str = "xmr-node.cakewallet.com:18081"; +pub const CAKE_EU: &str = "xmr-node-eu.cakewallet.com:18081"; +pub const CAKE_UK: &str = "xmr-node-uk.cakewallet.com:18081"; +pub const CAKE_US: &str = "xmr-node-usa-east.cakewallet.com:18081"; +pub const FEATHER_1: &str = "selsta1.featherwallet.net:18081"; +pub const FEATHER_2: &str = "selsta2.featherwallet.net:18081"; +pub const MAJESTICBANK_IS: &str = "node.majesticbank.is:18089"; +pub const MAJESTICBANK_SU: &str = "node.majesticbank.su:18089"; +pub const MONERUJO: &str = "nodex.monerujo.io:18081"; +pub const PLOWSOF_1: &str = "node.monerodevs.org:18089"; // ZMQ = 18084 +pub const PLOWSOF_2: &str = "node2.monerodevs.org:18089"; // ZMQ = 18084 +pub const RINO: &str = "node.community.rino.io:18081"; +pub const SETH: &str = "node.sethforprivacy.com:18089"; +pub const SUPPORTXMR: &str = "node.supportxmr.com:18081"; +pub const SUPPORTXMR_IR: &str = "node.supportxmr.ir:18081"; +pub const SINGAPORE: &str = "singapore.node.xmr.pm:18089"; +pub const XMRVSBEAST: &str = "p2pmd.xmrvsbeast.com:18081"; -pub const NODE_IPS: [&'static str; 18] = [ +pub const NODE_IPS: [&str; 18] = [ C3POOL,CAKE,CAKE_EU,CAKE_UK,CAKE_US,FEATHER_1,FEATHER_2,MAJESTICBANK_IS,MAJESTICBANK_SU, MONERUJO,PLOWSOF_1,PLOWSOF_2,RINO,SETH,SUPPORTXMR,SUPPORTXMR_IR,SINGAPORE,XMRVSBEAST, ]; @@ -201,7 +201,7 @@ impl Ping { //---------------------------------------------------------------------------------------------------- Main Ping function // Intermediate function for spawning thread pub fn spawn_thread(ping: &Arc>, og: &Arc>) { - let ping = Arc::clone(&ping); + let ping = Arc::clone(ping); let og = Arc::clone(og); std::thread::spawn(move|| { info!("Spawning ping thread..."); @@ -239,7 +239,7 @@ impl Ping { // timeout = BLACK // default = GRAY #[tokio::main] - pub async fn ping(ping: Arc>, og: Arc>) -> Result<(), anyhow::Error> { + pub async fn ping(ping: Arc>, _og: Arc>) -> Result<(), anyhow::Error> { // Timer let now = Instant::now(); @@ -249,7 +249,7 @@ impl Ping { let percent = (100.0 / ((NODE_IPS.len()) as f32)).floor(); // Create HTTP client - let info = format!("{}", "Creating HTTP Client"); + let info = "Creating HTTP Client".to_string(); ping.lock().unwrap().msg = info; let client: Client = Client::builder() .build(HttpConnector::new()); diff --git a/src/p2pool.rs b/src/p2pool.rs index 512ac10..62a6b46 100644 --- a/src/p2pool.rs +++ b/src/p2pool.rs @@ -31,7 +31,7 @@ use regex::Regex; use log::*; impl P2pool { - pub fn show(&mut self, node_vec: &mut Vec<(String, Node)>, og: &Arc>, online: bool, ping: &Arc>, regex: &Regexes, width: f32, height: f32, ctx: &egui::Context, ui: &mut egui::Ui) { + pub fn show(&mut self, node_vec: &mut Vec<(String, Node)>, og: &Arc>, _online: bool, ping: &Arc>, regex: &Regexes, width: f32, height: f32, ctx: &egui::Context, ui: &mut egui::Ui) { let text_edit = height / 22.0; //---------------------------------------------------------------------------------------------------- Console ui.group(|ui| { @@ -43,7 +43,7 @@ impl P2pool { }); //---------------------------------------------------------------------------------------------------- Args - if self.simple == false { + if !self.simple { ui.group(|ui| { ui.horizontal(|ui| { let width = (width/10.0) - SPACE; ui.style_mut().override_text_style = Some(Monospace); @@ -65,7 +65,7 @@ impl P2pool { if self.address.is_empty() { text = format!("Monero Address [{}/95] ➖", len); color = Color32::LIGHT_GRAY; - } else if self.address.len() == 95 && Regex::is_match(®ex.address, &self.address) && ! self.address.contains("0") && ! self.address.contains("O") && ! self.address.contains("l") { + } else if self.address.len() == 95 && Regex::is_match(®ex.address, &self.address) && ! self.address.contains('0') && ! self.address.contains('O') && ! self.address.contains('l') { text = format!("Monero Address [{}/95] ✔", len); color = Color32::from_rgb(100, 230, 100); } else { @@ -93,7 +93,7 @@ impl P2pool { if self.auto_select { let mut ping = ping.lock().unwrap(); // If we haven't auto_selected yet, auto-select and turn it off - if ping.pinged && ping.auto_selected == false { + if ping.pinged && !ping.auto_selected { self.node = ping.fastest; ping.auto_selected = true; } @@ -132,16 +132,14 @@ impl P2pool { ui.horizontal(|ui| { let width = (width/2.0)-4.0; // [Select fastest node] - if ui.add_sized([width, height], Button::new("Select fastest node")).on_hover_text(P2POOL_SELECT_FASTEST).clicked() { - if ping.lock().unwrap().pinged { - self.node = ping.lock().unwrap().fastest; - } - } + if ui.add_sized([width, height], Button::new("Select fastest node")).on_hover_text(P2POOL_SELECT_FASTEST).clicked() && ping.lock().unwrap().pinged { + self.node = ping.lock().unwrap().fastest; + } // [Ping Button] ui.set_enabled(!ping.lock().unwrap().pinging); if ui.add_sized([width, height], Button::new("Ping community nodes")).on_hover_text(P2POOL_PING).clicked() { - Ping::spawn_thread(&ping, &og); + Ping::spawn_thread(ping, og); }}); ui.vertical(|ui| { @@ -313,8 +311,7 @@ impl P2pool { existing_index += 1; } ui.horizontal(|ui| { - let text; - if exists { text = LIST_SAVE } else { text = LIST_ADD } + let text = if exists { LIST_SAVE } else { LIST_ADD }; let text = format!("{}\n Currently selected node: {}. {}\n Current amount of nodes: {}/1000", text, self.selected_index+1, self.selected_name, node_vec_len); // If the node already exists, show [Save] and mutate the already existing node if exists { @@ -362,7 +359,7 @@ impl P2pool { } _ => { node_vec.remove(self.selected_index); - self.selected_index = self.selected_index-1; + self.selected_index -= 1; new_name = node_vec[self.selected_index].0.clone(); new_node = node_vec[self.selected_index].1.clone(); } @@ -398,8 +395,8 @@ impl P2pool { ui.group(|ui| { ui.horizontal(|ui| { let width = (width/4.0)-SPACE; let height = height + 6.0; - if ui.add_sized([width, height], SelectableLabel::new(self.mini == false, "P2Pool Main")).on_hover_text(P2POOL_MAIN).clicked() { self.mini = false; } - if ui.add_sized([width, height], SelectableLabel::new(self.mini == true, "P2Pool Mini")).on_hover_text(P2POOL_MINI).clicked() { self.mini = true; } + if ui.add_sized([width, height], SelectableLabel::new(!self.mini, "P2Pool Main")).on_hover_text(P2POOL_MAIN).clicked() { self.mini = false; } + if ui.add_sized([width, height], SelectableLabel::new(self.mini, "P2Pool Mini")).on_hover_text(P2POOL_MINI).clicked() { self.mini = true; } })}); // [Out/In Peers] + [Log Level] ui.group(|ui| { ui.vertical(|ui| { diff --git a/src/status.rs b/src/status.rs index 4825dd3..818a59e 100644 --- a/src/status.rs +++ b/src/status.rs @@ -25,7 +25,7 @@ pub struct Status { } impl Status { - pub fn show(app: &mut App, width: f32, height: f32, ctx: &egui::Context, ui: &mut egui::Ui) { + pub fn show(_app: &mut App, _width: f32, _height: f32, _ctx: &egui::Context, ui: &mut egui::Ui) { let color = if ui.visuals().dark_mode { Color32::from_additive_luminance(196) } else { diff --git a/src/update.rs b/src/update.rs index 714192d..bcac491 100644 --- a/src/update.rs +++ b/src/update.rs @@ -25,7 +25,7 @@ //---------------------------------------------------------------------------------------------------- Imports use anyhow::{anyhow,Error}; -use arti_client::{TorClient,TorClientConfig}; +use arti_client::{TorClient}; use arti_hyper::*; use crate::constants::GUPAX_VERSION; //use crate::{Name::*,State}; @@ -64,21 +64,21 @@ use zip::ZipArchive; // - XMRig separates the hash and signature // - P2Pool hashes are in UPPERCASE -const GUPAX_METADATA: &'static str = "https://api.github.com/repos/hinto-janaiyo/gupax/releases/latest"; -const P2POOL_METADATA: &'static str = "https://api.github.com/repos/SChernykh/p2pool/releases/latest"; -const XMRIG_METADATA: &'static str = "https://api.github.com/repos/xmrig/xmrig/releases/latest"; +const GUPAX_METADATA: &str = "https://api.github.com/repos/hinto-janaiyo/gupax/releases/latest"; +const P2POOL_METADATA: &str = "https://api.github.com/repos/SChernykh/p2pool/releases/latest"; +const XMRIG_METADATA: &str = "https://api.github.com/repos/xmrig/xmrig/releases/latest"; -const GUPAX_PREFIX: &'static str = "https://github.com/hinto-janaiyo/gupax/releases/download/"; -const P2POOL_PREFIX: &'static str = "https://github.com/SChernykh/p2pool/releases/download/"; -const XMRIG_PREFIX: &'static str = "https://github.com/xmrig/xmrig/releases/download/"; +const GUPAX_PREFIX: &str = "https://github.com/hinto-janaiyo/gupax/releases/download/"; +const P2POOL_PREFIX: &str = "https://github.com/SChernykh/p2pool/releases/download/"; +const XMRIG_PREFIX: &str = "https://github.com/xmrig/xmrig/releases/download/"; -const GUPAX_SUFFIX: &'static str = "/gupax-"; -const P2POOL_SUFFIX: &'static str = "/p2pool-"; -const XMRIG_SUFFIX: &'static str = "/xmrig-"; +const GUPAX_SUFFIX: &str = "/gupax-"; +const P2POOL_SUFFIX: &str = "/p2pool-"; +const XMRIG_SUFFIX: &str = "/xmrig-"; -const GUPAX_HASH: &'static str = "SHA256SUMS"; -const P2POOL_HASH: &'static str = "sha256sums.txt.asc"; -const XMRIG_HASH: &'static str = "SHA256SUMS"; +const GUPAX_HASH: &str = "SHA256SUMS"; +const P2POOL_HASH: &str = "sha256sums.txt.asc"; +const XMRIG_HASH: &str = "SHA256SUMS"; #[cfg(target_os = "windows")] const GUPAX_EXTENSION: &'static str = "-windows-x64-standalone.zip"; @@ -95,32 +95,32 @@ const P2POOL_EXTENSION: &'static str = "-macos-x64.tar.gz"; const XMRIG_EXTENSION: &'static str = "-macos-x64.tar.gz"; #[cfg(target_os = "linux")] -const GUPAX_EXTENSION: &'static str = "-linux-x64-standalone.tar.gz"; +const GUPAX_EXTENSION: &str = "-linux-x64-standalone.tar.gz"; #[cfg(target_os = "linux")] -const P2POOL_EXTENSION: &'static str = "-linux-x64.tar.gz"; +const P2POOL_EXTENSION: &str = "-linux-x64.tar.gz"; #[cfg(target_os = "linux")] -const XMRIG_EXTENSION: &'static str = "-linux-static-x64.tar.gz"; +const XMRIG_EXTENSION: &str = "-linux-static-x64.tar.gz"; #[cfg(target_os = "windows")] const GUPAX_BINARY: &'static str = "Gupax.exe"; #[cfg(target_os = "macos")] const GUPAX_BINARY: &'static str = "Gupax"; #[cfg(target_os = "linux")] -const GUPAX_BINARY: &'static str = "gupax"; +const GUPAX_BINARY: &str = "gupax"; #[cfg(target_os = "windows")] const P2POOL_BINARY: &'static str = "p2pool.exe"; #[cfg(target_family = "unix")] -const P2POOL_BINARY: &'static str = "p2pool"; +const P2POOL_BINARY: &str = "p2pool"; #[cfg(target_os = "windows")] const XMRIG_BINARY: &'static str = "xmrig.exe"; #[cfg(target_family = "unix")] -const XMRIG_BINARY: &'static str = "xmrig"; +const XMRIG_BINARY: &str = "xmrig"; // Some fake Curl/Wget user-agents because GitHub API requires one and a Tor browser // user-agent might be fingerprintable without all the associated headers. -const FAKE_USER_AGENT: [&'static str; 50] = [ +const FAKE_USER_AGENT: [&str; 50] = [ "Wget/1.16.3","Wget/1.17","Wget/1.17.1","Wget/1.18","Wget/1.18","Wget/1.19","Wget/1.19.1","Wget/1.19.2","Wget/1.19.3","Wget/1.19.4", "Wget/1.19.5","Wget/1.20","Wget/1.20.1","Wget/1.20.2","Wget/1.20.3","Wget/1.21","Wget/1.21.1","Wget/1.21.2","Wget/1.21.3", "curl/7.64.1","curl/7.65.0","curl/7.65.1","curl/7.65.2","curl/7.65.3","curl/7.66.0","curl/7.67.0","curl/7.68.0","curl/7.69.0", @@ -129,28 +129,28 @@ const FAKE_USER_AGENT: [&'static str; 50] = [ "curl/7.83.0","curl/7.83.1","curl/7.84.0","curl/7.85.0", ]; -const MSG_NONE: &'static str = "No update in progress"; -const MSG_START: &'static str = "Starting update"; -const MSG_TMP: &'static str = "Creating temporary directory"; -const MSG_TOR: &'static str = "Creating Tor+HTTPS client"; -const MSG_HTTPS: &'static str = "Creating HTTPS client"; -const MSG_METADATA: &'static str = "Fetching package metadata"; -const MSG_METADATA_RETRY: &'static str = "Fetching package metadata failed, attempt"; -const MSG_COMPARE: &'static str = "Compare package versions"; -const MSG_UP_TO_DATE: &'static str = "All packages already up-to-date"; -const MSG_DOWNLOAD: &'static str = "Downloading packages"; -const MSG_DOWNLOAD_RETRY: &'static str = "Downloading packages failed, attempt"; -const MSG_EXTRACT: &'static str = "Extracting packages"; -const MSG_UPGRADE: &'static str = "Upgrading packages"; -pub const MSG_SUCCESS: &'static str = "Update successful"; -pub const MSG_FAILED: &'static str = "Update failed"; +const MSG_NONE: &str = "No update in progress"; +const MSG_START: &str = "Starting update"; +const MSG_TMP: &str = "Creating temporary directory"; +const MSG_TOR: &str = "Creating Tor+HTTPS client"; +const MSG_HTTPS: &str = "Creating HTTPS client"; +const MSG_METADATA: &str = "Fetching package metadata"; +const MSG_METADATA_RETRY: &str = "Fetching package metadata failed, attempt"; +const MSG_COMPARE: &str = "Compare package versions"; +const MSG_UP_TO_DATE: &str = "All packages already up-to-date"; +const MSG_DOWNLOAD: &str = "Downloading packages"; +const MSG_DOWNLOAD_RETRY: &str = "Downloading packages failed, attempt"; +const MSG_EXTRACT: &str = "Extracting packages"; +const MSG_UPGRADE: &str = "Upgrading packages"; +pub const MSG_SUCCESS: &str = "Update successful"; +pub const MSG_FAILED: &str = "Update failed"; -const INIT: &'static str = "------------------- Init -------------------"; -const METADATA: &'static str = "----------------- Metadata -----------------"; -const COMPARE: &'static str = "----------------- Compare ------------------"; -const DOWNLOAD: &'static str = "----------------- Download -----------------"; -const EXTRACT: &'static str = "----------------- Extract ------------------"; -const UPGRADE: &'static str = "----------------- Upgrade ------------------"; +const INIT: &str = "------------------- Init -------------------"; +const METADATA: &str = "----------------- Metadata -----------------"; +const COMPARE: &str = "----------------- Compare ------------------"; +const DOWNLOAD: &str = "----------------- Download -----------------"; +const EXTRACT: &str = "----------------- Extract ------------------"; +const UPGRADE: &str = "----------------- Upgrade ------------------"; // These two are sequential and not async so no need for a constant message. // The package in question will be known at runtime, so that will be printed. @@ -239,12 +239,12 @@ impl Update { let tls = tls_api_native_tls::TlsConnector::builder()?.build()?; let connector = ArtiHttpConnector::new(tor, tls); let client = ClientEnum::Tor(Client::builder().build(connector)); - return Ok(client) + Ok(client) } else { let mut connector = hyper_tls::HttpsConnector::new(); connector.https_only(true); let client = ClientEnum::Https(Client::builder().build(connector)); - return Ok(client) + Ok(client) } } @@ -253,14 +253,14 @@ impl Update { // actually contains the code. This is so that everytime // an update needs to happen (Gupax tab, auto-update), the // code only needs to be edited once, here. - pub fn spawn_thread(og: &Arc>, update: &Arc>, state_ver: &Arc>, state_path: &PathBuf) { + pub fn spawn_thread(og: &Arc>, update: &Arc>, state_ver: &Arc>, state_path: &Path) { update.lock().unwrap().path_p2pool = og.lock().unwrap().gupax.absolute_p2pool_path.display().to_string(); update.lock().unwrap().path_xmrig = og.lock().unwrap().gupax.absolute_xmrig_path.display().to_string(); update.lock().unwrap().tor = og.lock().unwrap().gupax.update_via_tor; - let og = Arc::clone(&og); - let state_ver = Arc::clone(&state_ver); - let update = Arc::clone(&update); - let state_path = state_path.clone(); + let og = Arc::clone(og); + let state_ver = Arc::clone(state_ver); + let update = Arc::clone(update); + let state_path = state_path.to_path_buf(); std::thread::spawn(move|| { info!("Spawning update thread..."); match Update::start(update.clone(), og.clone(), state_ver.clone()) { @@ -273,7 +273,7 @@ impl Update { Err(e) => { warn!("Update | Saving state ... FAIL ... {}", e); og.lock().unwrap().version = original_version; - *update.lock().unwrap().msg.lock().unwrap() = format!("Saving new versions into state failed"); + *update.lock().unwrap().msg.lock().unwrap() = "Saving new versions into state failed".to_string(); }, }; } @@ -294,7 +294,7 @@ impl Update { // 4. loop over vec, download links // 5. extract, upgrade #[tokio::main] - pub async fn start(update: Arc>, og: Arc>, state_ver: Arc>) -> Result<(), anyhow::Error> { + pub async fn start(update: Arc>, _og: Arc>, state_ver: Arc>) -> Result<(), anyhow::Error> { //---------------------------------------------------------------------------------------------------- Init *update.lock().unwrap().updating.lock().unwrap() = true; // Set timer @@ -352,7 +352,7 @@ impl Update { // function itself but for some reason, it was getting skipped over, // so the [new_ver] check is now here, in the outer scope. for i in 1..=3 { - if i > 1 { *update.lock().unwrap().msg.lock().unwrap() = format!("{} [{}/3]", MSG_METADATA_RETRY.to_string(), i); } + if i > 1 { *update.lock().unwrap().msg.lock().unwrap() = format!("{} [{}/3]", MSG_METADATA_RETRY, i); } let mut handles: Vec>> = vec![]; for pkg in vec.iter() { // Clone data before sending to async @@ -373,10 +373,7 @@ impl Update { // Two [??] will send the error. // We don't actually want to return the error here since we // prefer looping and retrying over immediately erroring out. - match handle.await? { - Err(e) => warn!("Update | {}", e), - _ => (), - } + if let Err(e) = handle.await? { warn!("Update | {}", e) } } // Check for empty version let mut indexes = vec![]; @@ -470,22 +467,20 @@ impl Update { info!("Update | {}", DOWNLOAD); let mut vec4 = vec![]; for i in 1..=3 { - if i > 1 { *update.lock().unwrap().msg.lock().unwrap() = format!("{} [{}/3]{}", MSG_DOWNLOAD_RETRY.to_string(), i, new_pkgs); } + if i > 1 { *update.lock().unwrap().msg.lock().unwrap() = format!("{} [{}/3]{}", MSG_DOWNLOAD_RETRY, i, new_pkgs); } let mut handles: Vec>> = vec![]; for pkg in vec3.iter() { // Clone data before async let bytes = Arc::clone(&pkg.bytes); let client = client.clone(); let version = pkg.new_ver.lock().unwrap(); - let link; // Download link = PREFIX + Version (found at runtime) + SUFFIX + Version + EXT // Example: https://github.com/hinto-janaiyo/gupax/releases/download/v0.0.1/gupax-v0.0.1-linux-x64-standalone // XMRig doesn't have a [v], so slice it out - if pkg.name == Name::Xmrig { - link = pkg.link_prefix.to_string() + &version + &pkg.link_suffix + &version[1..] + &pkg.link_extension; - } else { - link = pkg.link_prefix.to_string() + &version + &pkg.link_suffix + &version + &pkg.link_extension; - } + let link = match pkg.name { + Name::Xmrig => pkg.link_prefix.to_string() + &version + pkg.link_suffix + &version[1..] + pkg.link_extension, + _ => pkg.link_prefix.to_string() + &version + pkg.link_suffix + &version + pkg.link_extension, + }; info!("Update | {} ... {}", pkg.name, link); let handle: JoinHandle> = tokio::spawn(async move { match client { @@ -497,10 +492,7 @@ impl Update { } // Handle await for handle in handles { - match handle.await? { - Err(e) => warn!("Update | {}", e), - _ => (), - } + if let Err(e) = handle.await? { warn!("Update | {}", e) } } // Check for empty bytes let mut indexes = vec![]; @@ -534,11 +526,10 @@ impl Update { *update.lock().unwrap().msg.lock().unwrap() = format!("{}{}", MSG_EXTRACT, new_pkgs); info!("Update | {}", EXTRACT); for pkg in vec4.iter() { - let tmp; - match pkg.name { - Name::Gupax => tmp = tmp_dir.to_owned() + GUPAX_BINARY, - _ => tmp = tmp_dir.to_owned() + &pkg.name.to_string(), - } + let tmp = match pkg.name { + Name::Gupax => tmp_dir.to_owned() + GUPAX_BINARY, + _ => tmp_dir.to_owned() + &pkg.name.to_string(), + }; #[cfg(target_os = "windows")] ZipArchive::extract(&mut ZipArchive::new(std::io::Cursor::new(pkg.bytes.lock().unwrap().as_ref()))?, tmp)?; #[cfg(target_family = "unix")] @@ -563,7 +554,7 @@ impl Update { let entry = entry?.clone(); // If not a file, continue if ! entry.file_type().is_file() { continue } - let basename = entry.file_name().to_str().ok_or(anyhow::Error::msg("WalkDir basename failed"))?; + let basename = entry.file_name().to_str().ok_or_else(|| anyhow::Error::msg("WalkDir basename failed"))?; match basename { GUPAX_BINARY|P2POOL_BINARY|XMRIG_BINARY => { found = true; @@ -595,7 +586,7 @@ impl Update { } info!("Update | Moving new [{}] -> [{}]", entry.path().display(), path.display()); if name == P2pool || name == Xmrig { - std::fs::create_dir_all(std::path::Path::new(&path).parent().ok_or(anyhow::Error::msg(format!("{} path failed", name)))?)?; + std::fs::create_dir_all(std::path::Path::new(&path).parent().ok_or_else(|| anyhow::Error::msg(format!("{} path failed", name)))?)?; } std::fs::rename(entry.path(), path)?; match name { @@ -608,7 +599,7 @@ impl Update { _ => (), } } - if found == false { return Err(anyhow::Error::msg("Fatal error: Package binary could not be found")) } + if !found { return Err(anyhow::Error::msg("Fatal error: Package binary could not be found")) } // Remove tmp dir (on Unix) #[cfg(target_family = "unix")] @@ -706,7 +697,7 @@ impl Pkg { let mut response = client.request(request).await?; let body = hyper::body::to_bytes(response.body_mut()).await?; let body: TagName = serde_json::from_slice(&body)?; - *new_ver.lock().unwrap() = body.tag_name.clone(); + *new_ver.lock().unwrap() = body.tag_name; Ok(()) } @@ -730,7 +721,7 @@ impl Pkg { // Take in a [Name] and [Vec] of [Pkg]s, find // that [Name]'s corresponding new version. - fn get_new_pkg_version(name: Name, vec: &Vec<&Pkg>) -> Result { + fn get_new_pkg_version(name: Name, vec: &[&Pkg]) -> Result { for pkg in vec.iter() { if pkg.name == name { return Ok(pkg.new_ver.lock().unwrap().to_string()) diff --git a/src/xmrig.rs b/src/xmrig.rs index f70ad45..0c46639 100644 --- a/src/xmrig.rs +++ b/src/xmrig.rs @@ -18,14 +18,13 @@ use crate::{ Regexes, constants::*, - disk::*, - node::* + disk::* }; use egui::{ TextEdit,SelectableLabel,ComboBox,Label,Button,RichText,Slider,Checkbox, TextStyle::*, }; -use std::sync::{Arc,Mutex}; + use regex::Regex; use log::*; @@ -42,7 +41,7 @@ impl Xmrig { }); //---------------------------------------------------------------------------------------------------- Config - if self.simple == false { + if !self.simple { ui.group(|ui| { ui.horizontal(|ui| { let width = (width/10.0) - SPACE; ui.style_mut().override_text_style = Some(Monospace); @@ -62,7 +61,7 @@ impl Xmrig { if self.address.is_empty() { text = format!("Monero Address [{}/95] ➖", len); color = LIGHT_GRAY; - } else if self.address.len() == 95 && Regex::is_match(®ex.address, &self.address) && ! self.address.contains("0") && ! self.address.contains("O") && ! self.address.contains("l") { + } else if self.address.len() == 95 && Regex::is_match(®ex.address, &self.address) && ! self.address.contains('0') && ! self.address.contains('O') && ! self.address.contains('l') { text = format!("Monero Address [{}/95] ✔", len); color = GREEN; } else { @@ -100,7 +99,7 @@ impl Xmrig { // }); } else { - let height = height / 10.0; + let _height = height / 10.0; let width = ui.available_width() - 10.0; let mut incorrect_input = false; // This will disable [Add/Delete] on bad input // [Pool IP/Port] @@ -234,8 +233,7 @@ impl Xmrig { existing_index += 1; } ui.horizontal(|ui| { - let text; - if exists { text = LIST_SAVE } else { text = LIST_ADD } + let text = if exists { LIST_SAVE } else { LIST_ADD }; let text = format!("{}\n Currently selected pool: {}. {}\n Current amount of pools: {}/1000", text, self.selected_index+1, self.selected_name, pool_vec_len); // If the pool already exists, show [Save] and mutate the already existing pool if exists { @@ -283,7 +281,7 @@ impl Xmrig { } _ => { pool_vec.remove(self.selected_index); - self.selected_index = self.selected_index-1; + self.selected_index -= 1; new_name = pool_vec[self.selected_index].0.clone(); new_pool = pool_vec[self.selected_index].1.clone(); }