├── test ├── fixtures │ ├── image.jpg │ ├── movie.mp4 │ ├── movie.ogg │ ├── movie.webm │ └── image.jpg.out └── index.js ├── README.md ├── package.json ├── LICENSE ├── index.html └── src └── jscii.js /test/fixtures/image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnotionZ/jscii/HEAD/test/fixtures/image.jpg -------------------------------------------------------------------------------- /test/fixtures/movie.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnotionZ/jscii/HEAD/test/fixtures/movie.mp4 -------------------------------------------------------------------------------- /test/fixtures/movie.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnotionZ/jscii/HEAD/test/fixtures/movie.ogg -------------------------------------------------------------------------------- /test/fixtures/movie.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/EnotionZ/jscii/HEAD/test/fixtures/movie.webm -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Jscii 2 | ===== 3 | Jscii is an image/stream to ASCII conversion library. It can convert a single image to ASCII characters using [HTML5 canvas](http://caniuse.com/canvas) 2d context to analyze the pixel data. It can also convert a video stream using the [getUserMedia API](http://caniuse.com/stream). 4 | 5 | 6 | 7 | ### Examples ### 8 | 9 | Go to the [project site](http://enotionz.github.com/jscii/) for demo 10 | 11 | ### License ### 12 | 13 | Jscii is distributed under the [MIT License](http://www.opensource.org/licenses/MIT) -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jscii", 3 | "version": "1.0.0", 4 | "description": "JavaScript image to ASCII converter", 5 | "main": "src/jscii.js", 6 | "directories": { 7 | "test": "test" 8 | }, 9 | "scripts": { 10 | "test": "test/index.js" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+https://github.com/EnotionZ/jscii.git" 15 | }, 16 | "author": "Dominick Pham ", 17 | "license": "MIT", 18 | "bugs": { 19 | "url": "https://github.com/EnotionZ/jscii/issues" 20 | }, 21 | "homepage": "https://github.com/EnotionZ/jscii#readme", 22 | "devDependencies": { 23 | "express": "^4.13.3", 24 | "nightmare": "^2.0.7", 25 | "tape": "^4.2.2" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 Dominick Pham (dominick@dph.am) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining 4 | a copy of this software and associated documentation files (the 5 | "Software"), to deal in the Software without restriction, including 6 | without limitation the rights to use, copy, modify, merge, publish, 7 | distribute, sublicense, and/or sell copies of the Software, and to 8 | permit persons to whom the Software is furnished to do so, subject to 9 | the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be 12 | included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var url = require('url'); 4 | var path = require('path'); 5 | var fs = require('fs'); 6 | 7 | var test = require('tape'); 8 | var express = require('express'); 9 | var Nightmare = require('nightmare'); 10 | 11 | var app = express(); 12 | app.use(express.static(path.join(__dirname, '..'))); 13 | var server = app.listen(0); 14 | var nightmare = Nightmare(); 15 | nightmare 16 | .goto(url.format({ 17 | protocol: 'http', 18 | hostname: 'localhost', 19 | port: server.address().port 20 | })) 21 | .then(function () { 22 | test("jscii", function (t) { 23 | t.test("encodes a jpg correctly", function (st) { 24 | st.plan(1); 25 | 26 | var selector = '#ascii-container-image'; 27 | 28 | nightmare 29 | .wait(selector) 30 | .evaluate(function (selector) { 31 | return document.querySelector(selector).innerText; 32 | }, selector) 33 | .then(function (text) { 34 | st.equal(trim(text), trim(fs.readFileSync('test/fixtures/image.jpg.out', 'utf8'))); 35 | }); 36 | }); 37 | t.on('end', function () { 38 | nightmare 39 | .end() 40 | .then(function () { server.close(); }); // .then() is required or nightmare never closes 41 | }); 42 | }); 43 | }); 44 | 45 | trim.surroundingWhitespaceRegex = /^\s+|\s+$/g; 46 | function trim (str) { 47 | return str.replace(trim.surroundingWhitespaceRegex, ''); 48 | } 49 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Jscii 6 | 7 | 24 | 25 | 26 | Fork me on GitHub 27 |
28 |

Image to ASCII string

29 |
30 | 31 |

32 | 		
33 | 34 |

Webcam Feed to ASCII string (must enable video)

35 |
36 | 39 |
40 | 41 | 42 |
43 |

44 | 		
45 | 46 |

Video to ASCII string

47 |
48 | 54 |
55 | 56 | 57 |
58 |

59 | 		
60 |
61 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /src/jscii.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Jscii - Image to ASCII converter 3 | * http://enotionz.github.com/jscii/ 4 | * Author: Dominick Pham (@enotionz | http://dph.am) 5 | */ 6 | 7 | !function() { 8 | 9 | navigator.getUserMedia = navigator.getUserMedia || 10 | navigator.webkitGetUserMedia || 11 | navigator.mozGetUserMedia || 12 | navigator.msGetUserMedia; 13 | 14 | /** 15 | * value to character mapping from dark to light 16 | * add more characters and they will be accounted for automatically 17 | * note: the extra   is to account for the value range inclusive of 100% 18 | */ 19 | var chars = ['@','#','$','=','*','!',';',':','~','-',',','.',' ', ' ']; 20 | var charLen = chars.length-1; 21 | function getChar(val) { return chars[parseInt(val*charLen, 10)]; } 22 | 23 | /** 24 | * log when getUserMedia or when video metadata loading fail 25 | */ 26 | function logError(err) { if(console && console.log) console.log('Error!', err); return false; } 27 | 28 | /** 29 | * Options: 30 | * el - DOM node (img or video) 31 | * container - if supplied, ascii string will automatically be set on container innerHTML during a render 32 | * fn - function, callback to fire during a render with ascii string as arguments[0] 33 | * width - hi-res images/videos must be resized down, specify width and jscii will figure out height 34 | * color - enable color ascii (highly experimental) 35 | * interval - integer - for videos only, this is the interval between each render 36 | * webrtc - bool, default false, only applicable if 'el' is a video 37 | */ 38 | function Jscii(params) { 39 | var self = this; 40 | 41 | var el = this.el = params.el; 42 | this.container = params.container; 43 | this.fn = typeof params.fn === 'function' ? params.fn : null; 44 | this.width = typeof params.width === 'number' ? params.width : 150; 45 | this.color = !!params.color; 46 | 47 | this.canvas = document.createElement('canvas'); 48 | this.ctx = this.canvas.getContext('2d'); 49 | 50 | var nodeName = el.nodeName; 51 | if(nodeName === 'IMG') { 52 | el.addEventListener('load', function(){ self.render(); }); 53 | } else if(nodeName === 'VIDEO') { 54 | this.interval = typeof params.interval === 'number' ? params.interval : 15; 55 | this.webrtc = !!params.webrtc; 56 | 57 | if(this.webrtc) { 58 | if(typeof navigator.getUserMedia !== 'function') { 59 | return logError((el.innerHTML = 'Error: browser does not support WebRTC')); 60 | } 61 | navigator.getUserMedia({video: true, audio: false}, function(localMediaStream){ 62 | self.mediaStream = localMediaStream; 63 | el.src = (window.URL || window.webkitURL).createObjectURL(localMediaStream); 64 | }, logError); 65 | } 66 | el.addEventListener('loadeddata', function() { self.play(); }); 67 | } 68 | } 69 | 70 | /** 71 | * start rendering, for video type only 72 | */ 73 | Jscii.prototype.play = function() { 74 | var self = this; 75 | self.pause().videoTimer = setInterval(function() { 76 | if(self.mediaStream || !self.webrtc) self.render(); 77 | }, self.interval); 78 | return self; 79 | }; 80 | 81 | /** 82 | * pause rendering, for video type only 83 | */ 84 | Jscii.prototype.pause = function() { 85 | if(this.videoTimer) clearInterval(this.videoTimer); 86 | return this; 87 | }; 88 | 89 | /** 90 | * getter/setter for output dimension 91 | */ 92 | Jscii.prototype.dimension = function(width, height) { 93 | if(typeof width === 'number' && typeof height === 'number') { 94 | this._scaledWidth = this.canvas.width = width; 95 | this._scaledHeight = this.canvas.height = height; 96 | return this; 97 | } else { 98 | return { width: this._scaledWidth, height: this._scaledHeight }; 99 | } 100 | }; 101 | 102 | /** 103 | * gets context image data, perform ascii conversion, append string to container 104 | */ 105 | Jscii.prototype.render = function() { 106 | var el = this.el, nodeName = el.nodeName, ratio; 107 | var dim = this.dimension(), width, height; 108 | if(!dim.width || !dim.height) { 109 | ratio = nodeName === 'IMG' ? el.height/el.width : el.videoHeight/el.videoWidth; 110 | this.dimension(this.width, parseInt(this.width*ratio, 10)); 111 | dim = this.dimension(); 112 | } 113 | width = dim.width; 114 | height = dim.height; 115 | 116 | // might take a few cycles before we 117 | if(!width || !height) return; 118 | 119 | this.ctx.drawImage(this.el, 0, 0, width, height); 120 | this.imageData = this.ctx.getImageData(0, 0, width, height).data; 121 | var asciiStr = this.getAsciiString(); 122 | if(this.container) this.container.innerHTML = asciiStr; 123 | if(this.fn) this.fn(asciiStr); 124 | }; 125 | 126 | /** 127 | * given a picture/frame's pixel data and a defined width and height 128 | * return the ASCII string representing the image 129 | */ 130 | Jscii.prototype.getAsciiString = function() { 131 | var dim = this.dimension(), width = dim.width, height = dim.height; 132 | var len = width*height, d = this.imageData, str = ''; 133 | 134 | // helper function to retrieve rgb value from pixel data 135 | var getRGB = function(i) { return [d[i=i*4], d[i+1], d[i+2]]; }; 136 | 137 | for(var i=0; i'+getChar(val)+''; 142 | else str += getChar(val); 143 | } 144 | return str; 145 | }; 146 | 147 | window.Jscii = Jscii; 148 | 149 | }(); 150 | -------------------------------------------------------------------------------- /test/fixtures/image.jpg.out: -------------------------------------------------------------------------------- 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 | --------------------------------------------------------------------------------