├── .github └── workflows │ ├── release.yaml │ └── test-snap-can-build.yml ├── .gitignore ├── .goreleaser.yaml ├── Dockerfile ├── LICENSE ├── README.md ├── animation.go ├── animation_test.go ├── animations └── pedro.animation ├── colors.go ├── draw.go ├── go.mod ├── go.sum ├── inventory.go ├── main.go ├── parrot-file-demo.gif └── snap └── snapcraft.yaml /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | name: goreleaser 2 | 3 | on: 4 | push: 5 | tags: 6 | - '*' 7 | 8 | permissions: 9 | contents: write 10 | 11 | jobs: 12 | goreleaser: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout 16 | uses: actions/checkout@v4 17 | with: 18 | fetch-depth: 0 19 | - name: Set up Go 20 | uses: actions/setup-go@v5 21 | - name: Run GoReleaser 22 | uses: goreleaser/goreleaser-action@v6 23 | with: 24 | distribution: goreleaser 25 | version: '~> v2' 26 | args: release --clean 27 | env: 28 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 29 | -------------------------------------------------------------------------------- /.github/workflows/test-snap-can-build.yml: -------------------------------------------------------------------------------- 1 | name: 🧪 Snap Builds 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | 16 | - uses: snapcore/action-build@v1 17 | id: build 18 | 19 | - uses: diddlesnaps/snapcraft-review-action@v1 20 | with: 21 | snap: ${{ steps.build.outputs.snap }} 22 | isClassic: 'false' 23 | # Plugs and Slots declarations to override default denial (requires store assertion to publish) 24 | # plugs: ./plug-declaration.json 25 | # slots: ./slot-declaration.json 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # gitginore template for creating Snap packages 2 | # website: https://snapcraft.io/ 3 | 4 | parts/ 5 | prime/ 6 | stage/ 7 | *.snap 8 | 9 | # Snapcraft global state tracking data(automatically generated) 10 | # https://forum.snapcraft.io/t/location-to-save-global-state/768 11 | /snap/.snapcraft/ 12 | 13 | # Source archive packed by `snapcraft cleanbuild` before pushing to the LXD container 14 | /*_source.tar.bz2 15 | -------------------------------------------------------------------------------- /.goreleaser.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://goreleaser.com/static/schema.json 2 | # vim: set ts=2 sw=2 tw=0 fo=cnqoj 3 | version: 2 4 | 5 | before: 6 | hooks: 7 | - go mod tidy 8 | 9 | builds: 10 | - id: terminal-parrot 11 | binary: terminal-parrot 12 | goarch: 13 | - amd64 14 | - arm64 15 | 16 | archives: 17 | - format: tar.gz 18 | # this name template makes the OS and Arch compatible with the results of `uname`. 19 | name_template: >- 20 | {{ .ProjectName }}_ 21 | {{- title .Os }}_ 22 | {{- if eq .Arch "amd64" }}x86_64 23 | {{- else if eq .Arch "386" }}i386 24 | {{- else }}{{ .Arch }}{{ end }} 25 | {{- if .Arm }}v{{ .Arm }}{{ end }} 26 | # use zip for windows archives 27 | format_overrides: 28 | - goos: windows 29 | format: zip 30 | files: 31 | - LICENSE 32 | - animations/* 33 | - snap/* 34 | 35 | changelog: 36 | sort: asc 37 | filters: 38 | exclude: 39 | - "^docs:" 40 | - "^test:" 41 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM golang:alpine 2 | WORKDIR /project 3 | RUN apk update && apk add --no-cache git 4 | COPY go.* ./ 5 | RUN go mod download 6 | COPY *.go ./ 7 | RUN CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o parrot . 8 | 9 | FROM scratch 10 | COPY --from=0 /project/parrot /parrot 11 | COPY animations/ /etc/terminal-parrot 12 | ENTRYPOINT ["/parrot"] 13 | 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 John Hobbs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![terminal-parrot](https://snapcraft.io/terminal-parrot/badge.svg)](https://snapcraft.io/terminal-parrot) [![🧪 Snap Builds](https://github.com/kz6fittycent/terminal-parrot/actions/workflows/test-snap-can-build.yml/badge.svg)](https://github.com/kz6fittycent/terminal-parrot/actions/workflows/test-snap-can-build.yml) 2 | 3 | # :parrot: for your terminal 4 | 5 | ![demo](http://dropit.velvetcache.org.s3.amazonaws.com/jmhobbs/NzczFOYq4g/termbox-parrot-color.gif) 6 | 7 | ## Installing 8 | 9 | Either grab a build on the [releases page](https://github.com/jmhobbs/terminal-parrot/releases) or clone and run... 10 | 11 | ```bash 12 | $ go get -u github.com/jmhobbs/terminal-parrot 13 | $ terminal-parrot 14 | ``` 15 | 16 | ### Nix 17 | 18 | #### nix-env 19 | 20 | ```bash 21 | nix-env -i terminal-parrot 22 | ``` 23 | 24 | #### nix-profile 25 | 26 | ```bash 27 | nix profile install nixpkgs#terminal-parrot 28 | ``` 29 | 30 | ### Homebrew 31 | 32 | There is a tap for this as well, it's `jmhobbs/parrot` 33 | 34 | brew tap jmhobbs/parrot 35 | brew install terminal-parrot 36 | 37 | ### Snap Install 38 | 39 | ```$ sudo snap install terminal-parrot``` 40 | 41 | The command will be installed as `parrot`, rather than `terminal-parrot`. 42 | 43 | ### Snap Install 44 | 45 | ```$ sudo snap install terminal-parrot``` 46 | 47 | ### Docker 48 | 49 | The image is available on [docker hub](https://hub.docker.com/r/jmhobbs/terminal-parrot/) 50 | 51 | docker pull jmhobbs/terminal-parrot 52 | docker run -it --rm jmhobbs/terminal-parrot:latest 53 | 54 | You can also build a docker image locally and run it in a container with... 55 | 56 | docker build -t partyparrot ./ 57 | docker run -it --rm partyparrot (-args) 58 | 59 | ### Quitting 60 | 61 | Hit the escape or "q" key to quit. 62 | 63 | ### -loops 64 | 65 | You can limit your parrots enthusiasm with the `-loops` flag. 66 | 67 | ### :fastparrot: 68 | 69 | Set the frame delay with the `-delay` flag (defaults to 75, use 25 for :fastparrot:) 70 | 71 | ### :aussieparrot: 72 | 73 | Use `-orientation aussie` for our friends down under. 74 | 75 | ## Adding Animations 76 | 77 | You can add additional animations without re-compiling by adding a plain text file somewhere on the path (by default `/etc/terminal-parrot` or `/opt/homebrew/etc/terminal-parrot`). 78 | 79 | This file should contain the frames, separated by lines containing `!--FRAME--!`. The filename must end with `.animation`. 80 | 81 | The first segment of the file is reserved for metadata, which is key-value pairs separated by `:`. 82 | 83 | For example, the following file, named `test.animation` would add a new animation called `test`: 84 | 85 | ``` 86 | description: A test animation! 87 | !--FRAME--! 88 | [ Frame One ] 89 | !--FRAME--! 90 | [ Frame Two ] 91 | !--FRAME--! 92 | [ Frame Three ] 93 | ``` 94 | 95 | Then you can run `terminal-parrot test` to see your new animation (assuming it's on the path). 96 | 97 | ![Demo of custom animations](parrot-file-demo.gif) 98 | 99 | ## Thanks 100 | 101 | Idea from seeing [this tweet from @rachsmithtweets](https://twitter.com/rachsmithtweets/status/742785722290212868) 102 | 103 | Thanks to [termbox-go](https://github.com/nsf/termbox-go) for making it easy. 104 | 105 | Thanks to [jp2a](https://csl.name/jp2a/) for nice ASCII art conversion. 106 | 107 | Thanks to [erinking](https://github.com/erinking) for [fixing colors and animation frames](https://github.com/jmhobbs/terminal-parrot/pull/15) 108 | 109 | Thanks to [pdevine](https://github.com/pdevine) for the [Dockerfile](https://github.com/jmhobbs/terminal-parrot/pull/12) (and [robbyoconnor](https://github.com/robbyoconnor) for reviving the PR I let go stale) 110 | -------------------------------------------------------------------------------- /animation.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | _ "embed" 6 | "fmt" 7 | "os" 8 | "strings" 9 | ) 10 | 11 | type Animation struct { 12 | Metadata map[string]string 13 | Frames [][]byte 14 | } 15 | 16 | func LoadFromFile(file string) (*Animation, error) { 17 | b, err := os.ReadFile(file) 18 | if err != nil { 19 | return nil, err 20 | } 21 | 22 | return LoadFromBytes(b) 23 | } 24 | 25 | func LoadFromBytes(b []byte) (*Animation, error) { 26 | frames := bytes.Split(b, []byte("!--FRAME--!\n")) 27 | 28 | if len(frames) <= 2 { 29 | return nil, fmt.Errorf("no frames found") 30 | } 31 | 32 | // The first "frame" is actually the metadata. 33 | metadata := make(map[string]string) 34 | for _, line := range bytes.Split(frames[0], []byte{'\n'}) { 35 | parts := bytes.SplitN(line, []byte{':'}, 2) 36 | if len(parts) != 2 { 37 | continue 38 | } 39 | metadata[strings.TrimSpace(string(parts[0]))] = strings.TrimSpace(string(parts[1])) 40 | } 41 | 42 | for i, frame := range frames[1:] { 43 | if len(frame) == 0 { 44 | return nil, fmt.Errorf("invalid animation: frame %d is empty", i) 45 | } 46 | } 47 | 48 | return &Animation{metadata, frames[1:]}, nil 49 | } 50 | -------------------------------------------------------------------------------- /animation_test.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "testing" 4 | 5 | func Test_LoadFromFile(t *testing.T) { 6 | a, err := LoadFromFile("parrot") 7 | if err != nil { 8 | t.Fatal(err) 9 | } 10 | 11 | if len(a.Frames) != 10 { 12 | for _, frame := range a.Frames { 13 | t.Log(string(frame)) 14 | } 15 | t.Fatalf("expected 10 frames, got %d", len(a.Frames)) 16 | } 17 | } 18 | 19 | func Test_LoadFromBytes(t *testing.T) { 20 | t.Run("invalid: no frames", func(t *testing.T) { 21 | _, err := LoadFromBytes([]byte{}) 22 | if err == nil { 23 | t.Fatal("expected error, got nil") 24 | } 25 | }) 26 | 27 | t.Run("invalid: one frame", func(t *testing.T) { 28 | _, err := LoadFromBytes([]byte("frame")) 29 | if err == nil { 30 | t.Fatal("expected error, got nil") 31 | } 32 | }) 33 | 34 | t.Run("invalid: empty frame", func(t *testing.T) { 35 | _, err := LoadFromBytes([]byte("!--FRAME--!\n")) 36 | if err == nil { 37 | t.Fatal("expected error, got nil") 38 | } 39 | }) 40 | 41 | t.Run("valid", func(t *testing.T) { 42 | a, err := LoadFromBytes([]byte("A\n!--FRAME--!\nB\n")) 43 | if err != nil { 44 | t.Fatal(err) 45 | } 46 | 47 | if len(a.Frames) != 2 { 48 | t.Fatalf("expected 2 frames, got %d", len(a.Frames)) 49 | } 50 | }) 51 | } 52 | -------------------------------------------------------------------------------- /animations/pedro.animation: -------------------------------------------------------------------------------- 1 | description: Pedro the raccoon 2 | !--FRAME--! 3 | &&&&&&&&&&&& 4 | ................ &&&&&&&&&&&&&&&&&&&&&&&&&& ................ 5 | ............. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ............. 6 | .......... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .......... 7 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ........ 8 | ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ....... 9 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..... 10 | .... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 11 | ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 12 | .. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. 13 | . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 14 | &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 15 | &&&&&&&&&&&&&&&&&&& + . : &&&& . :+ X&&&&&&&&&&&&&&&&+ 16 | &&&&&&&&&&&&&&&&&& ;++ . . &&&&&&&&&&&&& 17 | &&&&&&&&&&&&&&&&&&& : ; ++;. .::.:: .+ . ; &&&&&&&&&& 18 | &&&&&&&&&&&&&&&&&&& ..:..::...::. : . . . . &&&&&&&&& 19 | &&&&&&&&&&&&&&&&&&&& ; . .:: . :.;. ;+ x &; . ;: +&&&&&&& 20 | &&&&&&&&&&&&&&&&&&&&$$ ;:. ..+: $&&&xx&&&&&&&; :;& &&&&&& 21 | &&&&&&&&&&&&&&&&&&&& : ;. . X&&&&+&&&& &&&& : &&& .&&&&& 22 | &&&&&&&&&&&&&&&&&&+ : & + &X+&X$&x &;&&$ &&&&&& &&&& 23 | &&&&&&&&&&&&&&&&&& x& &&&&.& X&& . ;xX; && && &&&& 24 | &&&&&&&&&&&&&&& ;Xx+$ &&&&&&&&&x&+ .:: .: ++: &&&&&& 25 | &&&&&&&&&&&&&& +$. +. &x X&x ..XX. &&& : :+. ::X &&&&&& 26 | &&&&&&&&&&&&&&. +&&&&&& &&&. . ;. ; :$;;;$ X.:X. .;+&: :&&; &&& 27 | &&&&&&&&&&&&$ .+ +X&& ..:; : ; ;. x :.& : && 28 | &&&&&&&&&&& X. :; +. .:..x..::; ::. + + ; :& & 29 | &&&&&&&&&&&. +X : + x ; x ::+: : : ; . &&&&&&&.;+xx$&&; 30 | . &&&&&&&&&&X :..:: . ; + : + :;::XX: &&&&&&&&&&: &&X && . 31 | . &&&&&&&&xx +. ..:: ;.:... . :&&&&&&&&&&& :: & : 32 | . . && +&x$ :+. ;::;.. ; ;: &&&&&&&&&&&& . +x& . 33 | . .: &+ x++X.; . .X ++$$&&&&&&&&X&&$&&&&&& ; . ; . 34 | .. ... $.$.& x.:++++.x.+; $&&x &&&&&&&&&&&&&&$&&&X .& . . 35 | .. . . . &&X+; . : .x: &&$ :&&&&+&x.:X && . ; .: 36 | ... : ;&x;XX .. .;;.;x X + &&&&&&&&&&&&& : .: . 37 | .. .. .x+:..: ; .: + X&&&&&x :. .. 38 | .. . . . .. ..: $X+Xx:: :.;.:.x ;;: . . . ...... : 39 | : . .... . . ::X;x&&&&&&&X&&&&&&.. . . . .. ... : 40 | !--FRAME--! 41 | &&&&&&&&&&&&&& 42 | ................ &&&&&&&&&&&&&&&&&&&&&&&&&& ............... 43 | ............. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ............. 44 | .......... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .......... 45 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ........ 46 | ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... 47 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..... 48 | .... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 49 | ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 50 | . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. 51 | . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & &&&&&&&&&&&&&&&&&&&&&&&&& 52 | &&&&&&&&&&&&&&&&&&&&&&& &&&&&&& & &.&&&&&&&&&&&&&&&& 53 | &&&&&&&&&&&&&&&&& X . : .&&&&&&&&&&&&& 54 | &&&&&&&&&&&&&&&&&+ . :.. :.. &&&&&&&&&&& 55 | &&&&&&&&&&&&&&&&&& + : :: .+&;&&&&; &&; &&&&&&&&&&& 56 | &&&&&&&&&&&&&&&&&&& .: ;:: :;&&&&+ &&&&& &&&& &&&&&&&&& 57 | &&&&& &&&&&&&&&&&& : . &&&$ x && ;; &&&&&x &&&&&&&& 58 | &&&&&& &&&& &&&&X . & x &&&& .; && $& &&&&&&&& 59 | &&&&&& &&&; &&& :; $&&&x&&x ;.x + : & X & & .&;&&&&&&& 60 | &&&&&&& &&& && . X&&&&&&& : $. x& : ++ $ x &$+&&&$&&&&&& 61 | &&&&&&& &&& ; ;: x&; X. &x : +. .;.: ; . +.: ;; &&&&&&& 62 | &&&&&&& &&& ;& $&&&&&& ; . +:. ++ X &:&&X&& &&&&& 63 | &&& $& & &$& :: .+ +$:. .: &&&&&&&&X &&;. &&X &&&& 64 | & ;x :& &X+ : ; ...;+::+.+; &&&&&&&&& &&& &&& 65 | ; x.; : && .:. .; :..+ &&&&&&&&&& + .. &&&&x&&& 66 | : ;; ;:.: .;; &x .. .. .: :;x;.;&&x+ .+&&&&&&&&&& : &&&&+ && 67 | .. XX;; :.. x . x.::.::.+.xX x&&&&&&&&&&&&&&&&&x : ; &&&&&&&& 68 | x : .x+$. & + ;. . . &&&&&&&&$&&&&: ;$&&&& &&+ 69 | ; & ;x; : && ..:;. .++ ;&&& x&&&&x$ x&&&&&&& &&& :. 70 | x . & .x .+ x+; &. + ; .; ;. &&&&&&&&&&&&&&&x && : . 71 | ; .. ;&:x++$; X&& :;.. ..; : . ;&&&&&&X .&& . 72 | . ... : . . &&;. . ;. . . . . .; . . 73 | ..:: . .+:;:;+:: :X$& ; :. : . : . ::;.x .:x+;x ... +. 74 | : . :... $:: : :.X;$ ; & . ::+;x .;: :&:X.X .... ...: 75 | ..... .. . . ;:$; . X&x$ :+&$&xX: ; &X:...X.x$x : . . 76 | . .. ..:. x:X&&x;;+$&xx .:&x :&; ;;x+x: .. :.. : .: 77 | . : :;.... . . :: +&X&&&&&&X&$:&&x$&&;. . : .: . . : . 78 | !--FRAME--! 79 | :&&&&&&&&&&&& 80 | ................. &&&&&&&&&&&&&&&&&&&&&&&&& ............... 81 | .............. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ............ 82 | ........... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .......... 83 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ........ 84 | ...... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... 85 | ...... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 86 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 87 | .... && &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 88 | ... &&& &;;&&&&&&&&&&&&&&&&&&&&&& & &; .::&&&&&&&&&&&&&&&&&& . 89 | .. &&&& &&&&&&&&&&&&&&&&& &&&&&&&&&&& 90 | &&&&& : &&&&&&&x;.X&+& &&&&: :&&& :&&&&&&&&&& 91 | . &&&&& : && & :xX x &&&&&&&& ++ &&&& &&&&&&&&& 92 | &&&& &&& . ..&&&&&: &&& X$$ &&&&& &&&&&&& 93 | & &&&& ; &&& :.X:. : x:x&&X. + . & &&&&&&& 94 | && &&& &&& .. . :: +.&& & : :. . +.&::X & &&&&&&&& 95 | &&& &&&& &&&& : .. ;:. &&& ;: x..:. +&&&&&&&&&&&&&& 96 | &&&& && &&: &&&&&+. ;: . &.. &x&&& X . x&&&& 97 | &&& . & :&&&&&&&&x .:: .: ;. &&&&&&& $& && ;&& 98 | :.:x:X: & & XX ; :;;$:: &&&&&&&&& . + x &&& & 99 | & . .. :. $ x&&&&&& :; : ;...; &&&&&&&&&&$ +:. &&&&:& 100 | && ; x ::;. ....: ;x . . .&&&&&&&&&&&&X : :&&&&& & 101 | & .X; ;: :+ :: : .. : . .. &&&&& X&&&&&&&&;;&+ &; +&&&&&&&X 102 | .X. X: ; + +. :: : ;.;&&X& &&&&&&&&&&&&&x& .:. . $&&&&& 103 | . x : +;; +X+..;.x ::: $&&&&&&&&&&&&X x &&&&&& 104 | &&& :.;:+ .X ... :: :: + &&&&&&X X&&&&&&&&; + 105 | :. &&& :. .:x.:.. :.:.:.. . :: &&&&&&&&&&&&&&&&&&&& x . 106 | . x&& x:.X: ..:X . ; :; :+X:X&;+X :&&&&&&&&&&&&&&& $ .. 107 | . : && . $::.x&. :. ;+ ; x; &&&&&&& && . . 108 | :.. &+ & .:; ;;&& .. ; .. $: . . 109 | . . + :: ;:: . :$+& :;:::: . : : :;:. . ;.;;&x .... 110 | .: . .. +.; . ;.;.. &X& ... : + :. ...;.&X. :.;. : 111 | . .:.. &:x. ;.; ..x&& . : : ...; . ++x; . . . .: 112 | . . . :+++ ++::X:&+; x ;:. .:::+::$:;x . .. . 113 | ..:. .. . .:.. x+;.;; x+ &X + : x+:&;&;x . .; ..: . 114 | . . .... ..:.. ;:&&&&&&&&&&&&&&&:X+ .... . . :.. 115 | !--FRAME--! 116 | &&&&&&&&&&&& 117 | ................ &&&&&&&&&&&&&&&&&&&&&&&&&& ................ 118 | ............. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ............. 119 | ........... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .......... 120 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ......... 121 | ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... 122 | .... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..... 123 | .... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 124 | ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& X &&&&&&&&&&&& ... 125 | .. &&&&&&&&&&&&&&&&&&&&&&&&&&&& ; .+&&&&&&&&&&&&&&&&&& .. 126 | . &&&&&&&&&&&&&&&&&&&&&&&&& &&&&& x $ & &&&&&&&& . 127 | . . &&&&&&&&&&&&&&&&&&&&&&& +&&&&&& .$XX ; xX & &&&&&&&&&& 128 | && &&&&&&&&&&&&&&&& &&&& .. +&&& &:&&&&&& 129 | &&& .; && &&&&&&&& : &&: ; $; & &&X && 130 | &$ + && &x &X . &&$ + + .: &&&&& ; .$ &&&.&&& 131 | :x: && . : : &X &;$&& &&&&&&: :$&&&&x;& 132 | & : ; . &: ::. ; X&&Xx .: . &&&&&&&&& . ;+:&&&&& & 133 | && ; ; && . ;: X& :: : . &&&&&&&&&&&&$X+x+ X&&&&$& 134 | &&& :; && & x. &&&&&X::.. &;x&&; &&&&&&&&&X&&. .&&&&&&X 135 | X&& .+. .: &&&X &&&&&: + ; &&&&&&&&&& . +;&&&&&&:x 136 | $ ; $. . &&+ +$&&.&:+: . ;.:.: :&..&&&&&&&& &&&&&&& & 137 | && ; ; .+;; &&& &$&&&& . .;: ;:+: &&&&&&X &&&&&&&&&& .& 138 | &&&& ;;$ && &&&$ & :; .X;: &X&&&&&&&;x&&&&&&&&&&&& &$ 139 | &&&& x&+ : . & x . :: X+X;; &&&&&&&&&&&&&&&&&&X ;& 140 | &&&& ..; +;: &$ + .. . .; . . : X &&&&&&&& $ & 141 | . &&& ;.:+ + & ::+x :: +; :.$:$&+ :.:.: ; ; 142 | . &&&& ;: xx+ && :x; . ; . ;.. &.+& + ;X . :. . ..:&.: : 143 | .. &&&&& ; +.: . && .. +..+; . + : .;.. . .+;; .x& . 144 | .. &&&&& :.. :x; :x$.x . ;: . :.: ..; ... :$xX .;. .; 145 | ...: &&&&& X: ... ...&&&+ + .x .. X.;.. : .:+ .X +x: .. 146 | .. . . &&&& :: .: +.; X.&&& : + xxxx :++.x; . .. .;. 147 | .... ... &&&& ..+ . .. x x.; $&&& : ; ;+ :;:$xx ; .. 148 | .... &&& ;.. ;:.:. . ; ; ; &x+&X&&x;X+ . : .. 149 | + . .. ... &&$+ .: + . :+.++&X&x&$&&XX$ ;&+ +: . . ... 150 | :. .. . . &&&x ; :.:;x : X; x&&X&&X . .. ; 151 | ... :. .... &+.+:.: ;&$;;&&&&&& ..... ..... ; ; 152 | !--FRAME--! 153 | :&&&&&&&&&&&+ 154 | .. . .. . &&&&&&&&&&&&&&&&&&&&&&&&& .x. . ....... .. 155 | ... + . .. . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... ... ... 156 | ... . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . . . 157 | ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..... ... 158 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. .:. 159 | ...: &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 160 | . . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 161 | . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 162 | & &&&&&&&&&&&&&&&&&&&&&&&&&&&&&+& &&&&&&&&&&&&&&: ... 163 | &&&&&&&&&&&&&&&&&&&&&&&&&&& xX&&&&&&&&& & &&&&&&&&&&&& . 164 | &&&&&&&&&&&&&&&&&&&&&&&&&& &&. &&&: &&&&&&&&&& ;. . 165 | &&&&&&&&&&&&&&&&&&&&&&& ;& &&&&;.x; x& + &&&&&&& + 166 | &&&&&&&&&&&&&&&&&&&&&& &&&&&.x;; &;;Xx&&&x&&&&&; &&&&& ;& 167 | &&&&&&&&&&&&&&&&&&&&&&x x. ;& & . + :&& .. &&&&: &&& + 168 | &&&&&&&&&&&&&&&&&&&&& : x&&&+ . :&; . &&&&&&&x&&& x 169 | &&&&&&&&&&&&&&&&&&&: . && . : .&&&&; ;:&&&&&&& && : x; 170 | &&&&&&&&&&&&&&&&.. &.x;X ;&& xX&&xx +&&&&&&; : +&&&&& && :.x 171 | &&&&&&&&&&&&&& +&&. + . &&&&&&&&&&+$.x &&& &x + $ 172 | &&&&&&&&&&&&&& X : $ . ; &&&&&&&$&& &&&&; &: . : 173 | &&&&&&&&&&&&&&& . &&&&&: . .;;:. &&&&&&&&&X &&&&& &$. $x 174 | &&& && &&&&&. .; &&&&.. ..; :: &&&&&&: &&&&&& .: . ++ 175 | &&&&; && &&&&& : &&& X; . ;X+. &;&&&&&.+&&&&&&&& :; : & 176 | &&&&& && &&&&&& x& & & :. x &&&&&&&&&&&&&&& ;+ x x; x; 177 | & && && &&&&&$+ &&X& X . xx: & x $:& + : .+x.: : 178 | && && &: &&&&& & + : ;.. &:;& ;& x..; .&x.x:XX. . 179 | . &&& : ; &&&: :.. . +;&&:: :x: . : +:x: & +:. 180 | &&& &;.X &&&& . +&& . : +; . :&+ :..: ;; 181 | ..; && &: : ; &&&&&X ; :. :. . . .$;+ &&x+ ;; ;;& ;. : 182 | ; &&& &x+ ; &&&&;& . x;. + . X&&& 183 | ... &&& ;+;+: X&&&&&&+ . .:. :&&X&x. +;+&&& ;.. 184 | .; &&&&& + : . . $.&&;$ ++. X:: ++&$ :x&+ + 185 | . .. . &&&&&& . :;: . : + .; +$X+x;.$ x.:xx x : : 186 | .::.: .:; &&&&&& .+ ; +;;X; &&&+x &&+ .&&x&:$ .. . . 187 | .. :: : . &&&&&. ; + .. . .+&:x &&&X x .. . . $ 188 | .::. . . &&&&&: X&&&&&& .; ..; : 189 | .. : .:. .: : . &&&&&&&&&&&&&&&& . .. . ..:. ; . 190 | !--FRAME--! 191 | &&&&&&&&&&&$ 192 | ............... &&&&&&&&&&&&&&&&&&&&&&&&& ................ 193 | ............. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ............. 194 | ......... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & .......... 195 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&: ; ......... 196 | ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & & ....... 197 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & $ ...... 198 | ... &&&&&&&&&&&&&&&&&&&&&&&&&&& x&&x&&&&&&x&&&&&&& & .... 199 | ... &&&&&&&&&&&&&&&&&&&&&&. x&&$&&&& &; $X &&&&. & ... 200 | .. &&&&&&&&&&&&&&&&&&&&&. &&& X&$ X .x &&&&&& & .. 201 | . &&&&&&&&&&&&&&&&&&&&X +&&&&&&: & $ x&&&&&&&&;X: && & . 202 | &&&&&&&&&&&&&&&&&&&& ;&&& +$;. &&&&&&&&&&&&&&&$x& &X:x x& . 203 | &&&&&&&&&&&&&&&&&&& : $ :;x &; &&&&&&& && :& 204 | &&&&&&&&&&&&&&&&& $ x&. . :.x +X&&x $;:. &&&&&&. x& ; : & 205 | &&&&&&&&&&&&&&&&;&& ;&&&&;:Xx ;:+ .+&&&&. +: + :.:.+x& 206 | &&&&&&&&&&&&&&&&;&: + &&&&; .+x:; && : x:; &&& :;. ; & 207 | &&&&&&&&&&&&&&&& xx$ &&&&$ .x &&&& .x.; ;+: . 208 | &&&&&&&&&&&&&&&& :. ;+&& . . &&&&&&&&&&$ ;;.&&&&& ;..+; . .:+; 209 | &&&&&&&&&&&&&&&& ;..x&& . && . &&&&&&&&&&&& x&&&&. .; ;: XxX :; 210 | &&&&&&&&&&&&&&& .; &X &; x; X&&&&&&&&&& &&&&&& .: &:x& & & 211 | &&&&&&&&&&&&&&&x . . &&&; : &&&&&&&&&& +&&&&& : ; + X&&. 212 | &&&&&&&&&&&&&& &$ ::.. &&X .; x : &&&&&&X:.&&&&&. :. ;: ;.; : 213 | &&&&&&&&&&&&& . : .: x &&&&&&&&&&. :::&;;.. . ;:$& 214 | &&&&&&&&&&&; : x++:&&: .:::;. :&&&&&&&&&$ :x. $: :: &+&+ 215 | &&&&&&&&&&& .: &&&&&: ; :: X &&&. : :: ::. $&;+& 216 | &&&&&&&&&&&& &&XX. :X.; &: X;+ ;.; ; . X &x ;&&&.+:& : 217 | . &&&&&&&&&&&&&&&+ && && .: ; : . X&;; ... :X$ +$&+ : 218 | . &&&&&&&&&&&&&&&& :X&& . : ..:: : : : x &+ X + X$ . 219 | .: &&&&&&&&&&&&&&&&& x$:..:::;;.; : .$+ &;&&; ;Xx: :& . 220 | &&&&&&&&&&&&&&&&& :: ::. ; ;.:: ; $ :$.&&X+; . ; 221 | .. .. $&&&&&& &&&&&&& . .. .$:.x$ :: : ... ; 222 | . : . &&&&&&&& &&&&&&&&; .:;$$;&x& &&&&&&&&x+ . . 223 | .. &&&& &&&&&&&&&&&&&&&&$&$:.&+; $X;&& ...: : 224 | . ... :. && && &&&&&+ : x + :&x$&&&&& . .. : . 225 | ... .: .;. & .x . ; .:;.: &+&&& ... ; ..:.. 226 | . . : . ... .;+x&+:::.;.x:++:.x:x.;+&&X$; .. X . .. 227 | . .. . .. ... .. .:+$+$xX+..+++;+x. . . : ; .. ..... 228 | !--FRAME--! 229 | &&&&&&&&&&&&&& 230 | . .. . .. . . &&&&&&&&&&&&&&&&&&&&&&&& .. .. .... . ;; 231 | . ..... ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. . .... 232 | ........ . &&&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&$ . ... ; ... 233 | . ...... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &+&&&& ::. . : .. 234 | ..... &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&& &&: .... 235 | .... &&&&&&&&&&&&&&&&&&& &;$&&&&&&&&& &&&& :+: . : 236 | ... $&&&&&&&&&&&&&&&&&&&& .+; X &. & $&&&&&& :. &&&X . + 237 | .. &&&&&&&&&&&&&&&&&&&&&& . :; &&&&&&&& ..;+;x: 238 | .. &&&&&&&&&&&&&&&&&.&& x; : &&&&&&&& : : + :X; .. 239 | &&&&&&&&&&&&&&&&&&&& &&&&&xx&x&: :&&&&&&&&& . :: ;..;. :x 240 | &&&&&&&&&&&&&&&&&:& . &&&&&&&& &&: .&&&&&&&& .:..x +.: :;&x. 241 | &&&&&&&&&&&&&&&&& &X& &&&&&&&&&&& &&&&&&& : .;;x..x;: +x 242 | &&&&&&&&&&&&&&&&x $&& ; : &&&&&&&&&&&& :&&&&&&:: . ; .... 243 | &&&&&&&&&&&&&&&&& &&&&& : &&&&&X&&& &&&&&&:. :;x x:+;:.; . + 244 | &&&&&&&&&&&&&&&&+ &&&&& :. x&&&&&&&&& &&&&&.$ . x. x +X: .::+ ; 245 | &&&&&&&&&&&&&&&&& & . &&&&&&&&&&&&&&& x .:. ..+:: :; :.:.$ 246 | &&&&&&&&&&&&&&&&&. :&&& : . .+ X &&&&&&&& + ...; .:+;.x; : 247 | &&&&&&&&&&&&&&&&&& .++&& :+$...$ & :&&&&X x :.; . :. : ;+$. .::+xx 248 | &&&&&&&&&&&&&&&& .&$$ ; x +$ .& +& :;; : + ..:.. : ;. ;.: : 249 | &&&&&&&&&&&&&&&&&x x &&&& ;:X: ; & & +X&+: :... ...; X.X. ; 250 | &&&&&&&&&&&&&&&&&+ . ; && x .;. + : :& &X :.:: ...; ..; &+&. & 251 | &&&&&&&&&&&&&&&&& :X+;X:& +: $+;X; .. .: :;; :&XX x& 252 | &&&&&&&&&&&&&&&&&&& . &&& :. X: ..:::::.: ; $ &+&&X 253 | &&&&&&&&&&&&&&&&&:&x:::&&&&&&& .. .;X . .. x. : . :. &$x&&&&& 254 | &&&&&&&&&&&&&&&&&;X.xX. &&&&&&;: : : : . .. ::... ; &;: && 255 | &&&&&&&&&&&&&&&&&: :&x&&& :::. : +.:: x ; ;&&&$& x&&&&& 256 | : &&&&&&&&&&&&&&& :X; && &&x :.::: .::.; &&&+ : &X; & 257 | : &&&&&&&&&&&&&& &&& .::.+X+:& &: .::. :.. .&&&+x;&X +.&& 258 | . &&&&&&&&&&&&&& ; . &X.. &&&: .:& .+ :: 259 | .. &&&&&&&&&&&&&&&&&& .;;$X&:x.XX;&&&& + ;. :: ;x .: 260 | ...:. &&&&&&; &&&&&& : ::::::. : : ;.;;;x; . 261 | . &&&&& &&::+X ... ;:. .;.+:;;.x:: ..;;x: . .. 262 | ..... . &&&&&&&&&&&&&& :.;; ;.;::x:.;::x . :x; . .... 263 | . .. . .. &&&&&&&&&&&&&& .:::::+; . :.. . . ;$& . . ... 264 | .... ....... $. :&.X + X &&& . . : .. .. 265 | . ... .. . . &&&&&&&&&& ; .&&&&&&&. . .. : .. : 266 | .. ... . :.: .. &&&&&&&&&&&X &&&&& ....... . . . 267 | !--FRAME--! 268 | &&&& 269 | ...... ......... :&&$$&xx:x && &+ &&& ........... . . 270 | .... ....... &&&&.x ;.+ . : X :: &&&&&&&& .......... . 271 | .......... &&&&X;X x ...;;&&&$&&& :&&&&&&&&&&&&& . ...... 272 | ..... ... &&&&&$&&&.. x $ &&$ &&x$ &&&&&&&&& . ...... 273 | ....... X& .:&:X. :&&&&&&&$: x +$& &&&&&&&& ....... 274 | ..... &Xx;:+x .; . +::X+ ..&+ : &&&&&&&&&&&&&&&&&&& . .... 275 | ... .& ; :& &; x ; : &:x&&:+ &&&&&&&&&&&&&&&&&& . 276 | ... ; X. :$xx.: ;:... ..;:. .:xX+ ;&&& &&&&&&&&&&&&&&&&&& . 277 | .. $.+;:$ . : ; .&x . ; :X&x &&&&&&&&&&&&&&&& 278 | :.+ :.x ;x+& . . ;. . ; ; : &x &&&&&&&&&&&&&&& : 279 | . .x; ;; . X ;. ++: ::. ;;$ ;.: &&&&&&&&&&&&&&&&&&&& 280 | . +:x; &&&&&&&&&&& & ;&& x +.. & .&&&&&&&&&&&&&&&&&&&&& 281 | x ; &&&&&&$X&&&&& X&& : $& : & &&&&&&&&&&&&&&&&&&&&& 282 | :. :&&&& &&&&; & ; ; :&& &X $ &&&&&&&&&&&&&&&&&&&& 283 | . X &&& &&&x&&&&& &x:;++. $&& &&x&&&&&&&&&&&&&&&&&&&&&&&&&&&& 284 | x X&&& &&&&&X&&&&& . ..: &&&&&+: &&&&&&&&&&&&&&&&&&& 285 | &x& & x&&&&&&&&&& ;x ; .. . .+: +&&&&&&&&&&&&&&&&& 286 | & &&&&: & &&x&&&& : .: : .&&x x. ; &&&&&&&&&&&&&&&&& 287 | &&&&&&& . +&&&&& ; +&&&+& &&&$ x; ::&&X +&&&&&&&&&&&&&&&&&&& 288 | &&&&&& . $&& +. && .: &&&&&&&&&&&&&&&&&&&&&& 289 | &&&&&& . & .. :; .:&&&&; : .; &&&&&&&&&&&&&&&&&&&&&&&& 290 | &&&&&&& &x .X+ .X & &X : . &&&&&&&&&&&&&&&&&&&&&&&&& 291 | &&&&& +x&&&$&+ ;++.$&&&&& . &&&&&&&&&&&&&&&&&&&&&&&&&& 292 | &&&&& & &&&& :+ &&&&&&&&&&&&&&&&&&&&&&&&&&& 293 | X&&&&&&&&&&&& &&&&x . $&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 294 | &&&&&&&&&&&& &&& &&&x. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 295 | :&&&&&&&&&&&&&; :& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& :+ 296 | +. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 297 | . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 298 | ... . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& : . 299 | . ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .: .... 300 | .. . ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... ... . 301 | ............ X&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . ........ 302 | .... ..... . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ............ 303 | ................. &&&&&&&&&&&&&&&&&&&& .... ... . ..... 304 | !--FRAME--! 305 | &&&&&&&&&&&&&& 306 | .. . . . .. X&&&&&&&&&&&&&&&&&&&&&&&&&& . ... .... .. 307 | : . . ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . .:...... 308 | . . .:. x&.;&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&& . .. 309 | : ..... &&& . .:;+ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . .. .. 310 | ... ... $&$ .++ ::+&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&& . ... 311 | ... : &x: ;&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&& . ... 312 | .... &&X; &x.: x&x &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. 313 | x. ;.;&$.x &&&&.+ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 314 | : &:.+.; +: ;:+ . &&&&&&&&&&&&&&&&&&&&&&&&&&& 315 | &&: x .&+X&xx.x&;.:;$; &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 316 | &&. : $x&&&&X . ;.. x&&$.XX &&&&&&&&&&&&&&&&&&&&&&&&& 317 | &&&&&+X&x&&$ .x:;+.. :; ; + &&&&&&&&&&&&&&&&&&& 318 | && :x&x & ::...: . ::. + &&+&&x . .&&&&&&&&&&&&&&&&&& 319 | x;&&&&X . : .::..+ .: $;;& .. . .: x&&&&&&&&&&&&&&&&&&& 320 | &&$+: ;; $.; .: . ..: :+ ;&xX&&&:+ + . . . &$&&&&&&&&&&&&&&&&&&& 321 | & ; ;&:x;; x :x. ; :; ;.. X;&&&&&;+;; &:&+ &&&&&&&&&&&&&&&&&&&& 322 | ;+ .$;:. .. . ;.X $ x.:..:... .& . ::: ;&&&&&&&&&&&&&&&&&&&&&& 323 | $ +&::; ;; . : & . & .x : ;: . :: :.; &&&&&&&&&&&&&&&&&&&&&& 324 | ;& ..+ :: + $ & & ... . .;&& & .:. &&&&&&&&&&&&&&&&&&&&&& 325 | & .;;.&; : +&&&&:& .;:.. $ &&x ..:. &&&&&&&&&&&&&&&&&&&&& 326 | $.; .; &&&&&&& :.+: . & : . + &&&&&&&&&&&&&&&&&&&& 327 | :;.; x ; :&&&X&&&+&& X &.&;; &&x ;;. . &&&&&&&&&&&&&&&&&&&& 328 | : :+..:. $&&&$+&&&&&&& : :& &&x& ; ; :&&&&&&&&&&&&&&&&&&&& 329 | &&xx:+X &&& &&&&&&&&&& ; . : &&&&&&&&&&&&&&&&&&&&& 330 | ;:::; &&& &&x&&$&&&& : $X:: &&&&&& : &&&&&&&&&&&&&&&&&&&& 331 | . +: :&&. &&&&&&&&&&.. : .:: $&& : &&&&&&&&&&&&&&&&&&&&& 332 | . ;; :: &&& ;& &&&&& : .:;:::. &&&&&&&&&&&&&&&&&&& . 333 | ;. +.+ &&x&+ & .&&: . &&&&&&&&&&&&&&&&&&&& ; . 334 | . :. X+ $&&&&& . & . ;. &. &&&&&& . ;&&&&&&&&&&&&&&&&&&&& . 335 | . . ; x &&&& $+$&$ &&+ &&&&&&&&&&&&&&&&&&&&& . 336 | .; . X &&&&;& &&; &&&$; &&&&&&&&&&&&&&&&&&&&&&& .:. . 337 | . ... : &&&&&&&& .&&$ &&&&&&&&&&&&&&&&&&&&&&&&&& .: .. 338 | ..: . : $&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. +. 339 | . : :. . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..... . 340 | : ... :. ;: .. &&&&&&&&&&&&&&&&&&&&&&&&&& . .. .:: ..; 341 | &&&&&&&&&&&& 342 | !--FRAME--! 343 | &&&&&&&&&&&& 344 | ................ &&&&&&&&&&&&&&&&&&&&&&&&&& ................ 345 | ............. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ........... 346 | ......... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .......... 347 | ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ........ 348 | ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... 349 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..... 350 | .... $&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&x ... 351 | ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. 352 | .. &&&&&&&&&&&&&&&&&&&&&&&&&&&& .&&&&&&&&&&&&&&&&&&&&&&&&&&& .. 353 | . &&&&& &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&& 354 | . . &&& &&&&&& &&& . . x &&&&&&&&&&&&&&&&&&&&&&&&&&& 355 | x &&&&.&&& . : : . +& &&&&&&&&&&&&&&&&&&&&&&&&&&&& 356 | ; & $& X& . :; .: :&&&&&&&&&&&&&&&&&&&&&&&&& 357 | x&& $&&&&& ; XX;&& & & : :.:.. . &&&&&&&&&&&&&&&&&&&&&&&& 358 | &$&&&&& ..& &&& &&&&&& :; x :. : &&&&&&&&&&&&&&&&&&&&&& 359 | & X&&X : + &&+ && &&x& . . ; . &&&&&&&&&&&&&&&&&&&&&& 360 | &&x;.; Xx&:+.x$;+ & & $&& :. ;&&&&&&&&&&&&&&&&&&&&; 361 | x. x . : : .; &&&&&x& x ;Xxx . ;&&&&&&&&&&&&&&&&&&&& 362 | + . ..&$ : ; ;;; x. :.. . &+& & . : &&&&&&&&&&&&&&&&&& 363 | x ;:: &&$+ : .. .; .+:;. : &x: +; &&& . ; &&&&&&&&&&&&&&&&&&+ 364 | $; :;& +$x . . . : .; & &&&&X+x+: + &&&&&&&&&&&&&&&& 365 | &$:x : &&; &&. . :.:x x&&$; &&&&&& & &&&&&&&&&&&&&&&&&& 366 | X&:&;&+ + .:.x& X:& ; .: : : ;. &&&&&&&&&&&&&&&& 367 | &&;$$&& x.&;. $&&&; ;; : ; : &+&$X:. &&&&&&&&&&&&&&& 368 | &&&&& &:$ x&&&&&&&&&. .;.; . : :&&&X;+ X&&&&&&&&&&&&&&& 369 | X +.$$;:$: &&&&&&&&&&&& .+ . &&& x&&&&&&&&&&&&&&& 370 | ; & x.; ; &&&&&&&&&&&&$ x..+X: X; xx&x&: .&&&&&&&&&&&&&&& . 371 | : $ :: : ;. .&&&&&&&&&&&&&&::.: .& &&&&&&&&&&&&&&& :: 372 | .: &. +;;:+.; &&&&&$&&& . .+x x;.&&&&x&&x&&&&&&&&&&&&&&&& . 373 | ::. &$;.; ;; && &&& ;$&xx X X & .&&&&&&&&&&&&&& : .. 374 | ; . ;$&;.+: &&+ + . ; && ; &&&&&&&&&&&&&&&&&& :.. 375 | ..:.. . x$&: ; &&x: &&&& &&&&&&&&&&&&&&&& :. ... 376 | .. .. $XxX;;; &&&&&&& &&&&& x. &&&&&&&&&&&&&&& .: .. 377 | . :.. x +$X;. &&&&&&&&&&&&&&&&&&&&&&&&&& .:. ...: 378 | ... . . .:. ;& : ;&&&&&&&&&&&&&&&&&&& :. : 379 | ... . :.. +x&&:;X; $&&& & && : . .; ..: . 380 | !--FRAME--! 381 | &&&&&&&&&&&& 382 | ............... &&&&&&&&&&&&&&&&&&&&&&&&&: ................ 383 | ............ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ............ 384 | ......... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ....... .. 385 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . ... 386 | ...... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ....... 387 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 388 | .... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 389 | ... &&&&&&&&&&&&&&&&&&&&& x&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 390 | . &&&&&&&&&&&&&&&&&&&&$ :&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 391 | . &&&&&&&&&&&&&&&&&&&&X . x:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 392 | &&&&&&&&&&&&&&&&&&& : + ::. &;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 393 | &&&&&&&&&&&&&& .;. :. X &&&&&&&&&&&&&&&&&&&&&&&&&&&&& 394 | &&&&&&&&& :. : ::X . : &&&&&&&&&&&&&&&&&&&&&&&&&& 395 | &&&&&&&& + + : ..: .x :.: ..: &&&&&&&&&&&&&&&&&&&&&&&& 396 | &&&&&&: + && &&& X & x ..:+. .+. ;:: . &&x&&&&&&&&&&&&&&&&&&&&& 397 | &&&& . .&&&&&&&&&& . .; . ; &&&&&&&&&&&&&&&&&&&&& 398 | &+ ; ; X.: X&: ;&&&X; .. ;;.:. $&&&&&&&&&&&&&&&&&&&& 399 | & .: . &&&&&$&& &&&&&&&& .. : ;: &&&&&&&&&&&&&&&&&& 400 | & :.;...;:+: .&&&&&&&&& : : :. ;&&&&&&&&&&&&&&&&& 401 | &.$ ..; : ...+ . +; : x&& && ;.:. : &&&&&&&&&&&&&&& 402 | : :...: :. .::.. . &+ &. :&&& ;X:;;.: &&&&&&&&&&&&&&& 403 | :+: . . ..:. . .:: ; &&;. . &&&&&+: ; + .&&&&&&&&&&&&&& 404 | ;: .... +. .. .. ; x$. & : $&&&&&& :$ &&&&&&&&&&&&& 405 | $:: ; .: . ..::; .+. .&&;. . x+. &&&&&&&&&&&& 406 | :: .++&;. :; x.. :;+:; .&&&&+;;Xx &&&&&&&&&&&& . 407 | :. & .; &&+& x ; ; ..; ;:+.. : &&&& : &&&&&&&&&&&& ;. 408 | . ;&$: X &&&& . . . .:+ &&&& &&&&&&&&&&&& . 409 | .:. +&X &&&&&&&&&&&&;: ;.:;+ x: : : &&&+ &&&&&&&&&& . x 410 | . . ;+& &&&&&&&&&&&&& :.:x.:.::; &: &&&&&&&&&&& .. 411 | ... xX& &&&&&&&&&&&&& .: ;.;; ; &&&X&&&: &&&&&&&&& ....... 412 | :: ..... X. &&&&&&&&&&&&&&.; ..: : : : &&&&&&&&& ........ 413 | . .... . &&&&&&&&& . ;&.. &+. &&&&&&&&&& ......... 414 | . .......... &&&&& .$&.& && :. ;&&&&&& ..... ...... 415 | ....... . .... &::x ..:& &&&& :&&&&&& ......... . ... 416 | ..... ... .... +.:+X&&&&&&&&&&&: . ..... ...... 417 | !--FRAME--! 418 | &&&&x 419 | ................. &&&&&&&&&&&&&&&&&&&&&&& ............... 420 | ..... ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ............. 421 | ............ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ......... 422 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ....... 423 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . ..... 424 | ...... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . ... 425 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 426 | ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& : 427 | .. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& : 428 | . &&&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 429 | . &&&&&&&&&&&&&&&&&&& : &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 430 | &&&&&&&&&&&&&&&&&&:& ; &x& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 431 | &&&&&&&&&&&&&&&&& : . ; &&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 432 | &&&&&&&&&&&&& ;: . . : .. . &&&&&&&&&&&&&&&&&&&&&&&&&&& 433 | &&&&&&&&&& ; ; .:; ::...+ ... ;&&&&&&&&&&&&&&&&&&&&&&&&&& 434 | &&&&&&&&& . . . :. :. $+ : X &&&&&&&&&&&&&&&&&&&&&&&& 435 | &&&&&&&x X.&& && & &x x . : .+ :; +: X&&&&&&&&&&&&&&&&&&&&&; 436 | &&&&&.:; ..:&&&&&&&&&& ... :: : ; &&&&&&&&&&&&&&&&&&&&& 437 | &&&;;: &&& &&&x& X&+&&&.& + :;:.; .. : &&&&&&&&&&&&&&&&&&& 438 | &. :. : . . : ;;&&&&&X&& & .::. :. &&&&&&&&&&&&&&&&&&& 439 | &$ X : ;;:. . ; :& ++&X + + : ; &&&&&&&&&&&&&&&& 440 | $. x ; :. .:: ; ; ... & +&&&&x. . +::;x &&&&&&&&&&&&&&&& 441 | ; :: ::......;: .. & &x; &&&&&& :: &&&&&&&&&&&&&&&& 442 | & :+ .:.. :. ;::;.+ xX$&& && +&&+ X;; &&&&&&&&&&&&&&& 443 | . && X. . :; . ;.: x ;.; . &&&&:;+ ;&&&&&&&&&&&&&&& 444 | &:: + ; :+ ::.:::.. . ..:. ::; +&&& &&&&&&&&&&&&&&&& 445 | ; &&:. +&&+& : :. : . . &&&&&&&&: &&&&&&&&&&&&&& 446 | &+ + x&&& .& $:.. .+ : : & &&&&&&&&&&&&&&& ; 447 | :.. &&& xx; &&&&&&&&&&&& . :xx;.+++ ;X.:+&& :&&&&&&&&&&&&& ..: 448 | &$X;+;: &&&&&&&&&&&X x:.+.;.::;&.& &&&&&&&&&&&&& 449 | ...... +;: .;; &&&&&&&&&&&& .. . .::. . &&&&&&&&&&&&&&&& . .. 450 | . . .. . &&;::; +&&&&&&&& ++x .. &&&&&&&&&&&&& ... . 451 | . ...... & x.; x&&&&X ;&&; $ &&& X&&&&&&&&&&&&& .. ... 452 | ...... .. &$x &&& + ;&&&&&x&x&&&&&&&&&&&&& . ....... 453 | ... ...:... ++. &&; &&&&&&&&&&&&&&&&&&&& . . ....... 454 | .... .. .. : &&&&&&&&&&&&&&&&&& & & ... ..... :. 455 | ..... . :.......:. &&& . .. ::........... . 456 | !--FRAME--! 457 | +&&&&&&&&&&&+ 458 | .............. &&&&&&&&&&&&&&&&&&&&&&&&& ............... 459 | ............. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . ... . .. 460 | .. ...... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . . . .. . 461 | ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& : . .... 462 | ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&X .: ... 463 | ...... :&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 464 | .... &&&&&&&&&&&&&&&&&$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..: 465 | ... &&&&&&&&&&&&&&&& .&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 466 | .. &&&&&&&&&&&&&&&& . +&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 467 | . &&&&&&&&&&&&&&&&& +: &&&&&&&&&&&&&&&&&&&&&&&&&& 468 | &&&&&&&&&&&&&&&& ; : : ..: x&&&&&&&&&&&&&&&&&&&&&&&& 469 | &&&&&&&&&&&&&& . .:. . +. . &&&&&&&&&&&&&&&&&&&&&& 470 | &&&&&&&&&&&& & x . ..x : ; &&&&&&&&&&&&&&&&&&&& 471 | &&&&&&& &&;. &&& X&&&&& &&&x&$x; .&&&&&&&&&&&&&&&&&&& 472 | & &&&& : &&;. &&&&&&&&&&$&&&&:&:&+:+:; : +&&&&&&&&&&&&&&&&& 473 | && &&& &.. x+ X &&&&& . ; &&&&&&&&&&&&&&&& 474 | &&x&& &&&: :&&; : x.X:; :&&&& && ; &&&&&&&&&&&&&&&& 475 | :&; : ; .;.. .; & ;&& $ .x &&&&&&&&&&&&&&&& 476 | . : : .& : : X+: ; :+ .&&+;;; ;.; . &&&& &&&&&&&&&&&&&&& 477 | &&&&&&&&&$ : . :; ..:: ; . . :. .;.. &&&&X X &&&&&&&&&&&&&& 478 | . ;: $X .. ..++. ; ; :&&x &&&&&&&&&&&&&& 479 | & :.. ; +:..; && .&&&&& .;X;&: X & &&+ &&&&&&&&&&&&&&& 480 | $: .xxx&&:. : .+ :&&&&&&&&&&&&&&& . ;& X+& &&+&X; &&&&&&&&&&&&&&; 481 | :; .;.: ;x$ .: :..; &&&&&&&&&&&&&&& + ; + &&&&&&&&&&&&& 482 | .: +: . $ ;& . + ;&&&&&&&&&&& :$&$&+ $& : :. &&&&&&&&&&&&&&&& 483 | .;;+..:.X&.: &&;&&&&&& .. &&& &&&&&&&&&&&&&& 484 | . x$+ x$; :. : &&$&&&&& :. +; &&&& xx : &&&&&&&&&&&X . 485 | .. &&&&;&&::x: . . &&& &. &&&& ;&&&&&&&&&&&& : 486 | .. && x.& $.x&$ x &&&& & && &&&&&&&X&&&&&&&&&&&&&&& . 487 | .: . &&&Xx: x $.+ &&&&&&&&&&&&&&&&&& &&&&&&&&&&&&& : 488 | . .. .&X X : X+ &&; . &$&&&&&&& & .... . 489 | .::.. . + : :x; x x +:: . : &&&&&&&&&&: & & . .. . 490 | . : : :&:& X &. :. . ..: ; &&X&; . . ... 491 | . .. . . . ;x&&& .: +:: .::; : ; . ; . . : .. 492 | : . .... . .&&&$x++XX; .. ..+ &+ :... ...:. 493 | ;.... . . ;.. ... : ;$x+;;+XxXx$xx&&x . : :..:. .. 494 | !--FRAME--! 495 | &&&&&&&&&&&& 496 | ................ x&&&&&&&&&&&&&&&&&&&&&&&&& ..... .. .. . 497 | . ......... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ....... . 498 | .... ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .......... 499 | .. .. ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... 500 | ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... 501 | ...... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . .. 502 | .... &&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . .. 503 | ... &&&&&&&&&&&&&&& xX&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. 504 | .. &&&&&&&&&&&&&&&& + &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 505 | . &&&&&&&&&&&&&&&&& x .x . &&&&&&&&&&&&&&&&&&&&&&&&&& 506 | &&&&&&&&&&&&&&& .. .. .. & &&&&&&&&&&&&&&&&&&&&&&& 507 | &&&&&&&&&&&&& : ; .:... &&&&&&&&&&&&&&&&&&&&& 508 | &&&&&&&&&&&& $ & X X . . x&:&&&&&&&&&&&&&&&&& 509 | &&&&&&&&&& &$ &&&&&&$ X&&&&&&+xXX .;. &&&&&&&&&&&&&&&&& 510 | .&&&&&&&&& X&&&;& &&&&&$&& + &&& .&&&&:..x. + &&&&&&&&&&&&&&&& 511 | &&&&&&&&& . ;X &&&&&:. & &&&&&&&&&&&&&&& 512 | &&&&&&&& . : .. : :&;:;& : ; &&& :. &&&&&&&&&&&&&&& 513 | && &&x .; .. X ;.; + : x : .. ..X &&&$ $ &&&&&&&&&&&&&&& 514 | & &&+;. .: ..+. ; . ; ;; ;+x;: .. ; . &&& &&&&&&&&&&&&&&& 515 | ;&&$ &$: . . : .;:.;+x: :. : .+ : .; &&+&&:&& &&&&&&&&&&&&& 516 | .+ : + :.::; : . ;..: x X ;&. &&&&&&&&&&&&& 517 | :++x. ;;X ;.. xx .&&&&&& .+ $ : . &&x &&&&&&&&&&&&&& 518 | ::&+ X&X.+ . . &xX&&&x &&&&&&&&&&&&:x. .& +& & &&&&+X &&&&&&&&&&&&& 519 | :x ;.. :.: $..&&&&&&&&&&&&&&&&+ & ; X .&&&&&&&&&&&& 520 | :+ ::+;$& .. ; &&&&&&&&&&&+ .&&X&$ & :.+ &&&&&&&&&&&&&&& 521 | $. && . : : X&x&&&&&& ; x&&& . &&&&&&&&&&&&& . 522 | . x+;+ & x+ :& :: ;&&&&&&&& :; X &&&& +&+. &&&&&&&&&& . 523 | . :. &+& + : + &&& +& &&&&& &&&&&&&&&&& : 524 | .. : &&&&&;X;;x+:;x :&&& .& &X &&&&&&&&&&&&&&&&&&&&&& .. 525 | .. . &&&&;. :&$ . &&&&&+ &&&&&&&&&&&&& &&&&&&&&&&& ;.. 526 | . . . && ;: x+ ;:: :&&&&&&&&&&&&&&+;x&&&&&&&&&& :: 527 | . ..... . &;: :+. &.+. &&&&&&&&&&& . . 528 | . : . . X&:X$: . ;. X :x. &&&&$ && .:. x.. 529 | . : .... . : &;X$&......+ .... . +:;; :: . .. 530 | :. .:.... . : : :.&X:.X;:::.:+ +;; .;;:;. ;. . ;. . 531 | !--FRAME--! 532 | &&&&&&&&&&&& 533 | ................ &&&&&&&&&&&&&&&&&&&&&&&&&& ............... 534 | ............. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .......... . 535 | ......... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .......... 536 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ......... 537 | ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... 538 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&X ..... 539 | .... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 540 | ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 541 | .. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. 542 | . &&&&&&&&&&&&& $&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 543 | &&&&&&&&&&&&& x & &&$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 544 | &&&&&&&&&&&& ; . ; x&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 545 | &&&&&&&&&&&&&+ : :. . :;&&&&&&&&&&&&&&&&&&&&&&&&&& 546 | &&&&&&&&&&&&;X: . . :. :.. . : .:. &&&&&&&&&&&&&&&&&&&&&&& 547 | &&&&&&&&&&&&: . x;. ;:.. +.;.. ; . :. . &&&&&&&&&&&&&&&&&&& 548 | &&&&&&&&&& ;.. . ...:.: ;.. : . . &&&&&&&&&&&&&&&&&&& 549 | &&&&&&&&+ ;: & . +;;+:.:;:: &&&&&&&&&&&&&&&&& 550 | &&&&&&&+ . & & x ; &&&&&& & :+ .. ; + . &&&&&&&&&&&&&&&& 551 | &&&&&; x+ &&&&&&&+ &&&&&X&&&;&&&&&&x : . ; . . &&&&&&&&&&&&&&&& 552 | &&&&& Xx+&; &&&&&&&$&& &X &&&&&+ : $ ;;+.; x&&&&&&&&&&&&&& 553 | &&&&&x : &&&&&&x& : &&&& &&&& & . &&&&&&&&&&&&&&x 554 | &&&&; . ... :..:$ X& : &&&&& &&&&&&&&&&&&&& 555 | && + .. . .. ::&. & $. ; $ +&&&&&X&&&x x&&&&&&&&&&&&& 556 | &x ..:.X ; ;;..: &&&+ :;: + . + &&. ; +&&&&&&&&&&&&& 557 | : & . ;;.+ :+....;: ; . +. ;. &&&& :&&&&&&&&&&& 558 | : .; . : ; .; :;. :x.:;x + . ;;: && && &&&&&&&&&&& 559 | :::.+::.:. . :: .. . : :: X:;$ &+ & &&&&&&&&&&&&&& + 560 | .+: .;. ; ; x : $:+++.&x+ . . : X&&&&&&&&&&&& :+ 561 | x:::;.. &&&&. &&&&&&&& .. .;.;&.. ;.: .&&&&&&&& 562 | .:.. +;: ;.. ;&&&&&&&&&&&&&&&. . .+ .&&&&&&&&& .. . 563 | . . . x : . &&&&&&&&&&&&&x ++$$x &&+ &&&&&&&&& ..... 564 | ..:. .. .;$$;. &&&&&&&&& $+X&$ &&&&& ;.&&&&&&&& . . 565 | . .:: . X&&+: &&&&&& :;&& &&&&&&&&&&&&&&& .. x .. .. 566 | .. .. ; : XXx; &&&&& . . .&&&&&&&&&&&: ... . .. ; 567 | : . . : :. :; &&&&& &&&&.X X : .... . . 568 | ... .: ... : : . &&&&&&&&&& . . : . : ....: 569 | !--FRAME--! 570 | x&&&&&&&&&&& 571 | ............ . . &&&&&&&&&&&&&&&&&&&&&&&&&& .......... .... 572 | .......... . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ......... 573 | ........... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . ........ 574 | .... .... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ....... 575 | . ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... 576 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 577 | .... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . . 578 | .. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 579 | .. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 580 | . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 581 | &&&&&&&&&&&&&& $&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 582 | &&&&&&&&&&&&& . && &$x:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 583 | &&&&&&&&&&&&&& : x: &;&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 584 | :&&&&&&&&&&&&&& .. : .: &&&&&&&&&&&&&&&&&&&&&&&&&& 585 | &&&&&&&&&&&&&&&x . . ::;. ;. . . + &&&&&&&&&&&&&&&&&&&&&&& 586 | &&&&&&&&&&&&& ; ::+ ;:+:. .:::; . : .:&&&&&&&&&&&&&&&&&&& 587 | &&&&&&&&&&&& + :;: ;: : : : + &&&&&&&&&&&&&&&&&&& 588 | &&&&&&&&&& : x; : ; :$ x::+;x. X&&&&&&&&&&&&&&&&& 589 | &&&&&&&&& & & &&&&&& & +&&&x ; X:+&&&&&&&&&&&&&&&&&& 590 | &&&&&&&x + &&&&&&&& &&&&$ &&. &&&&& &&.X . &&&&&&&&&&&&&&&&& 591 | &&&&&&; $+.$&+. .&&.$ &&& $ &&&&& . . &&&&&&&&&&&&&&&&& 592 | &&&&&&& x$&&+&&. & :&& : ;&&&: &+X ; &&&&&&&&&&&&&&& 593 | &&&&&&x : .;& x :. ;.: &&&&&&&&X &&&&&&&&&&&&&&&& 594 | &&&&; :: :; . ;:. X&&; + ..+ . &&&& . &&&&&&&&&&&&&$ 595 | &&&$&.: ; . : : +.+:. x;... . ;.; &$ &&&&&&&&&&&&&& 596 | &&X :..:;; + .. ;:+: ;: ; ; +$:$&&&& +&&&&&&&&&&&&&&& 597 | . &: : :.: .. :. .;. :.X++ $ +:.; ; :&&&&&&&&&&&&&&& 598 | . :&X ... : &: x:x ; : .+ $&&&&&&&&&& : 599 | . + + ;;+&&&&&& :&&&&&&&& X ;;; &&&&&&&&&&& 600 | ... :$$+ .+. x;&&&&&&&&&&&&&& &&$ &&. &&&&&&&&&&&&& . . 601 | ..... &&. . : :. &&&&&&&&&&& X&xX &&&&& X &&&&&&&&&&&& . ... 602 | ...... &x:++ . &&&&&&&& ; & :+&&&&&&&&&&&&&&&&& .... 603 | ........ ;++::Xx+& &&&&& . $&&&&&&&&& $&& ....... 604 | .......... +$&xX..Xx &&&& &&&&& :. & :&& . ........ 605 | ............ X:&: : : +&&&&&&&&&&&& $ & . ...... .. 606 | ..... . ...... . . $X$X;$ :x;:+x .... ........ 607 | ..... . .. . :;.$&x+:X$$X.;::+;: ...... ; .. . ... 608 | !--FRAME--! 609 | &&&&&&&&&&&& 610 | ................ &&&&&&&&&&&&&&&&&&&&&&&&&& ....... ... . 611 | ............ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ............ 612 | .... ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ......... 613 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..... . 614 | ....... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&: ...... 615 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 616 | ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 617 | ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 618 | .. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 619 | &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 620 | &&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 621 | &&&&&&&&&&&&&&& X :&:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 622 | &&&&&&&&&&&&&& : .; &&:&&&&&&&&&&&&&&&&&&&&&&& 623 | &&&&&&&&&&&&&&&& + :. : . ::. :. $&&&&&&&&&&&&&&&&&&&&&& 624 | &&&&&&&&&&&&&&&$ : .:. ;.:. .: . : ;; &&&&&&&&&&&&&&&&&&&& 625 | &&&&&&&&&&&&&& . + .. + ; .$ &&&&&&&&&&&&&&&&&& 626 | &&&&&&&&&&&&$ x x X$& X&$ &&; .. :: ;+X&&&&&&&&&&&&&&&&&& 627 | &&&&&&&&&&; & &. x+&&&$&&& &&&& X&&; &&&&&&&&&&&&&&&&&& 628 | &&&&&&&&&& ; &&&&&&$& &x &&&& ; X&&&& x: ; x&&&&&&&&&&&&&&&&& 629 | &&&&&&&&&& +x&&X &&. & ; &&&&&&&$ &&&&&&&&&&&&&&&&& 630 | &&&&&&&&& & .:++$&x&:: .:; &&& +&&&&&&&&&&&&&&& 631 | &&&&&&&& X + ; :: . ; $+. :. :. . : . && X &&&&&&&&&&&&&&& 632 | &&&&&&&& ..:.. ; . X : ; ..: :::+; &;&& &&&&&&&&&&&&&&&&& 633 | &&&&&&&: . :; :+ ; :.. & ++ ;+x . &&&&&&&&&&&&&&&& 634 | &&&& x+.; .. . . . + .: : .. &&&&&&&&&&&&& 635 | &$ &; +& :::+ &&&&&&&&&X$x + && x .&&&&&&&&&& && : 636 | : & && x +.;.&.&&&&&&&&&&&&X :x&+x&&&&: +$&&&&&& x& ;. 637 | .. +&& +++&&&&&&&&&& +&; &&&&&X&;&&&&&& &X$&&& . 638 | . . .&&x;;$&$& ..: &&&&&&& : : &&&&&&&&&&&& x &X& . 639 | .:... .x &+ X++ &+ &&&x&& &&&&&&&& +& +; .. . 640 | : . ; ;.;: x. .& &; $X x&&&&&&&&&&&&& + X&& . . 641 | ..... &&&&&&&x+.: :; &&& :; . &&+ . . .: 642 | . :..:: &&&&& X x X:xx&+ ; ;. : &&& .. . . . 643 | ..... . : &xX:x:x ;x x; + +x+ . .&&&& . : . ; 644 | ..; : x . +;.X&xXXXx$x:;X.X.++&&&&. . . : :. 645 | !--FRAME--! 646 | &&&&&&&&& 647 | ................ &&&&&&&&&&&&&&&&&&&&&&&&& ............... 648 | ............. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .............. 649 | .......... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .......... 650 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ......... 651 | ...... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ....... 652 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..... 653 | .... &&&&&&&&:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 654 | ... &&&&&&&&& &&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 655 | .. &&x&&&&&&& &&&& && :;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. 656 | . &&& &&&&&: &&& :. . +&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 657 | &&&&& $&&&& &&& &+ x : ; $ .&&&&&&&&&&&&&&&&&&& . 658 | &&&&&&& &&&& &&& && & .. & X&$&&&&&&&&&&&&&& . 659 | &&&&&&& &&& && &&&: + :.:+:.;. :..: &&&&&&&&&&&&&& 660 | &&&&&&&&& &&x && && X. .. : : &&&&&&&&&&& 661 | &&&&&&&&& . & & : ; X +& & ; :&&&&&&&&& 662 | & &&&&&& :::.&::. . :&+ &&$; XX&&&x:&&& &&&&X. &&&&&&&& 663 | &&& &&& :.:: . ... + ;;.+&&&&&&&&++& &&&&: X& ;&&&&&&& 664 | &&&&&& ::;.:.:;::;. ;& &&; $ & +&&& :&&&&&& 665 | &&&&&&& ::..:: .; .;:; ::: . . +. ;: :. X&& & &&&&&& 666 | &&&&&&&& ::: ..: ;. .: .; ;: ... ;:.;.:&&$ : ; . +&&& X&&&&& 667 | &&&&&&&& .. .:::::;:.; : .;: .;..+: .: : . ;X:+:. & & .&&&&& 668 | &&&&&&& + ;: ; ; . .: ++ .. X; . : :;x: &&&&&&& 669 | &&&&&& ; ;:.$::. :+;. .: . &&&&&&:& +x:; $x& ;x&&&& . 670 | &&&&; :;;. . x ;. + & .:;:+ ;&$ &&&&&&&&&&&& X&xXx &&&&& : 671 | . &&& ;.;:x; .;:..: : .&&$&;;&&&&&&&&&& . & :& &&& . 672 | : .& x.+:& + :: .: .; &&&&&&&&&.&&&& +.. && & : . 673 | :. &X.. .:; x; +; :..+X&+ &&&&&&&&& && .. && X& . . 674 | . +; +Xx ;.. .&.& : ..: . .;++& :&&&&& &&&& & . . 675 | .:. X;. .. + && .. :::.;. . ;$&&&; &&&&&& + 676 | ; .. +:.; . :..$ :.. . . :.: X&&&&&&&&&&&$&&&&&&& : : x: 677 | .: . .. ;+. x++ ;&+ +. . : .. .&&&&&&&& && . .:.. 678 | .. . .. ++: .xx:x ;: :&x. x... .. & : . . 679 | ;:. : .: : . &&&.&& X;&x :+ x .:::...: . &.: .. . . :.. 680 | :: .. ..: &&&&&X&: : ;; Xx$: $ ;:.xx++ . + ..... . ..: . 681 | :.. : ..: . :X$&x&xXX++ +:::+; . . . : . . :.: 682 | !--FRAME--! 683 | &&&&&&&&&&&&&&&& 684 | ............... &&&&&&&&&&&&&&&&&&&&&&&&&&&& ............... 685 | .. .. :. . .&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... ....... 686 | . ... . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .......... 687 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ........ 688 | ...... &&&&& &&&&&;X&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... 689 | ..... &&&&&& &&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..... 690 | .... &&&&&&& &&& . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 691 | ... & &&&&& &&& &&&&&&&&&&&&&&&&&&&&&&&&&&& &&&&&&&&&& .. 692 | .. &&& &&& &&& &&& $&$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 693 | &&&&& &&& &&& &&& ; +&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 694 | &&&&&& && && &&& . & &&&&&&&&&&&&&&&&&& 695 | &&&&&&&& &&&& :.::.:. . :: x X+&&&&&&&&&&&&&&& 696 | &&&&&&& ; + .. . &&$ : x.: . ..+. .:. ..:. &&&&&&&&&&&&& 697 | & &&&& ;.x :;+ : : : : &&&&&&&&&&& 698 | &&& ; .::;..:... ..; x & &&&&&&.&:x&&&X &&&&&&&&& 699 | &&&&&& .::+. ::.:;: X:&&&.&&:&; ;&&&&& ;& &&&& . &&&&&&&& 700 | &&&&&&& + + ..: : ;&&x &&&&&&$+ && . x&&& &&&&&&& 701 | &&&&&&&& X + : : .;X +;&&+x . . :XX : +; && &&&&&& 702 | &&&&&&&& .:+; x;:X : : + :.;:. : : : ;: &&&.x &&&&& 703 | &&&&&&&& . : ; + : : :.:.:; .:;X ;.;:. && &&&&& 704 | &&&&&&&& . ++;:+;.:;....:+:.; +. ;. ..:+.. x &..+;& ;&X&&&&& 705 | &&&&&&&& +. .:: ;. .:+ .; : .... : ;X.x;. &&;&&&&& 706 | &&&&&& : ; &..+ x; :: :; X x;&&$.: &&&&&&&&&&;; : &&&&& 707 | &&&&&$ ::: ;.:: $ : . :..: : &&&&&&&&&&&& ;&&&&& &&&&& 708 | &&&& ; .:. X:. .+: . . : x&&&&+$:X&&&&X&$ && &&& 709 | &&& ::+:.:..: X. :.: x ; x&&&&&&&X&&&&&& ; ; x &&& X& 710 | . && :. : . :;&x; ;.....;&&x &&&&x &&&& &&: . . && $& . 711 | . && : : .;.X : &; : : : X. &::&& &&X .. x&&&&&&& . ; 712 | .:. x;;.+ ; ; x+; :.: ..:. &&&&&&. &&&&&&& . 713 | . .:.::..+ + ; &. ...: :.:..:. :&&&&&&&&&&&&&&&&&&&& . .. 714 | :..: . . ;;.: :&&& ; : ; .. . &&&&&&&&& & .... .. 715 | . :..: x . &:.: &... :. ;:: : .&& ...:. 716 | ... .: : ;$;; x$&:& ;:;; x. + . ;;+ : + && .... . . 717 | : . . ; . &&X;$&+$:&&$x.$;+&X+xX.; .. x+x:. . .: . ; 718 | . ...: .: .. x&&&&x& :.:;+ x :x::$+.: . :.:. ; . 719 | !--FRAME--! 720 | &&&&&&&&&&&&&& 721 | ............... &&&&&&&&&&&&&&&&&&&&&&&&&& ............... 722 | ............ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ............ 723 | .......... &&&&&x&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ......... 724 | ........ .&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ....... 725 | ..... & &&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... 726 | ..... && : &&&& .: &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..... 727 | .... &&&& . &&&& .. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 728 | . . &&&&& &&& . &&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. 729 | . &&&& &&& &&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 730 | . & &&& +&&& &&&& ;&&&.&&&& &&&&&&&&&&&&&&&&&&&& . 731 | &&& &&&& :+.:; + & & &&&&&&&&&&&&&&&&& 732 | &&&&& ; . .:. &&& : ; ;. + +; : : & &&&&&&&&&&&&& 733 | &&&&& ; ; :+;:. & :..: ..: : &&&&&&&&&& 734 | &&&&& :;:: .:.;. ..;:. : : : &&&&&X&;&&&&.; &&&&&&&&& 735 | ;+; : ;:. . : . : + & x&&&X; &$& &&&&&+X: ; :&&&&&&& 736 | &&: ; ; +. ;::: x&&&&&&&&$X& X&& &&&: +&&&&&& 737 | &&&&&X :.:;:.: :::: $&&; ; &&&&& . : ;.& .&$ x&& x&&&&&& 738 | &&&&&&& .:: :.:. .. :.:X&&&&+; . .: : :: .: &&&x&&&&&& 739 | &&&&&&& . ::;. + ;; X$ . ;....: ... :.; . ....x .& :&&&& 740 | &&&&&& :.: . . .: .. ;.;. xx:+:;;: ; & & &&&&&& 741 | &&&&&& :.+ . & x ;; :;: ;: .& . &&&&&&&&$::&&& &&&&&& 742 | &&&&&& . :: + .::;.: ;.:..; +XX&&&x;; &&&&&&&&&&&: . & x& &&&& 743 | &&&&& . :;... :.. ..:. . .; &X &&&&&&&&&&&&& : & &&& 744 | &&&& :.. . ; X:+:.+:. ..... &&Xx&;.;x&&&&& : :.. & && 745 | &&&: + ..::+ : : . ::;.:.: &&&$&&&&&&&&&&& &&+ .. &&&.& 746 | . && .. .... . x& ..: : ;&&&&&&&& &&&&&& +: : &&&&x 747 | &;:: .;..; .+ : &: :: ::. x&&; &$& . . .. &&&&&& . 748 | + . X.& ;; :. & & ; .... + . +;X &&&&&; : &&&&& .:. 749 | + x .;..::. . &+ ;: :. + &+&&&&&&&&&&&&&&&&&&&&& .. 750 | .: .: ; ; : ... + $ .. : .;. :.;. &&&&&&&&&&&&&&& & .. . 751 | .. . . :: : ; : &: ;&. ::;:. .. x : &x&&.& .. . 752 | :. . . .:;.:x +&&&$ + x..:. . + :. : : .;: .:. 753 | : : ...;.. .+ $ $ . $ . x.: ; +. :;. : +:. :..++: :: : . :. 754 | . .: . . .:. ;;&&&&.&X... :x :: +.;.:. x x; . : ..; 755 | : .. . .::. . X&&&&x&&.;;+:.XX&+: . :;;. . . : . ; .. 756 | !--FRAME--! 757 | &&&&&&&&&&&&&& 758 | ............... &&&&&&&&&&&&&&&&&&&&&&&&&& . ........ ..... 759 | . ... ... ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . .......... 760 | ....... . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . ........ 761 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... 762 | ...... &&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&. . ... 763 | ..... &&&&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. 764 | .... &&&&&&&+ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 765 | .. && &&&&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. 766 | .. &&& &&&&&& .:. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 767 | . &&&& &&&&& . && : ;&&&&&& && &&&&&&&&&&&&&&&&&&&& . 768 | &&&&& &&&&& : &&& . &; + & & x&&&&&&&&&&&&&&&& 769 | &&&&&&& &&&&& &&&& :. . : ... + . &&&&&&&&&&&&& 770 | $&&&&& &&&& &&&&; :. : . :: .&&&&&&&&& 771 | &&x&&&. &&&$ &&&&x .: : x ::.. ; &&&&& &&&&&&xX &&&&&&&& 772 | &&& $ + : &&&; $. &. . &&&&x.&&&: &&&&&:;x x &&&&&&& 773 | &&& .; ;. &&& :. :;& XX ;;&&&; && + .:&&& &&&&&& 774 | &&& : ..;+ :: X$&&&&&&&$&+ & : + X&+ && &&&&& 775 | && +.::;. ::;:: x.: &&&&x . + ; :.+ + . .:.: & &&&&;&&&& 776 | ;.:+; .: :.. ...+ +x&&+X .. :;;. . : : ; .;; && &&& 777 | && . ;.;.+. :;. : : .+.:;: ;:. + & ..+ +XX & &&&&& 778 | &&& ... :. ;. :..:.: + ; . ;.:.;;;: +;:: + x+ . & &&&&& 779 | &&&& ;::+:.: :;:..:; : . + + . . &&&&&&&&&& +&&&&&& &&&& 780 | &&& : .:.:. ; :.x::;::.++x&+XX. &&&&&&&&&&&& && 781 | &&&& ..;x :::.::: x: ;; .; ;+ ; &&&&&&&&&&&& ; . & & 782 | &&& :+ : ;; ;: : ; : :. .... : x&&&&&&&$&&&&&&&& .:.: ; && 783 | &x : +: ;.::.X . :...: ; : .&&&&&&&&&&&&& &&&$ .&&& 784 | ; $.;:. ; ; &. ::;;..x:; .; ;&&&&&&&&$:&&&&&&x &x;.: +&&& . 785 | . x. ..++ .x . .. ..+Xx: .&&&: +:&&&& x: 786 | . .. x:.:. : :.:;&+ x:::; + ;; ; & x&&&&&. .&&& : 787 | . . . :;.....:. xX: :: . . : :. &&&&&&&&&&&&&&&&&& . . 788 | . ... ;;:::.. X&+ .+: ::..:..:.+. X&&&&&&&&&&&&&&x :. : 789 | .: . : ;: :;; x ; x&$ .. :. ::. . . & $x : ; . 790 | ... .: . :.:x.x && ;; : ........ : .. : .... : . 791 | : ; .. . x&&&&x. x; .: . . ; .: :+.;:: . . . 792 | . :..:: .:.. &&&&x$X;+X : ..&X; x:;x:; . ; . ..: ;. 793 | !--FRAME--! 794 | &&&&&&&&&&&&&& 795 | . ....... ... &&&&&&&&&&&&&&&&&&&&&&&&&& . :.... : . .. 796 | ... ... ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ....... ... 797 | .:. .... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... : 798 | . . . . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&X . .. 799 | . .. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$ ...... 800 | ...: &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 801 | .. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 802 | ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 803 | . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 804 | &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 805 | &&&&&&&&&&&&&&&&&&& . $&&&&X&&:& &x&&&&&&&&&&&&&&&&&&& 806 | &&&&&&&&&&&&&&&&&&+ ; x+ &&&&&&&&&&&&&& 807 | &&&&&&&&&&&&&&&&&&& : ; : . ;: : & &&&&&&&&&& 808 | &&&&&&&&&&&&&&&&&&&& + :.;::.;: . : : ;..: ; .;. &&&&&&&& 809 | &&&&&&&&&&&&&&&&&&&&& ; ; : .. .::: : : . &&&&&&& 810 | &&&&&&&&&&&&&&&&&&& . .: . x : ;:& $;&;X&&& ; : x &&&&&& 811 | &&&&&&&&&&&&&&&&&&& .. X; ; x $.&$&&&&&&. &&&&&: $& &&&&& 812 | &&&&&&&&&&&&&&&&&& . :$ &; &&&&& & &&&&&.. &&& .&&& 813 | &&&&&&&&&&&&&&&&& : :x& ;&&&&X$$:&&$x ;;+ &&&&.+&&& 814 | &&&&&&&&&&&&&&&: . $&&&&&&&&&&;+: . &$ ..:. &&&&& && 815 | &&&&&&&&&&&&&& .&&Xx:;+ &;:+ .: : x. :. . . ; + &&&& 816 | &&&&& &&&&&& & ;:;+X;&&&&&&: . .:; : $&&; ;.+;.; . . &x&& 817 | &&&& &&&&& &&+ :: ;. . : .;+. .;;:;:$x&&&& 818 | &&&& &&X+:+ &: . . : ... : ::::;.; . : .. .: $&++ && 819 | &&&& && $X; + ... :.:.:+. :: . ::; + X+ :x : 820 | &&& x x&&x : ::;. ...;.:.. ::::.;: ;&&&&&&&&& ; X$&&& 821 | & ; &&& ; $. +:+.: &&&&&&&&&&&& .X&& & .. 822 | .: ;. ;. : ..;$..: .. ;::X:X &:.x : &&&&&&&&&&&&& & . . 823 | ... ; . ;. &: :... ... ; . ;$.&&&&$&;&&X+&&&&&&&& : +:: :.. 824 | . .. :.. .; & :. . .:: :. . .; &&&&&&&x&&&&&&&&& .:: . . 825 | . . . . +;+x++X x ;.;;.:::;;:;+++:&&&&&&&&&&&&&&& &&&&xx+ . : .. 826 | . .:.; : ;;.& ;.:. : . ; X&xX&+ &&&&&: x:X &. ... .. 827 | ..: .. . ;+$ ; . : :x.:.. :x $&&&&&&$&+&&& : .. 828 | . ..; . . .&&& . :. : ; .+. &&&&&&& ... :.x : .. 829 | . . ...; : +&X;;:;x .; . :.: . .. ... . 830 | !--FRAME--! 831 | &&&&&&&&&&&&&& 832 | ........... ... &&&&&&&&&&&&&&&&&&&&&&&&&& ....... ....... 833 | ............. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ..... . ..... 834 | .......... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . ....... 835 | ........ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ........ 836 | ...... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ...... 837 | ..... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 838 | ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .... 839 | ... &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ... 840 | .. &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& .. 841 | . &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& . 842 | &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 843 | &&&&&&&&&&&&&&&&&&& : &&&&&x . & &X&&&&&&&&&&&&&&&&&& 844 | &&&&&&&&&&&&&&&&&&X .:&+ &&x&&&&&&&&&&& 845 | &&&&&&&&&&&&&&&&&&& ..: . . ...:..:. ;:;. : :&&&&&&&&&$ 846 | &&&&&&&&&&&&&&&&&&& ;+.;:: . +. ; .. :.:. ;: . +&&&&&&&& 847 | &&&&&&&&&&&&&&&&&&&& X : + . :..:; x .. .; &&&&&&& 848 | &&&&&&&&&&&&&&&&&&&&X+ ;; . :;+: . + :.&+ &&&; + &&&&&& 849 | &&&&&&&&&&&&&&&&&&&& . ::. ; ;;+: ; Xx&&&&&& &&&&& ::;:&& &&&&& 850 | &&&&&&&&&&&&&&&&&&&: : ; :& :&&&X. . && &&&&$ &&&x &&&&& 851 | &&&&&&&&&&&&&&&&&& . x& &+x $&x&&. :x&&: ;. &&&&x &&& 852 | &&&&&&&&&&&&&&&X :&&. &&&&$&&&; x &; x &: &&&&& &&& 853 | &&&&&&&&&&&&&&& +$ $&X&&&&&&&& :x. ; ...+ ;x. &&&&& 854 | &&&&&&&&&&&&& +x&&&&&&: ;& . ..: & .& :: : :. X; &&;&& 855 | &&&&&&&&&&&&.&$:: $;& &&&&& :.; : .&$ . ;. .:: &: +X&&& && 856 | &&&&&&&&&&&X . .$. ;. :: :x:;. . ; .. + +:; X$+ & 857 | &&&&&&&&&& & +::: ..:;:: : :. :. .::+ ; : + +& ; 858 | . &&&&&&&&&:: + .. ;: .. .::;.:..+ . . &&&$ $: Xx; &&$ 859 | . &&&&&&&$;& : ;+::;:+::; : ; .. +;X$; &&&&&&&&&& ++X&&& : 860 | . . &&&&&; && : . . .. . :. . &&&&&&&&&&&+ .$&; .. 861 | .. &&&&: $X :;;;...++.; : x$x&&&&&&&&&&&&& . . 862 | ..... && :x: :: .. :::x&&&&&&&&&+ &Xxx&&&&&&X .:;. : .. 863 | ...... : ++.; .:::: .. . &&: x &&&&&&&&&&&&&&& .x ... 864 | ........ : &&x; ... :; :.:&. $X+;X&&&&&&&x&&&&&&&&&; . ...... 865 | ...... : .. X&:$. ..; .:. ;;x& .: &&&&&&+ &+ . . ..... . 866 | ... . :...... :&x.x ...:.:. :X &&&&&&&& ... .. : 867 | .. ; . . :.... .&& +. $+:. . ...... .... 868 | .. .. . ... . xXx&&&&&x&X :;$$x x . ... . .... 869 | -------------------------------------------------------------------------------- /colors.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "github.com/nsf/termbox-go" 4 | 5 | var colors = []termbox.Attribute{ 6 | // approx colors from original gif 7 | termbox.Attribute(210), // peach 8 | termbox.Attribute(222), // orange 9 | termbox.Attribute(120), // green 10 | termbox.Attribute(123), // cyan 11 | termbox.Attribute(111), // blue 12 | termbox.Attribute(134), // purple 13 | termbox.Attribute(177), // pink 14 | termbox.Attribute(207), // fuschia 15 | termbox.Attribute(206), // magenta 16 | termbox.Attribute(204), // red 17 | } 18 | -------------------------------------------------------------------------------- /draw.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "slices" 6 | 7 | "github.com/nsf/termbox-go" 8 | ) 9 | 10 | var frame_index = 0 11 | var color_index = 0 12 | 13 | func reverse(lines [][]byte) [][]byte { 14 | slices.Reverse(lines) 15 | return lines 16 | } 17 | 18 | func draw(animation Animation, orientation string) { 19 | termbox.Clear(termbox.ColorDefault, termbox.ColorDefault) 20 | lines := bytes.Split(animation.Frames[frame_index], []byte{'\n'}) 21 | 22 | if orientation == "aussie" { 23 | lines = reverse(lines) 24 | } 25 | 26 | for x, line := range lines { 27 | for y, cell := range line { 28 | termbox.SetCell(y, x, rune(cell), colors[color_index], termbox.ColorDefault) 29 | } 30 | } 31 | 32 | termbox.Flush() 33 | frame_index++ 34 | color_index++ 35 | if frame_index >= len(animation.Frames) { 36 | frame_index = 0 37 | } 38 | if color_index >= len(colors) { 39 | color_index = 0 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/jmhobbs/terminal-parrot 2 | 3 | go 1.22 4 | 5 | require ( 6 | github.com/mattn/go-isatty v0.0.4 7 | github.com/nsf/termbox-go v0.0.0-20181027232701-60ab7e3d12ed 8 | ) 9 | 10 | require ( 11 | github.com/mattn/go-runewidth v0.0.3 // indirect 12 | golang.org/x/sys v0.24.0 // indirect 13 | ) 14 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= 2 | github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 3 | github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= 4 | github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= 5 | github.com/nsf/termbox-go v0.0.0-20181027232701-60ab7e3d12ed h1:bAVGG6B+R5qpSylrrA+BAMrzYkdAoiTaKPVxRB+4cyM= 6 | github.com/nsf/termbox-go v0.0.0-20181027232701-60ab7e3d12ed/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ= 7 | golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= 8 | golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 9 | -------------------------------------------------------------------------------- /inventory.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "os" 5 | "path/filepath" 6 | "strings" 7 | ) 8 | 9 | type Inventory map[string]Animation 10 | 11 | func (i Inventory) LoadFromPaths(paths []string) error { 12 | for _, path := range paths { 13 | files, err := os.ReadDir(path) 14 | if err != nil { 15 | if os.IsNotExist(err) { 16 | continue 17 | } 18 | return err 19 | } 20 | 21 | for _, file := range files { 22 | if !file.IsDir() && strings.HasSuffix(file.Name(), ".animation") { 23 | animation, err := LoadFromFile(filepath.Join(path, file.Name())) 24 | if err != nil { 25 | return err 26 | } 27 | i[strings.TrimSuffix(file.Name(), ".animation")] = *animation 28 | } 29 | } 30 | } 31 | 32 | return nil 33 | } 34 | 35 | func NewInventory() Inventory { 36 | return Inventory{ 37 | "parrot": Animation{ 38 | Metadata: map[string]string{ 39 | "description": "The classic Party Parrot.", 40 | }, 41 | Frames: [][]byte{ 42 | []byte(` .cccc;;cc;';c. 43 | .,:dkdc:;;:c:,:d:. 44 | .loc'.,cc::::::,..,:. 45 | .cl;....;dkdccc::,...c; 46 | .c:,';:'..ckc',;::;....;c. 47 | .c:'.,dkkoc:ok:;llllc,,c,';:. 48 | .;c,';okkkkkkkk:,lllll,:kd;.;:,. 49 | co..:kkkkkkkkkk:;llllc':kkc..oNc 50 | .cl;.,okkkkkkkkkkc,:cll;,okkc'.cO; 51 | ;k:..ckkkkkkkkkkkl..,;,.;xkko:',l' 52 | .,...';dkkkkkkkkkkd;.....ckkkl'.cO; 53 | .,,:,.;oo:ckkkkkkkkkkkdoc;;cdkkkc..cd, 54 | .cclo;,ccdkkl;llccdkkkkkkkkkkkkkkkd,.c; 55 | .lol:;;okkkkkxooc::loodkkkkkkkkkkkko'.oc 56 | .c:'..lkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkd,.oc 57 | .lo;,ccdkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkd,.c; 58 | ,dx:..;lllllllllllllllllllllllllllllllloc'... 59 | cNO;........................................ 60 | `), 61 | []byte(` .ckx;'........':c. 62 | .,:c:c:::oxxocoo::::,',. 63 | .odc'..:lkkoolllllo;..;d, 64 | ;c..:o:..;:..',;'.......;. 65 | ,c..:0Xx::o:.,cllc:,'::,.,c. 66 | ;c;lkXXXXXXl.;lllll;lXXOo;':c. 67 | ,dc.oXXXXXXXXl.,lllll;lXXXXx,c0: 68 | ;Oc.oXXXXXXXXo.':ll:;'oXXXXO;,l' 69 | 'l;;OXXXXXXXXd'.'::'..dXXXXO;,l' 70 | 'l;:0XXXXXXXX0x:...,:o0XXXXk,:x, 71 | 'l;;kXXXXXXKXXXkol;oXXXXXXXO;oNc 72 | ,c'..ckk2XXXXXXXXXX00XXXXXXX0:;o:. 73 | .':;..:dd::ooooOXXXXXXXXXXXXXXXo..c; 74 | .',',:co0XX0kkkxx0XXXXXXXXXXXXXXX0c..;l. 75 | .:;'..oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXko;';:. 76 | .cdc..:oOXXXXXXXXKXXXXXXXXXXXXXXXXXXXXXXo..oc 77 | :0o...:dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxo,.:, 78 | cNo........................................;' 79 | `), 80 | []byte(` .cc;. ... .;c. 81 | .,,cc:cc:lxxxl:ccc:;,. 82 | .lo;...lKKklllookl..cO; 83 | .cl;.,;'.okl;...'.;,..';:. 84 | .:o;;dkx,.ll..,cc::,..,'.;:,. 85 | co..lKKKkokl.':lllo;''ol..;dl. 86 | .,c;.,xKKKKKKo.':llll;.'oOxo,.cl,. 87 | cNo..lKKKKKKKo'';llll;;okKKKl..oNc 88 | cNo..lKKKKKKKko;':c:,'lKKKKKo'.oNc 89 | cNo..lKKKKKKKKKl.....'dKKKKKxc,l0: 90 | .c:'.lKKKKKKKKKk;....oKKKKKKo'.oNc 91 | ,:.,oxOKKKKKKKOxxxxOKKKKKKxc,;ol:. 92 | ;c..'':oookKKKKKKKKKKKKKKKKKk:.'clc. 93 | ,dl'.,oxo;'';oxOKKKKKKKKKKKKKKKOxxl::;,,. 94 | .dOc..lKKKkoooookKKKKKKKKKKKKKKKKKKKxl,;ol. 95 | cx,';okKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKl..;lc. 96 | co..:dddddddddddddddddddddddddddddddddl:;''::. 97 | co..........................................." 98 | `), 99 | []byte(` .ccccccc. 100 | .,,,;cooolccol;;,,. 101 | .dOx;..;lllll;..;xOd. 102 | .cdo,',loOXXXXXkll;';odc. 103 | ,oo:;c,':oko:cccccc,...ckl. 104 | ;c.;kXo..::..;c::'.......oc 105 | ,dc..oXX0kk0o.':lll;..cxxc.,ld, 106 | kNo.'oXXXXXXo'':lll;..oXXOd;cOd. 107 | KOc;oOXXXXXXo.':lol,..dXXXXl';xc 108 | Ol,:k0XXXXXX0c.,clc'.:0XXXXx,.oc 109 | KOc;dOXXXXXXXl..';'..lXXXXXd..oc 110 | dNo..oXXXXXXXOx:..'lxOXXXXXk,.:; .. 111 | cNo..lXXXXXXXXXOolkXXXXXXXXXkl;..;:.;. 112 | .,;'.,dkkkkk0XXXXXXXXXXXXXXXXXOxxl;,;,;l:. 113 | ;c.;:''''':doOXXXXXXXXXXXXXXXXXXOdo;';clc. 114 | ;c.lOdood:'''oXXXXXXXXXXXXXXXXXXXXXk,..;ol. 115 | ';.:xxxxxocccoxxxxxxxxxxxxxxxxxxxxxxl::'.';;. 116 | ';........................................;l' 117 | `), 118 | []byte(` 119 | .;:;;,.,;;::,. 120 | .;':;........'co:. 121 | .clc;'':cllllc::,.':c. 122 | .lo;;o:coxdlooollc;',::,,. 123 | .c:'.,cl,.'lc',,;;'......cO; 124 | do;';oxoc::l;;llllc'.';;'.';. 125 | c..ckkkkkkkd,;llllc'.:kkd;.':c. 126 | '.,okkkkkkkkc;llllc,.:kkkdl,cO; 127 | ..;xkkkkkkkkc,ccll:,;okkkkk:,cl, 128 | ..,dkkkkkkkkc..,;,'ckkkkkkkc;ll. 129 | ..'okkkkkkkko,....'okkkkkkkc,:c. 130 | c..ckkkkkkkkkdl;,:okkkkkkkkd,.',';. 131 | d..':lxkkkkkkkkxxkkkkkkkkkkkdoc;,;'..'.,. 132 | o...'';llllldkkkkkkkkkkkkkkkkkkdll;..'cdo. 133 | o..,l;'''''';dkkkkkkkkkkkkkkkkkkkkdlc,..;lc. 134 | o..;lc;;;;;;,,;clllllllllllllllllllllc'..,:c. 135 | o..........................................;' 136 | `), 137 | []byte(` 138 | .,,,,,,,,,. 139 | .ckKxodooxOOdcc. 140 | .cclooc'....';;cool. 141 | .loc;;;;clllllc;;;;;:;,. 142 | .c:'.,okd;;cdo:::::cl,..oc 143 | .:o;';okkx;';;,';::;'....,;,. 144 | co..ckkkkkddk:,cclll;.,c:,:o:. 145 | co..ckkkkkkkk:,cllll;.:kkd,.':c. 146 | .,:;.,okkkkkkkk:,cclll;.:kkkdl;;o:. 147 | cNo..ckkkkkkkkko,.;llc,.ckkkkkc..oc 148 | ,dd;.:kkkkkkkkkx;..;:,.'lkkkkko,.:, 149 | ;c.ckkkkkkkkkkc.....;ldkkkkkk:.,' 150 | ,dc..'okkkkkkkkkxoc;;cxkkkkkkkkc..,;,. 151 | kNo..':lllllldkkkkkkkkkkkkkkkkkdcc,.;l. 152 | KOc,l;''''''';lldkkkkkkkkkkkkkkkkkc..;lc. 153 | xx:':;;;;,.,,...,;;cllllllllllllllc;'.;oo, 154 | cNo.....................................oc 155 | `), 156 | []byte(` 157 | 158 | .ccccccc. 159 | .ccckNKOOOOkdcc. 160 | .;;cc:ccccccc:,::::,,. 161 | .c;:;.,cccllxOOOxlllc,;ol. 162 | .lkc,coxo:;oOOxooooooo;..:, 163 | .cdc.,dOOOc..cOd,.',,;'....':c. 164 | cNx'.lOOOOxlldOl..;lll;.....cO; 165 | ,do;,:dOOOOOOOOOl'':lll;..:d:.'c, 166 | co..lOOOOOOOOOOOl'':lll;.'lOd,.cd. 167 | co.,dOOOOOOOOOOOo,.;llc,.,dOOc..dc 168 | co..lOOOOOOOOOOOOc.';:,..cOOOl..oc 169 | .,:;.'::lxOOOOOOOOOo:'...,:oOOOc..dc 170 | ;Oc..cl'':llxOOOOOOOOdcclxOOOOx,.cd. 171 | .:;';lxl''''':lldOOOOOOOOOOOOOOc..oc 172 | ,dl,.'cooc:::,....,::coooooooooooc'.c: 173 | cNo.................................oc 174 | `), 175 | []byte(` 176 | 177 | 178 | .cccccccc. 179 | .,,,;;cc:cccccc:;;,. 180 | .cdxo;..,::cccc::,..;l. 181 | ,oo:,,:c:cdxxdllll:;,';:,. 182 | .cl;.,oxxc'.,cc,.',;;'...oNc 183 | ;Oc..cxxxc'.,c;..;lll;...cO; 184 | .;;',:ldxxxdoldxc..;lll:'...'c, 185 | ;c..cxxxxkxxkxxxc'.;lll:'','.cdc. 186 | .c;.;odxxxxxxxxxxxd;.,cll;.,l:.'dNc 187 | .:,''ccoxkxxkxxxxxxx:..,:;'.:xc..oNc 188 | .lc,.'lc':dxxxkxxxxxxxdl,...',lx:..dNc 189 | .:,',coxoc;;ccccoxxxxxxxxo:::oxxo,.cdc. 190 | .;':;.'oxxxxxc''''';cccoxxxxxxxxxkxc..oc 191 | ,do:'..,:llllll:;;;;;;,..,;:lllllllll;..oc 192 | cNo.....................................oc 193 | `), 194 | []byte(` 195 | 196 | .ccccc. 197 | .cc;'coooxkl;. 198 | .:c:::c:,;,,,;c;;,.'. 199 | .clc,',:,..:xxocc;...c; 200 | .c:,';:ox:..:c,,,,,,...cd, 201 | .c:'.,oxxxxl::l:.;loll;..;ol. 202 | ;Oc..:xxxxxxxxx:.,llll,....oc 203 | .,;,',:loxxxxxxxxx:.,llll;.,;.'ld, 204 | .lo;..:xxxxxxxxxxxx:.'cllc,.:l:'cO; 205 | .:;...'cxxxxxxxxxxxxol;,::,..cdl;;l' 206 | .cl;':;'';oxxxxxxxxxxxxx:....,cooc,cO; 207 | .,,,::;,lxoc:,,:lxxxxxxxxxxxo:,,;lxxl;'oNc 208 | .cdxo;':lxxxxxxc'';cccccoxxxxxxxxxxxxo,.;lc. 209 | .loc'.'lxxxxxxxxocc;''''';ccoxxxxxxxxx:..oc 210 | occ'..',:cccccccccccc:;;;;;;;;:ccccccccc,.'c, 211 | Ol;......................................;l' 212 | `), 213 | []byte(` 214 | ,ddoodd, 215 | .cc' ,ooccoo,'cc. 216 | .ccldo;....,,...;oxdc. 217 | .,,:cc;.''..;lol;;,'..lkl. 218 | .dkc';:ccl;..;dl,.''.....oc 219 | .,lc',cdddddlccld;.,;c::'..,cc:. 220 | cNo..:ddddddddddd;':clll;,c,';xc 221 | .lo;,clddddddddddd;':clll;:kc..;' 222 | .,:;..:ddddddddddddd:';clll;;ll,.. 223 | ;Oc..';:ldddddddddddl,.,c:;';dd;.. 224 | .''',:lc,'cdddddddddddo:,'...'cdd;.. 225 | .cdc';lddd:';lddddddddddddd;.';lddl,.. 226 | .,;::;,cdddddol;;lllllodddddddlcodddd:.'l, 227 | .dOc..,lddddddddlccc;'';cclddddddddddd;,ll. 228 | .coc,;::ldddddddddddddl:ccc:ldddddddddlc,ck; 229 | ,dl::,..,cccccccccccccccccccccccccccccccc:;':xx, 230 | cNd.........................................;lOc 231 | `), 232 | }, 233 | }, 234 | } 235 | } 236 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "fmt" 6 | "os" 7 | "path/filepath" 8 | "strings" 9 | "time" 10 | 11 | isatty "github.com/mattn/go-isatty" 12 | "github.com/nsf/termbox-go" 13 | ) 14 | 15 | func main() { 16 | framePath := flag.String("path", "/etc/terminal-parrot;/opt/homebrew/etc/terminal-parrot", "path to additional frame files") 17 | loops := flag.Int("loops", 0, "number of times to loop (default: infinite)") 18 | delay := flag.Int("delay", 75, "frame delay in ms") 19 | orientation := flag.String("orientation", "regular", "regular or aussie") 20 | list := flag.Bool("list", false, "list available animations and exit") 21 | flag.Parse() 22 | 23 | animation := "parrot" 24 | if len(flag.Args()) > 0 { 25 | animation = flag.Args()[0] 26 | } 27 | 28 | inventory := NewInventory() 29 | 30 | if err := inventory.LoadFromPaths(strings.Split(*framePath, ";")); err != nil { 31 | fmt.Fprintf(os.Stderr, "Error loading animations: %v\n", err) 32 | os.Exit(1) 33 | } 34 | 35 | if *list { 36 | fmt.Println("Available animations:\n") 37 | longestName := 0 38 | for name := range inventory { 39 | longestName = max(longestName, len(name)) 40 | } 41 | fmtString := fmt.Sprintf(" %% %ds : %%s\n", longestName) 42 | 43 | for name, animation := range inventory { 44 | description := "" 45 | if mdDescription, ok := animation.Metadata["description"]; ok { 46 | description = mdDescription 47 | } 48 | fmt.Printf(fmtString, name, description) 49 | } 50 | os.Exit(0) 51 | } 52 | 53 | if _, ok := inventory[animation]; !ok { 54 | fmt.Fprintf(os.Stderr, "Animation %q not found\n", animation) 55 | os.Exit(1) 56 | } 57 | 58 | if !isatty.IsTerminal(os.Stdout.Fd()) && !isatty.IsCygwinTerminal(os.Stdout.Fd()) { 59 | fmt.Fprintf(os.Stderr, "%s must be run in a terminal!\n", filepath.Base(os.Args[0])) 60 | os.Exit(1) 61 | } 62 | 63 | err := termbox.Init() 64 | if err != nil { 65 | panic(err) 66 | } 67 | defer termbox.Close() 68 | 69 | event_queue := make(chan termbox.Event) 70 | go func() { 71 | for { 72 | event_queue <- termbox.PollEvent() 73 | } 74 | }() 75 | 76 | termbox.SetOutputMode(termbox.Output256) 77 | 78 | loop_index := 0 79 | draw(inventory[animation], *orientation) 80 | 81 | loop: 82 | for { 83 | select { 84 | case ev := <-event_queue: 85 | if (ev.Type == termbox.EventKey && (ev.Key == termbox.KeyEsc || ev.Key == termbox.KeyCtrlC || ev.Ch == 'q')) || ev.Type == termbox.EventInterrupt { 86 | break loop 87 | } 88 | default: 89 | loop_index++ 90 | if *loops > 0 && (loop_index/9) >= *loops { 91 | break loop 92 | } 93 | draw(inventory[animation], *orientation) 94 | time.Sleep(time.Duration(*delay) * time.Millisecond) 95 | } 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /parrot-file-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jmhobbs/terminal-parrot/ae050e25b633060eaa4c94c93fc9592980459c25/parrot-file-demo.gif -------------------------------------------------------------------------------- /snap/snapcraft.yaml: -------------------------------------------------------------------------------- 1 | name: terminal-parrot 2 | adopt-info: terminal-parrot 3 | summary: Parrot for your terminal 4 | description: | 5 | You didn't know there was a party in your terminal, but there is! 6 | To run, type "terminal-parrot" 7 | To quit, hit the `ESC` key 8 | Enjoy! 9 | 10 | contact: https://github.com/kz6fittycent/terminal-parrot/issues 11 | issues: https://github.com/kz6fittycent/terminal-parrot/issues 12 | source-code: https://github.com/jmhobbs/terminal-parrot 13 | donation: https://www.patreon.com/kz6fittycent 14 | 15 | license: MIT 16 | base: core24 17 | grade: stable 18 | confinement: strict 19 | compression: lzo 20 | 21 | platforms: 22 | amd64: 23 | build-on: [amd64] 24 | build-for: [amd64] 25 | arm64: 26 | build-on: [arm64] 27 | build-for: [arm64] 28 | armhf: 29 | build-on: [armhf] 30 | build-for: [armhf] 31 | s390x: 32 | build-on: [s390x] 33 | build-for: [s390x] 34 | ppc64el: 35 | build-on: [ppc64el] 36 | build-for: [ppc64el] 37 | 38 | apps: 39 | terminal-parrot: 40 | command: bin/terminal-parrot 41 | 42 | parts: 43 | terminal-parrot: 44 | source: https://github.com/jmhobbs/terminal-parrot 45 | source-type: git 46 | plugin: go 47 | build-snaps: 48 | - go 49 | override-pull: | 50 | craftctl default 51 | craftctl set version="$(git describe --tags | sed 's/^v//' | cut -d "-" -f1)" 52 | --------------------------------------------------------------------------------