diff --git a/Project.toml b/Project.toml index 492608a..0d406c9 100644 --- a/Project.toml +++ b/Project.toml @@ -4,6 +4,7 @@ version = "1.9.0" [deps] Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b" +IterTools = "c8e1da08-722c-5040-9ed9-7db0dc04731e" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" [compat] diff --git a/src/ProgressMeter.jl b/src/ProgressMeter.jl index 4b03c62..b6b3fb8 100644 --- a/src/ProgressMeter.jl +++ b/src/ProgressMeter.jl @@ -5,6 +5,9 @@ using Distributed export Progress, ProgressThresh, ProgressUnknown, BarGlyphs, next!, update!, cancel, finish!, @showprogress, progress_map, progress_pmap, ijulia_behavior +export spinnercollection, demospinners +include("spinners.jl") + """ `ProgressMeter` contains a suite of utilities for displaying progress in long-running computations. The major functions/types in this module @@ -388,18 +391,20 @@ function updateProgress!(p::ProgressThresh; showvalues = (), end end -const spinner_chars = ['◐','◓','◑','◒'] -const spinner_done = '✓' +const default_spinner_chars = spinnercollection[1] +const default_spinner_done = '✓' spinner_char(p::ProgressUnknown, spinner::AbstractChar) = spinner spinner_char(p::ProgressUnknown, spinner::AbstractVector{<:AbstractChar}) = - p.done ? spinner_done : spinner[p.spincounter % length(spinner) + firstindex(spinner)] + p.done ? default_spinner_done : spinner[p.spincounter % length(spinner) + firstindex(spinner)] +spinner_char(p::ProgressUnknown, spinner::Union{AbstractVector{<:AbstractChar}, AbstractVector{<:AbstractString}}) = rpad(p.done ? default_spinner_done : spinner[p.spincounter % length(spinner) + firstindex(spinner)], maximum(length, spinner)) spinner_char(p::ProgressUnknown, spinner::AbstractString) = - p.done ? spinner_done : spinner[nextind(spinner, 1, p.spincounter % length(spinner))] + p.done ? default_spinner_done : spinner[nextind(spinner, 1, p.spincounter % length(spinner))] +spinner_char(p::ProgressUnknown, spinner::Int) = spinner_char(p::ProgressUnknown, spinnercollection[spinner]) function updateProgress!(p::ProgressUnknown; showvalues = (), truncate_lines = false, valuecolor = :blue, desc = p.desc, ignore_predictor = false, - spinner::Union{AbstractChar,AbstractString,AbstractVector{<:AbstractChar}} = spinner_chars, + spinner::Union{AbstractChar,AbstractString,AbstractVector{<:AbstractChar},AbstractVector{<:AbstractString}, Int} = default_spinner_chars, offset::Integer = p.offset, keep = (offset == 0), color = p.color) !p.enabled && return @@ -412,7 +417,7 @@ function updateProgress!(p::ProgressUnknown; showvalues = (), truncate_lines = f elapsed_time = t - p.tinit dur = durationstring(elapsed_time) if p.spinner - msg = @sprintf "%c %s Time: %s" spinner_char(p, spinner) p.desc dur + msg = @sprintf "%s %s Time: %s" spinner_char(p, spinner) p.desc dur p.spincounter += 1 else msg = @sprintf "%s %d Time: %s" p.desc p.counter dur @@ -442,7 +447,7 @@ function updateProgress!(p::ProgressUnknown; showvalues = (), truncate_lines = f if t > p.tlast+p.dt dur = durationstring(t-p.tinit) if p.spinner - msg = @sprintf "%c %s Time: %s" spinner_char(p, spinner) p.desc dur + msg = @sprintf " %s %s Time: %s" string(spinner_char(p, spinner)) p.desc dur p.spincounter += 1 else msg = @sprintf "%s %d Time: %s" p.desc p.counter dur diff --git a/src/spinners.jl b/src/spinners.jl new file mode 100644 index 0000000..9786323 --- /dev/null +++ b/src/spinners.jl @@ -0,0 +1,241 @@ +# Included in the collection are 91 spinners from https://github.com/briandowns/spinner + +# Copyright (c) 2022 Brian J. Downs + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# NOTICE OF CHANGES FROM https://github.com/briandowns/spinner +# - original spinners have been reordered +# - original spinner 36 (here 89) has been shorted +# - removed original spinner 60 (duplicate of 28) +# - original spinners 12, 31, 52, and 67 (here 83, 84, 82, and 43) have additional elements + +# 23 new spinners under MIT license (index 66, 67, 68, 69, 88, 97-114) +# Copyright (c) 2023 Alice Doucet Beaupré + + +""" + demospinners(spinners; delay=0.12) + +Demo a collection of `spinners`. Can be a mix of Vector{Char}, and Vector{String}. +""" +function demospinners(spinners; delay=0.12) + # We'll display an index [k] next to each spinner. + # If there are 9 or less spinners, then those will + # be 3 char wide ([1]...[9]). If there are between 10 + # and 99, then they'll be 4 char wide ([10]..[99]), etc. + lenmaxidx = textwidth("$(lastindex(spinners))") + + # Strings of a spinner given by a Vector{String} don't + # have to be of the same length. + fixedlens = textwidth.(argmax.(length, spinners)) .+ lenmaxidx .+ 4 + # [ N] spinnerN [N+1] spinnerN+1 + # ^ ^^ ^ = +4 + + function find_colwidths(lens, total_width) + N = length(lens) + colwidths = Int[] + for nbcols in length(spinners):-1:1 + nbrows = div(N + nbcols - 1, nbcols) + padlen = nbrows * nbcols - N + paddedlens = vcat(lens, zeros(Int, padlen)) + griddedlens = transpose(reshape(paddedlens, nbcols, :)) + colwidths = maximum(griddedlens, dims=1)[1, :] + if sum(colwidths) <= total_width + return colwidths, nbcols, nbrows + end + end + end + + termheight, current_tw = displaysize(stdout) + colwidths, nbcols, nbrows = find_colwidths(fixedlens, current_tw) + spinnercounters = ones(Int, length(spinners)) + + # clear terminal + print("\033[2J\033[H") + while true + termheight, tw = displaysize(stdout) + # detect change in terminal dimensions + if tw != current_tw + current_tw = tw + colwidths, nbcols, nbrows = find_colwidths(fixedlens, current_tw) + print("\033[2J\033[H") + end + + for k in 1:length(spinners) + colidx = mod(k - 1, nbcols) + 1 + rowidx = div(k + nbcols - 1, nbcols) + colwidth = colwidths[colidx] + + if rowidx <= termheight + msg = @sprintf "\u1b[34m[%s]\u1b[32m %s " lpad("$k", lenmaxidx) spinners[k][spinnercounters[k]] + # ^^^^ ^^^^ = +8 + msg = rpad(msg, colwidth + 8) # +8 accounts for ANSI escape sequences. + # textwidth used by lpad/rpad does not count \u1b + print(msg) + if colidx == nbcols && rowidx < termheight + println() + end + end + spinnercounters[k] = spinnercounters[k] % length(spinners[k]) + firstindex(spinners[k]) + end + print("\r\u1b[A"^min(nbrows, termheight)) + sleep(delay) + end + +end + +""" + demospinners(; delay=0.12) + +Demo the default collection of spinners with their index which can be selected using `next!(..., spinner=index)` +""" +demospinners(; delay=0.12) = demospinners(spinnercollection, delay=delay) + +""" + demospinners(k::Int; delay=0.12) + +Demo the `k`th spinner in the default spinner collection. +""" +demospinners(k::Int; delay=0.12) = demospinners(spinnercollection[k], delay=delay) + +""" + demospinners(spinner::AbstractString; delay=0.12) + +Demo a custom `spinner` given by the characters of a string. +""" +demospinners(spinner::AbstractString; delay=0.12) = demospinners(collect(spinner), delay=delay) + +""" + demospinners(spinner::Union{AbstractVector{<:AbstractString}, AbstractVector{<:AbstractChar}}; delay=0.12) + +Demo a custom `spinner` given by a vector of characters or strings. +""" +demospinners(spinner::Union{AbstractVector{<:AbstractString}, AbstractVector{<:AbstractChar}}; delay=0.12) = demospinners([spinner], delay=delay) + +const spinnercollection = [ + ['◐', '◓', '◑', '◒'], # ◐◓◑◒ + ['←', '↖', '↑', '↗', '→', '↘', '↓', '↙'], # ←↖↑↗→↘↓↙ + ['▁', '▃', '▄', '▅', '▆', '▇', '█', '▇', '▆', '▅', '▄', '▃', '▁'], # ▁▃▄▅▆▇█▇▆▅▄▃▁ + ['▖', '▘', '▝', '▗'], # ▖▘▝▗ + ['┤', '┘', '┴', '└', '├', '┌', '┬', '┐'], # ┤┘┴└├┌┬┐ + ['◢', '◣', '◤', '◥'], # ◢◣◤◥ + ['◰', '◳', '◲', '◱'], # ◰◳◲◱ + ['◴', '◷', '◶', '◵'], # ◴◷◶◵ + ['.', 'o', 'O', '@', '*'], # .oO@* + ['|', '/', '-', '\\'], # |/-\\ + ['◜', '◝', '◞', '◟'], # ◜◝◞◟ + ['⬒', '⬔', '⬓', '⬕'], # ⬒⬔⬓⬕ + ['⬖', '⬘', '⬗', '⬙'], # ⬖⬘⬗⬙ + ['⣾', '⣽', '⣻', '⢿', '⡿', '⣟', '⣯', '⣷'], # ⣾⣽⣻⢿⡿⣟⣯⣷ + ['⠁', '⠂', '⠄', '⡀', '⢀', '⠠', '⠐', '⠈'], # ⠁⠂⠄⡀⢀⠠⠐⠈ + ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'], # ⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏ + ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'], # abcdefghijklmnopqrstuvwxyz + ['▉', '▊', '▋', '▌', '▍', '▎', '▏', '▎', '▍', '▌', '▋', '▊', '▉'], # ▉▊▋▌▍▎▏▎▍▌▋▊▉ + ['■', '□', '▪', '▫'], # ■□▪▫ + ['←', '↑', '→', '↓'], # ←↑→↓ + ['╫', '╪'], # ╫╪ + ['♠', '♣', '♥', '♦'], # ♠♣♥♦ + ['➞', '➟', '➠', '➡', '➠', '➟'], # ➞➟➠➡➠➟ + ['⇐', '⇖', '⇑', '⇗', '⇒', '⇘', '⇓', '⇙'], # ⇐⇖⇑⇗⇒⇘⇓⇙ + ['⠁', '⠁', '⠉', '⠙', '⠚', '⠒', '⠂', '⠂', '⠒', '⠲', '⠴', '⠤', '⠄', '⠄', '⠤', '⠠', '⠠', '⠤', '⠦', '⠖', '⠒', '⠐', '⠐', '⠒', '⠓', '⠋', '⠉', '⠈', '⠈'], # ⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈ + ['⠈', '⠉', '⠋', '⠓', '⠒', '⠐', '⠐', '⠒', '⠖', '⠦', '⠤', '⠠', '⠠', '⠤', '⠦', '⠖', '⠒', '⠐', '⠐', '⠒', '⠓', '⠋', '⠉', '⠈'], # ⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈ + ['⠁', '⠉', '⠙', '⠚', '⠒', '⠂', '⠂', '⠒', '⠲', '⠴', '⠤', '⠄', '⠄', '⠤', '⠴', '⠲', '⠒', '⠂', '⠂', '⠒', '⠚', '⠙', '⠉', '⠁'], # ⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁ + ['⠋', '⠙', '⠚', '⠒', '⠂', '⠂', '⠒', '⠲', '⠴', '⠦', '⠖', '⠒', '⠐', '⠐', '⠒', '⠓', '⠋'], # ⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋ + ['ヲ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ア', 'イ', 'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', 'シ', 'ス', 'セ', 'ソ', 'タ', 'チ', 'ツ', 'テ', 'ト', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ', 'ヘ', 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', 'ラ', 'リ', 'ル', 'レ', 'ロ', 'ワ', 'ン'], # ヲァィゥェォャュョッアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン + ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█', '▉', '▊', '▋', '▌', '▍', '▎', '▏', '▏', '▎', '▍', '▌', '▋', '▊', '▉', '█', '▇', '▆', '▅', '▄', '▃', '▂', '▁'], # ▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▏▎▍▌▋▊▉█▇▆▅▄▃▂▁ + ['.', 'o', 'O', '°', 'O', 'o', '.'], # .oO°Oo. + ['+', 'x'], # +x + ['v', '<', '^', '>'], # v<^> + ['⎺', '⎻', '⎼', '⎽', '⎼', '⎻'], # ⎺⎻⎼⎽⎼⎻ + ['✶', '✸', '✹', '✺', '✹', '✷'], # ✶✸✹✺✹✷ + ['¿', '?'], # ¿? + ['▓', '▒', '░'], # ▓▒░ + ['▌', '▀', '▐', '▄'], # ▌▀▐▄ + ['⊶', '⊷'], # ⊶⊷ + ['▪', '▫'], # ▪▫ + ['□', '■'], # □■ + ['▮', '▯'], # ▮▯ + ['-', '=', '≡', '='], # -=≡ + ['d', 'q', 'p', 'b'], # dqpb + ['⢹', '⢺', '⢼', '⣸', '⣇', '⡧', '⡗', '⡏'], # ⢹⢺⢼⣸⣇⡧⡗⡏ + ['☗', '☖'], # ☗☖ + ['⧇', '⧆'], # ⧇⧆ + ['◉', '◎'], # ◉◎ + ['㊂', '㊀', '㊁'], # ㊂㊀㊁ + ['⦾', '⦿'], # ⦾⦿ + ['ဝ', '၀'], # ဝ၀ + ['▌', '▀', '▐', '▄'], # ▌ ▀ ▐▄ + ["⠈⠁", "⠈⠑", "⠈⠱", "⠈⡱", "⢀⡱", "⢄⡱", "⢄⡱", "⢆⡱", "⢎⡱", "⢎⡰", "⢎⡠", "⢎⡀", "⢎⠁", "⠎⠁", "⠊⠁"], # ⠈⠁ ⠈⠑ ⠈⠱ ⠈⡱ ⢀⡱ ⢄⡱ ⢄⡱ ⢆⡱ ⢎⡱ ⢎⡰ ⢎⡠ ⢎⡀ ⢎⠁ ⠎⠁ ⠊⠁ + ['⢄', '⢂', '⢁', '⡁', '⡈', '⡐', '⡠'], # ⢄⢂⢁⡁⡈⡐⡠ + ['□', '◱', '◧', '▣', '■'], # □◱◧▣■ + ['□', '◱', '▨', '▩', '■'], # □◱▨▩■ + ['░', '▒', '▓', '█'], # ░▒▓█ + ['░', '█'], # ░█ + ['◯', '⬤'], # ◯⬤ + ['▱', '▰'], # ▱▰ + ['➊', '➋', '➌', '➍', '➎', '➏', '➐', '➑', '➒', '➓'], # ➊➋➌➍➎➏➐➑➒➓ + ['⚀', '⚂', '⚄', '⚄', '⚀', '⚀', '⚀', '⚄', '⚅', '⚀', '⚃', '⚀', '⚄', '⚀', '⚄', '⚅', '⚅', '⚀', '⚅', '⚅'], # ⚀⚂⚄⚄⚀⚀⚀⚄⚅⚀⚃⚀⚄⚀⚄⚅⚅⚀⚅⚅ + ['½', '⅓', '⅔', '¼', '¾', '⅛', '⅜', '⅝', '⅞'], # ½⅓⅔¼¾⅛⅜⅝⅞ + ['↞', '↟', '↠', '↡'], # ↞↟↠↡ + ['♈', '♉', '♊', '♋', '♌', '♍', '♎', '♏', '♐', '♑', '♒', '♓'], # ♈♉♊♋♌♍♎♏♐♑♒♓ + ['䷀', '䷁', '䷂', '䷃', '䷄', '䷅', '䷆', '䷇', '䷈', '䷉', '䷊', '䷋', '䷌', '䷍', '䷎', '䷏', '䷐', '䷑', '䷒', '䷓', '䷔', '䷕', '䷖', '䷗', '䷘', '䷙', '䷚', '䷛', '䷜', '䷝', '䷞', '䷟', '䷠', '䷡', '䷢', '䷣', '䷤', '䷥', '䷦', '䷧', '䷨', '䷩', '䷪', '䷫', '䷬', '䷭', '䷮', '䷯', '䷰', '䷱', '䷲', '䷳', '䷴', '䷵', '䷶', '䷷', '䷸', '䷹', '䷺', '䷻', '䷼', '䷽', '䷾', '䷿'], # ䷀䷁䷂䷃䷄䷅䷆䷇䷈䷉䷊䷋䷌䷍䷎䷏䷐䷑䷒䷓䷔䷕䷖䷗䷘䷙䷚䷛䷜䷝䷞䷟䷠䷡䷢䷣䷤䷥䷦䷧䷨䷩䷪䷫䷬䷭䷮䷯䷰䷱䷲䷳䷴䷵䷶䷷䷸䷹䷺䷻䷼䷽䷾䷿ + ['▌', '▛', '▜', '▐', '▟', '▙'], # ▌▛▜▐▟▙ + ['°', 'º', '¤', 'ø', ',', '¸', '¸', ',', 'ø', '¤', 'º', '°', '`'], # °º¤ø,¸¸,ø¤º°` + ['⚪', '⚫'], # ⚪⚫ + ['🌍', '🌎', '🌏'], # 🌍🌎🌏 + ['🌑', '🌒', '🌓', '🌔', '🌕', '🌖', '🌗', '🌘'], # 🌑🌒🌓🌔🌕🌖🌗🌘 + ['🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚', '🕛'], # 🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛 + ['🕜', '🕝', '🕞', '🕟', '🕠', '🕡', '🕢', '🕣', '🕤', '🕥', '🕦', '🕧'], # 🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧 + ["◡◡", "⊙⊙", "◠◠"], + [".", "..", "..."], + [".", "..", "...", " ..", " .", " "], + ["∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙"], + ["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸"], + ["[ ]", "[ =]", "[ ==]", "[ ===]", "[====]", "[=== ]", "[== ]", "[= ]"], + [" |", " \\", "_", " \\", " |", " /", " _", " / "], + ["(● )", "( ● )", "( ● )", "( ● )", "( ● )", "( ●)", "( ● )", "( ● )", "( ● )", "( ● )"], + [">))'>", " >))'>", " >))'>", " >))'>", " >))'>", " <'((<", " <'((<", " <'((< "], + [">>--->", " >>--->", " >>--->", " >>--->", " >>--->", " <---<<", " <---<<", " <---<<", " <---<<", "<---<<"], + ["|", "||", "|||", "||||", "|||||", "||||||", "|||||||", "||||||||", "|||||||", "||||||", "|||||", "||||", "|||", "||", "| "], + ["[ ]", "[= ]", "[== ]", "[=== ]", "[==== ]", "[===== ]", "[====== ]", "[======= ]", "[======== ]", "[========= ]", "[==========]"], + ["(*---------)", "(-*--------)", "(--*-------)", "(---*------)", "(----*-----)", "(-----*----)", "(------*---)", "(-------*--)", "(--------*-)", "(---------*)"], + ["█▒▒▒▒▒▒▒▒▒", "███▒▒▒▒▒▒▒", "█████▒▒▒▒▒", "███████▒▒▒", "██████████"], + ["[ ]", "[> ]", "[=> ]", "[===> ]", "[=====> ]", "[======> ]", "[========> ]", "[=========>]", "[ =========]", "[ ========]", "[ =======]", "[ ======]", "[ =====]", "[ ====]", "[ ===]", "[ ==]", "[ =]"], + ["[>>> >]", "[]>>>> []", "[] >>>> []", "[] >>>> []", "[] >>>> []", "[] >>>>[]", "[>> >>]"], + [" . . . .", ". . . .", ". . . .", ". . . .", ". . . .", ". . . . ."], + [" |", " /", " _", " \\", " |", " \\", " _", " / "], + ["▐|\\____________▌", "▐_|\\___________▌", "▐__|\\__________▌", "▐___|\\_________▌", "▐____|\\________▌", "▐_____|\\_______▌", "▐______|\\______▌", "▐_______|\\_____▌", "▐________|\\____▌", "▐_________|\\___▌", "▐__________|\\__▌", "▐___________|\\_▌", "▐____________|\\▌", "▐____________/|▌", "▐___________/|_▌", "▐__________/|__▌", "▐_________/|___▌", "▐________/|____▌", "▐_______/|_____▌", "▐______/|______▌", "▐_____/|_______▌", "▐____/|________▌", "▐___/|_________▌", "▐__/|__________▌", "▐_/|___________▌", "▐/|____________▌"], + ["▐⠂ ▌", "▐⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂▌", "▐ ⠠▌", "▐ ⡀▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐⠠ ▌"], + ["________", "-_______", "_-______", "__-_____", "___-____", "____-___", "_____-__", "______-_", "_______-", "________", "_______-", "______-_", "_____-__", "____-___", "___-____", "__-_____", "_-______", "-_______", "________"], + ["|_______", "_/______", "__-_____", "___\\____", "____|___", "_____/__", "______-_", "_______\\", "_______|", "______\\_", "_____-__", "____/___", "___|____", "__\\_____", "_-______"], + ["██▒▒▒▒", "▒██▒▒▒", "▒▒██▒▒", "▒▒▒██▒", "▒▒▒▒██", "▒▒▒▒▒█", "▒▒▒▒▒▒", "█▒▒▒▒▒"], + ["", "█", "██", "███", " ███", " ███", " ███", " ██", " █", " "], + [" 🚴", " 🚴", " 🚴", " 🚴", " 🚴", " 🚴", "🚴", "", "", " "], + ["▒▒▒▒▒▒▒▒▒▒", "█▒▒▒▒▒▒▒▒▒", "██▒▒▒▒▒▒▒▒", "███▒▒▒▒▒▒▒", "████▒▒▒▒▒▒", "█████▒▒▒▒▒", "██████▒▒▒▒", "███████▒▒▒", "████████▒▒", "█████████▒", "██████████", "██████████", "▒█████████", "▒▒████████", "▒▒▒███████", "▒▒▒▒██████", "▒▒▒▒▒█████", "▒▒▒▒▒▒████", "▒▒▒▒▒▒▒███", "▒▒▒▒▒▒▒▒██", "▒▒▒▒▒▒▒▒▒█", "▒▒▒▒▒▒▒▒▒▒"], + ["``'-.,", "`'-.,_", "'-.,_,", "-.,_,.", ".,_,.-", ",_,.-'", "_,.-'`", ",.-'``", ".-'``'", "-'``'-", "'``'-."], + ["``'-.,_,.-'", "`'-.,_,.-'`", "'-.,_,.-'``", "-.,_,.-'``'", ".,_,.-'``'-", ",_,.-'``'-.", "_,.-'``'-.,", ",.-'``'-.,_", ".-'``'-.,_,", "-'``'-.,_,.", "'``'-.,_,.="], + ["°º¤ø,¸¸", "º¤ø,¸¸,", "¤ø,¸¸,ø", "ø,¸¸,ø¤", ",¸¸,ø¤º", "¸¸,ø¤º°", "¸,ø¤º°`", ",ø¤º°`°", "ø¤º°`°º", "¤º°`°º¤", "º°`°º¤ø", "°`°º¤ø,", "`°º¤ø,¸"], + ["°º¤ø,¸¸,ø¤º", "º¤ø,¸¸,ø¤º°", "¤ø,¸¸,ø¤º°`", "ø,¸¸,ø¤º°`°", ",¸¸,ø¤º°`°º", "¸¸,ø¤º°`°º¤", "¸,ø¤º°`°º¤ø", ",ø¤º°`°º¤ø,", "ø¤º°`°º¤ø,¸", "¤º°`°º¤ø,¸¸", "º°`°º¤ø,¸¸,", "°`°º¤ø,¸¸,ø", "`°º¤ø,¸¸,ø¤"], + ["|-⎻⎺⎻-⎼⎽⎼-|", "|-⎻⎻⎻-⎼⎼⎼-|", "|--⎻---⎼--|", "|---------|", "|--⎼---⎻--|", "|-⎼⎼⎼-⎻⎻⎻-|", "|-⎼⎽⎼-⎻⎺⎻-|", "|-⎼⎼⎼-⎻⎻⎻-|", "|--⎼---⎻--|", "|---------|", "|--⎻---⎼--|", "|-⎻⎻⎻-⎼⎼⎼-|"], + ["`、ヽ`ヽ`、ヽ", "ヽ`、ヽ`ヽ`、", "、ヽ`、ヽ`ヽ`", "`、ヽ`、ヽ`ヽ", "ヽ`、ヽ`、ヽ`", "`ヽ`、ヽ`、ヽ", "ヽ`ヽ`、ヽ`、"], + ["(-.-)......", "(-.-)z.....", "(-.-)zz....", "(-.-)Zzz...", "(-.-)ZZzz..", "(-.-)zZZzz.", "(-.-)zzZZzz", "(-.-)zzzZZz", "(-.-)zzzzZZ", "(-.-)zzzzzZ", "(-.-)zzzzzz", "(-.-).zzzzz", "(-.-)..zzzz", "(-.-)...zzz", "(-.-)....zz", "(-.-).....z", "(-.-)......", "(-.-)......", "(-.-)......", "(-.-)......", "(-.-)......", "(-.-)......", "(-.-)......", "(-.-)......", "(-.-)......", "(-.-)......", "(-.-)......", "(-.-)......"], + ["(∩^o^)⊃━・☆。*・゚*", "(∩^o^)⊃━。・*☆・*゚", "(∩^o^)⊃━☆*゚。・*・", "(∩^o^)⊃━☆・*゚・*。", "(∩^o^)⊃━。☆**・・゚", "(∩^o^)⊃━*☆゚。*・・", "(∩^o^)⊃━*゚。☆・・*", "(∩^o^)⊃━*・。・☆*゚", "(∩^o^)⊃━・。・☆*゚*", "(∩^o^)⊃━*・・*゚。☆", "(∩^o^)⊃━。*☆゚*・・", "(∩^o^)⊃━*゚・・。*☆"], + ["(ノ>ω<)ノ・:’’,・・", "(ノ>ω<)ノ・゚:,★゚*", "(ノ>ω<)ノ★:・:゚:,", "(ノ>ω<)ノ*:。’゚・・", "(ノ>ω<)ノ゚。’:*:・", "(ノ>ω<)ノ・:。 ゚:・", "(ノ>ω<)ノ★::・・’’", "(ノ>ω<)ノ:☆゚・*,:", "(ノ>ω<)ノ★’: 。’:", "(ノ>ω<)ノ :*・:*’", "(ノ>ω<)ノ。:::*・゚", "(ノ>ω<)ノ・:::゚’★", "(ノ>ω<)ノ★,:。:。・", "(ノ>ω<)ノ: ,**・:", "(ノ>ω<)ノ・’’:゚::", "(ノ>ω<)ノ**。 ’::", "(ノ>ω<)ノ’:★・☆,*", "(ノ>ω<)ノ。 :,’*★", "(ノ>ω<)ノ:★:☆・・*", "(ノ>ω<)ノ・:゚’* ・"], + ["(ノ◕ヮ◕)ノ゚*:・゚✧", "(ノ◕ヮ◕)ノ***:・゚", "(ノ◕ヮ◕)ノ✧:**:・", "(ノ◕ヮ◕)ノ✧✧:**:", "(ノ◕ヮ◕)ノ・゚✧:**", "(ノ◕ヮ◕)ノ・・゚✧:*", "(ノ◕ヮ◕)ノ✧✧・゚✧:", "(ノ◕ヮ◕)ノ゚゚✧・゚✧", "(ノ◕ヮ◕)ノ**゚✧・゚", "(ノ◕ヮ◕)ノ*:*゚✧・", "(ノ◕ヮ◕)ノ*・:*゚✧", "(ノ◕ヮ◕)ノ*:・:*゚", "(ノ◕ヮ◕)ノ*゚:・:*", "(ノ◕ヮ◕)ノ・・゚:・:", "(ノ◕ヮ◕)ノ:*・゚:・", "(ノ◕ヮ◕)ノ゚✧*・゚:", "(ノ◕ヮ◕)ノ・✧✧*・゚", "(ノ◕ヮ◕)ノ:・✧✧*・", "(ノ◕ヮ◕)ノ:゚・✧✧*", "(ノ◕ヮ◕)ノ✧*゚・✧✧"], + ["( ˘ ɜ˘)♫", "( ˘ ɜ˘)♪♫", "( ˘ ɜ˘)♬♪♫", "( ˘ ɜ˘)♩♬♪♫", "( ˘ ɜ˘)♬♩♬♪", "( ˘ ɜ˘)♩♬♩♬", "( ˘ ˘) ♪♩♬", "( ˘ ˘) ♪♩", "( ˘ ɜ˘)♬ ♪", "( ˘ ɜ˘)♩♬", "( ˘ ˘) ♩♬", "( ˘ ɜ˘)♬ ♩♬", "( ˘ ɜ˘)♪♬ ♩", "( ˘ ɜ˘)♩♪♬", "( ˘ ɜ˘)♪♩♪♬", "( ˘ ˘) ♪♩♪", "( ˘ ˘) ♪♩", "( ˘ ˘) ♪", "( ˘ ˘) "], + ["♫♬♩◖(● o ●)◗♩♬♫", "♩♫♬◖(● o ●)◗♬♫c", "♪♪♫◖(● o ●)◗♫♪♪", "♬♩♪◖(● o ●)◗♪♩♬", "♬♩♪◖(● o ●)◗♪♩♬", "♪♪♫◖(● o ●)◗♫♪♪", "♩♫♬◖(● o ●)◗♬♫♩", "♫♬♩◖(● o ●)◗♩♬♫"], + ["♫♬♩◖(⎺ ⎺)◗♩♬♫", "♩♫♬◖(⎻ ⎻)◗♬♫c", "♪♪♫◖(⎼ ⎼)◗♫♪♪", "♬♩♪◖(⎻ ⎻)◗♪♩♬", "♬♩♪◖(⎺ ⎺)◗♪♩♬", "♪♪♫◖(⎻ ⎻)◗♫♪♪", "♩♫♬◖(⎼ ⎼)◗♬♫♩", "♫♬♩◖(⎻ ⎻)◗♩♬♫"], + ["♫♬♩◖(⎺ ⎺)◗♩♬♫", "♩♫♬◖(⎺ ⎺)◗♬♫c", "♪♪♫◖(⎺ ⎺)◗♫♪♪", "♬♩♪◖(⎻ ⎻)◗♪♩♬", "♬♩♪◖(⎻ ⎻)◗♪♩♬", "♪♪♫◖(⎻ ⎻)◗♫♪♪", "♩♫♬◖(⎻ ⎻)◗♬♫♩", "♫♬♩◖(⎺ ⎺)◗♩♬♫"], + ["( ° °) ┳━┳ ", "( ° °) ┳━┳ ", "( ° °) ┳━┳ ", "( ° °) ┳━┳ ", "( °□°) ┳━┳ ", "( °□°) ┳━┳ ", "( °□°) ┳━┳ ", "(╯°□°)╯︵ ┻━┻ ", "(╯°□°)╯︵ ┻━┻ ", "(╯°□°)╯︵ ┻━┻ ", "(╯°□°)╯ ┻━┻ ", "(╯°□°)╯ ┻━┻ ", "(╯°□°)╯ ┻━┻ ", "( °□°) ┻━┻ ", "( °□°) ┻━┻ ", "( °□°) ┻━┻ ", "( °□°) ┻━┻ ", "( °□°) ┻━┻ ", "( °□°) ┻━┻ ", "( ° °) ┻━┻ ", "( ° °) ┻━┻ ", "( ° °) ┻━┻ ", "( ° °) ┻━┻ ", " ° °) ┻━┻ ", "° °) ┻━┻ ", " °) ┻━┻ (", "°) ┻━┻ (º", ") ┻━┻ (º ", " ┻━┻ (º _", " ┻━┻ (º _ ", " ┻━┻ (º _ º", " ┻━┻ (º _ º ", "┻━┻ (º _ º )", "┻━┻ (º _ º )", "┻━┻ (º _ º )", "┻━┻ (º _ º )", "┳━┳ノ(º _ º ) ", "┳━┳ノ(º _ º ) ", "┳━┳ノ(º _ º ) ", "┳━┳ノ(º _ º ) ", "┳━┳ (º _ º )", "┳━┳ (º _ º )", "┳━┳ (º _ º )", "┳━┳ (º _ º )", "┳━┳ (º _ º )", " ┳━┳ (º _ º ", ") ┳━┳ (º _ º", "°) ┳━┳ (º _ ", " °) ┳━┳ (º _", "° °) ┳━┳ (º ", " ° °) ┳━┳ (º", "( ° °) ┳━┳ ("] +] \ No newline at end of file