remove progressbar
This commit is contained in:
parent
0813387414
commit
f91bb2f7f0
6 changed files with 5 additions and 1455 deletions
96
cmd/cmd.go
96
cmd/cmd.go
|
@ -30,7 +30,6 @@ import (
|
||||||
"github.com/jmorganca/ollama/api"
|
"github.com/jmorganca/ollama/api"
|
||||||
"github.com/jmorganca/ollama/format"
|
"github.com/jmorganca/ollama/format"
|
||||||
"github.com/jmorganca/ollama/parser"
|
"github.com/jmorganca/ollama/parser"
|
||||||
"github.com/jmorganca/ollama/progressbar"
|
|
||||||
"github.com/jmorganca/ollama/readline"
|
"github.com/jmorganca/ollama/readline"
|
||||||
"github.com/jmorganca/ollama/server"
|
"github.com/jmorganca/ollama/server"
|
||||||
"github.com/jmorganca/ollama/version"
|
"github.com/jmorganca/ollama/version"
|
||||||
|
@ -53,9 +52,6 @@ func CreateHandler(cmd *cobra.Command, args []string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
spinner := NewSpinner("transferring context")
|
|
||||||
go spinner.Spin(100 * time.Millisecond)
|
|
||||||
|
|
||||||
commands, err := parser.Parse(bytes.NewReader(modelfile))
|
commands, err := parser.Parse(bytes.NewReader(modelfile))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -99,29 +95,9 @@ func CreateHandler(cmd *cobra.Command, args []string) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentDigest string
|
|
||||||
var bar *progressbar.ProgressBar
|
|
||||||
|
|
||||||
request := api.CreateRequest{Name: args[0], Path: filename, Modelfile: string(modelfile)}
|
request := api.CreateRequest{Name: args[0], Path: filename, Modelfile: string(modelfile)}
|
||||||
fn := func(resp api.ProgressResponse) error {
|
fn := func(resp api.ProgressResponse) error {
|
||||||
if resp.Digest != currentDigest && resp.Digest != "" {
|
log.Printf("progress(%s): %s", resp.Digest, resp.Status)
|
||||||
spinner.Stop()
|
|
||||||
currentDigest = resp.Digest
|
|
||||||
// pulling
|
|
||||||
bar = progressbar.DefaultBytes(
|
|
||||||
resp.Total,
|
|
||||||
resp.Status,
|
|
||||||
)
|
|
||||||
bar.Set64(resp.Completed)
|
|
||||||
} else if resp.Digest == currentDigest && resp.Digest != "" {
|
|
||||||
bar.Set64(resp.Completed)
|
|
||||||
} else {
|
|
||||||
currentDigest = ""
|
|
||||||
spinner.Stop()
|
|
||||||
spinner = NewSpinner(resp.Status)
|
|
||||||
go spinner.Spin(100 * time.Millisecond)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,11 +105,6 @@ func CreateHandler(cmd *cobra.Command, args []string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
spinner.Stop()
|
|
||||||
if spinner.description != "success" {
|
|
||||||
return errors.New("unexpected end to create model")
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,37 +141,13 @@ func PushHandler(cmd *cobra.Command, args []string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentDigest string
|
|
||||||
var bar *progressbar.ProgressBar
|
|
||||||
|
|
||||||
request := api.PushRequest{Name: args[0], Insecure: insecure}
|
request := api.PushRequest{Name: args[0], Insecure: insecure}
|
||||||
fn := func(resp api.ProgressResponse) error {
|
fn := func(resp api.ProgressResponse) error {
|
||||||
if resp.Digest != currentDigest && resp.Digest != "" {
|
log.Printf("progress(%s): %s", resp.Digest, resp.Status)
|
||||||
currentDigest = resp.Digest
|
|
||||||
bar = progressbar.DefaultBytes(
|
|
||||||
resp.Total,
|
|
||||||
fmt.Sprintf("pushing %s...", resp.Digest[7:19]),
|
|
||||||
)
|
|
||||||
|
|
||||||
bar.Set64(resp.Completed)
|
|
||||||
} else if resp.Digest == currentDigest && resp.Digest != "" {
|
|
||||||
bar.Set64(resp.Completed)
|
|
||||||
} else {
|
|
||||||
currentDigest = ""
|
|
||||||
fmt.Println(resp.Status)
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := client.Push(context.Background(), &request, fn); err != nil {
|
return client.Push(context.Background(), &request, fn)
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if bar != nil && !bar.IsFinished() {
|
|
||||||
return errors.New("unexpected end to push model")
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListHandler(cmd *cobra.Command, args []string) error {
|
func ListHandler(cmd *cobra.Command, args []string) error {
|
||||||
|
@ -359,38 +306,13 @@ func pull(model string, insecure bool) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var currentDigest string
|
|
||||||
var bar *progressbar.ProgressBar
|
|
||||||
|
|
||||||
request := api.PullRequest{Name: model, Insecure: insecure}
|
request := api.PullRequest{Name: model, Insecure: insecure}
|
||||||
fn := func(resp api.ProgressResponse) error {
|
fn := func(resp api.ProgressResponse) error {
|
||||||
if resp.Digest != currentDigest && resp.Digest != "" {
|
log.Printf("progress(%s): %s", resp.Digest, resp.Status)
|
||||||
currentDigest = resp.Digest
|
|
||||||
bar = progressbar.DefaultBytes(
|
|
||||||
resp.Total,
|
|
||||||
fmt.Sprintf("pulling %s...", resp.Digest[7:19]),
|
|
||||||
)
|
|
||||||
|
|
||||||
bar.Set64(resp.Completed)
|
|
||||||
} else if resp.Digest == currentDigest && resp.Digest != "" {
|
|
||||||
bar.Set64(resp.Completed)
|
|
||||||
} else {
|
|
||||||
currentDigest = ""
|
|
||||||
fmt.Println(resp.Status)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := client.Pull(context.Background(), &request, fn); err != nil {
|
return client.Pull(context.Background(), &request, fn)
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if bar != nil && !bar.IsFinished() {
|
|
||||||
return errors.New("unexpected end to pull model")
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func RunGenerate(cmd *cobra.Command, args []string) error {
|
func RunGenerate(cmd *cobra.Command, args []string) error {
|
||||||
|
@ -442,9 +364,6 @@ func generate(cmd *cobra.Command, model, prompt string, wordWrap bool, format st
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
spinner := NewSpinner("")
|
|
||||||
go spinner.Spin(60 * time.Millisecond)
|
|
||||||
|
|
||||||
var latest api.GenerateResponse
|
var latest api.GenerateResponse
|
||||||
|
|
||||||
generateContext, ok := cmd.Context().Value(generateContextKey("context")).([]int)
|
generateContext, ok := cmd.Context().Value(generateContextKey("context")).([]int)
|
||||||
|
@ -475,10 +394,6 @@ func generate(cmd *cobra.Command, model, prompt string, wordWrap bool, format st
|
||||||
|
|
||||||
request := api.GenerateRequest{Model: model, Prompt: prompt, Context: generateContext, Format: format}
|
request := api.GenerateRequest{Model: model, Prompt: prompt, Context: generateContext, Format: format}
|
||||||
fn := func(response api.GenerateResponse) error {
|
fn := func(response api.GenerateResponse) error {
|
||||||
if !spinner.IsFinished() {
|
|
||||||
spinner.Finish()
|
|
||||||
}
|
|
||||||
|
|
||||||
latest = response
|
latest = response
|
||||||
|
|
||||||
if wordWrap {
|
if wordWrap {
|
||||||
|
@ -511,7 +426,6 @@ func generate(cmd *cobra.Command, model, prompt string, wordWrap bool, format st
|
||||||
|
|
||||||
if err := client.Generate(cancelCtx, &request, fn); err != nil {
|
if err := client.Generate(cancelCtx, &request, fn); err != nil {
|
||||||
if strings.Contains(err.Error(), "context canceled") && abort {
|
if strings.Contains(err.Error(), "context canceled") && abort {
|
||||||
spinner.Finish()
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/jmorganca/ollama/progressbar"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Spinner struct {
|
|
||||||
description string
|
|
||||||
*progressbar.ProgressBar
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewSpinner(description string) *Spinner {
|
|
||||||
return &Spinner{
|
|
||||||
description: description,
|
|
||||||
ProgressBar: progressbar.NewOptions(-1,
|
|
||||||
progressbar.OptionSetWriter(os.Stderr),
|
|
||||||
progressbar.OptionThrottle(60*time.Millisecond),
|
|
||||||
progressbar.OptionSpinnerType(14),
|
|
||||||
progressbar.OptionSetRenderBlankState(true),
|
|
||||||
progressbar.OptionSetElapsedTime(false),
|
|
||||||
progressbar.OptionClearOnFinish(),
|
|
||||||
progressbar.OptionSetDescription(description),
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Spinner) Spin(tick time.Duration) {
|
|
||||||
for range time.Tick(tick) {
|
|
||||||
if s.IsFinished() {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
s.Add(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *Spinner) Stop() {
|
|
||||||
s.Finish()
|
|
||||||
fmt.Println(s.description)
|
|
||||||
}
|
|
|
@ -1,21 +0,0 @@
|
||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2017 Zack
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
|
@ -1,121 +0,0 @@
|
||||||
# progressbar
|
|
||||||
|
|
||||||
[![CI](https://github.com/schollz/progressbar/actions/workflows/ci.yml/badge.svg?branch=main&event=push)](https://github.com/schollz/progressbar/actions/workflows/ci.yml)
|
|
||||||
[![go report card](https://goreportcard.com/badge/github.com/schollz/progressbar)](https://goreportcard.com/report/github.com/schollz/progressbar)
|
|
||||||
[![coverage](https://img.shields.io/badge/coverage-84%25-brightgreen.svg)](https://gocover.io/github.com/schollz/progressbar)
|
|
||||||
[![godocs](https://godoc.org/github.com/schollz/progressbar?status.svg)](https://godoc.org/github.com/schollz/progressbar/v3)
|
|
||||||
|
|
||||||
A very simple thread-safe progress bar which should work on every OS without problems. I needed a progressbar for [croc](https://github.com/schollz/croc) and everything I tried had problems, so I made another one. In order to be OS agnostic I do not plan to support [multi-line outputs](https://github.com/schollz/progressbar/issues/6).
|
|
||||||
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
```
|
|
||||||
go get -u github.com/schollz/progressbar/v3
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### Basic usage
|
|
||||||
|
|
||||||
```golang
|
|
||||||
bar := progressbar.Default(100)
|
|
||||||
for i := 0; i < 100; i++ {
|
|
||||||
bar.Add(1)
|
|
||||||
time.Sleep(40 * time.Millisecond)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
which looks like:
|
|
||||||
|
|
||||||
![Example of basic bar](examples/basic/basic.gif)
|
|
||||||
|
|
||||||
|
|
||||||
### I/O operations
|
|
||||||
|
|
||||||
The `progressbar` implements an `io.Writer` so it can automatically detect the number of bytes written to a stream, so you can use it as a progressbar for an `io.Reader`.
|
|
||||||
|
|
||||||
```golang
|
|
||||||
req, _ := http.NewRequest("GET", "https://dl.google.com/go/go1.14.2.src.tar.gz", nil)
|
|
||||||
resp, _ := http.DefaultClient.Do(req)
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
f, _ := os.OpenFile("go1.14.2.src.tar.gz", os.O_CREATE|os.O_WRONLY, 0644)
|
|
||||||
defer f.Close()
|
|
||||||
|
|
||||||
bar := progressbar.DefaultBytes(
|
|
||||||
resp.ContentLength,
|
|
||||||
"downloading",
|
|
||||||
)
|
|
||||||
io.Copy(io.MultiWriter(f, bar), resp.Body)
|
|
||||||
```
|
|
||||||
|
|
||||||
which looks like:
|
|
||||||
|
|
||||||
![Example of download bar](examples/download/download.gif)
|
|
||||||
|
|
||||||
|
|
||||||
### Progress bar with unknown length
|
|
||||||
|
|
||||||
A progressbar with unknown length is a spinner. Any bar with -1 length will automatically convert it to a spinner with a customizable spinner type. For example, the above code can be run and set the `resp.ContentLength` to `-1`.
|
|
||||||
|
|
||||||
which looks like:
|
|
||||||
|
|
||||||
![Example of download bar with unknown length](examples/download-unknown/download-unknown.gif)
|
|
||||||
|
|
||||||
|
|
||||||
### Customization
|
|
||||||
|
|
||||||
There is a lot of customization that you can do - change the writer, the color, the width, description, theme, etc. See [all the options](https://pkg.go.dev/github.com/schollz/progressbar/v3?tab=doc#Option).
|
|
||||||
|
|
||||||
```golang
|
|
||||||
bar := progressbar.NewOptions(1000,
|
|
||||||
progressbar.OptionSetWriter(ansi.NewAnsiStdout()),
|
|
||||||
progressbar.OptionEnableColorCodes(true),
|
|
||||||
progressbar.OptionShowBytes(true),
|
|
||||||
progressbar.OptionSetWidth(15),
|
|
||||||
progressbar.OptionSetDescription("[cyan][1/3][reset] Writing moshable file..."),
|
|
||||||
progressbar.OptionSetTheme(progressbar.Theme{
|
|
||||||
Saucer: "[green]=[reset]",
|
|
||||||
SaucerHead: "[green]>[reset]",
|
|
||||||
SaucerPadding: " ",
|
|
||||||
BarStart: "[",
|
|
||||||
BarEnd: "]",
|
|
||||||
}))
|
|
||||||
for i := 0; i < 1000; i++ {
|
|
||||||
bar.Add(1)
|
|
||||||
time.Sleep(5 * time.Millisecond)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
which looks like:
|
|
||||||
|
|
||||||
![Example of customized bar](examples/customization/customization.gif)
|
|
||||||
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Pull requests are welcome. Feel free to...
|
|
||||||
|
|
||||||
- Revise documentation
|
|
||||||
- Add new features
|
|
||||||
- Fix bugs
|
|
||||||
- Suggest improvements
|
|
||||||
|
|
||||||
## Thanks
|
|
||||||
|
|
||||||
Thanks [@Dynom](https://github.com/dynom) for massive improvements in version 2.0!
|
|
||||||
|
|
||||||
Thanks [@CrushedPixel](https://github.com/CrushedPixel) for adding descriptions and color code support!
|
|
||||||
|
|
||||||
Thanks [@MrMe42](https://github.com/MrMe42) for adding some minor features!
|
|
||||||
|
|
||||||
Thanks [@tehstun](https://github.com/tehstun) for some great PRs!
|
|
||||||
|
|
||||||
Thanks [@Benzammour](https://github.com/Benzammour) and [@haseth](https://github.com/haseth) for helping create v3!
|
|
||||||
|
|
||||||
Thanks [@briandowns](https://github.com/briandowns) for compiling the list of spinners.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
MIT
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,80 +0,0 @@
|
||||||
package progressbar
|
|
||||||
|
|
||||||
var spinners = map[int][]string{
|
|
||||||
0: {"←", "↖", "↑", "↗", "→", "↘", "↓", "↙"},
|
|
||||||
1: {"▁", "▃", "▄", "▅", "▆", "▇", "█", "▇", "▆", "▅", "▄", "▃", "▁"},
|
|
||||||
2: {"▖", "▘", "▝", "▗"},
|
|
||||||
3: {"┤", "┘", "┴", "└", "├", "┌", "┬", "┐"},
|
|
||||||
4: {"◢", "◣", "◤", "◥"},
|
|
||||||
5: {"◰", "◳", "◲", "◱"},
|
|
||||||
6: {"◴", "◷", "◶", "◵"},
|
|
||||||
7: {"◐", "◓", "◑", "◒"},
|
|
||||||
8: {".", "o", "O", "@", "*"},
|
|
||||||
9: {"|", "/", "-", "\\"},
|
|
||||||
10: {"◡◡", "⊙⊙", "◠◠"},
|
|
||||||
11: {"⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"},
|
|
||||||
12: {">))'>", " >))'>", " >))'>", " >))'>", " >))'>", " <'((<", " <'((<", " <'((<"},
|
|
||||||
13: {"⠁", "⠂", "⠄", "⡀", "⢀", "⠠", "⠐", "⠈"},
|
|
||||||
14: {"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"},
|
|
||||||
15: {"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"},
|
|
||||||
16: {"▉", "▊", "▋", "▌", "▍", "▎", "▏", "▎", "▍", "▌", "▋", "▊", "▉"},
|
|
||||||
17: {"■", "□", "▪", "▫"},
|
|
||||||
18: {"←", "↑", "→", "↓"},
|
|
||||||
19: {"╫", "╪"},
|
|
||||||
20: {"⇐", "⇖", "⇑", "⇗", "⇒", "⇘", "⇓", "⇙"},
|
|
||||||
21: {"⠁", "⠁", "⠉", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠤", "⠄", "⠄", "⠤", "⠠", "⠠", "⠤", "⠦", "⠖", "⠒", "⠐", "⠐", "⠒", "⠓", "⠋", "⠉", "⠈", "⠈"},
|
|
||||||
22: {"⠈", "⠉", "⠋", "⠓", "⠒", "⠐", "⠐", "⠒", "⠖", "⠦", "⠤", "⠠", "⠠", "⠤", "⠦", "⠖", "⠒", "⠐", "⠐", "⠒", "⠓", "⠋", "⠉", "⠈"},
|
|
||||||
23: {"⠁", "⠉", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠤", "⠄", "⠄", "⠤", "⠴", "⠲", "⠒", "⠂", "⠂", "⠒", "⠚", "⠙", "⠉", "⠁"},
|
|
||||||
24: {"⠋", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠦", "⠖", "⠒", "⠐", "⠐", "⠒", "⠓", "⠋"},
|
|
||||||
25: {"ヲ", "ァ", "ィ", "ゥ", "ェ", "ォ", "ャ", "ュ", "ョ", "ッ", "ア", "イ", "ウ", "エ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ヤ", "ユ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ン"},
|
|
||||||
26: {".", "..", "..."},
|
|
||||||
27: {"▁", "▂", "▃", "▄", "▅", "▆", "▇", "█", "▉", "▊", "▋", "▌", "▍", "▎", "▏", "▏", "▎", "▍", "▌", "▋", "▊", "▉", "█", "▇", "▆", "▅", "▄", "▃", "▂", "▁"},
|
|
||||||
28: {".", "o", "O", "°", "O", "o", "."},
|
|
||||||
29: {"+", "x"},
|
|
||||||
30: {"v", "<", "^", ">"},
|
|
||||||
31: {">>--->", " >>--->", " >>--->", " >>--->", " >>--->", " <---<<", " <---<<", " <---<<", " <---<<", "<---<<"},
|
|
||||||
32: {"|", "||", "|||", "||||", "|||||", "|||||||", "||||||||", "|||||||", "||||||", "|||||", "||||", "|||", "||", "|"},
|
|
||||||
33: {"[ ]", "[= ]", "[== ]", "[=== ]", "[==== ]", "[===== ]", "[====== ]", "[======= ]", "[======== ]", "[========= ]", "[==========]"},
|
|
||||||
34: {"(*---------)", "(-*--------)", "(--*-------)", "(---*------)", "(----*-----)", "(-----*----)", "(------*---)", "(-------*--)", "(--------*-)", "(---------*)"},
|
|
||||||
35: {"█▒▒▒▒▒▒▒▒▒", "███▒▒▒▒▒▒▒", "█████▒▒▒▒▒", "███████▒▒▒", "██████████"},
|
|
||||||
36: {"[ ]", "[=> ]", "[===> ]", "[=====> ]", "[======> ]", "[========> ]", "[==========> ]", "[============> ]", "[==============> ]", "[================> ]", "[==================> ]", "[===================>]"},
|
|
||||||
37: {"ဝ", "၀"},
|
|
||||||
38: {"▌", "▀", "▐▄"},
|
|
||||||
39: {"🌍", "🌎", "🌏"},
|
|
||||||
40: {"◜", "◝", "◞", "◟"},
|
|
||||||
41: {"⬒", "⬔", "⬓", "⬕"},
|
|
||||||
42: {"⬖", "⬘", "⬗", "⬙"},
|
|
||||||
43: {"[>>> >]", "[]>>>> []", "[] >>>> []", "[] >>>> []", "[] >>>> []", "[] >>>>[]", "[>> >>]"},
|
|
||||||
44: {"♠", "♣", "♥", "♦"},
|
|
||||||
45: {"➞", "➟", "➠", "➡", "➠", "➟"},
|
|
||||||
46: {" | ", ` \ `, "_ ", ` \ `, " | ", " / ", " _", " / "},
|
|
||||||
47: {" . . . .", ". . . .", ". . . .", ". . . .", ". . . . ", ". . . . ."},
|
|
||||||
48: {" | ", " / ", " _ ", ` \ `, " | ", ` \ `, " _ ", " / "},
|
|
||||||
49: {"⎺", "⎻", "⎼", "⎽", "⎼", "⎻"},
|
|
||||||
50: {"▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸"},
|
|
||||||
51: {"[ ]", "[ =]", "[ ==]", "[ ===]", "[====]", "[=== ]", "[== ]", "[= ]"},
|
|
||||||
52: {"( ● )", "( ● )", "( ● )", "( ● )", "( ●)", "( ● )", "( ● )", "( ● )", "( ● )"},
|
|
||||||
53: {"✶", "✸", "✹", "✺", "✹", "✷"},
|
|
||||||
54: {"▐|\\____________▌", "▐_|\\___________▌", "▐__|\\__________▌", "▐___|\\_________▌", "▐____|\\________▌", "▐_____|\\_______▌", "▐______|\\______▌", "▐_______|\\_____▌", "▐________|\\____▌", "▐_________|\\___▌", "▐__________|\\__▌", "▐___________|\\_▌", "▐____________|\\▌", "▐____________/|▌", "▐___________/|_▌", "▐__________/|__▌", "▐_________/|___▌", "▐________/|____▌", "▐_______/|_____▌", "▐______/|______▌", "▐_____/|_______▌", "▐____/|________▌", "▐___/|_________▌", "▐__/|__________▌", "▐_/|___________▌", "▐/|____________▌"},
|
|
||||||
55: {"▐⠂ ▌", "▐⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂▌", "▐ ⠠▌", "▐ ⡀▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐⠠ ▌"},
|
|
||||||
56: {"¿", "?"},
|
|
||||||
57: {"⢹", "⢺", "⢼", "⣸", "⣇", "⡧", "⡗", "⡏"},
|
|
||||||
58: {"⢄", "⢂", "⢁", "⡁", "⡈", "⡐", "⡠"},
|
|
||||||
59: {". ", ".. ", "...", " ..", " .", " "},
|
|
||||||
60: {".", "o", "O", "°", "O", "o", "."},
|
|
||||||
61: {"▓", "▒", "░"},
|
|
||||||
62: {"▌", "▀", "▐", "▄"},
|
|
||||||
63: {"⊶", "⊷"},
|
|
||||||
64: {"▪", "▫"},
|
|
||||||
65: {"□", "■"},
|
|
||||||
66: {"▮", "▯"},
|
|
||||||
67: {"-", "=", "≡"},
|
|
||||||
68: {"d", "q", "p", "b"},
|
|
||||||
69: {"∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙"},
|
|
||||||
70: {"🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 "},
|
|
||||||
71: {"☗", "☖"},
|
|
||||||
72: {"⧇", "⧆"},
|
|
||||||
73: {"◉", "◎"},
|
|
||||||
74: {"㊂", "㊀", "㊁"},
|
|
||||||
75: {"⦾", "⦿"},
|
|
||||||
}
|
|
Loading…
Reference in a new issue