├── go.mod ├── assets ├── bg.jpg └── style.css ├── dockerignore ├── templates ├── about.html └── index.html ├── main.go ├── commands.sh ├── Dockerfile ├── features ├── template_handling.go ├── inputs_validation.go ├── handlers.go └── asciiart_process.go ├── README.md └── banners ├── thinkertoy.txt ├── standard.txt └── shadow.txt /go.mod: -------------------------------------------------------------------------------- 1 | module ascii_art_web 2 | 3 | go 1.22.3 4 | -------------------------------------------------------------------------------- /assets/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hmaach/ascii-art-web/HEAD/assets/bg.jpg -------------------------------------------------------------------------------- /dockerignore: -------------------------------------------------------------------------------- 1 | # Ignore version control system directories 2 | .git 3 | .gitignore 4 | 5 | # Ignore Docker-specific files 6 | Dockerfile 7 | .dockerignore 8 | 9 | # Ignore the commands script as it's not needed inside the container 10 | commands.sh 11 | 12 | # Ignore the README as it's not needed in the image 13 | README.md 14 | 15 | -------------------------------------------------------------------------------- /templates/about.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | About 7 | 8 | 9 |
10 |

Welcome to our first Gofer powered Server

11 |

Credit:

12 |

Ismail Bentour | Hamza Maach

13 |

@2024 Zone01 Oujda

14 | Home Page 15 |
16 | 17 | 18 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | 7 | ft "ascii_art_web/features" 8 | ) 9 | 10 | func main() { 11 | // Creat a costum file server handler 12 | fs := http.FileServer(http.Dir("./assets")) 13 | http.Handle("/assets/", http.StripPrefix("/assets/", fs)) 14 | http.HandleFunc("/", ft.Handler) 15 | fmt.Println("Starting the server on : http://localhost:8080") 16 | err := http.ListenAndServe(":8080", nil) 17 | if err != nil { 18 | fmt.Println("500 | Internal Server Error :", err) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /commands.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Stop the running container 4 | docker stop ascii-art-web-con 5 | 6 | # Remove unused data 7 | docker system prune -f 8 | 9 | # Remove the old image (corrected typo in command) 10 | docker rmi ascii-art-web-img 11 | 12 | # Build a new image 13 | docker build -f Dockerfile -t ascii-art-web-img . 14 | 15 | # Run a new container 16 | docker run -d -p 8080:8080 --name ascii-art-web-con ascii-art-web-img 17 | 18 | # Execute an interactive bash shell in the running container 19 | docker exec -it ascii-art-web-con /bin/bash -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # Use a specific version of Go with Alpine as the base image 2 | FROM golang:1.22.3-alpine 3 | 4 | # Install bash 5 | RUN apk add bash 6 | 7 | # Set the working directory in the container 8 | WORKDIR /app 9 | 10 | # Copy the current directory contents into the container at /app 11 | COPY . /app 12 | 13 | # Add metadata to the image 14 | LABEL project="ascii-art-web" \ 15 | version="1.0" \ 16 | repo="https://learn.zone01oujda.ma/git/hmaach/ascii-art-web-dockerize" 17 | 18 | # Build the Go application 19 | RUN go build -o main 20 | 21 | # Expose port 8080 to the outside world 22 | EXPOSE 8080 23 | 24 | # Command to run the application 25 | CMD ["./main"] -------------------------------------------------------------------------------- /features/template_handling.go: -------------------------------------------------------------------------------- 1 | package ascii_art_web 2 | 3 | import ( 4 | "fmt" 5 | "html/template" 6 | "net/http" 7 | ) 8 | 9 | // RenderTemplate renders the specified template with data 10 | func RenderTemplate(w http.ResponseWriter, tmpl string, data Data) { 11 | 12 | t, err := template.ParseFiles("templates/" + tmpl) 13 | if err != nil { 14 | http.Error(w, "500 | Internal Server Error !", http.StatusInternalServerError) 15 | fmt.Println("Error: ", err) 16 | return 17 | } 18 | 19 | err = t.ExecuteTemplate(w, tmpl, data) 20 | if err != nil { 21 | http.Error(w, "500 | Internal Server Error !", http.StatusInternalServerError) 22 | fmt.Println("Error executing the template: ", err) 23 | return 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /features/inputs_validation.go: -------------------------------------------------------------------------------- 1 | package ascii_art_web 2 | 3 | import ( 4 | "net/http" 5 | "strings" 6 | ) 7 | 8 | func checkBanner(banner string) bool { 9 | switch banner { 10 | case "shadow", "standard", "thinkertoy": 11 | default: 12 | return true 13 | } 14 | 15 | return false 16 | } 17 | 18 | // validates if the input contains only printable ASCII characters 19 | func checkValidString(input string) bool { 20 | input = strings.ReplaceAll(input, "\r", "") 21 | input = strings.ReplaceAll(input, "\n", "") 22 | for _, char := range input { 23 | if int(char) < 32 || int(char) > 126 { 24 | return true 25 | } 26 | } 27 | return false 28 | } 29 | 30 | // ValidateInput checks the validity of the input string, banner, and other parameters 31 | func ValidateInput(w http.ResponseWriter, str, banner string) bool { 32 | if checkBanner(banner) { 33 | http.Error(w, "404 | Banner not found", http.StatusNotFound) 34 | return false 35 | } 36 | if str == "" { 37 | http.Error(w, "400 | Bad Request: No input provided", http.StatusBadRequest) 38 | return false 39 | } 40 | if len(str) > 1000 { 41 | http.Error(w, "413 | The input must contain under 1000 characters.", http.StatusRequestEntityTooLarge) 42 | return false 43 | } 44 | if checkValidString(str) { 45 | http.Error(w, "400 | Bad Request: Invalid input. The input must contain characters with ASCII values ranging from 32 to 126.", http.StatusBadRequest) 46 | return false 47 | } 48 | return true 49 | } 50 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ASCII ART WEB 9 | 10 | 11 | 12 |
13 |
14 | 15 |

ASCII_ART GENERATOR

16 |
17 | 19 | 24 | 30 |
31 | 32 | 33 |
34 |
35 | 36 | {{if .Ascii_art}} 37 |
38 |
{{.Ascii_art}}
39 |
40 | {{end}} 41 | 42 | About 43 |
44 | 45 | 46 | -------------------------------------------------------------------------------- /features/handlers.go: -------------------------------------------------------------------------------- 1 | package ascii_art_web 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | "strings" 7 | ) 8 | 9 | type Data struct { 10 | Ascii_art string 11 | Input string 12 | Banner string 13 | } 14 | 15 | // DownloadHandler handles the download of the ASCII art file 16 | 17 | // HandleAsciiArt processes the "ascii-art" route 18 | func HandleAsciiArt(w http.ResponseWriter, r *http.Request, tmpl string) { 19 | str := r.FormValue("string") 20 | banner := r.FormValue("banner") 21 | export := r.Form.Has("Download") 22 | 23 | if !ValidateInput(w, str, banner) { 24 | return 25 | } 26 | 27 | str = strings.ReplaceAll(str, "\r\n", "\n") 28 | 29 | asciiArt, err := ProcessInput(w, str, banner) 30 | if err != nil { 31 | http.Error(w, "500 | Internal Server Error !", http.StatusInternalServerError) 32 | return 33 | } 34 | 35 | data := Data{ 36 | Ascii_art: asciiArt, 37 | Input: str, 38 | Banner: banner, 39 | } 40 | if export { 41 | filename := "ascii_art" + r.FormValue("filetype") 42 | w.Header().Set("Content-Disposition", "attachment; filename="+filename) 43 | w.Header().Set("Content-Length", fmt.Sprint(len(data.Ascii_art))) 44 | w.Header().Set("Content-Type", "text/plain") 45 | w.Write([]byte(data.Ascii_art)) 46 | } else { 47 | RenderTemplate(w, tmpl, data) 48 | } 49 | } 50 | 51 | // MainHandler handles the root route and other casescases 52 | func Handler(w http.ResponseWriter, r *http.Request) { 53 | tmpl := "index.html" 54 | 55 | switch r.URL.Path { 56 | case "/": 57 | if r.Method != http.MethodGet { 58 | http.Error(w, "405 | Method Not Allowed: Use GET", http.StatusMethodNotAllowed) 59 | return 60 | } 61 | 62 | RenderTemplate(w, tmpl, Data{}) 63 | 64 | case "/ascii-art": 65 | if r.Method != http.MethodPost { 66 | http.Error(w, "405 | Method Not Allowed: Use POST", http.StatusMethodNotAllowed) 67 | return 68 | } 69 | HandleAsciiArt(w, r, tmpl) 70 | 71 | case "/about": 72 | RenderTemplate(w, "about.html", Data{}) 73 | 74 | default: 75 | http.NotFound(w, r) 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /features/asciiart_process.go: -------------------------------------------------------------------------------- 1 | package ascii_art_web 2 | 3 | import ( 4 | "fmt" 5 | "net/http" 6 | "os" 7 | "strings" 8 | ) 9 | 10 | // ProcessInput processes the input string, reads the banner, and produces the ASCII art 11 | func ProcessInput(w http.ResponseWriter, input, banner string) (string, error) { 12 | inputWithoutNewLines := strings.ReplaceAll(input, "\n", "") 13 | if len(inputWithoutNewLines) == 0 { 14 | return input, nil 15 | } 16 | 17 | charactersMap, err := readBanner(banner) 18 | if err != nil { 19 | return "", err 20 | } 21 | 22 | return drawASCIIArt(charactersMap, input), nil 23 | } 24 | 25 | // readBanner reads the banner file and returns the ASCII art characters in map [rune]string and err if it occurs 26 | func readBanner(banner string) (map[rune][]string, error) { 27 | data, err := os.ReadFile("banners/" + banner + ".txt") 28 | if err != nil { 29 | fmt.Printf("500 | Internal Server Error: Unable to read banner file: %s\n", err) 30 | return nil, err 31 | } 32 | stringData := string(data[1:]) 33 | if banner == "thinkertoy" { 34 | stringData = strings.ReplaceAll(stringData, "\r", "") 35 | } 36 | content := strings.Split(stringData, "\n\n") 37 | charactersMap := convertTocharacterMap(content) 38 | return charactersMap, nil 39 | } 40 | 41 | // DrawASCIIArt draws ASCII art and colorizes specific substrings 42 | // Render the ASCII art based on the character map and the input lines 43 | func drawASCIIArt(characterMatrix map[rune][]string, input string) string { 44 | result := "" 45 | splittedInput := strings.Split(input, "\n") 46 | 47 | for _, val := range splittedInput { 48 | if val == "" { 49 | result += "\n" 50 | } else if val != "" { 51 | for j := 0; j < 8; j++ { 52 | for _, k := range val { 53 | result += characterMatrix[k][j] 54 | } 55 | result += "\n" 56 | } 57 | } 58 | } 59 | return result 60 | } 61 | 62 | // Convert content array to a character mapping ASCII characters to their line representations 63 | func convertTocharacterMap(content []string) map[rune][]string { 64 | charactersMap := map[rune][]string{} 65 | for i, val := range content { 66 | charactersMap[rune(32+i)] = strings.Split(val, "\n") 67 | } 68 | return charactersMap 69 | } 70 | -------------------------------------------------------------------------------- /assets/style.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --primary-color: #FD5E53; 3 | --bg-color: #252424a6; 4 | --input-bg-color: #ffffffcb; 5 | } 6 | 7 | 8 | body { 9 | font-family: Arial, sans-serif; 10 | background-image: url('/assets/bg.jpg'); 11 | background-size: cover; 12 | background-repeat: no-repeat; 13 | background-attachment: fixed; 14 | background-color: rgba(0, 0, 0, 0.514); 15 | background-blend-mode: darken; 16 | color: #fff; 17 | } 18 | 19 | 20 | form { 21 | margin: 20px 0; 22 | background-color: var(--bg-color); 23 | display: flex; 24 | flex-direction: column; 25 | gap: 10px; 26 | width: 50%; 27 | border-radius: 20px; 28 | border: 3px solid var(--primary-color); 29 | box-shadow: 0 4px 8px rgba(0, 0, 0, 0.274); 30 | } 31 | 32 | textarea { 33 | margin: 5px 15px; 34 | resize: none; 35 | min-height: 150px; 36 | background-color: var(--input-bg-color); 37 | border: 2px solid var(--primary-color); 38 | border-radius: 10px; 39 | box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1); 40 | } 41 | 42 | textarea:focus, 43 | select:focus { 44 | outline: none; 45 | } 46 | 47 | select { 48 | margin: 5px 15px; 49 | border: 2px solid var(--primary-color); 50 | background-color: var(--input-bg-color); 51 | border-radius: 10px; 52 | cursor: pointer; 53 | text-align: center; 54 | box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1); 55 | } 56 | 57 | input[type="submit"] { 58 | padding: 10px 25px; 59 | font-size: 20px; 60 | font-weight: 700; 61 | border: 0px; 62 | border-radius: 10px; 63 | margin-bottom: 10px; 64 | background-color: var(--primary-color); 65 | color: white; 66 | box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); 67 | } 68 | 69 | input[type="submit"]:hover { 70 | background-color: var(--primary-color); 71 | cursor: pointer; 72 | box-shadow: 1px 1px 8px var(--primary-color); 73 | } 74 | 75 | textarea, 76 | select { 77 | font-size: 16px; 78 | padding: 10px; 79 | font-weight: bolder; 80 | } 81 | 82 | #result { 83 | background-color: var(--bg-color); 84 | min-height: 160px; 85 | width: fit-content; 86 | min-width: 50%; 87 | max-width: 100%; 88 | margin-bottom: 10px; 89 | border: 3px dotted var(--primary-color); 90 | border-radius: 20px; 91 | color: black; 92 | overflow: auto; 93 | box-shadow: 0 4px 8px rgba(0, 0, 0, 0.274); 94 | text-shadow: 5px 5px 7px #fff; 95 | } 96 | 97 | pre { 98 | font-weight: bolder; 99 | min-width: 500px; 100 | margin: 10px 20px; 101 | color: #fff; 102 | text-align: start; 103 | } 104 | 105 | a { 106 | color: var(--primary-color); 107 | } 108 | 109 | 110 | 111 | @media (min-width: 1005px) and (max-width: 1281px) { 112 | form { 113 | width: 70%; 114 | } 115 | 116 | #result { 117 | width: 70%; 118 | } 119 | 120 | 121 | } 122 | 123 | 124 | @media (min-width: 200px) and (max-width: 1005px) { 125 | form { 126 | width: 95%; 127 | gap: 25px; 128 | padding: 30px 0; 129 | } 130 | 131 | #result { 132 | width: 95%; 133 | } 134 | 135 | textarea { 136 | min-height: 300px; 137 | font-size: 13px; 138 | font-weight: 500; 139 | 140 | } 141 | textarea::placeholder { 142 | font-size: 25px; 143 | font-weight: 500; 144 | 145 | } 146 | 147 | pre { 148 | font-weight: bolder; 149 | min-height: 400px; 150 | padding: 10px; 151 | } 152 | 153 | input[type="submit"] { 154 | padding: 10px 25px; 155 | font-size: 30px; 156 | font-weight: 700; 157 | } 158 | 159 | select { 160 | font-size: 25px; 161 | min-height: 70px; 162 | } 163 | 164 | h2 { 165 | font-size: 60px; 166 | } 167 | a{ 168 | font-size: larger; 169 | } 170 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ASCII-Art-Web-export-file 2 | 3 | ## Description 4 | 5 | ASCII-Art-Web-Stylize is a web-based implementation of the ASCII-Art project. It allows users to input text and transform it into a graphical representation using ASCII characters. The web interface with HTML & CSS supports multiple banner styles, including `shadow`, `standard`, and `thinkertoy`. 6 | 7 | ## Authors 8 | 9 | - Ismail Bentour 10 | - Hamza Maach 11 | 12 | ## Usage 13 | 14 | ### Running the Application 15 | 16 | #### Option 1: Using Go directly 17 | 18 | 1. Clone the repository: 19 | 20 | ```sh 21 | git clone https://github.com/hamzamaach/ascii-art-web.git 22 | cd ascii-art-export-file 23 | ``` 24 | 25 | 2. Run the Go application: 26 | 27 | ```sh 28 | go run . 29 | ``` 30 | 31 | 3. Open your web browser and navigate to: 32 | 33 | ``` 34 | http://localhost:8080 35 | ``` 36 | 37 | #### Option 2: Using Docker 38 | 39 | 1. Clone the repository: 40 | 41 | ```sh 42 | git clone https://github.com/hamzamaach/ascii-art-web.git 43 | cd ascii-art-export-file 44 | ``` 45 | 46 | 2. Build the Docker image: 47 | 48 | ```sh 49 | docker build -t ascii-art-web-img . 50 | ``` 51 | 52 | 3. Run the Docker container: 53 | 54 | ```sh 55 | docker run -d -p 8080:8080 --name ascii-art-web-con ascii-art-web-img 56 | ``` 57 | 58 | 4. Open your web browser and navigate to: 59 | 60 | ``` 61 | http://localhost:8080 62 | ``` 63 | 64 | To stop and remove the container: 65 | 66 | ```sh 67 | docker stop ascii-art-web-con 68 | docker rm ascii-art-web-con 69 | ``` 70 | 71 | ### Web Interface 72 | 73 | 1. Enter your text in the input field. 74 | 2. Select the desired banner style (shadow, standard, or thinkertoy) using the dropdown selector. 75 | 3. Click the "Generate" button to generate the ASCII art or "Download" button to export the output as file. 76 | 77 | ## Implementation Details 78 | 79 | ### Algorithm 80 | 81 | 1. **Input Parsing**: The input string is read from the user via an HTML form. 82 | 2. **Banner Selection**: The selected banner style is determined based on user input. 83 | 3. **Text Conversion**: The input string is converted to its ASCII representation using the selected banner style. 84 | 4. **Output Rendering**: The resulting ASCII art can be displayed on the webpage or downloaded. 85 | 86 | ### File Structure 87 | 88 | - `main.go`: The main Go file that contains the HTTP server logic. 89 | - `index.html`: Main page template. 90 | - `about.html`: About page template. 91 | - `features/`: Directory containing files that contain all functions. 92 | - `assets/`: Directory containing all the CSS assets. 93 | - `banners/`: Directory containing banner files (`shadow.txt`, `standard.txt`, `thinkertoy.txt`). 94 | - `Dockerfile`: Contains instructions for building the Docker image. 95 | 96 | ### HTTP Endpoints 97 | 98 | 1. **GET /**: Sends the HTML response for the main page. 99 | 100 | - **Status Code**: 200 OK 101 | 102 | 2. **POST /ascii-art**: Receives text and banner data from the form, processes it, and returns the ASCII art. 103 | 104 | - **Status Code**: 105 | - 200 OK: If the text is successfully converted. 106 | - 400 Bad Request: If the request is invalid. 107 | - 404 Not Found: If the page or the banner style is not found. 108 | - 500 Internal Server Error: For unhandled errors. 109 | 110 | ### Error Handling 111 | 112 | - **Invalid Input**: Returns a 400 Bad Request status. 113 | - **Page not Found**: Returns a 404 Not Found status. 114 | - **Invalid Banner**: Returns a 404 Not Found status. 115 | - **Entity Too Large**: Returns a 413 Entity Too Large. 116 | - **Method Not Allowed**: Returns a Method Not Allowed status. 117 | - **Unhandled Errors**: Returns a 500 Internal Server Error status. 118 | 119 | ## Docker 120 | 121 | The application can be containerized using Docker. The `Dockerfile` in the root directory contains the necessary instructions to build the image. 122 | 123 | To build and run the Docker container, follow the steps in the "Usage" section under "Option 2: Using Docker". -------------------------------------------------------------------------------- /banners/thinkertoy.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | o 13 | | 14 | o 15 | 16 | O 17 | 18 | 19 | 20 | o o 21 | | | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | 31 | -O-O- 32 | | | 33 | -O-O- 34 | | | 35 | 36 | 37 | 38 | | | 39 | -O-O- 40 | o | | 41 | -O-O- 42 | | | o 43 | -O-O- 44 | | | 45 | 46 | 47 | 48 | O 49 | o / 50 | / 51 | / o 52 | O 53 | 54 | 55 | 56 | 57 | 58 | o 59 | /| 60 | o-O- 61 | | 62 | 63 | 64 | 65 | o 66 | | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | / 76 | o 77 | | 78 | o 79 | \ 80 | 81 | 82 | 83 | 84 | \ 85 | o 86 | | 87 | o 88 | / 89 | 90 | 91 | 92 | 93 | o | o 94 | \|/ 95 | --O-- 96 | /|\ 97 | o | o 98 | 99 | 100 | 101 | 102 | 103 | | 104 | -o- 105 | | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | o 116 | | 117 | 118 | 119 | 120 | 121 | 122 | 123 | o-o 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | O 134 | 135 | 136 | 137 | 138 | o 139 | / 140 | o 141 | / 142 | o 143 | 144 | 145 | 146 | 147 | o-o 148 | o /o 149 | | / | 150 | o/ o 151 | o-o 152 | 153 | 154 | 155 | 156 | 0 157 | /| 158 | o | 159 | | 160 | o-o-o 161 | 162 | 163 | 164 | 165 | -- 166 | o o 167 | / 168 | / 169 | o--o 170 | 171 | 172 | 173 | 174 | o-o 175 | | 176 | oo 177 | | 178 | o-o 179 | 180 | 181 | 182 | 183 | o o 184 | | | 185 | o--O 186 | | 187 | o 188 | 189 | 190 | 191 | 192 | o--o 193 | | 194 | o-o 195 | | 196 | o-o 197 | 198 | 199 | 200 | 201 | o 202 | / 203 | O--o 204 | o | 205 | o-o 206 | 207 | 208 | 209 | 210 | o---o 211 | / 212 | o 213 | | 214 | o 215 | 216 | 217 | 218 | 219 | o-o 220 | | | 221 | o-o 222 | | | 223 | o-o 224 | 225 | 226 | 227 | 228 | o-o 229 | | o 230 | o--O 231 | / 232 | o 233 | 234 | 235 | 236 | 237 | 238 | O 239 | 240 | O 241 | 242 | 243 | 244 | 245 | 246 | 247 | o 248 | 249 | o 250 | | 251 | 252 | 253 | 254 | 255 | o 256 | / 257 | O 258 | \ 259 | o 260 | 261 | 262 | 263 | 264 | 265 | 266 | o--o 267 | o--o 268 | 269 | 270 | 271 | 272 | 273 | o 274 | \ 275 | O 276 | / 277 | o 278 | 279 | 280 | 281 | 282 | o-o 283 | o o 284 | / 285 | o 286 | 287 | O 288 | 289 | 290 | 291 | o 292 | / \ 293 | o O-o 294 | \ 295 | o- 296 | 297 | 298 | 299 | 300 | O 301 | / \ 302 | o---o 303 | | | 304 | o o 305 | 306 | 307 | 308 | 309 | o--o 310 | | | 311 | O--o 312 | | | 313 | o--o 314 | 315 | 316 | 317 | 318 | o-o 319 | / 320 | O 321 | \ 322 | o-o 323 | 324 | 325 | 326 | 327 | o-o 328 | | \ 329 | | O 330 | | / 331 | o-o 332 | 333 | 334 | 335 | 336 | o--o 337 | | 338 | O-o 339 | | 340 | o--o 341 | 342 | 343 | 344 | 345 | o--o 346 | | 347 | O-o 348 | | 349 | o 350 | 351 | 352 | 353 | 354 | o-o 355 | o 356 | | -o 357 | o | 358 | o-o 359 | 360 | 361 | 362 | 363 | o o 364 | | | 365 | O--O 366 | | | 367 | o o 368 | 369 | 370 | 371 | 372 | o-O-o 373 | | 374 | | 375 | | 376 | o-O-o 377 | 378 | 379 | 380 | 381 | o 382 | | 383 | | 384 | \ o 385 | o-o 386 | 387 | 388 | 389 | 390 | o o 391 | | / 392 | OO 393 | | \ 394 | o o 395 | 396 | 397 | 398 | 399 | o 400 | | 401 | | 402 | | 403 | O---o 404 | 405 | 406 | 407 | 408 | o o 409 | |\ /| 410 | | O | 411 | | | 412 | o o 413 | 414 | 415 | 416 | 417 | o o 418 | |\ | 419 | | \ | 420 | | \| 421 | o o 422 | 423 | 424 | 425 | 426 | o-o 427 | o o 428 | | | 429 | o o 430 | o-o 431 | 432 | 433 | 434 | 435 | o--o 436 | | | 437 | O--o 438 | | 439 | o 440 | 441 | 442 | 443 | 444 | o-o 445 | o o 446 | | | 447 | o O 448 | o-O\ 449 | 450 | 451 | 452 | 453 | o--o 454 | | | 455 | O-Oo 456 | | \ 457 | o o 458 | 459 | 460 | 461 | 462 | o-o 463 | | 464 | o-o 465 | | 466 | o--o 467 | 468 | 469 | 470 | 471 | o-O-o 472 | | 473 | | 474 | | 475 | o 476 | 477 | 478 | 479 | 480 | o o 481 | | | 482 | | | 483 | | | 484 | o-o 485 | 486 | 487 | 488 | 489 | o o 490 | | | 491 | o o 492 | \ / 493 | o 494 | 495 | 496 | 497 | 498 | o o 499 | | | 500 | o o o 501 | \ / \ / 502 | o o 503 | 504 | 505 | 506 | 507 | o o 508 | \ / 509 | O 510 | / \ 511 | o o 512 | 513 | 514 | 515 | 516 | o o 517 | \ / 518 | O 519 | | 520 | o 521 | 522 | 523 | 524 | 525 | o---o 526 | / 527 | -O- 528 | / 529 | o---o 530 | 531 | 532 | 533 | 534 | O-o 535 | | 536 | | 537 | | 538 | O-o 539 | 540 | 541 | 542 | 543 | o 544 | \ 545 | o 546 | \ 547 | o 548 | 549 | 550 | 551 | 552 | o-O 553 | | 554 | | 555 | | 556 | o-O 557 | 558 | 559 | 560 | 561 | o 562 | / \ 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | o---o 575 | 576 | 577 | 578 | 579 | 0 580 | | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | oo 591 | | | 592 | o-o- 593 | 594 | 595 | 596 | 597 | o 598 | | 599 | O-o 600 | | | 601 | o-o 602 | 603 | 604 | 605 | 606 | 607 | 608 | o-o 609 | | 610 | o-o 611 | 612 | 613 | 614 | 615 | o 616 | | 617 | o-O 618 | | | 619 | o-o 620 | 621 | 622 | 623 | 624 | 625 | 626 | o-o 627 | |-' 628 | o-o 629 | 630 | 631 | 632 | 633 | o-o 634 | | 635 | -O- 636 | | 637 | o 638 | 639 | 640 | 641 | 642 | 643 | 644 | o--o 645 | | | 646 | o--O 647 | | 648 | o--o 649 | 650 | 651 | o 652 | | 653 | O--o 654 | | | 655 | o o 656 | 657 | 658 | 659 | 660 | 661 | o 662 | 663 | | 664 | | 665 | 666 | 667 | 668 | 669 | 670 | o 671 | 672 | o 673 | | 674 | o o 675 | o-o 676 | 677 | 678 | o 679 | | / 680 | OO 681 | | \ 682 | o o 683 | 684 | 685 | 686 | 687 | o 688 | | 689 | | 690 | | 691 | o 692 | 693 | 694 | 695 | 696 | 697 | 698 | o-O-o 699 | | | | 700 | o o o 701 | 702 | 703 | 704 | 705 | 706 | 707 | o-o 708 | | | 709 | o o 710 | 711 | 712 | 713 | 714 | 715 | 716 | o-o 717 | | | 718 | o-o 719 | 720 | 721 | 722 | 723 | 724 | 725 | o-o 726 | | | 727 | O-o 728 | | 729 | o 730 | 731 | 732 | 733 | 734 | o-o 735 | | | 736 | o-O 737 | | 738 | o 739 | 740 | 741 | 742 | 743 | o-o 744 | | 745 | o 746 | 747 | 748 | 749 | 750 | 751 | 752 | o-o 753 | \ 754 | o-o 755 | 756 | 757 | 758 | 759 | o 760 | | 761 | -o- 762 | | 763 | o 764 | 765 | 766 | 767 | 768 | 769 | 770 | o o 771 | | | 772 | o--o 773 | 774 | 775 | 776 | 777 | 778 | 779 | o o 780 | \ / 781 | o 782 | 783 | 784 | 785 | 786 | 787 | 788 | o o o 789 | \ / \ / 790 | o o 791 | 792 | 793 | 794 | 795 | 796 | 797 | \ / 798 | o 799 | / \ 800 | 801 | 802 | 803 | 804 | 805 | 806 | o o 807 | | | 808 | o--O 809 | | 810 | o--o 811 | 812 | 813 | 814 | 815 | o-o 816 | / 817 | o-o 818 | 819 | 820 | 821 | 822 | o-o 823 | | 824 | o-O 825 | | 826 | o-o 827 | 828 | 829 | 830 | 831 | o 832 | | 833 | o 834 | | 835 | o 836 | 837 | 838 | 839 | 840 | o-o 841 | | 842 | O-o 843 | | 844 | o-o 845 | 846 | 847 | 848 | o_ / 849 | / o 850 | 851 | 852 | 853 | 854 | 855 | 856 | -------------------------------------------------------------------------------- /banners/standard.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | _ 12 | | | 13 | | | 14 | | | 15 | |_| 16 | (_) 17 | 18 | 19 | 20 | _ _ 21 | ( | ) 22 | V V 23 | 24 | 25 | 26 | 27 | 28 | 29 | _ _ 30 | _| || |_ 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 | | (_> < 61 | \___/\/ 62 | 63 | 64 | 65 | _ 66 | ( ) 67 | |/ 68 | 69 | 70 | 71 | 72 | 73 | 74 | __ 75 | / / 76 | | | 77 | | | 78 | | | 79 | | | 80 | \_\ 81 | 82 | 83 | __ 84 | \ \ 85 | | | 86 | | | 87 | | | 88 | | | 89 | /_/ 90 | 91 | 92 | _ 93 | /\| |/\ 94 | \ ` ' / 95 | |_ _| 96 | / , . \ 97 | \/|_|\/ 98 | 99 | 100 | 101 | 102 | _ 103 | _| |_ 104 | |_ _| 105 | |_| 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | _ 115 | ( ) 116 | |/ 117 | 118 | 119 | 120 | 121 | ______ 122 | |______| 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | _ 133 | (_) 134 | 135 | 136 | 137 | __ 138 | / / 139 | / / 140 | / / 141 | / / 142 | /_/ 143 | 144 | 145 | 146 | 147 | ___ 148 | / _ \ 149 | | | | | 150 | | |_| | 151 | \___/ 152 | 153 | 154 | 155 | 156 | _ 157 | / | 158 | | | 159 | | | 160 | |_| 161 | 162 | 163 | 164 | 165 | ____ 166 | |___ \ 167 | __) | 168 | / __/ 169 | |_____| 170 | 171 | 172 | 173 | 174 | _____ 175 | |___ / 176 | |_ \ 177 | ___) | 178 | |____/ 179 | 180 | 181 | 182 | 183 | _ _ 184 | | || | 185 | | || |_ 186 | |__ _| 187 | |_| 188 | 189 | 190 | 191 | 192 | ____ 193 | | ___| 194 | |___ \ 195 | __) | 196 | |____/ 197 | 198 | 199 | 200 | 201 | __ 202 | / / 203 | | '_ \ 204 | | (_) | 205 | \___/ 206 | 207 | 208 | 209 | 210 | _____ 211 | |___ | 212 | / / 213 | / / 214 | /_/ 215 | 216 | 217 | 218 | 219 | ___ 220 | ( _ ) 221 | / _ \ 222 | | (_) | 223 | \___/ 224 | 225 | 226 | 227 | 228 | ___ 229 | / _ \ 230 | | (_) | 231 | \__, | 232 | / / 233 | /_/ 234 | 235 | 236 | 237 | _ 238 | (_) 239 | 240 | _ 241 | (_) 242 | 243 | 244 | 245 | 246 | _ 247 | (_) 248 | 249 | _ 250 | ( ) 251 | |/ 252 | 253 | 254 | __ 255 | / / 256 | / / 257 | < < 258 | \ \ 259 | \_\ 260 | 261 | 262 | 263 | 264 | ______ 265 | |______| 266 | ______ 267 | |______| 268 | 269 | 270 | 271 | 272 | __ 273 | \ \ 274 | \ \ 275 | > > 276 | / / 277 | /_/ 278 | 279 | 280 | 281 | ___ 282 | |__ \ 283 | ) | 284 | / / 285 | |_| 286 | (_) 287 | 288 | 289 | 290 | 291 | ____ 292 | / __ \ 293 | / / _` | 294 | | | (_| | 295 | \ \__,_| 296 | \____/ 297 | 298 | 299 | 300 | /\ 301 | / \ 302 | / /\ \ 303 | / ____ \ 304 | /_/ \_\ 305 | 306 | 307 | 308 | ____ 309 | | _ \ 310 | | |_) | 311 | | _ < 312 | | |_) | 313 | |____/ 314 | 315 | 316 | 317 | _____ 318 | / ____| 319 | | | 320 | | | 321 | | |____ 322 | \_____| 323 | 324 | 325 | 326 | _____ 327 | | __ \ 328 | | | | | 329 | | | | | 330 | | |__| | 331 | |_____/ 332 | 333 | 334 | 335 | ______ 336 | | ____| 337 | | |__ 338 | | __| 339 | | |____ 340 | |______| 341 | 342 | 343 | 344 | ______ 345 | | ____| 346 | | |__ 347 | | __| 348 | | | 349 | |_| 350 | 351 | 352 | 353 | _____ 354 | / ____| 355 | | | __ 356 | | | |_ | 357 | | |__| | 358 | \_____| 359 | 360 | 361 | 362 | _ _ 363 | | | | | 364 | | |__| | 365 | | __ | 366 | | | | | 367 | |_| |_| 368 | 369 | 370 | 371 | _____ 372 | |_ _| 373 | | | 374 | | | 375 | _| |_ 376 | |_____| 377 | 378 | 379 | 380 | _ 381 | | | 382 | | | 383 | _ | | 384 | | |__| | 385 | \____/ 386 | 387 | 388 | 389 | _ __ 390 | | |/ / 391 | | ' / 392 | | < 393 | | . \ 394 | |_|\_\ 395 | 396 | 397 | 398 | _ 399 | | | 400 | | | 401 | | | 402 | | |____ 403 | |______| 404 | 405 | 406 | 407 | __ __ 408 | | \/ | 409 | | \ / | 410 | | |\/| | 411 | | | | | 412 | |_| |_| 413 | 414 | 415 | 416 | _ _ 417 | | \ | | 418 | | \| | 419 | | . ` | 420 | | |\ | 421 | |_| \_| 422 | 423 | 424 | 425 | ____ 426 | / __ \ 427 | | | | | 428 | | | | | 429 | | |__| | 430 | \____/ 431 | 432 | 433 | 434 | _____ 435 | | __ \ 436 | | |__) | 437 | | ___/ 438 | | | 439 | |_| 440 | 441 | 442 | 443 | ____ 444 | / __ \ 445 | | | | | 446 | | | | | 447 | | |__| | 448 | \___\_\ 449 | 450 | 451 | 452 | _____ 453 | | __ \ 454 | | |__) | 455 | | _ / 456 | | | \ \ 457 | |_| \_\ 458 | 459 | 460 | 461 | _____ 462 | / ____| 463 | | (___ 464 | \___ \ 465 | ____) | 466 | |_____/ 467 | 468 | 469 | 470 | _______ 471 | |__ __| 472 | | | 473 | | | 474 | | | 475 | |_| 476 | 477 | 478 | 479 | _ _ 480 | | | | | 481 | | | | | 482 | | | | | 483 | | |__| | 484 | \____/ 485 | 486 | 487 | 488 | __ __ 489 | \ \ / / 490 | \ \ / / 491 | \ \/ / 492 | \ / 493 | \/ 494 | 495 | 496 | 497 | __ __ 498 | \ \ / / 499 | \ \ /\ / / 500 | \ \/ \/ / 501 | \ /\ / 502 | \/ \/ 503 | 504 | 505 | 506 | __ __ 507 | \ \ / / 508 | \ V / 509 | > < 510 | / . \ 511 | /_/ \_\ 512 | 513 | 514 | 515 | __ __ 516 | \ \ / / 517 | \ \_/ / 518 | \ / 519 | | | 520 | |_| 521 | 522 | 523 | 524 | ______ 525 | |___ / 526 | / / 527 | / / 528 | / /__ 529 | /_____| 530 | 531 | 532 | 533 | ___ 534 | | _| 535 | | | 536 | | | 537 | | | 538 | | |_ 539 | |___| 540 | 541 | 542 | __ 543 | \ \ 544 | \ \ 545 | \ \ 546 | \ \ 547 | \_\ 548 | 549 | 550 | 551 | ___ 552 | |_ | 553 | | | 554 | | | 555 | | | 556 | _| | 557 | |___| 558 | 559 | 560 | /\ 561 | |/\| 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | ______ 576 | |______| 577 | 578 | _ 579 | ( ) 580 | \| 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | __ _ 590 | / _` | 591 | | (_| | 592 | \__,_| 593 | 594 | 595 | 596 | _ 597 | | | 598 | | |__ 599 | | '_ \ 600 | | |_) | 601 | |_.__/ 602 | 603 | 604 | 605 | 606 | 607 | ___ 608 | / __| 609 | | (__ 610 | \___| 611 | 612 | 613 | 614 | _ 615 | | | 616 | __| | 617 | / _` | 618 | | (_| | 619 | \__,_| 620 | 621 | 622 | 623 | 624 | 625 | ___ 626 | / _ \ 627 | | __/ 628 | \___| 629 | 630 | 631 | 632 | __ 633 | / _| 634 | | |_ 635 | | _| 636 | | | 637 | |_| 638 | 639 | 640 | 641 | 642 | 643 | __ _ 644 | / _` | 645 | | (_| | 646 | \__, | 647 | __/ | 648 | |___/ 649 | 650 | _ 651 | | | 652 | | |__ 653 | | _ \ 654 | | | | | 655 | |_| |_| 656 | 657 | 658 | 659 | _ 660 | (_) 661 | _ 662 | | | 663 | | | 664 | |_| 665 | 666 | 667 | 668 | _ 669 | (_) 670 | _ 671 | | | 672 | | | 673 | | | 674 | _/ | 675 | |__/ 676 | 677 | 678 | _ 679 | | | _ 680 | | |/ / 681 | | < 682 | |_|\_\ 683 | 684 | 685 | 686 | _ 687 | | | 688 | | | 689 | | | 690 | | | 691 | |_| 692 | 693 | 694 | 695 | 696 | 697 | _ __ ___ 698 | | '_ ` _ \ 699 | | | | | | | 700 | |_| |_| |_| 701 | 702 | 703 | 704 | 705 | 706 | _ __ 707 | | '_ \ 708 | | | | | 709 | |_| |_| 710 | 711 | 712 | 713 | 714 | 715 | ___ 716 | / _ \ 717 | | (_) | 718 | \___/ 719 | 720 | 721 | 722 | 723 | 724 | _ __ 725 | | '_ \ 726 | | |_) | 727 | | .__/ 728 | | | 729 | |_| 730 | 731 | 732 | 733 | __ _ 734 | / _` | 735 | | (_| | 736 | \__, | 737 | | | 738 | |_| 739 | 740 | 741 | 742 | _ __ 743 | | '__| 744 | | | 745 | |_| 746 | 747 | 748 | 749 | 750 | 751 | ___ 752 | / __| 753 | \__ \ 754 | |___/ 755 | 756 | 757 | 758 | _ 759 | | | 760 | | |_ 761 | | __| 762 | \ |_ 763 | \__| 764 | 765 | 766 | 767 | 768 | 769 | _ _ 770 | | | | | 771 | | |_| | 772 | \__,_| 773 | 774 | 775 | 776 | 777 | 778 | __ __ 779 | \ \ / / 780 | \ V / 781 | \_/ 782 | 783 | 784 | 785 | 786 | 787 | __ __ 788 | \ \ /\ / / 789 | \ V V / 790 | \_/\_/ 791 | 792 | 793 | 794 | 795 | 796 | __ __ 797 | \ \/ / 798 | > < 799 | /_/\_\ 800 | 801 | 802 | 803 | 804 | 805 | _ _ 806 | | | | | 807 | | |_| | 808 | \__, | 809 | __/ / 810 | |___/ 811 | 812 | 813 | 814 | ____ 815 | |_ / 816 | / / 817 | /___| 818 | 819 | 820 | 821 | __ 822 | / / 823 | | | 824 | / / 825 | \ \ 826 | | | 827 | \_\ 828 | 829 | 830 | _ 831 | | | 832 | | | 833 | | | 834 | | | 835 | | | 836 | | | 837 | |_| 838 | 839 | __ 840 | \ \ 841 | | | 842 | \ \ 843 | / / 844 | | | 845 | /_/ 846 | 847 | 848 | /\/| 849 | |/\/ 850 | 851 | 852 | 853 | 854 | 855 | 856 | -------------------------------------------------------------------------------- /banners/shadow.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | _| 13 | _| 14 | _| 15 | 16 | _| 17 | 18 | 19 | 20 | _| _| 21 | _| _| 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | _| _| 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 | _| _| 61 | _|_| _| 62 | 63 | 64 | 65 | _| 66 | _| 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | _| 75 | _| 76 | _| 77 | _| 78 | _| 79 | _| 80 | _| 81 | 82 | 83 | _| 84 | _| 85 | _| 86 | _| 87 | _| 88 | _| 89 | _| 90 | 91 | 92 | 93 | _| _| _| 94 | _|_|_| 95 | _|_|_|_|_| 96 | _|_|_| 97 | _| _| _| 98 | 99 | 100 | 101 | 102 | _| 103 | _| 104 | _|_|_|_|_| 105 | _| 106 | _| 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | _| 116 | _| 117 | 118 | 119 | 120 | 121 | 122 | _|_|_|_|_| 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | _| 134 | 135 | 136 | 137 | 138 | _| 139 | _| 140 | _| 141 | _| 142 | _| 143 | 144 | 145 | 146 | 147 | _| 148 | _| _| 149 | _| _| 150 | _| _| 151 | _| 152 | 153 | 154 | 155 | 156 | _| 157 | _|_| 158 | _| 159 | _| 160 | _| 161 | 162 | 163 | 164 | 165 | _|_| 166 | _| _| 167 | _| 168 | _| 169 | _|_|_|_| 170 | 171 | 172 | 173 | 174 | _|_|_| 175 | _| 176 | _|_| 177 | _| 178 | _|_|_| 179 | 180 | 181 | 182 | 183 | _| _| 184 | _| _| 185 | _|_|_|_| 186 | _| 187 | _| 188 | 189 | 190 | 191 | 192 | _|_|_|_| 193 | _| 194 | _|_|_| 195 | _| 196 | _|_|_| 197 | 198 | 199 | 200 | 201 | _|_|_| 202 | _| 203 | _|_|_| 204 | _| _| 205 | _|_| 206 | 207 | 208 | 209 | 210 | _|_|_|_|_| 211 | _| 212 | _| 213 | _| 214 | _| 215 | 216 | 217 | 218 | 219 | _|_| 220 | _| _| 221 | _|_| 222 | _| _| 223 | _|_| 224 | 225 | 226 | 227 | 228 | _|_| 229 | _| _| 230 | _|_|_| 231 | _| 232 | _|_|_| 233 | 234 | 235 | 236 | 237 | 238 | _| 239 | 240 | 241 | _| 242 | 243 | 244 | 245 | 246 | 247 | _| 248 | 249 | 250 | _| 251 | _| 252 | 253 | 254 | 255 | _| 256 | _| 257 | _| 258 | _| 259 | _| 260 | 261 | 262 | 263 | 264 | 265 | _|_|_|_|_| 266 | 267 | _|_|_|_|_| 268 | 269 | 270 | 271 | 272 | 273 | _| 274 | _| 275 | _| 276 | _| 277 | _| 278 | 279 | 280 | 281 | 282 | _|_| 283 | _| 284 | _|_| 285 | 286 | _| 287 | 288 | 289 | 290 | 291 | _|_|_|_|_| 292 | _| _| 293 | _| _|_|_| _| 294 | _| _| _| _| 295 | _| _|_|_|_| 296 | _| 297 | _|_|_|_|_|_| 298 | 299 | 300 | _|_| 301 | _| _| 302 | _|_|_|_| 303 | _| _| 304 | _| _| 305 | 306 | 307 | 308 | 309 | _|_|_| 310 | _| _| 311 | _|_|_| 312 | _| _| 313 | _|_|_| 314 | 315 | 316 | 317 | 318 | _|_|_| 319 | _| 320 | _| 321 | _| 322 | _|_|_| 323 | 324 | 325 | 326 | 327 | _|_|_| 328 | _| _| 329 | _| _| 330 | _| _| 331 | _|_|_| 332 | 333 | 334 | 335 | 336 | _|_|_|_| 337 | _| 338 | _|_|_| 339 | _| 340 | _|_|_|_| 341 | 342 | 343 | 344 | 345 | _|_|_|_| 346 | _| 347 | _|_|_| 348 | _| 349 | _| 350 | 351 | 352 | 353 | 354 | _|_|_| 355 | _| 356 | _| _|_| 357 | _| _| 358 | _|_|_| 359 | 360 | 361 | 362 | 363 | _| _| 364 | _| _| 365 | _|_|_|_| 366 | _| _| 367 | _| _| 368 | 369 | 370 | 371 | 372 | _|_|_| 373 | _| 374 | _| 375 | _| 376 | _|_|_| 377 | 378 | 379 | 380 | 381 | _| 382 | _| 383 | _| 384 | _| _| 385 | _|_| 386 | 387 | 388 | 389 | 390 | _| _| 391 | _| _| 392 | _|_| 393 | _| _| 394 | _| _| 395 | 396 | 397 | 398 | 399 | _| 400 | _| 401 | _| 402 | _| 403 | _|_|_|_| 404 | 405 | 406 | 407 | 408 | _| _| 409 | _|_| _|_| 410 | _| _| _| 411 | _| _| 412 | _| _| 413 | 414 | 415 | 416 | 417 | _| _| 418 | _|_| _| 419 | _| _| _| 420 | _| _|_| 421 | _| _| 422 | 423 | 424 | 425 | 426 | _|_| 427 | _| _| 428 | _| _| 429 | _| _| 430 | _|_| 431 | 432 | 433 | 434 | 435 | _|_|_| 436 | _| _| 437 | _|_|_| 438 | _| 439 | _| 440 | 441 | 442 | 443 | 444 | _|_| 445 | _| _| 446 | _| _|_| 447 | _| _| 448 | _|_| _| 449 | 450 | 451 | 452 | 453 | _|_|_| 454 | _| _| 455 | _|_|_| 456 | _| _| 457 | _| _| 458 | 459 | 460 | 461 | 462 | _|_|_| 463 | _| 464 | _|_| 465 | _| 466 | _|_|_| 467 | 468 | 469 | 470 | 471 | _|_|_|_|_| 472 | _| 473 | _| 474 | _| 475 | _| 476 | 477 | 478 | 479 | 480 | _| _| 481 | _| _| 482 | _| _| 483 | _| _| 484 | _|_| 485 | 486 | 487 | 488 | 489 | _| _| 490 | _| _| 491 | _| _| 492 | _| _| 493 | _| 494 | 495 | 496 | 497 | 498 | _| _| 499 | _| _| 500 | _| _| _| 501 | _| _| _| 502 | _| _| 503 | 504 | 505 | 506 | 507 | _| _| 508 | _| _| 509 | _| 510 | _| _| 511 | _| _| 512 | 513 | 514 | 515 | 516 | _| _| 517 | _| _| 518 | _| 519 | _| 520 | _| 521 | 522 | 523 | 524 | 525 | _|_|_|_|_| 526 | _| 527 | _| 528 | _| 529 | _|_|_|_|_| 530 | 531 | 532 | 533 | _|_| 534 | _| 535 | _| 536 | _| 537 | _| 538 | _| 539 | _|_| 540 | 541 | 542 | 543 | _| 544 | _| 545 | _| 546 | _| 547 | _| 548 | 549 | 550 | 551 | _|_| 552 | _| 553 | _| 554 | _| 555 | _| 556 | _| 557 | _|_| 558 | 559 | 560 | _| 561 | _| _| 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | _|_|_|_|_| 577 | 578 | _| 579 | _| 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | _|_|_| 590 | _| _| 591 | _| _| 592 | _|_|_| 593 | 594 | 595 | 596 | 597 | _| 598 | _|_|_| 599 | _| _| 600 | _| _| 601 | _|_|_| 602 | 603 | 604 | 605 | 606 | 607 | _|_|_| 608 | _| 609 | _| 610 | _|_|_| 611 | 612 | 613 | 614 | 615 | _| 616 | _|_|_| 617 | _| _| 618 | _| _| 619 | _|_|_| 620 | 621 | 622 | 623 | 624 | 625 | _|_| 626 | _|_|_|_| 627 | _| 628 | _|_|_| 629 | 630 | 631 | 632 | 633 | _|_| 634 | _| 635 | _|_|_|_| 636 | _| 637 | _| 638 | 639 | 640 | 641 | 642 | 643 | _|_|_| 644 | _| _| 645 | _| _| 646 | _|_|_| 647 | _| 648 | _|_| 649 | 650 | 651 | _| 652 | _|_|_| 653 | _| _| 654 | _| _| 655 | _| _| 656 | 657 | 658 | 659 | 660 | _| 661 | 662 | _| 663 | _| 664 | _| 665 | 666 | 667 | 668 | 669 | _| 670 | 671 | _| 672 | _| 673 | _| 674 | _| 675 | _| 676 | 677 | 678 | _| 679 | _| _| 680 | _|_| 681 | _| _| 682 | _| _| 683 | 684 | 685 | 686 | 687 | _| 688 | _| 689 | _| 690 | _| 691 | _| 692 | 693 | 694 | 695 | 696 | 697 | _|_|_| _|_| 698 | _| _| _| 699 | _| _| _| 700 | _| _| _| 701 | 702 | 703 | 704 | 705 | 706 | _|_|_| 707 | _| _| 708 | _| _| 709 | _| _| 710 | 711 | 712 | 713 | 714 | 715 | _|_| 716 | _| _| 717 | _| _| 718 | _|_| 719 | 720 | 721 | 722 | 723 | 724 | _|_|_| 725 | _| _| 726 | _| _| 727 | _|_|_| 728 | _| 729 | _| 730 | 731 | 732 | 733 | _|_|_| 734 | _| _| 735 | _| _| 736 | _|_|_| 737 | _| 738 | _| 739 | 740 | 741 | 742 | _| _|_| 743 | _|_| 744 | _| 745 | _| 746 | 747 | 748 | 749 | 750 | 751 | _|_|_| 752 | _|_| 753 | _|_| 754 | _|_|_| 755 | 756 | 757 | 758 | 759 | _| 760 | _|_|_|_| 761 | _| 762 | _| 763 | _|_| 764 | 765 | 766 | 767 | 768 | 769 | _| _| 770 | _| _| 771 | _| _| 772 | _|_|_| 773 | 774 | 775 | 776 | 777 | 778 | _| _| 779 | _| _| 780 | _| _| 781 | _| 782 | 783 | 784 | 785 | 786 | 787 | _| _| _| 788 | _| _| _| 789 | _| _| _| _| 790 | _| _| 791 | 792 | 793 | 794 | 795 | 796 | _| _| 797 | _|_| 798 | _| _| 799 | _| _| 800 | 801 | 802 | 803 | 804 | 805 | _| _| 806 | _| _| 807 | _| _| 808 | _|_|_| 809 | _| 810 | _|_| 811 | 812 | 813 | 814 | _|_|_|_| 815 | _| 816 | _| 817 | _|_|_|_| 818 | 819 | 820 | 821 | _| 822 | _| 823 | _| 824 | _| 825 | _| 826 | _| 827 | _| 828 | 829 | 830 | _| 831 | _| 832 | _| 833 | _| 834 | _| 835 | _| 836 | _| 837 | _| 838 | 839 | _| 840 | _| 841 | _| 842 | _| 843 | _| 844 | _| 845 | _| 846 | 847 | 848 | _| _| 849 | _| _| 850 | 851 | 852 | 853 | 854 | 855 | 856 | --------------------------------------------------------------------------------