adding kirby3-janitor
This commit is contained in:
6
vendor/league/climate/src/ASCII/404.txt
vendored
Normal file
6
vendor/league/climate/src/ASCII/404.txt
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
_ _ ___ _ _
|
||||
| || | / _ \| || |
|
||||
| || |_| | | | || |_
|
||||
|__ _| | | |__ _|
|
||||
| | | |_| | | |
|
||||
|_| \___/ |_|
|
||||
17
vendor/league/climate/src/ASCII/bender.txt
vendored
Normal file
17
vendor/league/climate/src/ASCII/bender.txt
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
( )
|
||||
H
|
||||
H
|
||||
_H_
|
||||
.-'-.-'-.
|
||||
/ \
|
||||
| |
|
||||
| .-------'._
|
||||
| / / '.' '. \
|
||||
| \ \ @ @ / /
|
||||
| '---------'
|
||||
| _______|
|
||||
| .'-+-+-+|
|
||||
| '.-+-+-+|
|
||||
| """""" |
|
||||
'-.__ __.-'
|
||||
"""
|
||||
6
vendor/league/climate/src/ASCII/failed.txt
vendored
Normal file
6
vendor/league/climate/src/ASCII/failed.txt
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
______ _____ _ ______ _____
|
||||
| ____/\ |_ _| | | ____| __ \
|
||||
| |__ / \ | | | | | |__ | | | |
|
||||
| __/ /\ \ | | | | | __| | | | |
|
||||
| | / ____ \ _| |_| |____| |____| |__| |
|
||||
|_|/_/ \_\_____|______|______|_____/
|
||||
17
vendor/league/climate/src/ASCII/fancy-bender.txt
vendored
Normal file
17
vendor/league/climate/src/ASCII/fancy-bender.txt
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
<blue> ( )</blue>
|
||||
<blue> H</blue>
|
||||
<blue> H</blue>
|
||||
<blue> _H_</blue>
|
||||
<blue> .-'-.-'-.</blue>
|
||||
<blue> / \</blue>
|
||||
<blue>| |</blue>
|
||||
<blue>| .-------'._</blue>
|
||||
<blue>| /<white>/ '.' '.</white> \</blue>
|
||||
<blue>| \<white>\ <black><blink>@ @</blink></black> /</white> /</blue>
|
||||
<blue>| '---------'</blue>
|
||||
<blue>| _______|</blue>
|
||||
<blue>| .'<black>-+-+-+</black>|</blue>
|
||||
<blue>| '.<black>-+-+-+</black>|</blue>
|
||||
<blue>| """""" |</blue>
|
||||
<blue>'-.__ __.-'</blue>
|
||||
<blue> """</blue>
|
||||
6
vendor/league/climate/src/ASCII/passed.txt
vendored
Normal file
6
vendor/league/climate/src/ASCII/passed.txt
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
_____ _____ _____ ______ _____
|
||||
| __ \ /\ / ____/ ____| ____| __ \
|
||||
| |__) / \ | (___| (___ | |__ | | | |
|
||||
| ___/ /\ \ \___ \\___ \| __| | | | |
|
||||
| | / ____ \ ____) |___) | |____| |__| |
|
||||
|_| /_/ \_\_____/_____/|______|_____/
|
||||
6
vendor/league/climate/src/ASCII/php
vendored
Normal file
6
vendor/league/climate/src/ASCII/php
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
__
|
||||
____ / /_ ____
|
||||
/ __ \/ __ \/ __ \
|
||||
/ /_/ / / / / /_/ /
|
||||
/ .___/_/ /_/ .___/
|
||||
/_/ /_/
|
||||
102
vendor/league/climate/src/ASCII/the-league-big.txt
vendored
Normal file
102
vendor/league/climate/src/ASCII/the-league-big.txt
vendored
Normal file
@@ -0,0 +1,102 @@
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyyyyyyyyyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyssoo+/:--...`````````````..--:/++ossyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyso/:-.``` ```.-:/osyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyso/-.`` ``.-/+syhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhso/-`` ``-:osyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs+:.` `.:+syhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyo:.` `.:oyhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy+-` ```.` `:::` `....` `-+yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy+-` `+++///. .o+-/o- -o+://++` .:` `-+shhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyo:` :: `oo.``` .o+` /s- `+o` ``. +s` ./. `:oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy/. /s. :s+/++. -s/:::/s/ .s/ `/+/` -s: +s` -/-`` ./shhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhys:` ``-//` `o+` .s/````` -s/----o+ .s/` .+o``o+` -s: :s/:++/- `-oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyo- `:++:-` -s: ``. oo//++/`.+. `/: -++++++- -s/` `o+` -so.```-. .oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyo. `-` :s:`.:+` /s//++/`.-.``` ```` :+++/+s. -s/:/+/` .oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhho. .oo- :oo+:. ` `-.`` ``..` .so-` `` `/+++-` .oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs- `:` `/s:` -s/`./++. ```..........``` .-/++/ -o+.`-+o/ .shhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy: ` .oo-`-/o/+o. -o+/-` ``.-/+ossyyyhhyyyyyyhhyyysso+/:.`` `. `+s- `os` -yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh+` .o+` `:oo+-` `:s: ` `.:+syhhyyso+/::--........--::/+osyyhhys+/.` -y: .oo- -+- `/hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy- .os/` .+o- ` .:+shhys+/-.` `.-:+syhhso:. `/o+:-/s/` :oo:oo- -shhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhho` `+o--oo-` :o- `-+shhs+:.` ``.` ...` `... `` `.:+shhs+-` -//:.`:ooo- .o/ `+hhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhh: ` -oo-` `:oyhyo:. ``` `.--` `--.` .--.` .--.` .--. ` `:oyhho:` -o+-`-oo` -hhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhy- -o+` -oyhy+-` `.` `.--` `.--` `--.` `--.` .--.` .--. .-.` `-/yhyo-` `. ` .shhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhs` ` `:yhyo-` `.` `.--` `.--` `.--` `--.` `--.` .--.` .--.` .--. `.+yhy/. `ohhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhh+` .+yhs/` `..``.--. `.--` `.--` `.--` `---` `--.` .--.` .--.` .--. ` `:shh+. `+hhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhho .+hho- ``` .--.``.--. `.--` `.--` `.--` `.--` `--.` `--.` .--.` .--.` `.` -ohh+. +hhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhh+` `/yho- ` `--.``.--.``.--.``.--` `.--` `.--` `.--` `--.` `--.` .--.` .--.``..` -ohh/` /hhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhho -yhs: .-.` `--.` .--.``.--.``.--` `... `..````..` `.-.` `--.` .--.` .--.``..` -shy: +hhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhho` `ohy/` `.` `--.` `--.` .--.``.-.` ``...-:://++++++++++//:-..`` `--.` `--.` .--.``.-` `/yho` `ohhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhy` -shs. ` `--.` `--.` `--.``.-. `.-:/++ooooooooooooooooooooooooo+:-```--.` `-.` `.` ..` .shy: `yhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhy- /hh+` `--` `.-.` `--.` `--. `-/+oooooooooooooooooooooooooooooooooso+-``.``````.....--` `.. `/hh/` -yhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhh/ +hy: `` `.--` `.-.` `--.` ``-osoooooooooooooooooooooooooooooooooo+/:--..--::/:::---... ..```` :yho` :hhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhs `+hy- .--. `.--` `.-.` `-- `+soooooooooooooooooooooooooooooooooo/--:--:/+/-..` .` `...` `--.` .yho` shhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhh- ohy- ..``.--` `..` ``...` ``+soooooooooooooooooooooooooooooooo+:-::-:+o:.`.:+o/``.-` `--.` `--.` .yho` -yhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhh+ -/ /hh- .--. ```-/++++++/:-. /soooooooooooooooooooooooooooooooo--/:-/oo-``-+oooooo:``--` `--.` `--.` .yh+` -/ +hhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhh. -ss: :hh: ..``.` -osooooooooos+ -sooooooooooooooooooooooooooooooo/./+.:os:``-osooooooos+-`.--` `.--` `--. :hh/ -ss/` `hhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhho ..---/ooos/.```` `hh+ .--. -sooooooooooo+`.oooooooooooooooooooooooooooooooo--o:.+so- .+sooooooooooos:``.--` `.--` `-. /hh. ..---/ooos/.```` ohhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhh: -osssoooooosooo:` `ohy` `.` .` `ooooooooooooo` osoooooooooooooooooooooooooooos+.:s--oso` :ooooooooooooooos+` `.--` `.--` `` sho` -osssoooooosooo:` -hhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhy` -oooooooooo:. -hh: `--.` .sooooooooooo- +sooooooooooooooooooooooooooos/`+s-.ss+` :soooooooooooooooos+` `.--` `.--` -hh: -oooooooooo:. `shhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhh+ /sooooooo. shs` `` `-- .sooooooooos- :`.oooooooooooooooooooooooooooo:`:s-.oso` :soooooooooooooooooos+ `. `.--` `.--` `ohs /sooooooo. /hhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhd- .sooo/+oos- .hd: .--` ` `+oooooooos: -+/``+soooooooooooooooooooooooo.`:..`:/+- -soooooooooooooooooooos- --` `.--` `.-` -dh- `sooo/+oos- -dhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhh. -/-` .-+/ /dh` `---` .soooooos/ -////-`-ooooooooooooooooooooooo.`.::::---``oooooooooooooooooooooos/ `.--` `.--` `` yh+ -/-` .-+/ `hhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhy `ohs .-` `.-- ` .oooooos- ///////.`:ooooooooooooooooooso`-+:``..---`/sooooooooooooooooooooos: ` `.--. `.--` ohs` yhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhs .yh+ `.--` `-. `+sooos/ -///////:.`-+sooooooooooooos+`-//:`+so+` .soooooooooooooooooooooos` --. .--. `.-- /hy. ohhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhho .hh: . `.--` `. -osoos- ://///////-``/osooooooooos+`://:`+sos: `+oooooooooooooooooooooos/ .--. .--. `.` -hh- ohhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhho .hh- `--` `.--` -osos: -///////////-``:+ssoooos/`:///`/soso :sooooooooooooooooooooooo``-.` .--. .--. -hh- +hhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhho .hh- .--. `.--` .+ss+.`:////////////-``-/oss/`:///`/soos- osooooooooooooooooooooos- `--.` `--.` .--` -hh- +hhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhho .hh: . .--. `.--` `/os/``----://///////:-.`.`////`:soos/` :sooooooooooooooooooooos+ .-` `--.` `--.` .` -hh- ohhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhs .yh+ --. .--. `.--` ` ..-:::..:`.//////////..////`:sooos```ooooooooooooooosssooooso. `.--` `--.` `--.` /hh. ohhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhy `sho .--.` .--. .--` `-/+oooooos:`-`+..//////:`-////`-sooos:``.++oosssssoo+/:-..``....` `` ``.` `--.` `-- ohs` shhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhh` /dh` `` .--.` .--. `.:+oooooooss/.-.`.+s/.-::/-`:////.-oooooo`-`--..``......---:::--.....`` `--.` ` yh+ `hhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhd- .hd- `-.` `--.` ```:+oooooooso+:.-..://.-oo. ` ./////..ooooos--.`..```..........-::/+++oooooo++/:.` `--. -hd- .hhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhh+ sho` `--.` `-- -ooooosso+/:-.-.-://///-.+s: -/////-.ooooos+`: ``....-:::/++oooooooooooooooooooooo+/.``` `. ohy /hhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhy` -hh- `--.` -.:+///::--.-..-://///////:`/s/`:///..ooooooo.:.:ooooooooooooooooooooooooooooooooooooos- --` -hh: `shhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhh- `` `ohs `` `--.``....```-`.-:///////////////`:s/`//.-oooooos-./`osooooooooooooooooooooooooooooooooooos/` `.` shs` ` -hhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhho `.-:/+++o` .hh/ .-` `-.`.`::::`+/`/////////////////:`/s-..:sooooos+`+`.++oossooooooooooooooooooooooooooooos+- .-. /hh. `++` -::- +hhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhh. `++:-o/``o: /hh: .-.` ``..-///-.o-./////////////////:`o+.+oooooooo.// `.....-:/++ooosoooooooooooooooooooo/.`` `.. -yh/ :o` -s:-o/ `hhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhh+ -s. -o` .+` `+hy. `.--` -`:///..s:./////////////////`:soooooooos.-o`` `.--` `.....-::/++oooooooooo++:.`` .--. .yho` -o//o- .s: /hhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhy- +/ ` `:/` `ohy. `.--``-`:///.-s:.:///////////////`:sooooooos:.s- --` `.--` `.--` `..````........` `--.``.. .shs` `-``.-. `+/ .yhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhs ``.```++-` `ohy. `.-.`:`////.-s+../////////////:`+ooooooos:`o/ `.--` `.--` `.--` `.-.` `.-.` `--.` .--. .yho` `/+` -` `` ohhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhh: `+///+s:``. `ohy: ````...:.:///.-+s+--://///////-.+soooooos/.++`.-.``.--```.--` `.--` `.-.` `--.` `--.` .` -yho` /s. :o` -o` :hhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhy- .s/:/++. `/hh/` .. ``.:.-///-./oo+:---::::--:ooooooooo:.o+```.--.``.--```.--` `.--` `.--` `--.` `--` :hh+` -/++o/..o: .yhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhy` `/o/` ` //` :yho. `.. `--.:///-./oso++////+oooooooos+--o/`.-.``.--.``.--` `.--` `.--` `.--` `--.` ` `ohy: -/` `..:/+: `shhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhho` .. `:s+` .shy/ `.. .----:/:-.:+oooooooooooooo+:-+o-```.--.``.--.``.--. `.--` `.--` `.--` `.` :yhs. `/+- .++:. ` `+hhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhh+ .-/+/-/o` `:yho- `.. `-:::---.:+oooooooooo+:-:++:``--.` .--.``.--.``.--. `.--` `.--` `.-. -ohy/` /s. ..`+s` +hhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhh/ `++/.` -:- .+hho. `.. `.:/++ooooo++///::-://:.`..` `--.` .--.``.--.``.--. `.--` `.--` ` .+hh+. `/++-.`.o/ /hhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhh+ ` ./+/+/` .+hho- `.` `....``````..----..`..` `--.` `--.` `--.` .--.``.--. `.--. `.` .+hho- `---.``.:+++- /hhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhh+` `:+o+. /s. -+hho:` `` `.--. .-.` .--` `--.` `--.` `--.` `--.` .--.``.--.``..` `-ohho- .s/::/++:` /hhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhho` :/.`++.-+o` ./yhy+. .--. `.--. `.--` `.--` `--.` `--.` `--.` `--.` .-. ./shy+. +o .o//o- +hhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhs. .o+::. ``.-. `:shhs/. ..-. `.--. `.--` `.--` `--.` `--.` `--.` `-. .:shhs:` /:` `++/o- ` .ohhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhy- :: .+++/:o/ `/shhs+-` ` .--. `.--` `.--` `---` `--.` `.` `-+shhs/` `/o- ./o+` .yhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhh+ -+oo:` .s: .:oyhhs/-` `` `...` `.-.` `..` `-/oyhyo:. :o- .so:-` `` /hhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs. .- `/o:o+` .//:` `.:oyhhyo/:.` `.:/oyhhyo/.` `-/- .+o++.`-/+. .shhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh/` -o+- `+o-.:o/. `.-/osyhhyso+/:--..````````..--:/+osyhhyso/:.` `/o:.` .+o-` `/hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy- .. -o/` .s: .` `.-/+ossyyhhyyyyyyyyyyhyyysso+/-.` .s: ` ./. -shhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhho. +o. `/o:``+++/-` ``..............`` -/+/-` .o+. `++ .ohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy+` `:++/++. .o+``.+o` `` `` o+`./o/``:o/++:` `+yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy+. `... -o++:.-o/``/o//:. .-///++` oo .:+oo` `..` `+yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy+. `o- `+o:- /s.`.:s- .:-.` `. :s:` `o/`.oo/-.`/: .+yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyo-` o/ :s- -s- `+o:.`+/` .` ``` `..... /- :s. +o.-/o: `o+ .oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs:` `` -s/.` -s- .s: .oo+ .s. `+++o. `o+:::o/ :o/.`o/ `+s:.` `` `:syhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy+-` `.://++: `++` /o`+/`:o .o/` :s- o+ `/o` `:+oo` `o/ `-+yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs+.` ` -/o/` s/ `o/o/ :s:---s+ /s//+s- +o `` `./shhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhys/-` ``.` `+. `+o. /s----s/ :s. `/+` .: `-/syhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs+-. `. .- :- `:` .` .-+shhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhys+-.` `-/oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhys+:.` `.-+oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhso+:.`` ``.:/oshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyso+:-.``` ```.-:/osyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyso++::-..``````````````````..-::/+osyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyyyyyyssyyyyyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
153
vendor/league/climate/src/ASCII/the-league-bigger.txt
vendored
Normal file
153
vendor/league/climate/src/ASCII/the-league-bigger.txt
vendored
Normal file
@@ -0,0 +1,153 @@
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyyssooo+++////////////+++ooossyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyso+//:-..```` ````..-://+osyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyo+/:-.`` ``.-:/+osyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyso/:.`` ``.-/+syhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyo+:.` `.:/oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhyo+-.` `.-+oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhyo:.` `.:oshhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyo:. .:oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhys/.` .:oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy+-` `-+yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy+- ``.. -++++- .---..`` ./yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy/. -//oosssss. `+yo:/sy: .ossoossss+- .. ./yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh+. /ys:...`` `oyo` -sy+` oy+` ``.:o: `sy/ ./yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhho- `+s/ -sy- `oyo` `oy+ -sy- +yo` +s: -ohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdy:` :ys. oso/+osys` `sy:`.....:yo` :ys` `o+//- -yy- :ys. .:. :ydhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhds- `. oyo :ys/:--.` `ssssssssssso` +y+ `-:oy/ `oy+ `sy/ -ysys+:. .ohhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhh/` .:oyy: .sy: .sy- `oy/`` -ys` `oyo` -sy- :ys. +yo` .sy/`-/osss- `/hdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdy: .-+syo/-` /ys. +y+-:/+ooy: `oy/ -ss` `+ysso+++ss+ `sy/ -sy: -sy/ `-:` :ydhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdy: /ys/` ` `oy+ `.-:+s- :yoo+/:--.` `---:/+:` /ys/-.` `oy+ .ssoss/-. -sdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdy- .:` :ss: `-+sy: -ysosso+/:. -/oossssss. .sy/`.:+sy: -sdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdy: `oys- -ssoss+:` :/-.` `.--.` .sy+` ` `:++o+- -sdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhh:` :sy+` .ss+` `.+: ./osso:.` -syo//oso/. :ydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhh/` .+: .oss- .sy+`./oss+:` ``......----......``` ``-/osso` `+ys:` `-+ss/ `/hhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdo. -sy+. ./os+os+` .ossso/-` `..://+ossyyyhhhhhhhhhhhhhhhhyyysso++/:-.` `-- :sy+. /ys. `+dhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy- `/:` `+ys:-oss/.``+ys:` `/:`` `.-/+osyhhhhhhhhhyyyysssoooooooosssyyyyhhhhhhhhhyso+/-.` /ys: :sy+` `` -sdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhh+` `/ss/` -osso-` -ss- `.:+syhhhhhhhyso+/:-..`````` ``````.-::++oyyhhhhhhyso:.` /ys. .oys- `:os/` `/hhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdy. `/sy+` `/ss/` `` .:+syhhhhhys+/-.`` ``.-/+oyhhhhhys+:.` `+ss+-```:ss/` `:oy+/ss/. .sdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhd+` `/ss+os+. -oyo- .-+shhhhhyo+:.` `.-/oyhhhhhs+:. `:osoooso- `:oso-` `/ss/. /hhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhy- `oy/` ./ss+. `/s/` `./shhhhhs+:.` ` `...` `----` .---.` ``` `.:+shhhhhs+-` .::-.` `:osoos/` `/s/ .ydyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo` `` ./ss+. ` `-+yhhhhyo:. ` .---. .----` .----` `.----` `.---.` .-+yhhhhyo-` `/sso-``/ss/` ` `+dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhd/ ./ss+. `.+yhhhhs/.` `---.` `----. `----. .----` `.----` `.---.` `..`` `./shhhhy+-` .oo- .+o. :hhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhh- `/so. `/yhhhhs/. .--.` `.---.` `----. `----. .----` .----` `.---.` `.--..` .:shhhhy+. -hhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhy. ` `-ohhhhy/. `.` `.---.` `.---.` `----. `----. `----` .----` `.---.` `.---.` .:shhhhs-` `sdyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyds` `:yhhhho- .----` `.---.` `.---.` `----. `----. `----` .----` `.---.` `.---.` .+yhhhy/` `odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo` `/yhhhy/` .--` .----` `.---.` `.---.` `----. `----. `----` .----` .----` `.---.` `` `:shhhh/` +dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo `/hhhhs- .----` .----` .----` `.---.` `----. `----. `----` .----` .----` `.---.` `..` -shhhh/` +dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo :hhhhs- `---. `----` .----` .----` `.---.` `----. `----. `----` .----` .----` `.---.` `--` .ohhhh/` +dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhydo -ydhds- ` `----. `----` .----` .----` `.---.` `.---.` `----. `----. `----` .----` .----` `--. .sdhhh: +dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhydo `odhhy- .--. `----. `----` .----` .----` .---. `.... `....` `--:-. `----` .----` .---.` `-:. -ydhds. +dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhyds /dhhd/ `.---.` `----. `----. `----` .---. ` ```.....--....``` ```.-. `----` .----` .----` `.:.` :hhhd+ odyhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhyhy` `ydyds` .:-` `.---.` `----. `----. `--.` `.--//+ooosssssssssssssssssoo++/-.` `----` .----` .----` .:. `odhdy. sdyhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhh. :dhhd: .----` .---.` `----. `--:-` `.-:/+oossssoooooooooooooooooooooooooooossso+/-` `----` `--:-` .--.` .:. -hhhd/ `hhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhd: +dyds` `-` .----` .----` `.---.` `` .:+ossssoooooooooooooooooooooooooooooooooooooooooosso+-` `.---` ``` .:` `odydo` -dhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhyd+ `ydhd/ `----` .----` .----` `.-:-` ./ossooooooooooooooooooooooooooooooooooooooooooooooooooosss+. ``.`..``` ``..---::/+- .-` :dhhh. /dyhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhy` .hhhh- ` `----` .----` .----` `. .+ssooooooooooooooooooooooooooooooooooooooooooooooooooosso/-`..--..`.-:++ooo++//:-----` .-` `.` -hhhh- sdyhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhh. -hhhh. .:-. `----` .----` .----` `/ssooooooooooooooooooooooooooooooooooooooooooooooooooss+-`.-/:-`.-/ooo+:-.` ``` .:--` `` `ydhd: `hhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhyd+ -dhhy. `----. `----. .----` .:-` `osooooooooooooooooooooooooooooooooooooooooooooooooosso:`.:+:.`-/oso/-` ` .-. `-:--. `----` `sdhd: :dhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhy` -hhdy` `.` `----. `...` ..---` `` `osooooooooooooooooooooooooooooooooooooooooooooooooss/.`-++-`./oyo:. `./+so- `--. `----. .----` `sdhd: sdhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhd: .` .hhhy` `-:-.` `-.` `.........`` `` `+soooooooooooooooooooooooooooooooooooooooooooooooss/.`:s/.`:oss+-` ./ossooos+. .--.` `----. `----` `sdhd- .` -dhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhds .y+ `yhhh. `.---. `:+osssssssssoo+/:-` /yooooooooooooooooooooooooooooooooooooooooooooooos+. :s+``:oss+. -+ssoooooooss/` `-:-.` `----. `----` `yhhh. .so` odhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhd: -sss/ sdhh- `-` `.-` `/ssoooooooooooooooy+ -sooooooooooooooooooooooooooooooooooooooooooooooss: .ss- -osso- -osooooooooooooss: `---.` `----. `----` .hhhy` -sss/ -hhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhy :sooos/ +dhd/ -:--` `+sooooooooooooooooso` .ssooooooooooooooooooooooooooooooooooooooooooooos+``/y/``+sos/` .+ssooooooooooooooos+` `.---.` `----. `-:-` -dhdo :ssoos/ sdhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhd/ .--::///+sooooos/-..``` -dhdo .--:. /sooooooooooooooooss. `osooooooooooooooooooooooooooooooooooooooooooooss: .oy- -ssss: :ssooooooooooooooooooss- `.---.` `----. `-- +dhd: .--::///+sooooos/-..``` -dhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhh` `/ssssssoooooooossssoooo- `sdhy` .. .-` -sooooooooooooooooss- +sooooooooooooooooooooooooooooooooooooooooooooso. :ss. :soss. `+soooooooooooooooooooooss: `.---.` `----.` .. `sdhy` `/ssssssoooooooossssoooo- `yhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhd+ .+ssooooooooooooooso:` /dhd: `:--` +soooooooooooooooos- `ssooooooooooooooooooooooooooooooooooooooooooos+``+ys. /soss. `osoooooooooooooooooooooooos/ `.---.` `.---.` -dhd+ ./ssooooooooooooooso/` /dhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhd: .+soooooooooooso-` `yhds .----` osooooooooooooooos/ /yoooooooooooooooooooooooooooooooooooooooooos/ `oss. /soss. `osoooooooooooooooooooooooooos/ `.---.` `.---. odhh. .+soooooooooooso:` -dhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhy` -soooooooooos/ /dhd: ` `--:` osoooooooooooooos/ -. `+soooooooooooooooooooooooooooooooooooooooss: .sss. :soss- `osooooooooooooooooooooooooooooy: .` `.---.` `.---.` .hhd+ -yoooooooooos/ sdhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhdo osoooossoooos+ `yhds `--. `-. /yooooooooooooos+ .++. `+soooooooooooooooooooooooooooooooooooooss. ``./- :yssy: `osoooooooooooooooooooooooooooooos. --` `.---.` `.---` odhh. +soooossoooos+ +dhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhd: -yssso+::+ssoso` -dhd/ `----. ` `ssoooooooooooso` `///+. :ssooooooooooooooooooooooooooooooooooso` -/:-.``..:+: /yooooooooooooooooooooooooooooooos+ .:--` `.---.` `.:. -dhd/ .sssso+::+ssoss` -dhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhd- +o/-.` .-+oy- odhh. `----. -sooooooooooss. `/+///+:` .+sooooooooooooooooooooooooooooooooso` `::::::::-...` -sooooooooooooooooooooooooooooooooso` .----` `.---.` `.` `yhds +o/-.` `-+oy- .hhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhh` ` `-. `yhds `-` `----. ` :sooooooooos/ :+///////. .osooooooooooooooooooooooooooooos+``:-``.-::::::/: `osooooooooooooooooooooooooooooooooso` .----` .----` +dhh` ` `-. yhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhs .hhd/ .:-.` `----` ` -ssoooooooy: :+///////+/. -ossooooooooooooooooooooooooos/ `/+/+- ````...-` /yooooooooooooooooooooooooooooooooos+ .. .----` .----` :dhd: odhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhdo /dhd: `.---.` `-:- .osoooooos+ -+/////////+/. ./ssoooooooooooooooooooooos/ `///+: .sso++: .soooooooooooooooooooooooooooooooooos. -:-` .----` .---. -dhd+ +dhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhd+ +dhh. `.---.` `-- :ssooooos- :+//////////+/-` `-ossooooooooooooooooooy: .+//+: `osooos. +sooooooooooooooooooooooooooooooooos/ `----. `----` .-:` `yhdo /dhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhd/ odhy` `-` `.---.` `. `+ssoooss. :+////////////+:. .:ossoooooooooooooos- .+//+/ `osoooy/ :yoooooooooooooooooooooooooooooooooos. `----. `----` .` sdds /dhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhd/ odhy `:--` .----` .+ssooss- -+/////////////+/:. `:ossoooooooooss- .+//+/ +soooso` `osoooooooooooooooooooooooooooooooooy/ .:. `----. `----` sdds :dhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhd/ odhy .----` .----` `/ssoos+` `:+//////////////+/:. `-/ossooooss. -+////` +sooooy: :yoooooooooooooooooooooooooooooooooso` ----. `----. `----` sdds :dhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhd/ odhy .----` .----` `:ssoss: `/+///////////////+//-` `-+osss. -+///+` /yoooos+ `ssoooooooooooooooooooooooooooooooooy- `----. `----. `--:` sdds :dhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhd/ odhy` `. .----` .----` -+ssss:` `:/::://////////////+/:.` `-` :+///+. :yooooss. ` /yooooooooooooooooooooooooooooooooos+ .-` `.---.` `----. `-` sdds :dhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhd+ +dhh. --. `----` .----` `:/--` `.``-/+///////////////. `/+///+. -yoooooy/ ` `ssooooooooooooooooooooooooooooooooss. ----` `.---.` `----. `yhdo /dhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhdo /dhd: .:--. `----` .----` `` `.-://++/- .+. -/+///////////+- `/////+- -ssooooso``. /yoooooooooooooooooooossssssoooooosy- .--:-` `.---.` `.---. .hhd+ +dhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhds -hhd/ `----. `----` .----` `.-/+ossssooooso``+` /. -///////////. .+////+- .ssoooooy- -``ossssssoooooooossssoo/::-..````````. ``` ``.-` `.---.` `.-:. :dhd: odhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhy` `yhdo `----. `----` .-.` .-+ossoooooooooss/``/. :ys/``-+/////+:` :+////+: .ssooooos+ .- ``.-::/++ooooo/:-.`` ``..--:::::---..` `` `.---.` `-. +dhh. shhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhh. odhh` .` `----. `----` ./ossoooooooooooss/.`--````:sss: `-:://- `/+////+: `osoooooos. :``/::-.` `````..-:////:--..``````````` `.---.` `yhds `hhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhd: :dhd: .:.` `----. `-` `:ossoooooooooosss+:`.--``-++:``/ss+` ` -+/////+: `osoooooos/ -: `-..```````.---:---.``````..-://++oooooooo++//:..` `.----` -dhd/ -dhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhdo `yhds `---.` `----. `/ssooooooooossso/:`.---``-//////. -sss- ` `:+/////+: `osooooooss``/` ``..```...```````..-://+oossssssoooooooooooossssso+:.` `` .-:` odhh. /dhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhy` +dhd- `.---.` `-:. .ssoooooosssoo/:...---``-:////////+: `+ss: /+/////+: `+sooooooos: /: `````...--::/+++oossssssooooooooooooooooooooooooooossso+:. `` `. .hhdo sdhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhd- `hhdo `.---.` ` .. /soooooo//-....---.``-:////////////+/` /ss/``/+///+: `osooooooos+ .o `ooooooosssssssooooooooooooooooooooooooooooooooooooooooooss. `:-` +dhh. .hhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhd+ /dhd- `.---.` -+-`......``...-.`..-:///////////////////` /ss+ `///+: `osoooooooss. o: /yoooooooooooooooooooooooooooooooooooooooooooooooooooooooy/ `--:. .hhdo /dhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhy` `.` `yhhy` .` `.---. ``....`````.. `::///////////////////////+. :sy/ `++- .osooooooooy: :o `ssoooooooooooooooooooooooooooooooooooooooooooooooooooooss/` .- sdhh. `` sdhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhd: ``.-/+osy/ :dhd+ --` `.-:` -` :::::/` +s` /+/////////////////////////` /ss- -- -ssoooooooos+ `y- /yssssoooooooooooooooooooooooooooooooooooooooooooooooosso. .-. /dhd/ -so` .-.` -dhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhds .//+oosso/-.+y- odhd: `---` `.- `- .+///+: `so `/////////////////////////+/ `oyo` `:ssooooooooss. oo `..-:/+ooossssooooooooooooooooooooooooooooooooooooooss+- `----` -hhds -yo. `+sooso. odhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhd- -ys:.`.yo` .yo` `yhhh. `----` `` -- :+///+- .y+ `/////////////////////////+- .sy-`osoooooooooos- :y. ...`` ``.-:/++oosssssooooooooooooooooooooooooooss+:` .. `-. `yhhh` `oy. `+y/``-ss. .hhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhds /h- /h/ /h: .hhhy` .----` :. /+///+. :y/ `/+////////////////////////` +soosoooooooooos/ .y/ `----. ``` ``..:/++oossssssssoooooooossssso+:. .:--. sdhd- `oy+..+y+ -yo` odhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhd: `ss. `/. `.` -dhds` .----` `/``//////` /y+``:+//////////////////////+. /yoooooooooooos+ `ss` --` `.---.` `----. ``...-:///++++o++++/:-.` `..` `.---` odhd/ `/+oss/ -sy. .hhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhds` :s: `:+o. :dhds` .----` ./ `//////` +yo. -//////////////////////+` +soooooooooooso` +y: `---.` `.---.` `----. `....` ```` .---.` `-` +dhd/ `/: `` .so. odhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhd/ `oy+-` :dhds` .--:. -/ `////+/` +ys/``:+//////////////////+: .ssooooooooooss` /y/ .---.` `.---.` `----. `-:--. `----` .-:--` .---.` odhd/ +y: ` :dhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhh. .:+o/:.`/y/ :dhdy` ` .-:. :+ `//////` /sso- `:+///////////////+: `osooooooooooss. /y+` .` `.---.` `.---.` `----. `----. `----` .----` .-:- `sdhd/ /y: :y/ .:` `yhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhyds .o:-:ososs:. . -hhhh. `. `:. -+``/+///+. -ssso:``-/+//////////+/- .osooooooooooss. /yo` .:--` .----` `.---.` `----. `----. `----` .----` ` .ydhd: /y+` -yo` `sy- odyhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhyd/ `ss/+ssosy: .hhhd: `-. .. -o. :+///+: `+soss/. .-////////:.``/ssooooooooooss. /yo` .----` .----` `.---.` `----. `----. `----` .----` -hhhd- /+oso+os. `oy- :dhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhd- `+h/ `.-.``- `sdhd+ .:. ` `+: .////+/. .ososso/-.````` `.:ossooooooooooos+``+y+` -. .----` .----` .----` `.---. `----. `----` `-. /dhdy. .-/osso/+y: .hhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhh` .osy+ +h+ /dhhh. .:. :+. -++//+/. -ossoosssooooosssooooooooooooss- .sy/ -:--. `----` .----` .----` `.---.` `----. `----. .ydyd+ -oy- .-+s/ `ydhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhyds --` :yo` .hhhd+ `-:. `:/. .:/+++/. .+ssoooooooooooooooooooooss: `+ys. `----. `----` .----` .----` `.---.` `----. `-:-` /dhhh- `+y+. +y+-` odyhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhydo .:ososs. +dhhh- `-:. :+:. `.--::` `-/osoooooooooooooosss+- .+ys: `-:. `----. `----` .----` .----` `.---.` `----. ` -ydhdo` `oy: `os:/sy/ +dyhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd+ `-+syo:. `sy- .ydhds. `-:. ./oo+:-----:/+osooooooooosssso/-`.:oyo- `.---. `----. `----. `----` .----` .----` `.-:- .odhdy- -ys` `` .sy. /dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd+ :oss+-` `:`. :hhhdo. `.:.` `.:+sssssssssssssssooo+::.``-/oso:.``--` `.---. `----. `----. .----` .----` `.---.` `` `+hhhh/ /sso:. `+y/ :dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd+ ./. `:oyo. `+hhhho. .--` `..```..--------..`..---/+++/-.`` .----` `.---.` `----. `----. `----` .----` .-:-` `+hhhdo` `-/oss/-:oy: :dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd+ `-+ss/-oy: `+hhhho. `..` `---.. `..---..``` ----` .----` `.---.` `----. `----. `----` .----` `` .+hhhdo. ://::-.` `:+o+/. /dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd+ ./sso-` `/yo. .+hhhhs- `` `----. `.-... `.---` .----` .----` `.---.` `.---.` `----. `----` .--.` -ohhhho. .os//++oss+-` /dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo` :sso:+y/` `oh/ `+hhhhy/. `.---.` `----. `----. .----` .----` `.---.` `.---.` `----. `----. `:shhhh+. -ys. `+sss+.` +dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds` ./. -yo:-+ss/` `:shhhho-` `.---.` `----. `----` .----` .----` `.---.` `.---.` `----.` `..` `-ohhhhy/` :yo` .oy/`-oo. `odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhy. `/s++o+-` `` `-+hhhhyo-` `.---.` `----. `----. .----` .----` `.---.` `.---.` `---. `-+yhhhho-` -/` /yo-:so. `` .ydyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhh: `oy/` .:/++oso:` `:ohhhhyo:. `...` `.---.` `----. `----` .----` .---.` `.---. ` `-+yhhhhs:` :ss/` ./sss-` -hhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhd+` /: .+so//:..+y/ `:ohhhhho/.` `----.` `----. `----` .----` .---. `` `./oyhhhhs/. `/ss. `:+yo` /dhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds. `-+sss. `sy. .:oyhhhhyo/.` ```.` `----. `----` .---. `` `.:oyhhhhyo:. .o+. `oy+-`` .. `odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhh/ :yo..+y+. /y+ `` `./oyhhhhys+:.` ` ```` `.:+syhhhhyo/.` `:ss+``:so//oso+:` :hhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdo` . .+s/+y+` `:+oo+-` `./oyhhhhhys+/-.`` ``.-/+syhhhhhyo+-` `-/+o. `:osos:` `.:+- `+dhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhh: `-ss+- -sy/--/ss/. `.-+oyhhhhhhhyo+/:--.```` ````.--:/+osyhhhhhhys+:.` `/ss+-.` `:os+. :yhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhds. /y+. `+yo. `:ss. `.-/+osyhhhhhhhhyyysso++++++//++++++ossyyyhhhhhhhhyss+/-.` +h/` `-oy+` .odhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhh+` . -ss: -ss. `-` `.-:/+ossyyhhhhhhhhhhhhhhhhhhhhhhyysso+/:-.` +y+` ` :- `/hhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhy: +h/ `+yo. `oyso:.` ```...-----::::-----....`` ./+/-` :ss: -s+ -ydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhds- .oso-` `:ss: .sy-`:oss/` /yo:/sso/. `+yo.``-+yo. .sdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhds. .+ssosy+` :ys. `+h/ `` `` /h: `./sy: -sssss+. .odhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdo. `--.` /yss/-` :ss. `oyo+:.` `.:/osso- /h: `-+sy/ `..` .odhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdo. `+y+`.+so+oyo` +y/.:+sss- .osso:.`.oy: :yo.-oss/./yo` .odhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhds- -s/ -y+-. /yo` .sy- /s/:-.` .:` /y+` .sy- :sss:. /:` .odhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdy: +h: :ys` -ys` `-ss+o. .o/` -:` +h/ +h+ `-+ys` .ss: -sdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh+` -o. -ys. .sy. +y/ :yso :y/ :++/. `/++oooss+. oh/ +y: +yooso/-` `o:` `/hdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhds- .sy+-` .sy- :yo os+s+ +y- `oy/:sy: `ss:....:ss. `/ys:` /h+ `oy/ -ohhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhy+. .-/ossoosy: `sy- .yo -h+ .so` -yy- `oy/ +y- oy- `:ss+so` `sy: `/ydhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy:` .-:. ../y/ /h/ :h+ :h/ .ss. `oy: /y+...-/ss. -sy- .:. `:shhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs:` `/ooso/ oy. /y/+y- .so+/////oy: -yooo++ss. :yo `-ohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs:` `-. -y+ /yso -yo--::::oy- .ss` -ys. `+/` `-ohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs/. ` :s: -yo `sy- `oy- -o+` .:shhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy+-` `.` ..` `` `-+shhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs/-` `-/syhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhys/-` `-/oyhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs+:.` `.:+syhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhys+:.` `.:+oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyso/:.`` ``.:/osyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyo+/:..`` ``..-/+osyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyss++/:-..```` ```..-:/++ssyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyssso+++////::::::::::::////+++oossyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
255
vendor/league/climate/src/ASCII/the-league-massive.txt
vendored
Normal file
255
vendor/league/climate/src/ASCII/the-league-massive.txt
vendored
Normal file
@@ -0,0 +1,255 @@
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyyyysssooo+++++++//////////++++++++oossssyyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyyso++//::--....``` ````....--://++ossyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhhhhhhhyyysoo+/::--..`` ``..---://oooyyyhhhhhhhhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyso++::-..``` ```..-::/+osyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyso+/:-..``` ```..--/+osyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhddhyss/:-.``` ```.-:/osyhhdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhhhhhyo+--` `.-+oyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhhhhys++--` `.-/+syyhhhhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhyys+/--` `.-/+syyhhhhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhdhhyo+-..` ``.-/+syhddhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhddhso:-``` ```--oshddhhyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdyy/:.` ``:/syhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhhhso/.` `.:+ohhhhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhyyo/:`` ``:/osyhhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhdhyo+-.` `.-+oyhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhdhh+/.`` ``./+yhdhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhy+-.` `..---.. ` `-+sydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhso-.` ``````..:::.` `./ossssss:- ``-:///:::--..`` `.-oshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhhhhso:.` `.--::/+++oooossy:. :+yss+++sss+-` ``/+ssyssssssssoo:-`` ``` .:+ohhhhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhhhy+:`` .+sysssssooo++//:.` ..ssyo+```/oyss:. -/yyso+::://++ossys+. .///.` `:/shhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhdhh+/.` ./sys+:-...```` `/oyss-` ..ssyo+` /oys+-` ```.-:s+:` `:syy/- `.:/hhdhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhys:-` --/-. `-oys+.` ./oyso-` :/syy:- `.+syo:` `` :+yss.` `-::.` .:oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhy/:` ``osyo+ `.+syo:` `````` `-osy+: .+syo/ `-oyyo-` +oyo+ -oyy/: `-:yydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhyo:. /+yss`` `/oys+:-:://+oo+. `:syy:-`````````.:oyo/` `:oys+.` `:::---.` `.ssy+: -/syy-. ````` .-oyhhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhhhy/- .:syy:- :+ssossssssssoo-` `-sss++/////////++sso/` ./syo/ `.yyyssys+. -/yys-` +oyso`` :+so/-.`` -:yyhhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhdhs:- `.` .osyo: -:yss+/::---..`` `-sssssssssssssssssso/` .+sy+: `--:+oys/. `/oys+. ``ssy+/ `-oyssyss+/:-. .:oyhhhyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhdhh/:` `.-/+s+-` `:oys+.` .-yys/- `-oss+/----------/oys/` `-osy/: `+syo:` `-oyyo-` .:yys/- `-osy++:+osssso//-.` `-:yhdhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhy/- `-:+ossyso:` `+sys/. `.ssy+: ``` `-oyy/- `-oys+` -osyo+-` .:osyo-` ./syo/` :+yso- :/yys-.```-:+osyyy+: .:shdhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhddo/` ``:/ossyso+/.`` :+yso-` osyo/``.--::://s+:` `-syh/- `-shy+.` `.+ssso++//:::/+ssss/` `-ssy/- `.+sys/. ``ssyo+ `../+o:. `/oddhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhho/ .:osssso+:-` .-yyy/- ``.` /+yssoosssyyyysyo:` ./++-. `.:/:-` .-oosssyyyyysssoo.` `-ssy+:` ./oys+.` :/yys+/.`` :+hhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhdyo:` ./syso/.` `` osyo+ ``..-:/+so-` :/ysooo++//:---..` `.----:://+/:.` ./oyso/--..`` `-osy+: `.+sssossso/:-`` `-oydhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhdys.. `` `/oyso-` .-:+o.` /+yso::/+osssssso:` `.-..````` ``` `/+ssyssoo+/:/+ssy:- .+syo+-:/ssssso+-` `.osdhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhdho-. `.:+o.` ..ssy+/``.:/osyyy:- .:ssssssss++/:-..` ``-:/++sssssyyyso`` -/syy:- ``.-:+oyo-` `-+ydhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhdd+:` .:yyyo/` /+yso++oyyss+:-` .+os/:-..`` ```..-////:.. `osyo+` ``-. ``::://-. `:/ddhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhdo/ `-osyso-` .osssso+/.` `` -/yyso+-.`` `-osyyyyyyso:. -+hhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhs:` -:ssyo+`` `.+sss+. `..+/:` .-++osssso/:..` -:ssyo+///osyss/:. `-shhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhh:. ..` :/ssy/:` -/yss/- ``-:/osyso-` `.::+ossyso/:-` `.ssyso..` -:+sssso:. .-yhdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyydhh/- -:so+. `-ossso/. ``osyso..-/+ssyss/:.` ```..---::::::::::::::::::::---..```` `.-:/osyss`` `.+oyss:. `-:ssyoo ./yhdyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhdhs-` :/yys+/ .-oossssss+/ .:sssossyyo+:-.` ``..-::/++oosssyyhhhhhhhhhhhhhhhhhhhhhhhhhhyysssoo++/::-..`` `.-/:: .:osys+.` /+yss`` `.oydhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhh.` ` /+yyy/- `-+ssyso:-/+syy:- .:syss+:-`` ```..-:/+oyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyoo+::..``` ``ossss-. /+yss.` ``yhdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhh/- `./::` `-+syso:--osyss/:.` `-osyso-` `:/:-` ``..::++ssyhhhhhhhhhhhhhhhhhhhhhyyyyyysssoooooooooossssyyyyyhhhhhhhhhhhhhhhhhhhhhyyso+/:..``` -/yys/- -:ssyo+ ``` ./yhdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhs-` ``/oyss.` `/ossossso+:- `./oyys/- `..-//osyhhhhhhhhhhhhhhhyyssooo///::-----....`````````````...-----::://+oossyyhhhhhhhhhhhhhhhyss+/-..` :+yso- `-osyso-` `./++.` `.oydhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhh-. `./+yys/:`` `.oosss+:` `.oos/- .-:/+yyhhhhhhhhhhhhyyss++/::-..```` ```..-:::++osyyhhhhhhhhhhhhyy++:-. -/yys/- -/ssyo/.` ``/+syyo/.` .-hhdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhd+: -/osyo/.` .-osyo+-` ...` `.:/+yyhhhhhhhhdhhyyo+/:-..``` ``..--/+osyhhddhhhhhhhyyo+:.` `.ssyss/:` .-ssyso.` `./osssooyss/- -/hhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhdy/. -:sssss+:` `.+oyss:. ``.:/syhhhhhhhhdhyss+/-.``` ```.-//ssyhdhhhhhhhhyy+/-`` .-+sssso/---:+oyso:. -/sssso-.`/oyss/-` `:sdhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhdd+: `./ossooosso+-` ..ssyso.` `.-+oyhhhhhhhhhhss+/-.``` ``.-:/oshhhhhhhhhhyso--`` `-:ossssssssss+.` `-:sssoo-. `./osyo/-` -/dhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdyo ``+oyss:-.:/ssyoo.` -/syyo/` ``-:oyhdhhhhhhhyy+/:.` ````` ``.....`` `...````` `.-/+syhhhhhhhdhyo/:`` .-/oooo+++-. `./osssso+`` -:ssyo+ +sdhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyydhs-` ``oos/- :/ssys+-` `:+o:- `.:+shhdhhhhhhho+:.` ``` `.-----.. `.-:::--.` `.--:----`` ``..````` `.:/+yhhhhhhdhhso:.. `..`` `.+oyss++osyo/.` -:o/: -ohdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhdho.` `..` `-+oyys+/` `` -:syhhhhhhhhys+:-`` `.-----.` `.-:-----`` `.-:----.` ``--:----.` ``------..` `--/syhhhhhhhhys:-` `-+oyys+:``./oyyo:- .` `+ydhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhh-. `.+oyss+:` -/oyhhhhhhhhs+/..` ``...` ``--:----`` `.-------`` `.-------`` ``.------.` ``--:---.. ``` `./+syhhhhhhhys/: -/ssys+-` `.+oyyy-. `.hhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo/ `-/osss+-. ``/+hhhhhhhhyy/:.`` ..-----.` ``-------.` ``-------`` `.------.` `.------.` ..-----..` `....`` `.-:syhhhhhhhh+/.` .:ooo-. `-+oo.` :+dhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhydhs- `-/ssyss.` ``:+yhdhhhhdys+-` ``..`` ``.------. ``-------. `.------.. `.------.` ..------.` ..------`` --:--..`` `./sydhhhhdhy+/`` ``.. ``` .ohdyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhdyo` -/s++`` `.+sddhhhhhho+.` .-:::--` `.------.` `.----:-.` ..----:..` `.------.` `.------.` `-------`` `.--::---`` ``/ohhhhhhdds+-` `+sdhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhd-. `.`` ``/+yhdhhhhho+-` `` `.------.. `.------.` ..------.` ..------`` .------.`` `.------.` ``-------.` ``-------`` `-/+hhhhhdhho+`` `.hhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo/ `./ohhhhhdhy+:`` `.----.` `..-----.. `.------.` `.------.` ``-------`` `.-------`` `.-------` ``.------. ``------.. `:/shdhhhhds+-` :odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyydhy-` :+yhhhhhhdo/.` ..:-----.` .-------`` `.------.` `-------.` ``-------.` ``------.` `.------.` ..------.` `..:----.. `./+hhhhhhhh+/ `-ohdyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds.` :/dhhhydhh+:` ``.` ``-------`` `.-:-----`` `.-:----- `.-:----. ``--:----. `.------.. `.------.` ..:-----.` .-------` ` `-/yhdhhhdd+: `ohhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhydd/- `-shdhhhhdo/` ``--::-.` `-----:-.` ``-------`` ``-------` `.----:-.` ..----:-. .-----:.. `.-----:.` `.------.` `-------`` ```. /odhhhhdhy:. -:ddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdyy` ..yydhhhhho/ `.----:--` `-----:-. ``------.. `.------.` `.------.` ..------.` .----:--`` .----:-.`` ``-------.` ``-------.` `...` /+hhhhhdhy-. sydhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd+- `:oydhhhdyo:` ..` `.------.` `.------.` `..-----..` `.------.` `.------.` `-------`` `.-------`` `.-------`` ``.------.` ``------.. `.-..` `-oydhhhhhs:` ./hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyydho. :+hhhhhdys.. `.----.. `.------.` `.------.` ..------`` `.-------`` `--:----.` ``-------.` ``-------` ``------.` `.------.` `..-----..` `.--.` `.oydhhhhho/ .+ydyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhho` -/ddhhhdho-` `.-::---.. `.-:----.` `.------.` ``-------`` `.-:-----`` `.-:----- `--:----. ``--:---.. `.------.. `.------.` ..:-----.` .-:-. `-+hdhhhdd+: `oyhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdd/- .+ydhhhdd+: ``` ..------`` .-:--:--` -----:-.` ``-----:-.` ``-------`` `.----:--` `.---::-.` ..----:-. .-----:.. `.-----:.` `.------.` `.-:-.` -/ddhhhdho-` .-ddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdyy /odhhhhdo+ `.---`` `.-------`` `.-------` `.------.` ``-------. `.-----:.. `.-----.`` `....---`` ..---:--`` .----:--`` `-------.` ``-------.` ``---.` /ohhhhhds+`` sydhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd+: -/dhhhhhy/. --:----.` ``-------`` `.------.` `.------.` ..---::-.` `..-.... ``` `..------`` `.-------`` `.------.` ``.------.` `.--:.` .:shhhhhd+:` -/dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhydhs- ./ydhhhhd/- ``.------.` ``------.. `.------.. `.------.` ..----..` ```.......-----.......``` ````..-..` ``-------` `.------.` `.------.` `..:--`` .:hhhhhdy+. .ohdyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdy-` :+dhhhhdo/ -.` `.:-----.` `..:-----. `.-:----.` `.-:::::`` ``` ``...-::////+++ooooooooooooooooooo+++///::-..`` ````` ``--:---.. `.------.` `.------.` .-:--` :+dhhhhdo/ `.sdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhds/ .-dhhhhdy/. `.-::-.. `.------.` ..------.` ..------`` ...`` ````--://++ooossssssssssssssssssssosssssssssssssssssssooo//:--`` ..-----.. `.-:----.` `.------.` `----` `:sdhhhdd:- :+ddyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdd-. `.oyhhhhd+: `.------.` `.------.` ``-------`` `.----:--`` ```..-:://+oosssssssooooooooooooooooooooooooooooooooooooooooooosssssso++/:-``` ..------`` .----:-.`` `------.` ``---.` :/dhhhhhs-` ..hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdys `-shdhhdyo` ` `.------.`` ``-------.` ``-------.` ``---..` ``.-:/++oosssssssoooooooooooooooooooooooooooooooooooooooooooooooooooooooooosssss++:-.`` `.----:--`` `.-----.` ````` ``---`` +sdhhdhy:` osdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd+: +sdhydhs-` `.-`` `.-------`` `.-------` ``-------. ``` `.-:++osssssssoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosssso+/-.` ``.-----.` ``` ..:-` -ohdyhdyo`` -/dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhy-` -/ddhhhho.` `.--:--.` ``------.` `.------.` `.------.` ``:/oosssssooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooossssso+:-` `````````````````` ````` ..:.` `+ydhhdd+: -shdyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdy/. `-shhhhhh-. ``-------. ``------.. `.------.. `.-::-.` `:+ossssoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosssss+:.` ``.......`````````..-:::////++++ooso:` `` ``.-`` `.hhhhhds:` `:ydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhho` `-shdhhdo/ ..-----..` `.------.` `.------.` ``.- `/+sssoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosssso+/-..``..---..`````..-::/++ooooooo+++/////::/:.` ..-` ``-.` :odhhhhy:` `+yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyddo: /odhydhs- `..` ..------`` .------.` `-------.` `:/sssooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooossso+/:`````:::--.````.-/++ossso++/::--...````` ..:--` ``.`` -ohdyhds+ -/ddyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd.` ..dhhhhho.` .-::-.` `-------`` `.----:--`` `.----:--` `./syooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooossso+-.```--//:-.```.-/oossso+::-.` ``` ..::--.` `` `oydhhdd:. ``hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdys `+sdhhdd/- .-:----.` ``-------.` ``-------.` `.---::`` :+ysooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooossso+:.` .:/+/:-``..:+osssoo:-.`` ```` `.---...` `.------.. .-ddhhdyo` osdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo/ ./ydhhdys` ``.-------` ``.---::-.` ``------.. `.--- ..sssoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosss+/.` .-+++:-```-:osyss+/-.` ..` `.-:-.` `.-::---.. `.------.` +sdhydy+. -+dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:. `:yhhhhh/. `` `.------.` ..--.--.` `..---::.. ``` :+ssooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosso+:.``./oo/:.` :/+ssss+:-`` `.:/oo+.` `..::-.` ..------`` `.------.` `:yhhhhh/. `:yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdho- +sdhydy+. ..:.. `.---::-.` ```..--.`` `-oyooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooossso.` `.oos:-```:+sssss:-` `./+sssssso+` .-:--`` `.-------`` `.-------` `:ydyhdso .+ydyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdy:` ``` `.dhhhhy+` `---::.. `.-..`` ````......``````` ``` .ossooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooso+.` `:oy+: ``-/ssysso:. `-/osssoooooosso/` `.-::-.` ``-------.` ``-------`` /sdhhdd-. ``` `-sdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhho` .o// /oddydd:- .-------`` `.-:/++ooooooooooo++//:--..`` -/ysoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosss/- `/+y+/ `:/sssss/:` .-oosssoooooooooosso:. `.:::-.` ``-------. `.------.. .-dhhhds+ .o// `+yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdo/ -/yso`` `.shhhdyy` `.----:-- ..+ossssssssssssssssssssssooo+//`` +ossoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooss+/```:/yo:` `-+ossss+/` `.:osssoooooooooooooossoo.` ..:::-.` ..-----..` `.------.. sydhhds-` -/yss`` :+ddyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhydd/- ``ssssy:- .ohdyhd+: `.` ``--:-. `-+ssssooooooooooooooooooooossssso`` `.ssooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooyo/.` .+sy:- ``oosssyo/.` `++sssoooooooooooooooooosso/. `.-:---.` ..------.` .-------` -+dhhdhs- ``osssy:- .:ddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh.` :+ssosso/` `:hhhhhy- ..:-. ``.` .:sssoooooooooooooooooooooooooosy/: :/ysoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosy+:` /oh+: `/ossosy/: :+ssooooooooooooooooooooooosso-` .-::---.` ``-------`` `.-:--:-. -shdhhd/. :/ysosss+` ``hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyy `:oyoooooyo/. +sdhydy:` ----:-.` oossoooooooooooooooooooooooooosso- `.+soooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooossoo :/hs/. `-ossosyo+ `-osyoooooooooooooooooooooooooossoo` --:--:-.` `-----:-.` ``-----` `-sdhhdyo `-oyoooooys/. sydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds+ ` ```````...-:sssooooosss:.` ``yhhhhy+` ..------.` .-ysooooooooooooooooooooooooooooyo:` ./oyooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosso-` `:sh+: `+oysosso-` ``+ossooooooooooooooooooooooooooooosy+: `.----:--` `.----:-.` ``-::.. +sdhhhh.` ` ```````...-:sssooooosss:.` /odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd+: `-:////+++++oooosooooooooosoo/::--...````` -:ddydd+: `.--::-. :+ssoooooooooooooooooooooooooosso/` `-sssooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosss+.` -/yss`` -:ysosss+.` :/ysoooooooooooooooooooooooooooooooooso:` `.------.` `.------.` `.-:-` -/ddydd/- `-:////+++++oooosooooooooosoo/::--...````` -/dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh/. `.+oyssssssssssoooooooooooosssssssooo+++/:` /oddhhh.` ``` ``--:.` `.+soooooooooooooooooooooooooooosy:- /+ysooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosss-. `.ssy/- `-+sssosy:. `:oyooooooooooooooooooooooooooooooooooosss:- `.------.` ..------.` ...` ``yhhhds+ `.+oyssssssssssoooooooooooossssssoooo+++/:` `:hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy- `.ooysooooooooooooooooooooooooossssyy+/.` .ohhhdyo `---` ``.` `:oyoooooooooooooooooooooooooossoo` ``ossooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosy+/ `/oys+. `-ossosso+ .:sssoooooooooooooooooooooooooooooooooooossso`` `.-:----.` `.------.` ```` +sdhhds.` ``ooysoooooooooooooooooooooooooosssyyo/.` -ohdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdh+. `.+ssooooooooooooooooooooooooosss/:` ./ydhhd+: ..:----`` .+ssoooooooooooooooooooooooooosy/- ``sssooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooss+. .+sys+` /+ysosss:` ``ossooooooooooooooooooooooooooooooooooooooooss+: .-:-----` -------.` -/dhhdy+. `.+osooooooooooooooooooooooooosss/:` ./ydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdy/. `:/ssooooooooooooooooooooosso/-` -shdhhy:` `.------.. .ossooooooooooooooooooooooooosso- +ossooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosss/`` :+yyy:- `.sssooyo:` -/ysooooooooooooooooooooooooooooooooooooooooooos+-` `.-------`` `.------.` -yhdhhy- -/ssooooooooooooooooooooosso+-` `:ydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds-` `/+ssoooooooooooooooooss+/.` `:hhhdho. `.------.` -ossoooooooooooooooooooooooooyo-` :/ysoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosss-. ..sssso`` :+ssosso/` `.+sssoooooooooooooooooooooooooooooooooooooooooooss+. `.------.` `.------.` .+hdhhh/. /+ssoooooooooooooooooss++.` `.shhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhho` .:ssooooooooooooooooso/.` :+dhhdy/` `.----:-` .ossooooooooooooooooooooooosso/` ...` `-ossooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooss+/ `/ssss/- `-oyooosy:. .+ssoooooooooooooooooooooooooooooooooooooooooooooosy/- ``` `.------.. `.------.` `-sdhhdo/ .:ysooooooooooooooooso/.` +yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds+ :+ysooooooooooooooooyo/. osdhhho.` ...` `.--:-` .+ssooooooooooooooooooooooosy-. //:` `:oyooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosso-` `/oys+. `-ossoosoo` -/ysooooooooooooooooooooooooooooooooooooooooooooooosso+ `.-.` `.-:----.. `.-:----.` `+yhhdys :+ysooooooooooooooooyo/. /odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo/ oossoooooosssoooooooso+. ``yhhhds+ `.-:-.` ``:-.` ./oyooooooooooooooooooooosso+ `.+++-` :+ssooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosss+.` `` ``::.` /+ysoosy/- `oossoooooooooooooooooooooooooooooooooooooooooooooooooss.` ---.` .-------`` .------` /oddhhh.` +ossoooooosssoooooooss+. :/ddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdd/: `.sssoosssssooossssooosso. ..hhhdd+: `-:----. ``.` `-oyoooooooooooooooooooooss/- -:+++// ``osssooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosy:- ``/:-.``` :/+oosso-` .-ysooooooooooooooooooooooooooooooooooooooooooooooooooosy:- .-:--`` `.-------`` `.--:-` -/ddhhd-. ``sssoosssssooosssoooosso-` -:ddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdd:- .:yssssso+/:...:/ssssssss:` -:ddhdd:- ..------.` `/ossooooooooooooooooooss+. `.:+///++-. .:sssoooooooooooooooooooooooooooooooooooooooooooooooooooooooosso+ -://:::--.`````..:--` :+ssoooooooooooooooooooooooooooooooooooooooooooooooooooss+: ..:----.` ``------.`` `.:-.` .-dhhdd/: .-ysssssoo/:...:/ssssssss:. .-dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd-. :+yso+/-.` --/oossy/- :+ddhhh.` ..------.` -:ysoooooooooooooooooos+.` .:/+/////+/-` `-+sssooooooooooooooooooooooooooooooooooooooooooooooooooooosss:. `:/::::://:::--..````` `.+sooooooooooooooooooooooooooooooooooooooooooooooooooooosso/` `-------.` `.------.. `.-` ``hhhdds/ :+yso+/-.` .-/+ossy/. `.hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh.` `:/:-.` ../+y/: /sdhhhy`` `.------`` `` ``sssooooooooooooooosso/ .-+/////////+:. .-osssoooooooooooooooooooooooooooooooooooooooooooooooooooyo:` ` `.-:://:::::::::::::.` ./oyooooooooooooooooooooooooooooooooooooooooooooooooooooosso/` ..------.` `..-----..` ``` sydhhy+ :/:-.` ../+s/: ``hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh`` `` ``... `+yhhdyo `.-`` `-------.` `` :/ysooooooooooooooss/- :/+//////////++-. .:ossooooooooooooooooooooooooooooooooooooooooooooooooss+: `/:-` ``.--:::::::::://:` `-ossooooooooooooooooooooooooooooooooooooooooooooooooooooosso/` ..------.` ..------.` +sdhhho` `` ``... yyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyy` .ohhhds+ `.:--` `.------. ``` `-+ssooooooooooooosy:- :/+////////////+/-` `/+sssoooooooooooooooooooooooooooooooooooooooooooosss.` .-++//:.` ```.---::::/:.` -/ssoooooooooooooooooooooooooooooooooooooooooooooooooooooosso/ `` `.------`` `.-------`` /odhhds-` oydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdys `-sdhhdo/ .-::--.` `.----:`` ` `.+sssooooooooooosy/- :/+//////////////+:- `/+sssooooooooooooooooooooooooooooooooooooooooosy/: `:+///++-. `...````````.` +ossooooooooooooooooooooooooooooooooooooooooooooooooooooooss/- ..-` ``-------.` ``-------`` :+dhhdy:` osdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdso `:ydhhd+: `.------.` `.-::.. .-sssooooooooooss+: -:+///////////////++:-` `-+osssoooooooooooooooooooooooooooooooooooooss+. .//+//+// `/oss+//:-.` ``sssooooooooooooooooooooooooooooooooooooooooooooooooooooooosy-. --:--` `.----:-.` ``------.. -+dhhdy+. +sdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds+ ./ydhhd+- `.------.. `.-:-` :/sssoooooooosso/` `-+/////////////////+//-. `./+sssooooooooooooooooooooooooooooooooosss+.` -:+////+-. `:oysssssys/. -:ysooooooooooooooooooooooooooooooooooooooooooooooooooooooosss`` ------.` `.------.` ..-----` ./hhhdy+. /odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds+ .+ydhhh/. `.-------`` `---` .:osssooooooooyo-` `:/+////////////////////-.` ``-/osssoooooooooooooooooooooooooooooosy:- `.++///+/:` `-ossooooos+.` :+ssooooooooooooooooooooooooooooooooooooooooooooooooooooooss+/ `.------.. `.------.` ..-::`` `:yhhdho. /odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo+ .ohdhhh:` ``` `.-------`` ``-.. -:sssoooooooss+. `:+////////////////////+/:-. `./+sssoooooooooooooooooooooooooossoo` -/+////+:` :+ysoooosso/ `.+soooooooooooooooooooooooooooooooooooooooooooooooooooooooosy/: `.------.` `.------.` ``-:`` -yhhdho. /odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo/ .ohdhhy:` ``:-.` ``------.` `.`` :/yssoooooosy/- .-++////////////////////+++-. `./+ssssooooooooooooooooooooosss:. `-/+///++:- ``sssooooosy:- `:oyooooooooooooooooooooooooooooooooooooooooooooooooooooooosss-` ``` .-:--:-.` `--:----.` ```` -shddhs- :odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo/ .ohdhhy- ``:::-. ``-----:.. ` `-+sssooooosss`` :/+//////////////////////++/--` .:+osssooooooooooooooooooyo:` `-+//////+`` :/ysooooosss.` .ossoooooooooooooooooooooooooooooooooooooooooooooooooooooooss/. `.-:`` `.----:--`` `.----:-- -shddhs- :+dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo/ .ohdhhy- ``:---:-.` `..----:..` `.oosssooosso/` .:/+//////////////////////+++::.`` .-++sssssooooooooooosso/ //+////+:- `.+ssooooosso+ .:ssooooooooooooooooooooooooooooooooooooooooooooooooooooooooyo-` `--:--.` ``-------` `.------.` -shddhs- :+dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo/ .ohdhhy- ..------.` ..------`` `-/osssoooss+.` `-:++///////////////////////+///:.` ``-:/ossssooooooosss.` .-++//////.` .+ssoooooosy/: :+ysoooooooooooooooooooooooooooooooooooooooooooooooooooooosso/` `-------. `.------.. `.------.` -shddhs- :+dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo/ .ohdhhy- `-------`` `.-------`` `-:ssssooss+/ ``:/+/////////////////////////////:-. `.-/+ossssoosy+: `://////+/-` .:ssoooooosso-` +ossooooooooooooooooooooooooooooooooooooooooooooooooooooooss/: `..:----..` `.-:----.. `.------`` -shddhs- :+dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo/ .ohdhhy- ``--:----.` ``-------` .-osysooss+: `.:/+////////////////////////////++:-.` ```:/+ssyso-` `:/+//////: +ossooooooyo/. `.sssooooooooooooooooooooooooooooooooooooooooooooooooooooooosy-. ..:-----.` .-:-----` --:::`` -shddhs- :+dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo/ .ohdhhy- ``` `.-:--:-. `-----:-. -:ssssoyso-` ../++////////////////////////////++//-.` ../:.` -:+/////++.. .-ysooooooooyo-` ` -:ysoooooooooooooooooooooooooooooooooooooooooooooooooooooossoo `... `-------`` ``-------`` `.-:`` -shddhs- :odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo+ .ohdhhh:` ``--` `.------.` ..-----..` .-+osssyo+`` ..........-://+////////////////////+//:-.``` `.++/////+// /ossoooooosso/ ` :+ssoooooooooooooooooooooooooooooooooooooooooooooooooooooosy+: .-:-.`` ``-------.` ``-------.` `.`` -yhhdhs- /odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds+ .+ydhhh/. ---.` ..------.` ..------`` `-:/:---`` `````--///////////////////////++///-. `-/+//////+-. `-oyoooooooosy/- `` `/sssooooooooooooooooooooooooooooooooooooooooooooooooooooosss:. .------` ``-------.` `.------.. -yhhdho. /odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds+ .+ydhhd+- --:--.` `.------.` ``-------`` ``` ```....... .-:-` .-//+////////////////////+++-` `-/+/////+//. `-ossooooooooss.` `. `-oyoooooooooooooooooooooooooooooooooooooooooosssssssssssssys+. `.---::-.` `.------.` `..-----..` .:hhhdho. /odhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdso ./ydhhd+: .-:----.` `--:----.` ``--:----.` ``` `.-::/++oooooooo/: ``o/-` `:/++//////////////////+/.` .-+///////+/.` :/ysooooooossoo ``.. ./oyooooooooooooooooooooooooooooooooossssssssssoooooooooossyo-` ``..-:::.. `.------.` ..------`` -/dhhdy+. +sdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdys `-sdhhdo/ `.-------`` `.-:-----` `.------. ```-:/+ossssssssosssosss+` +:.` -.```:/+///////////////++.. ``+///////++:- ``sssoooooooosy+: `-```-sssoooooooooooooooooooooooooosssssso++///:-.....````````.... ````` ``.--.. `.------.` ``----:-- :+dhhdy/. +sdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyy `.ohhhds+ ``-------`` `.------.` ..---::.. ``--/+osssssooooooooooooosy/- `./- ``so/.` .:/+////////////+:: `-/+///////++`` -/ysoooooooooss:. `-` `./++oosssssssssssssssssssssssoo+/:--.```` ``````````````````` ```` ``...`` `-------.` ``--:-. /odhhds-` osdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy`` `+yhhdso `.------.` `.------.` ..-..`` `.-/+sssssooooooooooooooossso+```-/.` -:yys+/`` -:++////////+//.` `:/+///////+/: `+sssooooooooss+. ..-` ``..-::://++oooooooooo+//::..` `````..----:::::::::---...`` ``` `.------.` `.-.. +sdhhho.` syhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh.` +sdhhyy ` `.------.. `.------.` ` `-:+ossssooooooooooooooooossso/.``.:-- .-ossss/:` ::+/////++/:` -:+//////////-` ./oyooooooooooyo:` --.` ...```` ``.....---..`` ``..--://////////::----......````` `.------.` ``` sydhhy+` ``yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd-. /oddhhh.` `-.` `.-------`` `-----:-.` :/oossssooooooooooooooooosssso-. `.::-` ...` .:ossso+. ``...--::/.` `.++////////+/-` .:sssoooooooooss+`` :- ``+++//::-..` `.--:////////::--...``` `````````````` `.------.` ``yhhdds/ `.hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd:. -:ddhhd-. `.-:`` `.-------`` `.--.. `./+ssssooooooooooooooooooossso/-. `-::.` ../++:- ``/osss+/ ``` `.:////////////:` +ossoooooooooss+: .-:- `.::---..``` ``.---:://:::--..````` `..--::://++++++ooo++++++/::--.` `.------.` ..dhhdd+: .-dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdd/- .-dhhdd+: `-:--.` ``-------`` `` `:/osssooooooooooooooooooossso+-.```:::.```-:////++.. `.ossss:- `` `.//+////////++.. .-ssooooooooooosy-. -/-. ````` ``..---------..`````````````..::///+ooosssssssssssssssssssssssssso++/:..`` `.----:-` -:ddhdd:. .:ddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhddo: ``hhhhds/ `.-----. `.------.. `-/sssooooooooooooooooosssss+/:.``.-::-. ``-:+///////+:.` -/ssss+.` ` ``//+/////////+// /ossoooooooooosss`` :/`` ````...`````.....```` ```````--:://+ooosssssssoooooooooooooooooooooooooooosssssoo+/:``` ``` `.--:-` :oddhhh.` -/ddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds/ oydhhho` `.----:-.` `..-----` ./oysoooooooooooooosssssoo/:- ``..:::.```.:/++////////+++-` `:ossso-` -:++//////////+-. `:oyoooooooooooss++ `-// ```````` `````...--::/+++oosssssssssoooooooooooooooooooooooooooooooooooooooooossssoo/-.`` ```` `.-. +yhhhyy /oddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyo` /odhhdy:` ..------.` .-:.` :/yssooooooooossssssoo+::.. `.--::-.` `.::/++////////////+//`` -/ssso+ -/++////////+/:` `-sssoooooooooooss:. .+:- `````.....---::///++ooooossssssssooooooooooooooooooooooooooooooooooooooooooooooooooooooosssss+/-` `.. `` `.shhhds+ +shhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds-` ./hhhdho. `.------.` `` ``` +oyssssssssssoo++/:-..```---::-..` ..-////////////////////++:- ``oosss:- ``/////////+/:` +ossooooooooooosso. `-o-` .+++++oooooooosssssssssssooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosssss:. `-:-.` .+ydhhd+- `.ohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdy:` -yhdhhy-` ``-------.` :::` .-/+++++///::-..````..---:-.````.--/////////////////////////+/-` .:ssss+.` -:+/////++.. .-ssoooooooooooooyo:` :/+. .:ysssssssssssooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosss-` `-:---`` -shdhhy:` `-sdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdy+. .+ydhhd+- `-------. -/o:-```````````````.------.`````..::/++////////////////////////////.` ./oyss+. `./////+/: `/ossooooooooooooss+.` o+:` /+ysoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooys+. `----:-. ./hhhdho. ./ydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhs- `.sdhhds+ `` `.----:-.` `.:::----.......---..`` ``..::/+++///////////////////////////////+// /ossy/- `-/+///.` ./syoooooooooooooss+: ``s/` oossooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosss+.` ``--:.` /odhhds-` .ohdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh:. ``..-.` +sdhhhh`` `... `.---:--` ` `````````` --.` .-/++++////////////////////////////////////++.. .-ssso+ `:++/.` -/ssoooooooooooooosy-. -/o/ ``sssooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosss:. ` ``.` `yyhhhy+` `.. `-yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd+- ``.--:/+osy+/ -/ddydd/- `-:.. `.--::.` `-`` `--------:- ooo- `.//+///////////////////////////////////////+/:` +osss.` -::- ``ossoooooooooooooosoo` +s:- -/yysooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosss/: ``-.` -:ddhdd+: .:ooo`` `` ./dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdo+ `.-::/+ossyssossso` `.hhhhds+ ..:-.` `--:-. `--. .//+/////+/.` /+h/- `-/+////////////////////////////////////////+/-` -/yyy/- ```` :+ssoooooooooooooosy+/ `-oy`` -:ooosssssssoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooosss+-` `.-:--.` /oddhhd-. `osyso`` `./++//:.` :+dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdys `.-:++ossyyssso+/-.`-osy.. osdhydy-` `--:--` `--: `-- `./+/////+/:` `:yo+ ://///////////////////////////////////////+//. -osyo/ `:oyooooooooooooooosss:` .ooo ``..-:/++ossysssssooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooossyoo.` `------:`` `.sdhhdys .-yyo-` +oyyyyyyso.` osdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh`` ./shsso++-:/sy/- `-sh+: ./dhhdhs- ..:----` `..` -:`` -/+//////+-` `:sh-. ..++////////////////////////////////////////+:. `:oys+.` :/ysooooooooooooooooys/. .:h+: ``` `.-::/+oossssssssoooooooooooooooooooooooooooooooooooooooooooooooooooooooosss+:` --:-- .ohdhhd+- :+ho-` .:yyo:.-:+syo/` yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdd:- `.+ss+.` `+ss+` `+ss+` -shdhhd+- `------.. ` ..:. .-++/////+/: `+yo/` //+///////////////////////////////////////+/: `+syo:-.sssooooooooooooooooss+.` /oy:` `.---..``` `..-:://+ooosssssssssoooooooooooooooooooooooooooooooooooooooosssss+/.` ``---`` `.`` ./hhhdhy- `+ss+` `/oyo:` `.+syo.` .-dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyddo/ :+yo.` :+hs:` :+hs:` `-sdhhdys `..-----.. `:-```/////////+`` -/hs:` .-+////////////////////////////////////////// :ossooossooooooooooooooooss+: ``ys+. ..-::---.` ``..--::/++ooossssssssssoooooooooooooooooooooooooossssss+/-` --::---` +sdhydy:` `/syo:.``./syo/` `.+yo/` :+ddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy+` .:hs/. .-hy+. .-so:` +sdhhhd-. .-------`` ---` -:+/////++-. `.yss:. `-/+//////////////////////////////////////++.` -/sssssooooooooooooooooooss.. -:hs:` `` `.-:----.` `....``` ```..--://++ooosssssssssssssssssssssssssssoo+/--`` `.------.. `.hhhhhy+` -:yyso+/+syy-. ./sh/- +sdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdy-` ``sss:` ``:-.` ```` .-ddhhds/ `.-------`` `./. `.+///////+:` /oho+ -:++////////////////////////////////////++.` -/ysooooooooooooooooooosso+ `/ss+` ---` `--:----.` ``--:----.` `````..-::///++++ooooooooooo++//:-.``` ``.--. `.-:--::`` /oddydm/- :/ossyyy+/ .:syy.. `.sdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdho. /oho/ ``.-: osdhydy:` ``-------.` `::: `-/+/////+/:` `-syy/- `//+///////////////////////////////////++.` -/ysoooooooooooooooooooss:. `:sh/: `--:--`` `.-------` `.-:--:-. ``..`` `````````````` `.::----.` .-:-- `-sdhhdys ``` ``.--.` `.syyo/ ./ydyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy:` -:o:- `.++syy-. ./hhhhhy:` ``------.. `:/`` -/+//////+-. `:oyso:` `-//+///////////////////////////////////` :+ssooooooooooooooooooss+. `-osy.. ``-------`` `.------.` `.------.` `..-----..` ``` ` ```...` `-------`` `.`` `-shdhhd+- `.so/. `.o+/.` -shdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd+: :+yys+/.` .+ydyhds+ ..---::.` -::- `.++/////+/: `/osss/- `.:/+///////////////////////////////+/: `/sssoooooooooooooooooos+.` :+yo+ `.------.. `.------.` ..------.` ..--:---`` ..---...`` .-:::--.` ``-------.` /odhhdho. -/hy+. `` -/dhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdyo `..`` `-oys+.` `oyhhhhd-. ..--:-. ``+/.` :/+/////++.. .-sssss-. `.//+/////////////////////////////+:. `-oyooooooooooooooooooss+: ``ssy/- `.------.. `.------.` `.------`` `-------`` `.-:::---`` ``.-------` ``.------. `.hhhhhho.` `.+ys+` `.-.` +sdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh`` `.:/+os+/:.. ./sy+: -:ddhhdy+` `` ``--:-.` ::+. `-+////////:` /+ysss+-` `.:/+/////////////////////////+//. `-ossooooooooooooooooosss.` -/yyo- `-.` .-------`` `.-:----.` ``--:----.` ``-------.` ``-------` `.------.` `.-::-- /sdhydd/- ./sh:- `:sy/: `-:`` `yhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhydd+: .:yyoo+ssyso++oss.` osdhydho. ``.`` ``--:.` .+/: `./+/////+/:. `.+sssss+/```.-//+////////////////////++/:` /+ssooooooooooooooooosy+/ `.+syo-` ..:--.` ``-------`` `.-------`` `.-------` `.------. ``------.. `.------.. ..-`` ./ydyhdys` ./yso` `-oyy-. ./sh:- -:ddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhy+` ``::.``.-/++sssss+/:.````.-`` `:yhhhhd+: `..`` ``--- `./o.` -:++/////+:- ``/osssss+:```.-:/+/////////////////+//`` .-sssooooooooooooooooosso-` .+sy+: .-:----.` ``-------.` ``------.`` `.------.` ..------.` ..-----.. `.------.` -/hhhhhh/. +oyoo..`` :+ho+ .:yss`` +sdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdy:` `.ossoosssoo/++sy:- `:ydhhhhh.` ``-.` .-`` -:+:```//+/////++.` `.ssssosso:-`` .-/////////////////:.```-+sssooooooooooooooooosso-` -/yss.` ``.------. `.------.. `.------.` ..------.` ..------.` .-------`` .------.` ``yydhhdy/. `+osssso+::ooy:. /oh+/ `-sdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhydhs- .-yso:.--/oossso+-. :+ddyhds+` ..-.. .`` +//. `-//+/////+:.` .:ossoosss+/.````.--::::::::--.` `./+sssooooooooooooooooooss/- ``ssy+: ` `.------.` ..-----..` `.------.. `.------.` `.------`` `.-------`` `.---::.` `/oddyhdo/ `.-:/oossssso/-.` `.yss-` .ohdyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd+- :+hs/. `.--.```.-` ``sydhydyo. .-:.` ` `-+/: `.:++///////-. `./ossoossso+/--.`` `````` ``.-:+osssoooooooooooooooooosyo+```:+ys+. `-.. `.------.` ..------.` .-------`` `.------.` ``-------.` ``-------`` ``--.` ./ydhhdhy.` `.-:/oosssoo//+ys:` ./hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdyo `-:/oss+.` +oy/- .:yhhhhdo+ ``:--` ./+-. `.//+///////.. `.+ossooossssoo++/::::::/++oosssooooooooooooooooooooss+-` ./syo/` .-:--.` `.------.` ``.------`` `.-------`` `.-------`` ``.------.` ``-------. `` /odhhhhh/. `.://`` `..-//oosyyo/` +sdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh.. `.syyss:- :+yso`` `-shhhhhd:- `.:--` `.+/-``.-//+///////-` `./osssooosssssssssssssssssoooooooooooooooooooooss+/`` :+yss-. .-:----.` `-------.` ``-------.` ``-------`` `.------.` `.------.` ..------.` .-hhhhhdy:` `+osyy-. `` ```.:/+:. `.hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyddo: ///-. ./sy/: -/ddhhhhs-` `-:-.` .-+::```-:++////++:-```-:ssssooooooooooooooooooooooooooooooooooooosso+`` -:yyy+: `.-------` `.------. ``-------. `.------.. `.------.` ..------.` ..---:-` `.ohhhhdd+: -/yys/:` :/o/-`` `` :/ddyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhds.` .-:osyo-` +odhhhhh/- ``--:.. `://:.` ..::////++/:.` .-+osssoooooooooooooooooooooooooooooosssso/. `./oyyo/` ```` ``-------` `.----:-.` ..----:-.` ..----:..` `.-----:.` `.------.` `--`` ./hhdyhdso `-oys+.` .-yyyyyo+:.` `ohhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhydho. `.::ossoosss:. .ohdhhhhh-. ``-::.` :/+/:.` ``..---:::.` .-/+oooooooooooooooooooooooooooossso+-. `.+oyss:- ``--:-. `.------.. `.------.` ..------.` ..------`` `.------.`` ``-------.` ` ..yhdhhdhs-` `-osy:- `/oso://syy+/ .+ydyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhd/- ../+osyso/-.:+yo+`` `/odhhhhhs:` `..:--`` `.:/o+/:-..`` ````` ```.-:+osoooooooooooooooooooosssss+/-.```-+oyso:- ``::----.` `..-----.. `.------.` `.------.` ``-------`` `.-------`` ``.------- `-oydhhhds+` :+yso` .-:. ``:/yss`` ./hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdys .-/ooyss+/..` `-oyh/- ``osdhhhhh+: ..:--`` ``-:+ssso+/////////++ooooooooooooooooooooosssssoo+:-`` .-+oyys/:.` ..------.` .-------`` `.-:----.` `-------.` ``-------.` ``-------` `.-::-. -/hhhhhdys`` -/yss.. `:syy-. +sdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdd-. `.:/ssyss+/.`` `./o.. `-shdyhhhh:- `--:-` `.-ooyyysssssssssssooooooooooossssssssoo+/:```` .-/syyso:-` `..` ``-------`` `.-:-----`` `.-:----- `--:--:-. ``--:---.. `.------.. ...` .-hhhhydhy:` -osyo+/.` :+yso`` `.hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdy+` .+yhso/-. `./-. /oddhhhdy/.` --:-. ```` `.:/++oossssssssssssssssoo++//::.. ```.-:+oyys+/.. ``--::-.` ``-----:-.` ``-------`` ``------.` `.----:-.` ..----:-. .-----:.. .:ydhhyhds/` `:/ssyss/:.`` .-yys:. +sdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhydy/. `.:/.` `--osyso`` +sdhhhhds+`` `.--..` `...`` `...-------------...`````....-:/++ooo++--.` ` ``.----:--` ``.------.` `.------.. `.------.. `.------.` ..------.` .------` ``/odhhhhdso`` .-/osyys+/--:+syo:` `:ydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh/. -:+syso+syo/` ./yhhhhhds+.` ``---.` ``---..``` ``..--:///////:::-.`` ``..-.` `.------.` `.------.` `..-----..` `.------.. `.------.` `-------`` `..-`` `./odhhhhdy+-` ``.````` `.:/osssssss/: `:hhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdyo `-/ssyso-..:+hs+. -:hhdhhdhy+: ``.-`` `.-:----.` ````.....``` ``--:---.. `.------.` ..------.` ..------`` `.-:-----` `--:----.` ``-------.` -/yhdhhhhd/-` `-+ooo+++///:-. `.-:+/:--`` +sdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdd:. -:ossoo/.` ``osyo/ -/hddyhhhh/: `..`` `.::----.` ``......`` ``------. `.-:----.` `.-:----.` `-------`` `.-------`` `.-:-----` `.-:----- `--::::.` -:hhhhyddh+: `+oyssosssyyyyss/-` `` .-dhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhho` `./+yysss+/` `-oyy:- `/sddhhhdhs:. ``` `.------.. ..::::--.` ..:-----.` .----:--`` .-:--:--` -----:-.` ``-----:-.` ``-------`` `.------.` `...` `-ohdhhhhds+.` -:hyo-```..--:/+oyss/:` `+ydhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyydho- :/syyo+:/+ys/.` `-oyh/- +ohhhhhdhh/:` `.------.. `.------.` `-------`` `.-------`` `.-------` `.------.` ``-------. `.------.. `.------.. `-:yhdhhhhhs+`` .-yss-` :/sssss+:.`` .+ydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhd+: /+y+/.` `.osy+:`` ..+osss.. `:oydhhhhhyo:- .------.`` ``-------.` ``-------.` ``-------`` `.------.` `.------.` ..-----..` `.------.. `.----.. .:oyhhhhhdys/. +oho/ `-+so+:+oyys:. -/dhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhh.` `.-`` .:sss///+oyso:- `.oshhhhhdhy/:` `.-------`` `.-------`` ``.------. `.------.. `.------.. `.------.` ..------.` .------.`` `..` `-/yhdhhhhdyo-. -/yss.` -/syy-. `.++o-` ``yydhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhds+ -/ssssssss/:.` `.:syddhhhhhy+: ``--:::--` `.------.` `.:-----.` `..:----.. `.-:----.` `.------.` `-------`` `.---::-- :/shhhhhddhs/.` ``.` .+sy+:`..ssy/- ``` /oddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdy+. ..sss/-..-.. ````.-:.. ``+shhhhhhhhs+:.` ``..--:-. `.------.. `.------.` ..------`` .-------`` .------.` `-------.` ``-..`` ``-+ohhhhhhhhso.` `+oy+: `./oysoooso-` ./ydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhd+: `/oys/. ``-://+ooosss+:.` `.-+shhhhhhhhso-.` ``..-..` `.------.` `.------.` ``-------`` `.-------`` `.-------` ``.----:-. `.-oshhhhhhhhso:.` :/ssy/-` `.++ssss+.`` -/hhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhh.` `+so/` `./osssssoo+//ssy/: ``/+yhhhhhhhyyo:-`` ``` `.----:-.`` ``-------.` ``-------.` ``-------`` `.----:-.` `.-..`` ``-:+sydhhhhhhyo/`` `-+sys/.` .:+osso/:` ``yydhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhds+` .--. :/sss+/:--.`` /oho+ `.:+yhhhhhhdhho+:.. `.----:--`` ``.------.` ``-------. `.------.. `.------`` `.:+oyhdhhhhhhh+/-` ` .-ssy:. `./+yss`` `/oddyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdho. `-/syyso`` `osy/- -:+sydhhhhhhhys/:.` ````.....` `.--:::--` `..--:::-.` `..-----.` `````` `.:/syhhhhhhhdys+:- `-+/: osy+:`` ``--- ./ydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhdo+ .:+syoo+sy+:` .-yso-` ``./+shhhhhhhhhyso::.`` ``......`` ..-..-..` `````` ``-:ooyhhhhhhhhhyo+..` -/yyy/:` -:ssssso+/-. /odhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhd:- /+yso..`/+yso-. :/hs+. ``.:/syhhhhhhhhhyyo+:-``` ```--+osyhhhhhhhhhys/:.`` `.:osys+-``.:osso//+sssss+/:.` .-hhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhhs-` `-/-. ``+oyso...+syo-` ``--:::..` `.:+ohhhhhhhhhdhyso+:-.`` ```--+osyhdhhhhhhhhhso:.` ``--:.` .-ssyo+/+sss-. ``-:/ooyso-` `.ohhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyydhh/. ./osoossy/- `/+sssyyso/-. -:/oshhhhhhhhddhhyso/:-..`` ``..-:/osyhhddhhhhhhhhso+:- .-/ossyy/- .-+syyss:. `.:-` .:yhdyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdhy.` `/oyys/: `-+syo+:::osyso-. ``-:/osyhhhhhhhhhhhyyyoo+/:--..`` ```.--://+oyyyhhhhhhhhhhhhso+:-.` .-osyss/::.. `:/sss/:` ``sydhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhdy+.` -:osso+-` ``+oyso.` .-/osso/. `.-:/ooyyhhhhhhhhhhhhhyyysso+//:::---..``` ```..---::://+ossyyyhhhhhhhhhhhhhyyoo/:-.` `-osso+-. ``:/ssy+:` `+sdhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhs:. +oyso.` `:+yyo:. `-:sss:. ```.-:/+ssyyhhhhhhhhhhhhhhhhhhyyyyssooo+++++++++++++++++++oosssyyyhhhhhhhhhhhhhhhhhhhyss+/:-.``` .+sh/:` `-+syso-` `-ohdhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhdys`` `./.` .+sys+.` `ssy/- ```.-:++osyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhhhyyso+:-.```` -oyy:- `.sso-` `oydhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhdy+. :+yss.` `-/yss:. ``/:.`` ``..-:/++ossyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyysso++/:--.`` ` ./sys+.` ``` ``` `/sddyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyydhs:. +oho/ ./oyso-` :+yys+/..` ```..--:::::///////+++++++///////::::---..`` `.-/:-.. `:+yys:. `-o+/` `-ohdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdyy.` /+ho+.` :+yys:. `:oyoo+ssso/:- .-+ossssoo:-.` ``+oyso.` ``+oho+ `.sydhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdyo.` .:ssyo+-` -:yyy/: .:syy--`--ooyss/:` /+yso::/osyso+/`` `-+syo/.` `-/oyys:. `+sdhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyydhh/. ``/+yys+/::/osyo:. osyo+ `.:+syo-` /oh+: `.-+oyyy+: `/oyso///+syyo/.` .:yhdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhdd:- -/oyyyyyys:- :+yso. :/hs+. ``..` `````` /oh+: `./oys+. `+osyyyys/: .-hhdhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhdy/.` `.-::::-- `-oysso:-`` `.+syo:` :+ys+/:..` `..:/+osoo/-. /oh+: ``:/yyy/- `-----.` .:shhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhds+`` .:sss++oss+/-...:osy/: `.+ssssssso+/:.` `.-:+osssso+osyso`` /oh+/ `.:/oosoosss.` ``/ohhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhds+.` `+oyo+`..:+sssoossyso`` .+sy+:.--+ossss+-` `.+ssssoo:-.``.:oyy:- :+yso..-+oyss+/.-+syo/` `/odhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhdhy/- -:hys:. ``:/yssoo+-. .:yyy.` ``.:+yso-` ..:-.` `/sys/.` `:oyo/` `-ossoosss/:.`` `+syo-` .:yhdhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhh/:` ``/:-` :+ho+`` +oyo/ `ssy/: :+yyso+//:.` -:o/.` .-yyo-` `/oyo-` `.+syso-` `.`` `-:hhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhdyo:. /oh+: .-yys:. `.sss:. `.:/sssssy:. `:/-. `..` :+hs/. osy+/ ``.:oss+.` .-yss:. .-+yhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhdys-. osh/- :+ys/. :/ys+. -/yso..-.` `-oys+-` `.-`` ````` ````````.....`` `+os:. -/hs+. -/yss...:/oosss/- /oyso`` .-sydhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhy+-` -/o:. `-oys+.` `.+sy+.` +oh+/ `:oysso- `:sy/- `:/++//-. ``//+++ooooosss++.` osho/ :+ys:` .+syooossoo/:-` `-o/:` `./shdhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhdys-. ``` .+sy/: ./sh+: `.sss:. .+osssy/- ./yh:- :+yssssyoo`` ``sssooo++++/+osyo/` -/yys/-` `.oys+` `-oyss+:-.`` `` `.oshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhy+.` .:ssyo+/:-`` -/sss.` -/hs+. `-sss:/sss`` .osy.` .-yys/:.:+sy+: `osy/-```````.+sy+.` `-+syso:. .+sh/- :+ys/. `./shhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhys-.` `.-:/oosss++///osyo/ `/oyo:` .:yoo`./sh/- `-sss`` ./oys/. `.+syo-` osy/- /oyo-` ..+oyso/+sss`` ..ssy/- `..oshhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhs+-. ..://ossssso+-` `.oys+` -/ho+ `+ss+.` -/yo+ .+syo/` -/yso-` +oh+: `/oys:` `./ossss+/ +oho+ `-/sydhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhdyy:-` ..-::.` `..-/sh/: /oh+/ -:hs+. :+h+/ .:yss.` `osy+: /+yo+.....--/oss+-` .-ssy/- .-/-. `.-sydhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhyo:- `/osssyy/:.` +oy/- ``osy:.:+h+: .:yso...```````+oy+: :/ysooossssssss:- +oy+/ .:+yhhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhhhh+/.` `-:/++ooss+. ``sss:` -/yoooos:. .:ssoooooooooooosy/: -/yso++//::/osy-. -/yso` `.:+yhhhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhhyo/`` ```..:::` .-hyo- .+sssso-` -/yso////++++++osy/- .:yss```` .:syo/` `:sso`` ``/+yhhhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdyo:.` `.o+:` `.+yys+. -/yso``````````osy/- `:sss.` `/oys/. `... `.:osdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyyhhdys:-.` -:so:` -/hso `ssy/- `-oyy-. ..ooo-. `-:syhddyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhdhhs+:.` .`` .-/:: `/++:. `://.` ````` `.:/syhdhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyhhhhhyo/-- ```` .-/oshhhhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyy+/-` `./+yyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhdhhso-. ..oshhdhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhddhy+/.`` ``./+shhddhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhdddyyo/:..` ``.-:osydddhhyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhhhys+/:.` `.::+sshhhhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyyhhhhhhhss+/:.` ``-:+oshhhhhhhyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhhhhhyso/:`` ``:/+syhhhhhhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhddhys+/--``` ```.-/+syydddhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhysoo/:-..``` ```...:/oosyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyyoo/::--.``` ```..-::/+osyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyhhhhhhhhhhyysso++::--..`` ``..--::/+oosyyhhhhhhhhhhyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyyss++//:--...``` ```...--::/++osyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyyyyssoo++++/////:::::::::::::::::::://///+++++osssyyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
51
vendor/league/climate/src/ASCII/the-league.txt
vendored
Normal file
51
vendor/league/climate/src/ASCII/the-league.txt
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyysoo++//////++oosyyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhyo+/-.`` ``.-:+oyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhs+:.` `.:+shhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhyo:.` `` `.` `.` `.:oyhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhyo:` . :/-. -/./`./.-. /` . `:oyhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhy+. `.` /- `o-. +:-+-/-`/:-/ `+ ::-. ./yhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhs/` ` .+-- `+.-./--`.` ```---`::./.:/-.` ` `/shhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhy/` . .+.-+--. ``` ```.....`` ````/:-` `/-:- `/yhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhy+. `- :::-:--.` .-:/++++//////++++/:-.` `` `+. -+`.` `+yhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhy- -//` ./` ` .:+++:-.`` ` ` ` ``.-:+++:. -:::-/::- -shhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhho` ` `:: ` `:++:.````.`...........`.`````.:++:. -.`- ` `ohhhhhhhhhhhhh
|
||||
hhhhhhhhhhhh+` ` .+o:.```.`..`..`................` .:o+. +hhhhhhhhhhhh
|
||||
hhhhhhhhhhh+ .+o-``.`..`..`..`..`..`..`...........```-o+. /hhhhhhhhhhh
|
||||
hhhhhhhhhh+ `/s- `..`..`..`..`...--:::::--.``........```-s/` +hhhhhhhhhh
|
||||
hhhhhhhhhs `o+```..`..`..`.-/++oooooooooooo+/-..`..`.`````+s. ohhhhhhhhh
|
||||
hhhhhhhhy. .y: .`..`..`..`:ooooooooooooooooo+/:-::-...-`..` :y. `yhhhhhhhh
|
||||
hhhhhhhh/ . .y: .`.`.:---. /oooooooooooooooo/::/:-:++:..`..... -y. . /hhhhhhhh
|
||||
hhhhhhhy` `.:s:`` s/ .```+ooooo/-ooooooooooooooo+::/+./ooooo+...`..`. /y` `.:s:`` yhhhhhhh
|
||||
hhhhhhh+ `/ooooo/` /s ..` :ooooo+`ooooooooooooooo//:+/.+oooooooo.`..`..` s/ `/ooooo/` +hhhhhhh
|
||||
hhhhhhh. oooo/ h-`.`` :ooooo.:-ooooooooooooo:--/+`ooooooooooo`.`..`.`-h` oooo/ .hhhhhhh
|
||||
hhhhhhh `. `- -h ``.. `+oos.///-/oooooooooo-----./oooooooooos.`..`..` y: `. `- yhhhhhh
|
||||
hhhhhhy +s `..`` :oo:-///:-:+oooooo-/-/o-.sooooooooooo ..`..`. o+ yhhhhhh
|
||||
hhhhhhy ++ ..`.. `:o/-/////:-:/oo-/:/o+ oooooooooooo-`.`..`.. ++ shhhhhh
|
||||
hhhhhhy +o .`..`.. `-:.-.-:///:.-/::oo.-ooooooosooo+`.`..`..` o+ yhhhhhh
|
||||
hhhhhhh -y `..`..`..:+ooo+../-:/--//:oo/.:::///::-...`` ` ..`. y: yhhhhhh
|
||||
hhhhhhh. `h-`.`..`-+ooo+/--:/-/:`://-ooo-`.`.-:::/++ooooo+:-``.`.h` .hhhhhhh
|
||||
hhhhhhh+ ` /s `..`.---.-:://///::/:::ooo:-+oooooooooooooooooo:`. s+ /hhhhhhh
|
||||
hhhhhhhy .:/:/` `y/ .`.`-/-/-////////:/-/ooo/:`://++oooooooooooo/-`. :y` `/`::` yhhhhhhh
|
||||
hhhhhhhh/ `/`.`: .y- ..`.:/-/-////////.ooooo:-.`..`....:::///:-..`. -y. .::`/` :hhhhhhhh
|
||||
hhhhhhhhy` `--/:` .y: `..-:/-//://///:/oooo:/.`..`..`..`..`..`..`. :y- /.:`-` `yhhhhhhhh
|
||||
hhhhhhhhhs `::.-- .s+````.:/::++/::/+ooo+::.`..`..`..`..`..`..```/s. ..:/-: ohhhhhhhhh
|
||||
hhhhhhhhhh+ ``.-/: `/s-````-:::/ooooo++/:-.`..`..`..`..`..`..` -s+` /-`:/` +hhhhhhhhhh
|
||||
hhhhhhhhhhh/ ..``::. .oo-```.-:::::::--...`..`..`..`..`..`.``-oo. ..-:--: /hhhhhhhhhhh
|
||||
hhhhhhhhhhhh+ -:/.+` .+o:` `.``..`.......`..`..`..`.````:o+- `+.::-` /hhhhhhhhhhhh
|
||||
hhhhhhhhhhhhho` `:.---: ./++:.`````.`...........`.``` .:+o/. ` :-.:/ ` `ohhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhs- -::-:`.. .:++/:..`` `` ` ` ``..:/++:. ``-::::.` -shhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhy+` :.-:.-: ` `.-//+++////////+++//-.` ` ::` .:- `+yhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhy:` /-.:./-:. ` ``......`` `` /-:-:--: `:yhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhs:` ```/-/:.:--- .` ` `/././::/``` `:shhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhs/. : -:`-:`+`:: -` --` :-:`:.-: /:-` - ./shhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhyo:` `.--`/- +.:+ /-.+ +-/- -+ - `-oyhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhyo:`` `` . .- /../ :`.- . ``:oyhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhys+:`` ``-+syhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhso+:.`` ``.:/oshhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhysso++////////++oosyhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
||||
416
vendor/league/climate/src/Argument/Argument.php
vendored
Normal file
416
vendor/league/climate/src/Argument/Argument.php
vendored
Normal file
@@ -0,0 +1,416 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Argument;
|
||||
|
||||
use League\CLImate\Exceptions\UnexpectedValueException;
|
||||
use function is_array;
|
||||
|
||||
class Argument
|
||||
{
|
||||
/**
|
||||
* An argument's name.
|
||||
*
|
||||
* Use this name when internally referring to the argument.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $name;
|
||||
|
||||
/**
|
||||
* An argument's short representation.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $prefix;
|
||||
|
||||
/**
|
||||
* An argument's long representation.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $longPrefix;
|
||||
|
||||
/**
|
||||
* An argument's description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description;
|
||||
|
||||
/**
|
||||
* Whether or not an argument is required.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $required = false;
|
||||
|
||||
/**
|
||||
* Whether or not an argument only needs to be defined to have a value.
|
||||
*
|
||||
* These arguments have the value true when they are defined on the command
|
||||
* line.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $noValue = false;
|
||||
|
||||
/**
|
||||
* Which data type to cast an argument's value to.
|
||||
*
|
||||
* Valid data types are "string", "int", "float", and "bool".
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $castTo = 'string';
|
||||
|
||||
/**
|
||||
* An argument's default value.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $defaultValue = [];
|
||||
|
||||
/**
|
||||
* An argument's value, after type casting.
|
||||
*
|
||||
* @var string[]|int[]|float[]|bool[]
|
||||
*/
|
||||
protected $values = [];
|
||||
|
||||
/**
|
||||
* Build a new command argument.
|
||||
*
|
||||
* @param string $name
|
||||
*/
|
||||
public function __construct($name)
|
||||
{
|
||||
$this->setName($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a new command argument from an array.
|
||||
*
|
||||
* @param string $name
|
||||
* @param array $params
|
||||
*
|
||||
* @return Argument
|
||||
*/
|
||||
public static function createFromArray($name, array $params)
|
||||
{
|
||||
$argument = new Argument($name);
|
||||
$params = self::getSettableArgumentParams($params);
|
||||
|
||||
foreach ($params as $key => $value) {
|
||||
$method = 'set' . ucwords($key);
|
||||
$argument->{$method}($value);
|
||||
}
|
||||
|
||||
return $argument;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get argument params based on settable properties
|
||||
*
|
||||
* @param array $params
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected static function getSettableArgumentParams(array $params)
|
||||
{
|
||||
$allowed = [
|
||||
'prefix',
|
||||
'longPrefix',
|
||||
'description',
|
||||
'required',
|
||||
'noValue',
|
||||
'castTo',
|
||||
'defaultValue',
|
||||
];
|
||||
|
||||
return array_intersect_key($params, array_flip($allowed));
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an argument's name.
|
||||
*
|
||||
* Use this name when internally referring to the argument.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function name()
|
||||
{
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an argument's name.
|
||||
*
|
||||
* Use this name when internally referring to the argument.
|
||||
*
|
||||
* @param string $name
|
||||
*/
|
||||
protected function setName($name)
|
||||
{
|
||||
$this->name = trim($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an argument's short form.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function prefix()
|
||||
{
|
||||
return $this->prefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an argument's short form.
|
||||
*
|
||||
* @param string $prefix
|
||||
*/
|
||||
protected function setPrefix($prefix)
|
||||
{
|
||||
$this->prefix = trim($prefix);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an argument's long form.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function longPrefix()
|
||||
{
|
||||
return $this->longPrefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an argument's short form.
|
||||
*
|
||||
* @param string $longPrefix
|
||||
*/
|
||||
protected function setLongPrefix($longPrefix)
|
||||
{
|
||||
$this->longPrefix = trim($longPrefix);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if an argument has a prefix.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function hasPrefix()
|
||||
{
|
||||
return $this->prefix() || $this->longPrefix();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an argument's description.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function description()
|
||||
{
|
||||
return $this->description;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an argument's description.
|
||||
*
|
||||
* @param string $description
|
||||
*/
|
||||
protected function setDescription($description)
|
||||
{
|
||||
$this->description = trim($description);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether or not an argument is required.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isRequired()
|
||||
{
|
||||
return $this->required;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set whether an argument is required or not.
|
||||
*
|
||||
* @param bool $required
|
||||
*/
|
||||
protected function setRequired($required)
|
||||
{
|
||||
$this->required = (bool) $required;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether or not an argument only needs to be defined to have a
|
||||
* value.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function noValue()
|
||||
{
|
||||
return $this->noValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set whether or not an argument only needs to be defined to have a value.
|
||||
*
|
||||
* @param bool $noValue
|
||||
*/
|
||||
protected function setNoValue($noValue)
|
||||
{
|
||||
$this->setCastTo('bool');
|
||||
$this->noValue = (bool) $noValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the data type to cast an argument's value to.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function castTo()
|
||||
{
|
||||
return $this->castTo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the data type to cast an argument's value to.
|
||||
*
|
||||
* Valid data types are "string", "int", "float", and "bool".
|
||||
*
|
||||
* @param string $castTo
|
||||
*
|
||||
* @return void
|
||||
* @throws UnexpectedValueException if $castTo is not a valid data type.
|
||||
*/
|
||||
protected function setCastTo($castTo)
|
||||
{
|
||||
if (!in_array($castTo, ['string', 'int', 'float', 'bool'])) {
|
||||
throw new UnexpectedValueException(
|
||||
"An argument may only be cast to the data type "
|
||||
. "'string', 'int', 'float', or 'bool'."
|
||||
);
|
||||
}
|
||||
|
||||
$this->castTo = $this->noValue() ? 'bool' : $castTo;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an argument's default values.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function defaultValue()
|
||||
{
|
||||
return $this->defaultValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an argument's default value.
|
||||
*
|
||||
* @param string $defaultValue
|
||||
*/
|
||||
public function setDefaultValue($defaultValue)
|
||||
{
|
||||
if (!is_array($defaultValue)) {
|
||||
$defaultValue = [$defaultValue];
|
||||
}
|
||||
$this->defaultValue = $defaultValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an argument's value.
|
||||
*
|
||||
* Argument values are type cast based on the value of $castTo.
|
||||
*
|
||||
* @return string|int|float|bool
|
||||
*/
|
||||
public function value()
|
||||
{
|
||||
if ($this->values) {
|
||||
return end($this->values);
|
||||
}
|
||||
$cast_method = 'castTo' . ucwords($this->castTo);
|
||||
return $this->{$cast_method}(current($this->defaultValue()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an argument's values.
|
||||
*
|
||||
* Argument values are type cast based on the value of $castTo.
|
||||
*
|
||||
* @return string[]|int[]|float[]|bool[]
|
||||
*/
|
||||
public function values()
|
||||
{
|
||||
if ($this->values) {
|
||||
return $this->values;
|
||||
}
|
||||
$cast_method = 'castTo' . ucwords($this->castTo);
|
||||
return array_map([$this, $cast_method], $this->defaultValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated use values() instead.
|
||||
*/
|
||||
public function valueArray()
|
||||
{
|
||||
return $this->values();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an argument's value based on its command line entry.
|
||||
*
|
||||
* Argument values are type cast based on the value of $castTo.
|
||||
*
|
||||
* @param string|bool $value
|
||||
*/
|
||||
public function setValue($value)
|
||||
{
|
||||
$cast_method = 'castTo' . ucwords($this->castTo);
|
||||
$this->values[] = $this->{$cast_method}($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $value
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function castToString($value)
|
||||
{
|
||||
return (string) $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $value
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function castToInt($value)
|
||||
{
|
||||
return (int) $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $value
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
protected function castToFloat($value)
|
||||
{
|
||||
return (float) $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $value
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function castToBool($value)
|
||||
{
|
||||
return (bool) $value;
|
||||
}
|
||||
}
|
||||
183
vendor/league/climate/src/Argument/Filter.php
vendored
Normal file
183
vendor/league/climate/src/Argument/Filter.php
vendored
Normal file
@@ -0,0 +1,183 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Argument;
|
||||
|
||||
class Filter
|
||||
{
|
||||
protected $arguments = [];
|
||||
|
||||
/**
|
||||
* Set the available arguments
|
||||
*
|
||||
* @param array $arguments
|
||||
*/
|
||||
public function setArguments(array $arguments)
|
||||
{
|
||||
$this->arguments = $arguments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve optional arguments
|
||||
*
|
||||
* @return Argument[]
|
||||
*/
|
||||
public function optional()
|
||||
{
|
||||
return $this->filterArguments(['isOptional']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve required arguments
|
||||
*
|
||||
* @return Argument[]
|
||||
*/
|
||||
public function required()
|
||||
{
|
||||
return $this->filterArguments(['isRequired']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve arguments with prefix
|
||||
*
|
||||
* @return Argument[]
|
||||
*/
|
||||
public function withPrefix()
|
||||
{
|
||||
return $this->filterArguments(['hasPrefix']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve arguments without prefix
|
||||
*
|
||||
* @return Argument[]
|
||||
*/
|
||||
public function withoutPrefix()
|
||||
{
|
||||
return $this->filterArguments(['noPrefix']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find all required arguments that don't have values after parsing.
|
||||
*
|
||||
* These arguments weren't defined on the command line.
|
||||
*
|
||||
* @return Argument[]
|
||||
*/
|
||||
public function missing()
|
||||
{
|
||||
return $this->filterArguments(['isRequired', 'noValue']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter defined arguments as to whether they are required or not
|
||||
*
|
||||
* @param string[] $filters
|
||||
*
|
||||
* @return Argument[]
|
||||
*/
|
||||
protected function filterArguments($filters = [])
|
||||
{
|
||||
$arguments = $this->arguments;
|
||||
|
||||
foreach ($filters as $filter) {
|
||||
$arguments = array_filter($arguments, [$this, $filter]);
|
||||
}
|
||||
|
||||
if (in_array('hasPrefix', $filters)) {
|
||||
usort($arguments, [$this, 'compareByPrefix']);
|
||||
}
|
||||
|
||||
return array_values($arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether an argument as a prefix
|
||||
*
|
||||
* @param Argument $argument
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function noPrefix($argument)
|
||||
{
|
||||
return !$argument->hasPrefix();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether an argument as a prefix
|
||||
*
|
||||
* @param Argument $argument
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function hasPrefix($argument)
|
||||
{
|
||||
return $argument->hasPrefix();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether an argument is required
|
||||
*
|
||||
* @param Argument $argument
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function isRequired($argument)
|
||||
{
|
||||
return $argument->isRequired();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether an argument is optional
|
||||
*
|
||||
* @param Argument $argument
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function isOptional($argument)
|
||||
{
|
||||
return !$argument->isRequired();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether an argument is optional
|
||||
*
|
||||
* @param Argument $argument
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function noValue($argument)
|
||||
{
|
||||
return $argument->values() == [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare two arguments by their short and long prefixes.
|
||||
*
|
||||
* @see usort()
|
||||
*
|
||||
* @param Argument $a
|
||||
* @param Argument $b
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function compareByPrefix(Argument $a, Argument $b)
|
||||
{
|
||||
if ($this->prefixCompareString($a) < $this->prefixCompareString($b)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prep the prefix string for comparison
|
||||
*
|
||||
* @param Argument $argument
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function prefixCompareString(Argument $argument)
|
||||
{
|
||||
return mb_strtolower($argument->longPrefix() ?: $argument->prefix() ?: '');
|
||||
}
|
||||
}
|
||||
261
vendor/league/climate/src/Argument/Manager.php
vendored
Normal file
261
vendor/league/climate/src/Argument/Manager.php
vendored
Normal file
@@ -0,0 +1,261 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Argument;
|
||||
|
||||
use League\CLImate\CLImate;
|
||||
use League\CLImate\Exceptions\InvalidArgumentException;
|
||||
|
||||
class Manager
|
||||
{
|
||||
/**
|
||||
* An array of arguments passed to the program.
|
||||
*
|
||||
* @var Argument[] $arguments
|
||||
*/
|
||||
protected $arguments = [];
|
||||
|
||||
/**
|
||||
* A program's description.
|
||||
*
|
||||
* @var string $description
|
||||
*/
|
||||
protected $description;
|
||||
|
||||
/**
|
||||
* Filter class to find various types of arguments
|
||||
*
|
||||
* @var \League\CLImate\Argument\Filter $filter
|
||||
*/
|
||||
protected $filter;
|
||||
|
||||
/**
|
||||
* Summary builder class
|
||||
*
|
||||
* @var \League\CLImate\Argument\Summary $summary
|
||||
*/
|
||||
protected $summary;
|
||||
|
||||
/**
|
||||
* Argument parser class
|
||||
*
|
||||
* @var \League\CLImate\Argument\Parser $parser
|
||||
*/
|
||||
protected $parser;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->filter = new Filter();
|
||||
$this->summary = new Summary();
|
||||
$this->parser = new Parser();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an argument.
|
||||
*
|
||||
* @param Argument|string|array $argument
|
||||
* @param $options
|
||||
*
|
||||
* @return void
|
||||
* @throws InvalidArgumentException if $argument isn't an array or Argument object.
|
||||
*/
|
||||
public function add($argument, array $options = [])
|
||||
{
|
||||
if (is_array($argument)) {
|
||||
$this->addMany($argument);
|
||||
return;
|
||||
}
|
||||
|
||||
if (is_string($argument)) {
|
||||
$argument = Argument::createFromArray($argument, $options);
|
||||
}
|
||||
|
||||
if (!$argument instanceof Argument) {
|
||||
throw new InvalidArgumentException('Please provide an argument name or object.');
|
||||
}
|
||||
|
||||
$this->arguments[$argument->name()] = $argument;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add multiple arguments to a CLImate script.
|
||||
*
|
||||
* @param array $arguments
|
||||
*/
|
||||
protected function addMany(array $arguments = [])
|
||||
{
|
||||
foreach ($arguments as $name => $options) {
|
||||
$this->add($name, $options);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if an argument exists.
|
||||
*
|
||||
* @param string $name
|
||||
* @return bool
|
||||
*/
|
||||
public function exists($name)
|
||||
{
|
||||
return isset($this->arguments[$name]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an argument's value.
|
||||
*
|
||||
* @param string $name
|
||||
* @return string|int|float|bool|null
|
||||
*/
|
||||
public function get($name)
|
||||
{
|
||||
return isset($this->arguments[$name]) ? $this->arguments[$name]->value() : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an argument's all values as an array.
|
||||
*
|
||||
* @param string $name
|
||||
* @return string[]|int[]|float[]|bool[]
|
||||
*/
|
||||
public function getArray($name)
|
||||
{
|
||||
return isset($this->arguments[$name]) ? $this->arguments[$name]->values() : [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all arguments.
|
||||
*
|
||||
* @return Argument[]
|
||||
*/
|
||||
public function all()
|
||||
{
|
||||
return $this->arguments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if an argument has been defined on the command line.
|
||||
*
|
||||
* This can be useful for making sure an argument is present on the command
|
||||
* line before parse()'ing them into argument objects.
|
||||
*
|
||||
* @param string $name
|
||||
* @param array $argv
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function defined($name, array $argv = null)
|
||||
{
|
||||
// The argument isn't defined if it's not defined by the calling code.
|
||||
if (!$this->exists($name)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$argument = $this->arguments[$name];
|
||||
$command_arguments = $this->parser->arguments($argv);
|
||||
|
||||
foreach ($command_arguments as $command_argument) {
|
||||
if ($this->isArgument($argument, $command_argument)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the defined argument matches the command argument.
|
||||
*
|
||||
* @param Argument $argument
|
||||
* @param string $command_argument
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function isArgument($argument, $command_argument)
|
||||
{
|
||||
$possibilities = [
|
||||
$argument->prefix() => "-{$argument->prefix()}",
|
||||
$argument->longPrefix() => "--{$argument->longPrefix()}",
|
||||
];
|
||||
|
||||
foreach ($possibilities as $key => $search) {
|
||||
if ($key && strpos($command_argument, $search) === 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all arguments as key/value pairs.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
$return = [];
|
||||
|
||||
foreach ($this->all() as $name => $argument) {
|
||||
$return[$name] = $argument->value();
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a program's description.
|
||||
*
|
||||
* @param string $description
|
||||
*/
|
||||
public function description($description)
|
||||
{
|
||||
$this->description = trim($description);
|
||||
}
|
||||
|
||||
/**
|
||||
* Output a script's usage statement.
|
||||
*
|
||||
* @param CLImate $climate
|
||||
* @param array $argv
|
||||
*/
|
||||
public function usage(CLImate $climate, array $argv = null)
|
||||
{
|
||||
$this->summary
|
||||
->setClimate($climate)
|
||||
->setDescription($this->description)
|
||||
->setCommand($this->parser->command($argv))
|
||||
->setFilter($this->filter, $this->all())
|
||||
->output();
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse command line arguments into CLImate arguments.
|
||||
*
|
||||
* @param array $argv
|
||||
*/
|
||||
public function parse(array $argv = null)
|
||||
{
|
||||
$this->parser->setFilter($this->filter, $this->all());
|
||||
|
||||
$this->parser->parse($argv);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the trailing arguments
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function trailing()
|
||||
{
|
||||
return $this->parser->trailing();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the trailing arguments as an array
|
||||
*
|
||||
* @return array|null
|
||||
*/
|
||||
public function trailingArray()
|
||||
{
|
||||
return $this->parser->trailingArray();
|
||||
}
|
||||
}
|
||||
309
vendor/league/climate/src/Argument/Parser.php
vendored
Normal file
309
vendor/league/climate/src/Argument/Parser.php
vendored
Normal file
@@ -0,0 +1,309 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Argument;
|
||||
|
||||
use League\CLImate\Exceptions\InvalidArgumentException;
|
||||
|
||||
class Parser
|
||||
{
|
||||
/**
|
||||
* Filter class to find various types of arguments
|
||||
*
|
||||
* @var \League\CLImate\Argument\Filter $filter
|
||||
*/
|
||||
protected $filter;
|
||||
|
||||
/**
|
||||
* Summary builder class
|
||||
*
|
||||
* @var \League\CLImate\Argument\Summary $summary
|
||||
*/
|
||||
protected $summary;
|
||||
|
||||
protected $trailing;
|
||||
|
||||
protected $trailingArray;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->summary = new Summary();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Filter $filter
|
||||
* @param Argument[] $arguments
|
||||
*
|
||||
* @return \League\CLImate\Argument\Parser
|
||||
*/
|
||||
public function setFilter($filter, $arguments)
|
||||
{
|
||||
$this->filter = $filter;
|
||||
$this->filter->setArguments($arguments);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse command line arguments into CLImate arguments.
|
||||
*
|
||||
* @param array $argv
|
||||
*
|
||||
* @return void
|
||||
* @throws InvalidArgumentException if required arguments aren't defined.
|
||||
*/
|
||||
public function parse(array $argv = null)
|
||||
{
|
||||
$cliArguments = $this->arguments($argv);
|
||||
|
||||
if (in_array('--', $cliArguments)) {
|
||||
$cliArguments = $this->removeTrailingArguments($cliArguments);
|
||||
}
|
||||
|
||||
$unParsedArguments = $this->prefixedArguments($cliArguments);
|
||||
|
||||
$this->nonPrefixedArguments($unParsedArguments);
|
||||
|
||||
// After parsing find out which arguments were required but not
|
||||
// defined on the command line.
|
||||
$missingArguments = $this->filter->missing();
|
||||
|
||||
if (count($missingArguments) > 0) {
|
||||
throw new InvalidArgumentException(
|
||||
'The following arguments are required: '
|
||||
. $this->summary->short($missingArguments) . '.'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the command name.
|
||||
*
|
||||
* @param array $argv
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function command(array $argv = null)
|
||||
{
|
||||
return $this->getCommandAndArguments($argv)['command'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the passed arguments.
|
||||
*
|
||||
* @param array $argv
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function arguments(array $argv = null)
|
||||
{
|
||||
return $this->getCommandAndArguments($argv)['arguments'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the trailing arguments
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function trailing()
|
||||
{
|
||||
return $this->trailing;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the trailing arguments as an array
|
||||
*
|
||||
* @return array|null
|
||||
*/
|
||||
public function trailingArray()
|
||||
{
|
||||
return $this->trailingArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the trailing arguments from the parser and set them aside
|
||||
*
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function removeTrailingArguments(array $arguments)
|
||||
{
|
||||
$trailing = array_splice($arguments, array_search('--', $arguments));
|
||||
array_shift($trailing);
|
||||
$this->trailingArray = $trailing;
|
||||
$this->trailing = implode(' ', $trailing);
|
||||
|
||||
return $arguments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse command line options into prefixed CLImate arguments.
|
||||
*
|
||||
* Prefixed arguments are arguments with a prefix (-) or a long prefix (--)
|
||||
* on the command line.
|
||||
*
|
||||
* Return the arguments passed on the command line that didn't match up with
|
||||
* prefixed arguments so they can be assigned to non-prefixed arguments.
|
||||
*
|
||||
* @param array $argv
|
||||
* @return array
|
||||
*/
|
||||
protected function prefixedArguments(array $argv = [])
|
||||
{
|
||||
foreach ($argv as $key => $passed_argument) {
|
||||
$argv = $this->trySettingArgumentValue($argv, $key, $passed_argument);
|
||||
}
|
||||
|
||||
// Send un-parsed arguments back upstream.
|
||||
return array_values($argv);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse unset command line options into non-prefixed CLImate arguments.
|
||||
*
|
||||
* Non-prefixed arguments are parsed after the prefixed arguments on the
|
||||
* command line, in the order that they're defined in the script.
|
||||
*
|
||||
* @param array $unParsedArguments
|
||||
*/
|
||||
protected function nonPrefixedArguments(array $unParsedArguments = [])
|
||||
{
|
||||
foreach ($this->filter->withoutPrefix() as $key => $argument) {
|
||||
if (isset($unParsedArguments[$key])) {
|
||||
$argument->setValue($unParsedArguments[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the name and value of the argument passed in
|
||||
*
|
||||
* @param string $cliArgument
|
||||
* @return string[] [$name, $value]
|
||||
*/
|
||||
protected function getNameAndValue($cliArgument)
|
||||
{
|
||||
// Look for arguments defined in the "key=value" format.
|
||||
if (strpos($cliArgument, '=') !== false) {
|
||||
return explode('=', $cliArgument, 2);
|
||||
}
|
||||
|
||||
// If the argument isn't in "key=value" format then assume it's in
|
||||
// "key value" format and define the value after we've found the
|
||||
// matching CLImate argument.
|
||||
return [$cliArgument, null];
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to set the an argument's value and remove applicable
|
||||
* arguments from array
|
||||
*
|
||||
* @param array $argv
|
||||
* @param int $key
|
||||
* @param string $passed_argument
|
||||
*
|
||||
* @return array The new $argv
|
||||
*/
|
||||
protected function trySettingArgumentValue($argv, $key, $passed_argument)
|
||||
{
|
||||
list($name, $value) = $this->getNameAndValue($passed_argument);
|
||||
|
||||
// Look for the argument in our defined $arguments
|
||||
// and assign their value.
|
||||
if (!($argument = $this->findPrefixedArgument($name))) {
|
||||
return $argv;
|
||||
}
|
||||
|
||||
// We found an argument key, so take it out of the array.
|
||||
unset($argv[$key]);
|
||||
|
||||
return $this->setArgumentValue($argv, $argument, $key, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the argument's value
|
||||
*
|
||||
* @param array $argv
|
||||
* @param Argument $argument
|
||||
* @param int $key
|
||||
* @param string|null $value
|
||||
*
|
||||
* @return array The new $argv
|
||||
*/
|
||||
protected function setArgumentValue($argv, $argument, $key, $value)
|
||||
{
|
||||
// Arguments are given the value true if they only need to
|
||||
// be defined on the command line to be set.
|
||||
if ($argument->noValue()) {
|
||||
$argument->setValue(true);
|
||||
return $argv;
|
||||
}
|
||||
|
||||
if (is_null($value)) {
|
||||
if (count($argv) === 0) {
|
||||
return $argv;
|
||||
}
|
||||
|
||||
// If the value wasn't previously defined in "key=value"
|
||||
// format then define it from the next command argument.
|
||||
$nextArgvValue = $argv[$key + 1];
|
||||
if ($this->isValidArgumentValue($nextArgvValue)) {
|
||||
$argument->setValue($nextArgvValue);
|
||||
unset($argv[$key + 1]);
|
||||
return $argv;
|
||||
}
|
||||
}
|
||||
|
||||
$argument->setValue($value);
|
||||
|
||||
return $argv;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the value is considered a valid input value.
|
||||
*
|
||||
* @param $argumentValue
|
||||
* @return bool
|
||||
*/
|
||||
protected function isValidArgumentValue($argumentValue)
|
||||
{
|
||||
return empty($this->findPrefixedArgument($argumentValue));
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for argument in defined prefix arguments
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return Argument|false
|
||||
*/
|
||||
protected function findPrefixedArgument($name)
|
||||
{
|
||||
foreach ($this->filter->withPrefix() as $argument) {
|
||||
if (in_array($name, ["-{$argument->prefix()}", "--{$argument->longPrefix()}"])) {
|
||||
return $argument;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pull a command name and arguments from $argv.
|
||||
*
|
||||
* @param array $argv
|
||||
* @return array
|
||||
*/
|
||||
protected function getCommandAndArguments(array $argv = null)
|
||||
{
|
||||
// If no $argv is provided then use the global PHP defined $argv.
|
||||
if (is_null($argv)) {
|
||||
global $argv;
|
||||
}
|
||||
|
||||
$arguments = $argv;
|
||||
$command = array_shift($arguments);
|
||||
|
||||
return compact('arguments', 'command');
|
||||
}
|
||||
}
|
||||
215
vendor/league/climate/src/Argument/Summary.php
vendored
Normal file
215
vendor/league/climate/src/Argument/Summary.php
vendored
Normal file
@@ -0,0 +1,215 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Argument;
|
||||
|
||||
use League\CLImate\CLImate;
|
||||
|
||||
class Summary
|
||||
{
|
||||
/**
|
||||
* @var \League\CLImate\CLImate $climate
|
||||
*/
|
||||
protected $climate;
|
||||
|
||||
/**
|
||||
* @var string $description
|
||||
*/
|
||||
protected $description;
|
||||
|
||||
/**
|
||||
* @var string $command
|
||||
*/
|
||||
protected $command;
|
||||
|
||||
/**
|
||||
* @var Filter $filter
|
||||
*/
|
||||
protected $filter;
|
||||
|
||||
/**
|
||||
* @param \League\CLImate\CLImate $climate
|
||||
*
|
||||
* @return \League\CLImate\Argument\Summary
|
||||
*/
|
||||
public function setClimate(CLImate $climate)
|
||||
{
|
||||
$this->climate = $climate;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $description
|
||||
*
|
||||
* @return \League\CLImate\Argument\Summary
|
||||
*/
|
||||
public function setDescription($description)
|
||||
{
|
||||
$this->description = $description;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $command
|
||||
*
|
||||
* @return \League\CLImate\Argument\Summary
|
||||
*/
|
||||
public function setCommand($command)
|
||||
{
|
||||
$this->command = $command;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Filter $filter
|
||||
* @param Argument[] $arguments
|
||||
*
|
||||
* @return \League\CLImate\Argument\Summary
|
||||
*/
|
||||
public function setFilter($filter, $arguments)
|
||||
{
|
||||
$this->filter = $filter;
|
||||
$this->filter->setArguments($arguments);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Output the full summary for the program
|
||||
*/
|
||||
public function output()
|
||||
{
|
||||
// Print the description if it's defined.
|
||||
if ($this->description) {
|
||||
$this->climate->out($this->description)->br();
|
||||
}
|
||||
|
||||
// Print the usage statement with the arguments without a prefix at the end.
|
||||
$this->climate->out("Usage: {$this->command} "
|
||||
. $this->short($this->getOrderedArguments()));
|
||||
|
||||
// Print argument details.
|
||||
foreach (['required', 'optional'] as $type) {
|
||||
$this->outputArguments($this->filter->{$type}(), $type);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a short summary of a list of arguments.
|
||||
*
|
||||
* @param Argument[] $arguments
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function short($arguments)
|
||||
{
|
||||
return implode(' ', array_map([$this, 'argumentBracketed'], $arguments));
|
||||
}
|
||||
|
||||
/**
|
||||
* Build an argument's summary for use in a usage statement.
|
||||
*
|
||||
* For example, "-u username, --user username", "--force", or
|
||||
* "-c count (default: 7)".
|
||||
*
|
||||
* @param Argument $argument
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function argument(Argument $argument)
|
||||
{
|
||||
$summary = $this->prefixedArguments($argument);
|
||||
$printedName = mb_strstr($summary, ' ' . $argument->name());
|
||||
|
||||
// Print the argument name if it's not printed yet.
|
||||
if (!$printedName && !$argument->noValue()) {
|
||||
$summary .= $argument->name();
|
||||
}
|
||||
|
||||
if ($defaults = $argument->defaultValue()) {
|
||||
if (count($defaults) == 1) {
|
||||
$summary .= " (default: {$defaults[0]})";
|
||||
} else {
|
||||
$summary .= ' (defaults: ' . implode(', ', $defaults) . ')';
|
||||
}
|
||||
}
|
||||
|
||||
return $summary;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build argument summary surrounded by brackets
|
||||
*
|
||||
* @param Argument $argument
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function argumentBracketed(Argument $argument)
|
||||
{
|
||||
return '[' . $this->argument($argument) . ']';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the arguments ordered by whether or not they have a prefix
|
||||
*
|
||||
* @return Argument[]
|
||||
*/
|
||||
protected function getOrderedArguments()
|
||||
{
|
||||
return array_merge($this->filter->withPrefix(), $this->filter->withoutPrefix());
|
||||
}
|
||||
|
||||
/**
|
||||
* Print out the argument list
|
||||
*
|
||||
* @param array $arguments
|
||||
* @param string $type
|
||||
*/
|
||||
protected function outputArguments($arguments, $type)
|
||||
{
|
||||
if (count($arguments) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->climate->br()->out(mb_convert_case($type, MB_CASE_TITLE) . ' Arguments:');
|
||||
|
||||
foreach ($arguments as $argument) {
|
||||
$this->climate->tab()->out($this->argument($argument));
|
||||
|
||||
if ($argument->description()) {
|
||||
$this->climate->tab(2)->out($argument->description());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the summary for any prefixed arguments
|
||||
*
|
||||
* @param Argument $argument
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function prefixedArguments(Argument $argument)
|
||||
{
|
||||
$prefixes = [$argument->prefix(), $argument->longPrefix()];
|
||||
$summary = [];
|
||||
|
||||
foreach ($prefixes as $key => $prefix) {
|
||||
if (!$prefix) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$sub = str_repeat('-', $key + 1) . $prefix;
|
||||
|
||||
if (!$argument->noValue()) {
|
||||
$sub .= " {$argument->name()}";
|
||||
}
|
||||
|
||||
$summary[] = $sub;
|
||||
}
|
||||
|
||||
return implode(', ', $summary);
|
||||
}
|
||||
}
|
||||
446
vendor/league/climate/src/CLImate.php
vendored
Normal file
446
vendor/league/climate/src/CLImate.php
vendored
Normal file
@@ -0,0 +1,446 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate;
|
||||
|
||||
use League\CLImate\Argument\Manager as ArgumentManager;
|
||||
use League\CLImate\Decorator\Style;
|
||||
use League\CLImate\Settings\Manager as SettingsManager;
|
||||
use League\CLImate\TerminalObject\Dynamic\Spinner;
|
||||
use League\CLImate\TerminalObject\Router\Router;
|
||||
use League\CLImate\Util\Helper;
|
||||
use League\CLImate\Util\Output;
|
||||
use League\CLImate\Util\UtilFactory;
|
||||
|
||||
/**
|
||||
* @method CLImate black(string $str = null)
|
||||
* @method CLImate red(string $str = null)
|
||||
* @method CLImate green(string $str = null)
|
||||
* @method CLImate yellow(string $str = null)
|
||||
* @method CLImate blue(string $str = null)
|
||||
* @method CLImate magenta(string $str = null)
|
||||
* @method CLImate cyan(string $str = null)
|
||||
* @method CLImate lightGray(string $str = null)
|
||||
* @method CLImate darkGray(string $str = null)
|
||||
* @method CLImate lightRed(string $str = null)
|
||||
* @method CLImate lightGreen(string $str = null)
|
||||
* @method CLImate lightYellow(string $str = null)
|
||||
* @method CLImate lightBlue(string $str = null)
|
||||
* @method CLImate lightMagenta(string $str = null)
|
||||
* @method CLImate lightCyan(string $str = null)
|
||||
* @method CLImate white(string $str = null)
|
||||
*
|
||||
* @method CLImate backgroundBlack(string $str = null)
|
||||
* @method CLImate backgroundRed(string $str = null)
|
||||
* @method CLImate backgroundGreen(string $str = null)
|
||||
* @method CLImate backgroundYellow(string $str = null)
|
||||
* @method CLImate backgroundBlue(string $str = null)
|
||||
* @method CLImate backgroundMagenta(string $str = null)
|
||||
* @method CLImate backgroundCyan(string $str = null)
|
||||
* @method CLImate backgroundLightGray(string $str = null)
|
||||
* @method CLImate backgroundDarkGray(string $str = null)
|
||||
* @method CLImate backgroundLightRed(string $str = null)
|
||||
* @method CLImate backgroundLightGreen(string $str = null)
|
||||
* @method CLImate backgroundLightYellow(string $str = null)
|
||||
* @method CLImate backgroundLightBlue(string $str = null)
|
||||
* @method CLImate backgroundLightMagenta(string $str = null)
|
||||
* @method CLImate backgroundLightCyan(string $str = null)
|
||||
* @method CLImate backgroundWhite(string $str = null)
|
||||
*
|
||||
* @method CLImate bold(string $str = null)
|
||||
* @method CLImate dim(string $str = null)
|
||||
* @method CLImate underline(string $str = null)
|
||||
* @method CLImate blink(string $str = null)
|
||||
* @method CLImate invert(string $str = null)
|
||||
* @method CLImate hidden(string $str = null)
|
||||
*
|
||||
* @method CLImate info(string $str = null)
|
||||
* @method CLImate comment(string $str = null)
|
||||
* @method CLImate whisper(string $str = null)
|
||||
* @method CLImate shout(string $str = null)
|
||||
* @method CLImate error(string $str = null)
|
||||
*
|
||||
* @method mixed out(string $str)
|
||||
* @method mixed inline(string $str)
|
||||
* @method mixed table(array $data)
|
||||
* @method mixed json(mixed $var)
|
||||
* @method mixed br($count = 1)
|
||||
* @method mixed tab($count = 1)
|
||||
* @method mixed draw(string $art)
|
||||
* @method mixed border(string $char = null, integer $length = null)
|
||||
* @method mixed dump(mixed $var)
|
||||
* @method mixed flank(string $output, string $char = null, integer $length = null)
|
||||
* @method mixed progress(integer $total = null)
|
||||
* @method Spinner spinner(string $label = null, string ...$characters = null)
|
||||
* @method mixed padding(integer $length = 0, string $char = '.')
|
||||
* @method mixed input(string $prompt, Util\Reader\ReaderInterface $reader = null)
|
||||
* @method mixed confirm(string $prompt, Util\Reader\ReaderInterface $reader = null)
|
||||
* @method mixed password(string $prompt, Util\Reader\ReaderInterface $reader = null)
|
||||
* @method mixed checkboxes(string $prompt, array $options, Util\Reader\ReaderInterface $reader = null)
|
||||
* @method mixed radio(string $prompt, array $options, Util\Reader\ReaderInterface $reader = null)
|
||||
* @method mixed animation(string $art, TerminalObject\Helper\Sleeper $sleeper = null)
|
||||
* @method mixed columns(array $data, $column_count = null)
|
||||
* @method mixed clear()
|
||||
* @method CLImate clearLine()
|
||||
*
|
||||
* @method CLImate addArt(string $dir)
|
||||
*/
|
||||
class CLImate
|
||||
{
|
||||
/**
|
||||
* An instance of the Style class
|
||||
*
|
||||
* @var \League\CLImate\Decorator\Style $style
|
||||
*/
|
||||
public $style;
|
||||
|
||||
/**
|
||||
* An instance of the Terminal Object Router class
|
||||
*
|
||||
* @var \League\CLImate\TerminalObject\Router\Router $router
|
||||
*/
|
||||
protected $router;
|
||||
|
||||
/**
|
||||
* An instance of the Settings Manager class
|
||||
*
|
||||
* @var \League\CLImate\Settings\Manager $settings
|
||||
*/
|
||||
protected $settings;
|
||||
|
||||
/**
|
||||
* An instance of the Argument Manager class
|
||||
*
|
||||
* @var \League\CLImate\Argument\Manager $arguments
|
||||
*/
|
||||
public $arguments;
|
||||
|
||||
/**
|
||||
* An instance of the Output class
|
||||
*
|
||||
* @var \League\CLImate\Util\Output $output
|
||||
*/
|
||||
public $output;
|
||||
|
||||
/**
|
||||
* An instance of the Util Factory
|
||||
*
|
||||
* @var \League\CLImate\Util\UtilFactory $util
|
||||
*/
|
||||
protected $util;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->setStyle(new Style());
|
||||
$this->setRouter(new Router());
|
||||
$this->setSettingsManager(new SettingsManager());
|
||||
$this->setOutput(new Output());
|
||||
$this->setUtil(new UtilFactory());
|
||||
$this->setArgumentManager(new ArgumentManager());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the style property
|
||||
*
|
||||
* @param \League\CLImate\Decorator\Style $style
|
||||
*/
|
||||
public function setStyle(Style $style)
|
||||
{
|
||||
$this->style = $style;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the router property
|
||||
*
|
||||
* @param \League\CLImate\TerminalObject\Router\Router $router
|
||||
*/
|
||||
public function setRouter(Router $router)
|
||||
{
|
||||
$this->router = $router;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the settings property
|
||||
*
|
||||
* @param \League\CLImate\Settings\Manager $manager
|
||||
*/
|
||||
public function setSettingsManager(SettingsManager $manager)
|
||||
{
|
||||
$this->settings = $manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the arguments property
|
||||
*
|
||||
* @param \League\CLImate\Argument\Manager $manager
|
||||
*/
|
||||
public function setArgumentManager(ArgumentManager $manager)
|
||||
{
|
||||
$this->arguments = $manager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the output property
|
||||
*
|
||||
* @param \League\CLImate\Util\Output $output
|
||||
*/
|
||||
public function setOutput(Output $output)
|
||||
{
|
||||
$this->output = $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the util property
|
||||
*
|
||||
* @param \League\CLImate\Util\UtilFactory $util
|
||||
*/
|
||||
public function setUtil(UtilFactory $util)
|
||||
{
|
||||
$this->util = $util;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extend CLImate with custom methods
|
||||
*
|
||||
* @param string|object|array $class
|
||||
* @param string $key Optional custom key instead of class name
|
||||
*
|
||||
* @return \League\CLImate\CLImate
|
||||
*/
|
||||
public function extend($class, $key = null)
|
||||
{
|
||||
$this->router->addExtension($key, $class);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Force ansi support on
|
||||
*
|
||||
* @return \League\CLImate\CLImate
|
||||
*/
|
||||
public function forceAnsiOn()
|
||||
{
|
||||
$this->util->system->forceAnsi();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Force ansi support off
|
||||
*
|
||||
* @return \League\CLImate\CLImate
|
||||
*/
|
||||
public function forceAnsiOff()
|
||||
{
|
||||
$this->util->system->forceAnsi(false);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write line to writer once
|
||||
*
|
||||
* @param string|array $writer
|
||||
*
|
||||
* @return \League\CLImate\CLImate
|
||||
*/
|
||||
public function to($writer)
|
||||
{
|
||||
$this->output->once($writer);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Output the program's usage statement
|
||||
*
|
||||
* @param array $argv
|
||||
* @return void
|
||||
*/
|
||||
public function usage(array $argv = null)
|
||||
{
|
||||
$this->arguments->usage($this, $argv);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the program's description
|
||||
*
|
||||
* @param string $description
|
||||
*
|
||||
* @return \League\CLImate\CLImate
|
||||
*/
|
||||
public function description($description)
|
||||
{
|
||||
$this->arguments->description($description);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if we have valid output
|
||||
*
|
||||
* @param mixed $output
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
protected function hasOutput($output)
|
||||
{
|
||||
if (!empty($output)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Check for type first to avoid errors with objects/arrays/etc
|
||||
return ((is_string($output) || is_numeric($output)) && strlen($output) > 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for the method within the string
|
||||
* and route it if we find one.
|
||||
*
|
||||
* @param string $method
|
||||
* @param string $name
|
||||
*
|
||||
* @return string The new string without the executed method.
|
||||
*/
|
||||
protected function parseStyleMethod($method, $name)
|
||||
{
|
||||
// If the name starts with this method string...
|
||||
if (substr($name, 0, strlen($method)) == $method) {
|
||||
// ...remove the method name from the beginning of the string...
|
||||
$name = substr($name, strlen($method));
|
||||
|
||||
// ...and trim off any of those underscores hanging around
|
||||
$name = ltrim($name, '_');
|
||||
|
||||
$this->style->set($method);
|
||||
}
|
||||
|
||||
return $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for any style methods within the name and apply them
|
||||
*
|
||||
* @param string $name
|
||||
* @param array $method_search
|
||||
*
|
||||
* @return string Anything left over after applying styles
|
||||
*/
|
||||
protected function applyStyleMethods($name, $method_search = null)
|
||||
{
|
||||
// Get all of the possible style attributes
|
||||
$method_search = $method_search ?: array_keys($this->style->all());
|
||||
|
||||
$new_name = $this->searchForStyleMethods($name, $method_search);
|
||||
|
||||
// While we still have a name left and we keep finding methods,
|
||||
// loop through the possibilities
|
||||
if (strlen($new_name) > 0 && $new_name != $name) {
|
||||
return $this->applyStyleMethods($new_name, $method_search);
|
||||
}
|
||||
|
||||
return $new_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Search for style methods in the current name
|
||||
*
|
||||
* @param string $name
|
||||
* @param array $search
|
||||
* @return string
|
||||
*/
|
||||
protected function searchForStyleMethods($name, $search)
|
||||
{
|
||||
// Loop through the possible methods
|
||||
foreach ($search as $method) {
|
||||
// See if we found a valid method
|
||||
$name = $this->parseStyleMethod($method, $name);
|
||||
}
|
||||
|
||||
return $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build up the terminal object and return it
|
||||
*
|
||||
* @param string $name
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return object|null
|
||||
*/
|
||||
protected function buildTerminalObject($name, $arguments)
|
||||
{
|
||||
// Retrieve the parser for the current set of styles
|
||||
$parser = $this->style->parser($this->util->system);
|
||||
|
||||
// Reset the styles
|
||||
$this->style->reset();
|
||||
|
||||
// Execute the terminal object
|
||||
$this->router->settings($this->settings);
|
||||
$this->router->parser($parser);
|
||||
$this->router->output($this->output);
|
||||
$this->router->util($this->util);
|
||||
|
||||
return $this->router->execute($name, $arguments);
|
||||
}
|
||||
|
||||
/**
|
||||
* Route anything leftover after styles were applied
|
||||
*
|
||||
* @param string $name
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return object|null
|
||||
*/
|
||||
protected function routeRemainingMethod($name, array $arguments)
|
||||
{
|
||||
// If we still have something left, let's figure out what it is
|
||||
if ($this->router->exists($name)) {
|
||||
$obj = $this->buildTerminalObject($name, $arguments);
|
||||
|
||||
// If something was returned, return it
|
||||
if (is_object($obj)) {
|
||||
return $obj;
|
||||
}
|
||||
} elseif ($this->settings->exists($name)) {
|
||||
$this->settings->add($name, reset($arguments));
|
||||
// Handle passthroughs to the arguments manager.
|
||||
} else {
|
||||
// If we can't find it at this point, let's fail gracefully
|
||||
$this->out(reset($arguments));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Magic method for anything called that doesn't exist
|
||||
*
|
||||
* @param string $requested_method
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return \League\CLImate\CLImate|\League\CLImate\TerminalObject\Dynamic\DynamicTerminalObject
|
||||
*
|
||||
* List of many of the possible method being called here
|
||||
* documented at the top of this class.
|
||||
*/
|
||||
public function __call($requested_method, $arguments)
|
||||
{
|
||||
// Apply any style methods that we can find first
|
||||
$name = $this->applyStyleMethods(Helper::snakeCase($requested_method));
|
||||
|
||||
// The first argument is the string|array|object we want to echo out
|
||||
$output = reset($arguments);
|
||||
|
||||
if (strlen($name)) {
|
||||
// If we have something left, let's try and route it to the appropriate place
|
||||
if ($result = $this->routeRemainingMethod($name, $arguments)) {
|
||||
return $result;
|
||||
}
|
||||
} elseif ($this->hasOutput($output)) {
|
||||
// If we have fulfilled all of the requested methods and we have output, output it
|
||||
$this->out($output);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
72
vendor/league/climate/src/Decorator/Component/BackgroundColor.php
vendored
Normal file
72
vendor/league/climate/src/Decorator/Component/BackgroundColor.php
vendored
Normal file
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator\Component;
|
||||
|
||||
class BackgroundColor extends Color
|
||||
{
|
||||
/**
|
||||
* The difference to add to a foreground color code
|
||||
* to get a background color code
|
||||
*
|
||||
* @const integer ADD
|
||||
*/
|
||||
const ADD = 10;
|
||||
|
||||
/**
|
||||
* Get the code for the requested color
|
||||
*
|
||||
* @param mixed $val
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($val)
|
||||
{
|
||||
$color = parent::get($this->strip($val));
|
||||
|
||||
if ($color) {
|
||||
$color += self::ADD;
|
||||
}
|
||||
|
||||
return $color;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the current background color
|
||||
*
|
||||
* @param mixed $val
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($val)
|
||||
{
|
||||
return parent::set($this->strip($val));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all of the available background colors
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function all()
|
||||
{
|
||||
$colors = [];
|
||||
|
||||
foreach ($this->colors as $color => $code) {
|
||||
$colors['background_' . $color] = $code + self::ADD;
|
||||
}
|
||||
|
||||
return $colors;
|
||||
}
|
||||
|
||||
/**
|
||||
* Strip the color of any prefixes
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function strip($val)
|
||||
{
|
||||
return str_replace('background_', '', $val);
|
||||
}
|
||||
}
|
||||
53
vendor/league/climate/src/Decorator/Component/BaseDecorator.php
vendored
Normal file
53
vendor/league/climate/src/Decorator/Component/BaseDecorator.php
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator\Component;
|
||||
|
||||
abstract class BaseDecorator implements DecoratorInterface
|
||||
{
|
||||
/**
|
||||
* An array of defaults for the decorator
|
||||
*
|
||||
* @var array $defaults;
|
||||
*/
|
||||
protected $defaults = [];
|
||||
|
||||
/**
|
||||
* An array of currently set codes for the decorator
|
||||
*
|
||||
* @var array $current;
|
||||
*/
|
||||
protected $current = [];
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->defaults();
|
||||
}
|
||||
|
||||
/**
|
||||
* Load up the defaults for this decorator
|
||||
*/
|
||||
public function defaults()
|
||||
{
|
||||
foreach ($this->defaults as $name => $code) {
|
||||
$this->add($name, $code);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset the currently set decorator
|
||||
*/
|
||||
public function reset()
|
||||
{
|
||||
$this->current = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the currently set codes for the decorator
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function current()
|
||||
{
|
||||
return $this->current;
|
||||
}
|
||||
}
|
||||
100
vendor/league/climate/src/Decorator/Component/Color.php
vendored
Normal file
100
vendor/league/climate/src/Decorator/Component/Color.php
vendored
Normal file
@@ -0,0 +1,100 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator\Component;
|
||||
|
||||
class Color extends BaseDecorator
|
||||
{
|
||||
/**
|
||||
* The available colors
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $colors = [];
|
||||
|
||||
/**
|
||||
* An array of default colors
|
||||
*
|
||||
* @var array $defaults
|
||||
*/
|
||||
protected $defaults = [
|
||||
'default' => 39,
|
||||
'black' => 30,
|
||||
'red' => 31,
|
||||
'green' => 32,
|
||||
'yellow' => 33,
|
||||
'blue' => 34,
|
||||
'magenta' => 35,
|
||||
'cyan' => 36,
|
||||
'light_gray' => 37,
|
||||
'dark_gray' => 90,
|
||||
'light_red' => 91,
|
||||
'light_green' => 92,
|
||||
'light_yellow' => 93,
|
||||
'light_blue' => 94,
|
||||
'light_magenta' => 95,
|
||||
'light_cyan' => 96,
|
||||
'white' => 97,
|
||||
];
|
||||
|
||||
/**
|
||||
* Add a color into the mix
|
||||
*
|
||||
* @param string $key
|
||||
* @param integer $value
|
||||
*/
|
||||
public function add($key, $value)
|
||||
{
|
||||
$this->colors[$key] = (int) $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all of available colors
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function all()
|
||||
{
|
||||
return $this->colors;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the code for the color
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get($val)
|
||||
{
|
||||
// If we already have the code, just return that
|
||||
if (is_numeric($val)) {
|
||||
return $val;
|
||||
}
|
||||
|
||||
if (array_key_exists($val, $this->colors)) {
|
||||
return $this->colors[$val];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the current color
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($val)
|
||||
{
|
||||
$code = $this->get($val);
|
||||
|
||||
if ($code) {
|
||||
$this->current = [$code];
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
77
vendor/league/climate/src/Decorator/Component/Command.php
vendored
Normal file
77
vendor/league/climate/src/Decorator/Component/Command.php
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator\Component;
|
||||
|
||||
class Command extends BaseDecorator
|
||||
{
|
||||
/**
|
||||
* Commands that correspond to a color in the $colors property
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $commands = [];
|
||||
|
||||
/**
|
||||
* The default commands available
|
||||
*
|
||||
* @var array $defaults
|
||||
*/
|
||||
protected $defaults = [
|
||||
'info' => 'green',
|
||||
'comment' => 'yellow',
|
||||
'whisper' => 'light_gray',
|
||||
'shout' => 'red',
|
||||
'error' => 'light_red',
|
||||
];
|
||||
|
||||
/**
|
||||
* Add a command into the mix
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $value
|
||||
*/
|
||||
public function add($key, $value)
|
||||
{
|
||||
$this->commands[$key] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all of the available commands
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function all()
|
||||
{
|
||||
return $this->commands;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the style that corresponds to the command
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get($val)
|
||||
{
|
||||
if (array_key_exists($val, $this->commands)) {
|
||||
return $this->commands[$val];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the currently used command
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return string|false
|
||||
*/
|
||||
public function set($val)
|
||||
{
|
||||
// Return the code because it is a string corresponding
|
||||
// to a property in another class
|
||||
return ($code = $this->get($val)) ? $code : false;
|
||||
}
|
||||
}
|
||||
28
vendor/league/climate/src/Decorator/Component/DecoratorInterface.php
vendored
Normal file
28
vendor/league/climate/src/Decorator/Component/DecoratorInterface.php
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator\Component;
|
||||
|
||||
interface DecoratorInterface
|
||||
{
|
||||
public function add($key, $value);
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
|
||||
public function defaults();
|
||||
|
||||
public function get($val);
|
||||
|
||||
public function set($val);
|
||||
|
||||
public function all();
|
||||
|
||||
public function current();
|
||||
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
|
||||
public function reset();
|
||||
}
|
||||
89
vendor/league/climate/src/Decorator/Component/Format.php
vendored
Normal file
89
vendor/league/climate/src/Decorator/Component/Format.php
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator\Component;
|
||||
|
||||
class Format extends BaseDecorator
|
||||
{
|
||||
/**
|
||||
* The available formatting options
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $formats = [];
|
||||
|
||||
/**
|
||||
* An array of default formats
|
||||
*
|
||||
* @var array $defaults
|
||||
*/
|
||||
protected $defaults = [
|
||||
'bold' => 1,
|
||||
'dim' => 2,
|
||||
'underline' => 4,
|
||||
'blink' => 5,
|
||||
'invert' => 7,
|
||||
'hidden' => 8,
|
||||
];
|
||||
|
||||
/**
|
||||
* Add a format into the mix
|
||||
*
|
||||
* @param string $key
|
||||
* @param mixed $value
|
||||
*/
|
||||
public function add($key, $value)
|
||||
{
|
||||
$this->formats[$key] = (int) $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve all of the available formats
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function all()
|
||||
{
|
||||
return $this->formats;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the code for the format
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get($val)
|
||||
{
|
||||
// If we already have the code, just return that
|
||||
if (is_numeric($val)) {
|
||||
return $val;
|
||||
}
|
||||
|
||||
if (array_key_exists($val, $this->formats)) {
|
||||
return $this->formats[$val];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the current format
|
||||
*
|
||||
* @param string $val
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($val)
|
||||
{
|
||||
$code = $this->get($val);
|
||||
|
||||
if ($code) {
|
||||
$this->current[] = $code;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
174
vendor/league/climate/src/Decorator/Parser/Ansi.php
vendored
Normal file
174
vendor/league/climate/src/Decorator/Parser/Ansi.php
vendored
Normal file
@@ -0,0 +1,174 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator\Parser;
|
||||
|
||||
use League\CLImate\Util\Helper;
|
||||
|
||||
class Ansi extends Parser
|
||||
{
|
||||
/**
|
||||
* Wrap the string in the current style
|
||||
*
|
||||
* @param string $str
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
|
||||
public function apply($str)
|
||||
{
|
||||
return $this->start() . $this->parse($str) . $this->end();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the string that begins the style
|
||||
*
|
||||
* @param string $codes
|
||||
* @return string
|
||||
*/
|
||||
protected function start($codes = null)
|
||||
{
|
||||
$codes = $codes ?: $this->currentCode();
|
||||
$codes = $this->codeStr($codes);
|
||||
|
||||
return $this->wrapCodes($codes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the string that ends the style
|
||||
*
|
||||
* @param string|array $codes
|
||||
* @return string
|
||||
*/
|
||||
protected function end($codes = null)
|
||||
{
|
||||
if (empty($codes)) {
|
||||
$codes = [0];
|
||||
} else {
|
||||
$codes = Helper::toArray($codes);
|
||||
|
||||
// Reset everything back to normal up front
|
||||
array_unshift($codes, 0);
|
||||
}
|
||||
|
||||
return $this->wrapCodes($this->codeStr($codes));
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap the code string in the full escaped sequence
|
||||
*
|
||||
* @param string $codes
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
|
||||
protected function wrapCodes($codes)
|
||||
{
|
||||
return "\e[{$codes}m";
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the string for tags and replace them with their codes
|
||||
*
|
||||
* @param string $str
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
|
||||
protected function parse($str)
|
||||
{
|
||||
$count = preg_match_all($this->tags->regex(), $str, $matches);
|
||||
|
||||
// If we didn't find anything, return the string right back
|
||||
if (!$count || !is_array($matches)) {
|
||||
return $str;
|
||||
}
|
||||
|
||||
// All we want is the array of actual strings matched
|
||||
$matches = reset($matches);
|
||||
|
||||
return $this->parseTags($str, $matches);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the given string for the tags and replace them with the appropriate codes
|
||||
*
|
||||
* @param string $str
|
||||
* @param array $tags
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
|
||||
protected function parseTags($str, $tags)
|
||||
{
|
||||
// Let's keep a history of styles applied
|
||||
$history = ($this->currentCode()) ? [$this->currentCode()] : [];
|
||||
|
||||
foreach ($tags as $tag) {
|
||||
$str = $this->replaceTag($str, $tag, $history);
|
||||
}
|
||||
|
||||
return $str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace the tag in the str
|
||||
*
|
||||
* @param string $str
|
||||
* @param string $tag
|
||||
* @param array $history
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
|
||||
protected function replaceTag($str, $tag, &$history)
|
||||
{
|
||||
// We will be replacing tags one at a time, can't pass this by reference
|
||||
$replace_count = 1;
|
||||
|
||||
if (strpos($tag, '/')) {
|
||||
// We are closing out the tag, pop off the last element and get the codes that are left
|
||||
array_pop($history);
|
||||
$replace = $this->end($history);
|
||||
} else {
|
||||
// We are starting a new tag, add it onto the history and replace with correct color code
|
||||
$history[] = $this->tags->value($tag);
|
||||
$replace = $this->start($this->tags->value($tag));
|
||||
}
|
||||
|
||||
return str_replace($tag, $replace, $str, $replace_count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stringify the codes
|
||||
*
|
||||
* @param mixed $codes
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
|
||||
protected function codeStr($codes)
|
||||
{
|
||||
// If we get something that is already a code string, just pass it back
|
||||
if (!is_array($codes) && strpos($codes, ';')) {
|
||||
return $codes;
|
||||
}
|
||||
|
||||
$codes = Helper::toArray($codes);
|
||||
|
||||
// Sort for the sake of consistency and testability
|
||||
sort($codes);
|
||||
|
||||
return implode(';', $codes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the current style code
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
|
||||
protected function currentCode()
|
||||
{
|
||||
return $this->codeStr($this->current);
|
||||
}
|
||||
}
|
||||
19
vendor/league/climate/src/Decorator/Parser/NonAnsi.php
vendored
Normal file
19
vendor/league/climate/src/Decorator/Parser/NonAnsi.php
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator\Parser;
|
||||
|
||||
class NonAnsi extends Parser
|
||||
{
|
||||
/**
|
||||
* Strip the string of any tags
|
||||
*
|
||||
* @param string $str
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
|
||||
public function apply($str)
|
||||
{
|
||||
return preg_replace($this->tags->regex(), '', $str);
|
||||
}
|
||||
}
|
||||
38
vendor/league/climate/src/Decorator/Parser/Parser.php
vendored
Normal file
38
vendor/league/climate/src/Decorator/Parser/Parser.php
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator\Parser;
|
||||
|
||||
use League\CLImate\Decorator\Tags;
|
||||
|
||||
abstract class Parser
|
||||
{
|
||||
/**
|
||||
* An array of the currently applied codes
|
||||
*
|
||||
* @var array $current;
|
||||
*/
|
||||
protected $current = [];
|
||||
|
||||
/**
|
||||
* An array of the tags that should be searched for
|
||||
* and their corresponding replacements
|
||||
*
|
||||
* @var \League\CLImate\Decorator\Tags $tags
|
||||
*/
|
||||
public $tags;
|
||||
|
||||
public function __construct(array $current, Tags $tags)
|
||||
{
|
||||
$this->current = $current;
|
||||
$this->tags = $tags;
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap the string in the current style
|
||||
*
|
||||
* @param string $str
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract public function apply($str);
|
||||
}
|
||||
26
vendor/league/climate/src/Decorator/Parser/ParserFactory.php
vendored
Normal file
26
vendor/league/climate/src/Decorator/Parser/ParserFactory.php
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator\Parser;
|
||||
|
||||
use League\CLImate\Util\System\System;
|
||||
use League\CLImate\Decorator\Tags;
|
||||
|
||||
class ParserFactory
|
||||
{
|
||||
/**
|
||||
* Get an instance of the appropriate Parser class
|
||||
*
|
||||
* @param System $system
|
||||
* @param array $current
|
||||
* @param Tags $tags
|
||||
* @return Parser
|
||||
*/
|
||||
public static function getInstance(System $system, array $current, Tags $tags)
|
||||
{
|
||||
if ($system->hasAnsiSupport()) {
|
||||
return new Ansi($current, $tags);
|
||||
}
|
||||
|
||||
return new NonAnsi($current, $tags);
|
||||
}
|
||||
}
|
||||
23
vendor/league/climate/src/Decorator/Parser/ParserImporter.php
vendored
Normal file
23
vendor/league/climate/src/Decorator/Parser/ParserImporter.php
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator\Parser;
|
||||
|
||||
trait ParserImporter
|
||||
{
|
||||
/**
|
||||
* An instance of the Parser class
|
||||
*
|
||||
* @var \League\CLImate\Decorator\Parser\Parser $parser
|
||||
*/
|
||||
protected $parser;
|
||||
|
||||
/**
|
||||
* Import the parser and set the property
|
||||
*
|
||||
* @param \League\CLImate\Decorator\Parser\Parser $parser
|
||||
*/
|
||||
public function parser(Parser $parser)
|
||||
{
|
||||
$this->parser = $parser;
|
||||
}
|
||||
}
|
||||
295
vendor/league/climate/src/Decorator/Style.php
vendored
Normal file
295
vendor/league/climate/src/Decorator/Style.php
vendored
Normal file
@@ -0,0 +1,295 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator;
|
||||
|
||||
use League\CLImate\Decorator\Parser\ParserFactory;
|
||||
use League\CLImate\Util\Helper;
|
||||
use League\CLImate\Util\System\System;
|
||||
|
||||
/**
|
||||
* @method void addColor(string $color, integer $code)
|
||||
* @method void addFormat(string $format, integer $code)
|
||||
* @method void addCommand(string $command, mixed $style)
|
||||
*/
|
||||
class Style
|
||||
{
|
||||
/**
|
||||
* An array of Decorator objects
|
||||
*
|
||||
* @var Component\DecoratorInterface[] $style
|
||||
*/
|
||||
protected $style = [];
|
||||
|
||||
/**
|
||||
* An array of the available Decorators
|
||||
* and their corresponding class names
|
||||
*
|
||||
* @var array $available
|
||||
*/
|
||||
protected $available = [
|
||||
'format' => 'Format',
|
||||
'color' => 'Color',
|
||||
'background' => 'BackgroundColor',
|
||||
'command' => 'Command',
|
||||
];
|
||||
|
||||
protected $parser;
|
||||
|
||||
/**
|
||||
* An array of the current styles applied
|
||||
*
|
||||
* @var array $current
|
||||
*/
|
||||
protected $current = [];
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
foreach ($this->available as $key => $class) {
|
||||
$class = 'League\CLImate\Decorator\Component\\' . $class;
|
||||
$this->style[$key] = new $class();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all of the styles available
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function all()
|
||||
{
|
||||
$all = [];
|
||||
|
||||
foreach ($this->style as $style) {
|
||||
$all = array_merge($all, $this->convertToCodes($style->all()));
|
||||
}
|
||||
|
||||
return $all;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to get the corresponding code for the style
|
||||
*
|
||||
* @param mixed $key
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($key)
|
||||
{
|
||||
foreach ($this->style as $style) {
|
||||
if ($code = $style->get($key)) {
|
||||
return $code;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to set some aspect of the styling,
|
||||
* return true if attempt was successful
|
||||
*
|
||||
* @param string $key
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function set($key)
|
||||
{
|
||||
foreach ($this->style as $style) {
|
||||
if ($code = $style->set($key)) {
|
||||
return $this->validateCode($code);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset the current styles applied
|
||||
*
|
||||
*/
|
||||
public function reset()
|
||||
{
|
||||
foreach ($this->style as $style) {
|
||||
$style->reset();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a new instance of the Parser class based on the current settings
|
||||
*
|
||||
* @param \League\CLImate\Util\System\System $system
|
||||
*
|
||||
* @return \League\CLImate\Decorator\Parser\Parser
|
||||
*/
|
||||
public function parser(System $system)
|
||||
{
|
||||
return ParserFactory::getInstance($system, $this->current(), new Tags($this->all()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Compile an array of the current codes
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function current()
|
||||
{
|
||||
$full_current = [];
|
||||
|
||||
foreach ($this->style as $style) {
|
||||
$full_current = array_merge($full_current, Helper::toArray($style->current()));
|
||||
}
|
||||
|
||||
$full_current = array_filter($full_current);
|
||||
|
||||
return array_values($full_current);
|
||||
}
|
||||
|
||||
/**
|
||||
* Make sure that the code is an integer, if not let's try and get it there
|
||||
*
|
||||
* @param mixed $code
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
protected function validateCode($code)
|
||||
{
|
||||
if (is_integer($code)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Plug it back in and see what we get
|
||||
if (is_string($code)) {
|
||||
return $this->set($code);
|
||||
}
|
||||
|
||||
if (is_array($code)) {
|
||||
return $this->validateCodeArray($code);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate an array of codes
|
||||
*
|
||||
* @param array $codes
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
protected function validateCodeArray(array $codes)
|
||||
{
|
||||
// Loop through it and add each of the properties
|
||||
$adds = [];
|
||||
|
||||
foreach ($codes as $code) {
|
||||
$adds[] = $this->set($code);
|
||||
}
|
||||
|
||||
// If any of them came back true, we're good to go
|
||||
return in_array(true, $adds);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the array of codes to integers
|
||||
*
|
||||
* @param array $codes
|
||||
* @return array
|
||||
*/
|
||||
protected function convertToCodes(array $codes)
|
||||
{
|
||||
foreach ($codes as $key => $code) {
|
||||
if (is_int($code)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$codes[$key] = $this->getCode($code);
|
||||
}
|
||||
|
||||
return $codes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the integers from the mixed code input
|
||||
*
|
||||
* @param string|array $code
|
||||
*
|
||||
* @return integer|array
|
||||
*/
|
||||
protected function getCode($code)
|
||||
{
|
||||
if (is_array($code)) {
|
||||
return $this->getCodeArray($code);
|
||||
}
|
||||
|
||||
return $this->get($code);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an array of integers from the array of codes
|
||||
*
|
||||
* @param array $codes
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getCodeArray(array $codes)
|
||||
{
|
||||
foreach ($codes as $key => $code) {
|
||||
$codes[$key] = $this->get($code);
|
||||
}
|
||||
|
||||
return $codes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the add method for the style they are trying to add
|
||||
*
|
||||
* @param string $method
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function parseAddMethod($method)
|
||||
{
|
||||
return strtolower(substr($method, 3, strlen($method)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a custom style
|
||||
*
|
||||
* @param string $style
|
||||
* @param string $key
|
||||
* @param string $value
|
||||
*/
|
||||
protected function add($style, $key, $value)
|
||||
{
|
||||
$this->style[$style]->add($key, $value);
|
||||
|
||||
// If we are adding a color, make sure it gets added
|
||||
// as a background color too
|
||||
if ($style == 'color') {
|
||||
$this->style['background']->add($key, $value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Magic Methods
|
||||
*
|
||||
* List of possible magic methods are at the top of this class
|
||||
*
|
||||
* @param string $requested_method
|
||||
* @param array $arguments
|
||||
*/
|
||||
public function __call($requested_method, $arguments)
|
||||
{
|
||||
// The only methods we are concerned about are 'add' methods
|
||||
if (substr($requested_method, 0, 3) != 'add') {
|
||||
return false;
|
||||
}
|
||||
|
||||
$style = $this->parseAddMethod($requested_method);
|
||||
|
||||
if (array_key_exists($style, $this->style)) {
|
||||
list($key, $value) = $arguments;
|
||||
$this->add($style, $key, $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
76
vendor/league/climate/src/Decorator/Tags.php
vendored
Normal file
76
vendor/league/climate/src/Decorator/Tags.php
vendored
Normal file
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Decorator;
|
||||
|
||||
class Tags
|
||||
{
|
||||
/**
|
||||
* Original keys passed in to build tags
|
||||
*
|
||||
* @var array $tags
|
||||
*/
|
||||
|
||||
protected $keys = [];
|
||||
|
||||
/**
|
||||
* Available tags and their values
|
||||
*
|
||||
* @var array $tags
|
||||
*/
|
||||
|
||||
protected $tags = [];
|
||||
|
||||
public function __construct(array $keys)
|
||||
{
|
||||
$this->keys = $keys;
|
||||
$this->build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all available tags
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
|
||||
public function all()
|
||||
{
|
||||
return $this->tags;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the value of the requested tag
|
||||
*
|
||||
* @param string $key
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
|
||||
public function value($key)
|
||||
{
|
||||
return (array_key_exists($key, $this->tags)) ? $this->tags[$key] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the regular expression that can be used to parse the string for tags
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
|
||||
public function regex()
|
||||
{
|
||||
return '(<(?:(?:(?:\\\)*\/)*(?:' . implode('|', array_keys($this->keys)) . '))>)';
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the search and replace for all of the various style tags
|
||||
*/
|
||||
|
||||
protected function build()
|
||||
{
|
||||
foreach ($this->keys as $tag => $code) {
|
||||
$this->tags["<{$tag}>"] = $code;
|
||||
$this->tags["</{$tag}>"] = $code;
|
||||
$this->tags["<\\/{$tag}>"] = $code;
|
||||
}
|
||||
}
|
||||
}
|
||||
7
vendor/league/climate/src/Exceptions/Exception.php
vendored
Normal file
7
vendor/league/climate/src/Exceptions/Exception.php
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Exceptions;
|
||||
|
||||
interface Exception
|
||||
{
|
||||
}
|
||||
7
vendor/league/climate/src/Exceptions/InvalidArgumentException.php
vendored
Normal file
7
vendor/league/climate/src/Exceptions/InvalidArgumentException.php
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Exceptions;
|
||||
|
||||
class InvalidArgumentException extends \InvalidArgumentException implements Exception
|
||||
{
|
||||
}
|
||||
7
vendor/league/climate/src/Exceptions/RuntimeException.php
vendored
Normal file
7
vendor/league/climate/src/Exceptions/RuntimeException.php
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Exceptions;
|
||||
|
||||
class RuntimeException extends \RuntimeException implements Exception
|
||||
{
|
||||
}
|
||||
7
vendor/league/climate/src/Exceptions/UnexpectedValueException.php
vendored
Normal file
7
vendor/league/climate/src/Exceptions/UnexpectedValueException.php
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Exceptions;
|
||||
|
||||
class UnexpectedValueException extends \UnexpectedValueException implements Exception
|
||||
{
|
||||
}
|
||||
174
vendor/league/climate/src/Logger.php
vendored
Normal file
174
vendor/league/climate/src/Logger.php
vendored
Normal file
@@ -0,0 +1,174 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate;
|
||||
|
||||
use Psr\Log\AbstractLogger;
|
||||
use Psr\Log\InvalidArgumentException;
|
||||
use Psr\Log\LogLevel;
|
||||
use function array_key_exists;
|
||||
use function is_array;
|
||||
use function str_replace;
|
||||
use function strpos;
|
||||
|
||||
/**
|
||||
* A PSR-3 compatible logger that uses CLImate for output.
|
||||
*/
|
||||
class Logger extends AbstractLogger
|
||||
{
|
||||
/**
|
||||
* @var array $levels Conversion of the level strings to their numeric representations.
|
||||
*/
|
||||
private $levels = [
|
||||
LogLevel::EMERGENCY => 1,
|
||||
LogLevel::ALERT => 2,
|
||||
LogLevel::CRITICAL => 3,
|
||||
LogLevel::ERROR => 4,
|
||||
LogLevel::WARNING => 5,
|
||||
LogLevel::NOTICE => 6,
|
||||
LogLevel::INFO => 7,
|
||||
LogLevel::DEBUG => 8,
|
||||
];
|
||||
|
||||
/**
|
||||
* @var int $level Ignore logging attempts at a level less than this.
|
||||
*/
|
||||
private $level;
|
||||
|
||||
/**
|
||||
* @var CLImate $climate The underlying climate instance we are using for output.
|
||||
*/
|
||||
private $climate;
|
||||
|
||||
/**
|
||||
* Create a new Logger instance.
|
||||
*
|
||||
* @param string $level One of the LogLevel constants
|
||||
* @param CLImate $climate An existing CLImate instance to use for output
|
||||
*/
|
||||
public function __construct($level = LogLevel::INFO, CLImate $climate = null)
|
||||
{
|
||||
$this->level = $this->convertLevel($level);
|
||||
|
||||
if ($climate === null) {
|
||||
$climate = new CLImate;
|
||||
}
|
||||
$this->climate = $climate;
|
||||
|
||||
# Define some default styles to use for the output
|
||||
$commands = [
|
||||
"emergency" => ["white", "bold", "background_red"],
|
||||
"alert" => ["white", "background_yellow"],
|
||||
"critical" => ["red", "bold"],
|
||||
"error" => ["red"],
|
||||
"warning" => "yellow",
|
||||
"notice" => "light_cyan",
|
||||
"info" => "green",
|
||||
"debug" => "dark_gray",
|
||||
];
|
||||
|
||||
# If any of the required styles are not defined then define them now
|
||||
foreach ($commands as $command => $style) {
|
||||
if (!$this->climate->style->get($command)) {
|
||||
$this->climate->style->addCommand($command, $style);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a numeric log level for the passed parameter.
|
||||
*
|
||||
* @param string $level One of the LogLevel constants
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
private function convertLevel($level)
|
||||
{
|
||||
# If this is one of the defined string log levels then return it's numeric value
|
||||
if (!array_key_exists($level, $this->levels)) {
|
||||
throw new InvalidArgumentException("Unknown log level: {$level}");
|
||||
}
|
||||
|
||||
return $this->levels[$level];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a new instance logging at a different level
|
||||
*
|
||||
* @param string $level One of the LogLevel constants
|
||||
*
|
||||
* @return Logger
|
||||
*/
|
||||
public function withLogLevel($level)
|
||||
{
|
||||
$logger = clone $this;
|
||||
$logger->level = $this->convertLevel($level);
|
||||
return $logger;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Log messages to a CLImate instance.
|
||||
*
|
||||
* @param string $level One of the LogLevel constants
|
||||
* @param string|object $message If an object is passed it must implement __toString()
|
||||
* @param array $context Placeholders to be substituted in the message
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function log($level, $message, array $context = []): void
|
||||
{
|
||||
if ($this->convertLevel($level) > $this->level) {
|
||||
return;
|
||||
}
|
||||
|
||||
# Handle objects implementing __toString
|
||||
$message = (string)$message;
|
||||
|
||||
# Handle any placeholders in the $context array
|
||||
foreach ($context as $key => $val) {
|
||||
$placeholder = "{" . $key . "}";
|
||||
|
||||
# If this context key is used as a placeholder, then replace it, and remove it from the $context array
|
||||
if (strpos($message, $placeholder) !== false) {
|
||||
$val = (string)$val;
|
||||
$message = str_replace($placeholder, $val, $message);
|
||||
unset($context[$key]);
|
||||
}
|
||||
}
|
||||
|
||||
# Send the message to the climate instance
|
||||
$this->climate->{$level}($message);
|
||||
|
||||
# Append any context information not used as placeholders
|
||||
$this->outputRecursiveContext($level, $context, 1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Handle recursive arrays in the logging context.
|
||||
*
|
||||
* @param string $level One of the LogLevel constants
|
||||
* @param array $context The array of context to output
|
||||
* @param int $indent The current level of indentation to be used
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function outputRecursiveContext($level, array $context, $indent)
|
||||
{
|
||||
foreach ($context as $key => $val) {
|
||||
$this->climate->tab($indent);
|
||||
|
||||
$this->climate->{$level}()->inline("{$key}: ");
|
||||
|
||||
if (is_array($val)) {
|
||||
$this->climate->{$level}("[");
|
||||
$this->outputRecursiveContext($level, $val, $indent + 1);
|
||||
$this->climate->tab($indent)->{$level}("]");
|
||||
} else {
|
||||
$this->climate->{$level}((string)$val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
22
vendor/league/climate/src/Settings/Art.php
vendored
Normal file
22
vendor/league/climate/src/Settings/Art.php
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Settings;
|
||||
|
||||
class Art implements SettingsInterface
|
||||
{
|
||||
/**
|
||||
* An array of valid art directories
|
||||
* @var array[] $dirs
|
||||
*/
|
||||
public $dirs = [];
|
||||
|
||||
/**
|
||||
* Add directories of art
|
||||
*/
|
||||
public function add()
|
||||
{
|
||||
$this->dirs = array_merge($this->dirs, func_get_args());
|
||||
$this->dirs = array_filter($this->dirs);
|
||||
$this->dirs = array_values($this->dirs);
|
||||
}
|
||||
}
|
||||
84
vendor/league/climate/src/Settings/Manager.php
vendored
Normal file
84
vendor/league/climate/src/Settings/Manager.php
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Settings;
|
||||
|
||||
class Manager
|
||||
{
|
||||
/**
|
||||
* An array of settings that have been... set
|
||||
*
|
||||
* @var array $settings
|
||||
*/
|
||||
protected $settings = [];
|
||||
|
||||
/**
|
||||
* Check and see if the requested setting is a valid, registered setting
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function exists($name)
|
||||
{
|
||||
return class_exists($this->getPath($name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a setting
|
||||
*
|
||||
* @param string $name
|
||||
* @param mixed $value
|
||||
*/
|
||||
public function add($name, $value)
|
||||
{
|
||||
$setting = $this->getPath($name);
|
||||
$key = $this->getClassName($name);
|
||||
|
||||
// If the current key doesn't exist in the settings array, set it up
|
||||
if (!array_key_exists($name, $this->settings)) {
|
||||
$this->settings[$key] = new $setting();
|
||||
}
|
||||
|
||||
$this->settings[$key]->add($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the value of the requested setting if it exists
|
||||
*
|
||||
* @param string $key
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function get($key)
|
||||
{
|
||||
if (array_key_exists($key, $this->settings)) {
|
||||
return $this->settings[$key];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the short name for the requested settings class
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getPath($name)
|
||||
{
|
||||
return 'League\CLImate\Settings\\' . $this->getClassName($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the short class name for the setting
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getClassName($name)
|
||||
{
|
||||
return ucwords(str_replace('add_', '', $name));
|
||||
}
|
||||
}
|
||||
32
vendor/league/climate/src/Settings/SettingsImporter.php
vendored
Normal file
32
vendor/league/climate/src/Settings/SettingsImporter.php
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Settings;
|
||||
|
||||
trait SettingsImporter
|
||||
{
|
||||
/**
|
||||
* Dictates any settings that a class may need access to
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function settings()
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Import the setting into the class
|
||||
*
|
||||
* @param \League\CLImate\Settings\SettingsInterface $setting
|
||||
*/
|
||||
public function importSetting($setting)
|
||||
{
|
||||
$short_name = basename(str_replace('\\', '/', get_class($setting)));
|
||||
|
||||
$method = 'importSetting' . $short_name;
|
||||
|
||||
if (method_exists($this, $method)) {
|
||||
$this->$method($setting);
|
||||
}
|
||||
}
|
||||
}
|
||||
11
vendor/league/climate/src/Settings/SettingsInterface.php
vendored
Normal file
11
vendor/league/climate/src/Settings/SettingsInterface.php
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Settings;
|
||||
|
||||
interface SettingsInterface
|
||||
{
|
||||
/**
|
||||
* @return void
|
||||
*/
|
||||
public function add();
|
||||
}
|
||||
47
vendor/league/climate/src/TerminalObject/Basic/BasicTerminalObject.php
vendored
Normal file
47
vendor/league/climate/src/TerminalObject/Basic/BasicTerminalObject.php
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
use League\CLImate\Decorator\Parser\ParserImporter;
|
||||
use League\CLImate\Settings\SettingsImporter;
|
||||
use League\CLImate\Util\UtilImporter;
|
||||
|
||||
use function strlen;
|
||||
|
||||
abstract class BasicTerminalObject implements BasicTerminalObjectInterface
|
||||
{
|
||||
use SettingsImporter, ParserImporter, UtilImporter;
|
||||
|
||||
/**
|
||||
* Set the property if there is a valid value
|
||||
*
|
||||
* @param string $key
|
||||
* @param string $value
|
||||
*/
|
||||
protected function set($key, $value)
|
||||
{
|
||||
if (strlen((string) $value)) {
|
||||
$this->$key = $value;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the parser for the current object
|
||||
*
|
||||
* @return \League\CLImate\Decorator\Parser\Parser
|
||||
*/
|
||||
public function getParser()
|
||||
{
|
||||
return $this->parser;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this object requires a new line to be added after the output
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sameLine()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
34
vendor/league/climate/src/TerminalObject/Basic/BasicTerminalObjectInterface.php
vendored
Normal file
34
vendor/league/climate/src/TerminalObject/Basic/BasicTerminalObjectInterface.php
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
use League\CLImate\Decorator\Parser\Parser;
|
||||
use League\CLImate\Util\UtilFactory;
|
||||
|
||||
interface BasicTerminalObjectInterface
|
||||
{
|
||||
public function result();
|
||||
|
||||
public function settings();
|
||||
|
||||
/**
|
||||
* @param $setting
|
||||
* @return void
|
||||
*/
|
||||
public function importSetting($setting);
|
||||
|
||||
/**
|
||||
* @return boolean
|
||||
*/
|
||||
public function sameLine();
|
||||
|
||||
/**
|
||||
* @param \League\CLImate\Decorator\Parser\Parser $parser
|
||||
*/
|
||||
public function parser(Parser $parser);
|
||||
|
||||
/**
|
||||
* @param UtilFactory $util
|
||||
*/
|
||||
public function util(UtilFactory $util);
|
||||
}
|
||||
67
vendor/league/climate/src/TerminalObject/Basic/Border.php
vendored
Normal file
67
vendor/league/climate/src/TerminalObject/Basic/Border.php
vendored
Normal file
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
class Border extends BasicTerminalObject
|
||||
{
|
||||
/**
|
||||
* The character to repeat for the border
|
||||
*
|
||||
* @var string $char
|
||||
*/
|
||||
protected $char = '-';
|
||||
|
||||
/**
|
||||
* The length of the border
|
||||
*
|
||||
* @var integer $length
|
||||
*/
|
||||
protected $length;
|
||||
|
||||
public function __construct($char = null, $length = null)
|
||||
{
|
||||
$this->char($char)->length($length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the character to repeat for the border
|
||||
*
|
||||
* @param string $char
|
||||
*
|
||||
* @return Border
|
||||
*/
|
||||
public function char($char)
|
||||
{
|
||||
$this->set('char', $char);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the length of the border
|
||||
*
|
||||
* @param integer $length
|
||||
*
|
||||
* @return Border
|
||||
*/
|
||||
public function length($length)
|
||||
{
|
||||
$this->set('length', $length);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the border
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function result()
|
||||
{
|
||||
$length = $this->length ?: $this->util->width() ?: 100;
|
||||
$str = str_repeat($this->char, $length);
|
||||
$str = substr($str, 0, $length);
|
||||
|
||||
return $str;
|
||||
}
|
||||
}
|
||||
16
vendor/league/climate/src/TerminalObject/Basic/Br.php
vendored
Normal file
16
vendor/league/climate/src/TerminalObject/Basic/Br.php
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
class Br extends Repeatable
|
||||
{
|
||||
/**
|
||||
* Return an empty string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function result()
|
||||
{
|
||||
return array_fill(0, $this->count, '');
|
||||
}
|
||||
}
|
||||
21
vendor/league/climate/src/TerminalObject/Basic/Clear.php
vendored
Normal file
21
vendor/league/climate/src/TerminalObject/Basic/Clear.php
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
class Clear extends BasicTerminalObject
|
||||
{
|
||||
/**
|
||||
* Clear the terminal
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function result()
|
||||
{
|
||||
return "\e[H\e[2J";
|
||||
}
|
||||
|
||||
public function sameLine()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
36
vendor/league/climate/src/TerminalObject/Basic/ClearLine.php
vendored
Normal file
36
vendor/league/climate/src/TerminalObject/Basic/ClearLine.php
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
final class ClearLine extends Repeatable
|
||||
{
|
||||
/**
|
||||
* Clear the lines.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function result()
|
||||
{
|
||||
$string = "";
|
||||
while ($this->count > 0) {
|
||||
$string .= $this->util->cursor->startOfCurrentLine();
|
||||
$string .= $this->util->cursor->deleteCurrentLine();
|
||||
--$this->count;
|
||||
|
||||
$string .= $this->util->cursor->up();
|
||||
}
|
||||
|
||||
$string .= $this->util->cursor->down();
|
||||
|
||||
return $string;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function sameLine()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
207
vendor/league/climate/src/TerminalObject/Basic/Columns.php
vendored
Normal file
207
vendor/league/climate/src/TerminalObject/Basic/Columns.php
vendored
Normal file
@@ -0,0 +1,207 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
use League\CLImate\TerminalObject\Helper\StringLength;
|
||||
|
||||
class Columns extends BasicTerminalObject
|
||||
{
|
||||
use StringLength;
|
||||
|
||||
/**
|
||||
* Number of columns
|
||||
*
|
||||
* @var integer $column_count
|
||||
*/
|
||||
protected $column_count;
|
||||
|
||||
/**
|
||||
* Data to columnize
|
||||
*
|
||||
* @var array $data
|
||||
*/
|
||||
protected $data;
|
||||
|
||||
public function __construct($data, $column_count = null)
|
||||
{
|
||||
$this->data = $data;
|
||||
$this->column_count = $column_count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the number of columns organize data
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function result()
|
||||
{
|
||||
$keys = array_keys($this->data);
|
||||
$first_key = reset($keys);
|
||||
|
||||
return (!is_int($first_key)) ? $this->associativeColumns() : $this->columns();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get columns for a regular array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function columns()
|
||||
{
|
||||
$this->data = $this->setData();
|
||||
$column_widths = $this->getColumnWidths();
|
||||
$output = [];
|
||||
$count = count(reset($this->data));
|
||||
|
||||
for ($i = 0; $i < $count; $i++) {
|
||||
$output[] = $this->getRow($i, $column_widths);
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-configure the data into it's final form
|
||||
*/
|
||||
protected function setData()
|
||||
{
|
||||
// If it's already an array of arrays, we're good to go
|
||||
if (is_array(reset($this->data))) {
|
||||
return $this->setArrayOfArraysData();
|
||||
}
|
||||
|
||||
$column_width = $this->getColumnWidth($this->data);
|
||||
$row_count = $this->getMaxRows($column_width);
|
||||
|
||||
return array_chunk($this->data, $row_count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-configure an array of arrays into column arrays
|
||||
*/
|
||||
protected function setArrayOfArraysData()
|
||||
{
|
||||
$this->setColumnCountViaArray($this->data);
|
||||
|
||||
$new_data = array_fill(0, $this->column_count, []);
|
||||
|
||||
foreach ($this->data as $items) {
|
||||
for ($i = 0; $i < $this->column_count; $i++) {
|
||||
$new_data[$i][] = (array_key_exists($i, $items)) ? $items[$i] : null;
|
||||
}
|
||||
}
|
||||
|
||||
return $new_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get columns for an associative array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function associativeColumns()
|
||||
{
|
||||
$column_width = $this->getColumnWidth(array_keys($this->data));
|
||||
$output = [];
|
||||
|
||||
foreach ($this->data as $key => $value) {
|
||||
$output[] = $this->pad($key, $column_width) . $value;
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the row of data
|
||||
*
|
||||
* @param integer $key
|
||||
* @param array $column_widths
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getRow($key, $column_widths)
|
||||
{
|
||||
$row = [];
|
||||
|
||||
for ($j = 0; $j < $this->column_count; $j++) {
|
||||
if (isset($this->data[$j]) && array_key_exists($key, $this->data[$j])) {
|
||||
$row[] = $this->pad($this->data[$j][$key], $column_widths[$j]);
|
||||
}
|
||||
}
|
||||
|
||||
return trim(implode('', $row));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the standard column width
|
||||
*
|
||||
* @param array $data
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
protected function getColumnWidth($data)
|
||||
{
|
||||
// Return the maximum width plus a buffer
|
||||
return $this->maxStrLen($data) + 5;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an array of each column's width
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getColumnWidths()
|
||||
{
|
||||
$column_widths = [];
|
||||
|
||||
for ($i = 0; $i < $this->column_count; $i++) {
|
||||
if (!isset($this->data[$i])) {
|
||||
$column_widths[] = 0;
|
||||
continue;
|
||||
}
|
||||
$column_widths[] = $this->getColumnWidth($this->data[$i]);
|
||||
}
|
||||
|
||||
return $column_widths;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the count property
|
||||
*
|
||||
* @param integer $column_width
|
||||
*/
|
||||
protected function setColumnCount($column_width)
|
||||
{
|
||||
$this->column_count = (int) floor($this->util->width() / $column_width);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the count property via an array
|
||||
*
|
||||
* @param array $items
|
||||
*/
|
||||
protected function setColumnCountViaArray($items)
|
||||
{
|
||||
$counts = array_map(function ($arr) {
|
||||
return count($arr);
|
||||
}, $items);
|
||||
|
||||
$this->column_count = max($counts);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of rows per column
|
||||
*
|
||||
* @param integer $column_width
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
protected function getMaxRows($column_width)
|
||||
{
|
||||
if (!$this->column_count) {
|
||||
$this->setColumnCount($column_width);
|
||||
}
|
||||
|
||||
return ceil(count($this->data) / $this->column_count);
|
||||
}
|
||||
}
|
||||
30
vendor/league/climate/src/TerminalObject/Basic/Draw.php
vendored
Normal file
30
vendor/league/climate/src/TerminalObject/Basic/Draw.php
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
use League\CLImate\TerminalObject\Helper\Art;
|
||||
|
||||
class Draw extends BasicTerminalObject
|
||||
{
|
||||
use Art;
|
||||
|
||||
public function __construct($art)
|
||||
{
|
||||
// Add the default art directory
|
||||
$this->addDir(__DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'ASCII');
|
||||
|
||||
$this->art = $art;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the art
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function result()
|
||||
{
|
||||
$file = $this->artFile($this->art);
|
||||
|
||||
return $this->parse($file);
|
||||
}
|
||||
}
|
||||
36
vendor/league/climate/src/TerminalObject/Basic/Dump.php
vendored
Normal file
36
vendor/league/climate/src/TerminalObject/Basic/Dump.php
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
class Dump extends BasicTerminalObject
|
||||
{
|
||||
/**
|
||||
* The data to convert to JSON
|
||||
*
|
||||
* @var mixed $data
|
||||
*/
|
||||
protected $data;
|
||||
|
||||
public function __construct($data)
|
||||
{
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the data as JSON
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function result()
|
||||
{
|
||||
ob_start();
|
||||
|
||||
var_dump($this->data);
|
||||
|
||||
$result = ob_get_contents();
|
||||
|
||||
ob_end_clean();
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
74
vendor/league/climate/src/TerminalObject/Basic/Flank.php
vendored
Normal file
74
vendor/league/climate/src/TerminalObject/Basic/Flank.php
vendored
Normal file
@@ -0,0 +1,74 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
class Flank extends BasicTerminalObject
|
||||
{
|
||||
/**
|
||||
* The string that will be flanked
|
||||
*
|
||||
* @var string $str
|
||||
*/
|
||||
protected $str;
|
||||
|
||||
/**
|
||||
* The character(s) to repeat on either side of the string
|
||||
*
|
||||
* @var string $char
|
||||
*/
|
||||
protected $char = '#';
|
||||
|
||||
/**
|
||||
* How many times the character(s) should be repeated on either side
|
||||
*
|
||||
* @var integer $repeat
|
||||
*/
|
||||
protected $repeat = 3;
|
||||
|
||||
public function __construct($str, $char = null, $repeat = null)
|
||||
{
|
||||
$this->str = $str;
|
||||
|
||||
$this->char($char)->repeat($repeat);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the character(s) to repeat on either side
|
||||
*
|
||||
* @param string $char
|
||||
*
|
||||
* @return Flank
|
||||
*/
|
||||
public function char($char)
|
||||
{
|
||||
$this->set('char', $char);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the repeat of the flank character(s)
|
||||
*
|
||||
* @param integer $repeat
|
||||
*
|
||||
* @return Flank
|
||||
*/
|
||||
public function repeat($repeat)
|
||||
{
|
||||
$this->set('repeat', $repeat);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the flanked string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function result()
|
||||
{
|
||||
$flank = str_repeat($this->char, $this->repeat);
|
||||
|
||||
return "{$flank} {$this->str} {$flank}";
|
||||
}
|
||||
}
|
||||
16
vendor/league/climate/src/TerminalObject/Basic/Inline.php
vendored
Normal file
16
vendor/league/climate/src/TerminalObject/Basic/Inline.php
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
class Inline extends Out
|
||||
{
|
||||
/**
|
||||
* Check if this object requires a new line should be added after the output
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sameLine()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
28
vendor/league/climate/src/TerminalObject/Basic/Json.php
vendored
Normal file
28
vendor/league/climate/src/TerminalObject/Basic/Json.php
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
class Json extends BasicTerminalObject
|
||||
{
|
||||
/**
|
||||
* The data to convert to JSON
|
||||
*
|
||||
* @var mixed $data
|
||||
*/
|
||||
protected $data;
|
||||
|
||||
public function __construct($data)
|
||||
{
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the data as JSON
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function result()
|
||||
{
|
||||
return json_encode($this->data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
|
||||
}
|
||||
}
|
||||
28
vendor/league/climate/src/TerminalObject/Basic/Out.php
vendored
Normal file
28
vendor/league/climate/src/TerminalObject/Basic/Out.php
vendored
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
class Out extends BasicTerminalObject
|
||||
{
|
||||
/**
|
||||
* The content to output
|
||||
*
|
||||
* @var string $content
|
||||
*/
|
||||
protected $content;
|
||||
|
||||
public function __construct($content)
|
||||
{
|
||||
$this->content = $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the content to output
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function result()
|
||||
{
|
||||
return $this->content;
|
||||
}
|
||||
}
|
||||
18
vendor/league/climate/src/TerminalObject/Basic/Repeatable.php
vendored
Normal file
18
vendor/league/climate/src/TerminalObject/Basic/Repeatable.php
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
abstract class Repeatable extends BasicTerminalObject
|
||||
{
|
||||
/**
|
||||
* How many times the element should be repeated
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
protected $count;
|
||||
|
||||
public function __construct($count = 1)
|
||||
{
|
||||
$this->count = (int) round(max((int) $count, 1));
|
||||
}
|
||||
}
|
||||
29
vendor/league/climate/src/TerminalObject/Basic/Tab.php
vendored
Normal file
29
vendor/league/climate/src/TerminalObject/Basic/Tab.php
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
/**
|
||||
* Tab class to enable tabs to be output without using the escape character.
|
||||
*/
|
||||
class Tab extends Repeatable
|
||||
{
|
||||
/**
|
||||
* Check if this object requires a new line should be added after the output.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sameLine()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the relevant number of tab characters.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function result()
|
||||
{
|
||||
return str_repeat("\t", $this->count);
|
||||
}
|
||||
}
|
||||
308
vendor/league/climate/src/TerminalObject/Basic/Table.php
vendored
Normal file
308
vendor/league/climate/src/TerminalObject/Basic/Table.php
vendored
Normal file
@@ -0,0 +1,308 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Basic;
|
||||
|
||||
use League\CLImate\Exceptions\InvalidArgumentException;
|
||||
use League\CLImate\TerminalObject\Helper\StringLength;
|
||||
|
||||
use function array_keys;
|
||||
use function count;
|
||||
use function get_object_vars;
|
||||
use function is_array;
|
||||
use function is_object;
|
||||
use function max;
|
||||
use function preg_split;
|
||||
|
||||
class Table extends BasicTerminalObject
|
||||
{
|
||||
use StringLength;
|
||||
|
||||
/**
|
||||
* The data for the table, an array of (arrays|objects)
|
||||
*
|
||||
* @var array $data
|
||||
*/
|
||||
protected $data = [];
|
||||
|
||||
/**
|
||||
* An array of the widths of each column in the table
|
||||
*
|
||||
* @var array $column_widths
|
||||
*/
|
||||
protected $column_widths = [];
|
||||
|
||||
/**
|
||||
* The width of the table
|
||||
*
|
||||
* @var integer $table_width
|
||||
*/
|
||||
protected $table_width = 0;
|
||||
|
||||
/**
|
||||
* The divider between table cells
|
||||
*
|
||||
* @var string $column_divider
|
||||
*/
|
||||
protected $column_divider = ' | ';
|
||||
|
||||
/**
|
||||
* The border to divide each row of the table
|
||||
*
|
||||
* @var string $border
|
||||
*/
|
||||
protected $border;
|
||||
|
||||
/**
|
||||
* The array of rows that will ultimately be returned
|
||||
*
|
||||
* @var array $rows
|
||||
*/
|
||||
protected $rows = [];
|
||||
|
||||
/**
|
||||
* @var string $pregix A string to be output before each row is output.
|
||||
*/
|
||||
private $prefix = "";
|
||||
|
||||
|
||||
public function __construct(array $data, $prefix = "")
|
||||
{
|
||||
$this->data = $this->getData($data);
|
||||
$this->prefix = $prefix;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param array $input
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function getData(array $input)
|
||||
{
|
||||
$output = [];
|
||||
|
||||
foreach ($input as $item) {
|
||||
if (is_object($item)) {
|
||||
$item = get_object_vars($item);
|
||||
}
|
||||
|
||||
if (!is_array($item)) {
|
||||
throw new InvalidArgumentException("Invalid table data, you must pass an array of arrays or objects");
|
||||
}
|
||||
|
||||
$output[] = $item;
|
||||
}
|
||||
|
||||
return $this->splitRows($output);
|
||||
}
|
||||
|
||||
/**
|
||||
* Split each row in $data into an array of arrays
|
||||
* Where each value represents a line in a cell
|
||||
*
|
||||
* @param array $data
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function splitRows($data)
|
||||
{
|
||||
foreach ($data as $row_key => $row) {
|
||||
$height = 1;
|
||||
$lines = [];
|
||||
foreach ($row as $key => $column) {
|
||||
$lines[$key] = preg_split('/(\r\n|\r|\n)/u', $column);
|
||||
$height = max($height, count($lines[$key]));
|
||||
}
|
||||
$keys = array_keys($row);
|
||||
$new_rows = [];
|
||||
for ($i = 0; $i < $height; $i++) {
|
||||
$new_row = [];
|
||||
foreach ($keys as $key) {
|
||||
$new_row[$key] = $lines[$key][$i] ?? '';
|
||||
}
|
||||
$new_rows[] = $new_row;
|
||||
}
|
||||
$data[$row_key] = $new_rows;
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the built rows
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function result()
|
||||
{
|
||||
$this->column_widths = $this->getColumnWidths();
|
||||
$this->table_width = $this->getWidth();
|
||||
$this->border = $this->getBorder();
|
||||
|
||||
$this->buildHeaderRow();
|
||||
|
||||
foreach ($this->data as $row_columns) {
|
||||
foreach ($row_columns as $columns) {
|
||||
$this->addLine($this->buildRow($columns));
|
||||
}
|
||||
$this->addLine($this->border);
|
||||
}
|
||||
|
||||
return $this->rows;
|
||||
}
|
||||
|
||||
/**
|
||||
* Append a line to the output.
|
||||
*
|
||||
* @param string $line The line to output
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function addLine($line)
|
||||
{
|
||||
$this->rows[] = $this->prefix . $line;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Determine the width of the table
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
protected function getWidth()
|
||||
{
|
||||
$first_row = reset($this->data);
|
||||
$first_row = reset($first_row);
|
||||
$first_row = $this->buildRow($first_row);
|
||||
|
||||
return $this->lengthWithoutTags($first_row);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the border for each row based on the table width
|
||||
*/
|
||||
protected function getBorder()
|
||||
{
|
||||
return (new Border())->length($this->table_width)->result();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for a header row (if it's an array of associative arrays or objects),
|
||||
* if there is one, tack it onto the front of the rows array
|
||||
*/
|
||||
protected function buildHeaderRow()
|
||||
{
|
||||
$this->addLine($this->border);
|
||||
|
||||
$header_row = $this->getHeaderRow();
|
||||
if ($header_row) {
|
||||
$this->addLine($this->buildRow($header_row));
|
||||
$this->addLine((new Border)->char('=')->length($this->table_width)->result());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get table row
|
||||
*
|
||||
* @param mixed $columns
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function buildRow($columns)
|
||||
{
|
||||
$row = [];
|
||||
|
||||
foreach ($columns as $key => $column) {
|
||||
$row[] = $this->buildCell($key, $column);
|
||||
}
|
||||
|
||||
$row = implode($this->column_divider, $row);
|
||||
|
||||
return trim($this->column_divider . $row . $this->column_divider);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the string for this particular table cell
|
||||
*
|
||||
* @param mixed $key
|
||||
* @param string $column
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function buildCell($key, $column)
|
||||
{
|
||||
return $this->pad($column, $this->column_widths[$key]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the header row for the table if it's an associative array or object
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
protected function getHeaderRow()
|
||||
{
|
||||
$first_item = reset($this->data);
|
||||
$first_item = reset($first_item);
|
||||
|
||||
$keys = array_keys($first_item);
|
||||
$first_key = reset($keys);
|
||||
|
||||
// We have an associative array (probably), let's have a header row
|
||||
if (!is_int($first_key)) {
|
||||
return array_combine($keys, $keys);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the width of each column
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getColumnWidths()
|
||||
{
|
||||
$first_row = reset($this->data);
|
||||
$first_row = reset($first_row);
|
||||
|
||||
// Create an array with the columns as keys and values of zero
|
||||
$column_widths = $this->getDefaultColumnWidths($first_row);
|
||||
|
||||
foreach ($this->data as $row_columns) {
|
||||
foreach ($row_columns as $columns) {
|
||||
foreach ($columns as $key => $column) {
|
||||
$column_widths[$key] = $this->getCellWidth($column_widths[$key], $column);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $column_widths;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up an array of default column widths
|
||||
*
|
||||
* @param array $columns
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getDefaultColumnWidths(array $columns)
|
||||
{
|
||||
$widths = $this->arrayOfStrLens(array_keys($columns));
|
||||
|
||||
return array_combine(array_keys($columns), $widths);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the width of the columns without tags
|
||||
*
|
||||
* @param array $current_width
|
||||
* @param string $str
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
protected function getCellWidth($current_width, $str)
|
||||
{
|
||||
return max($current_width, $this->lengthWithoutTags($str));
|
||||
}
|
||||
}
|
||||
213
vendor/league/climate/src/TerminalObject/Dynamic/Animation.php
vendored
Normal file
213
vendor/league/climate/src/TerminalObject/Dynamic/Animation.php
vendored
Normal file
@@ -0,0 +1,213 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic;
|
||||
|
||||
use League\CLImate\TerminalObject\Dynamic\Animation\Keyframe;
|
||||
use League\CLImate\TerminalObject\Helper\Art;
|
||||
use League\CLImate\TerminalObject\Helper\Sleeper;
|
||||
|
||||
class Animation extends DynamicTerminalObject
|
||||
{
|
||||
use Art;
|
||||
|
||||
/**
|
||||
* @var \League\CLImate\TerminalObject\Helper\Sleeper $sleeper
|
||||
*/
|
||||
protected $sleeper;
|
||||
|
||||
/**
|
||||
* @var \League\CLImate\TerminalObject\Dynamic\Animation\Keyframe $keyframes
|
||||
*/
|
||||
protected $keyframes;
|
||||
|
||||
public function __construct($art, Sleeper $sleeper = null, Keyframe $keyframes = null)
|
||||
{
|
||||
// Add the default art directory
|
||||
$this->addDir(__DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'ASCII');
|
||||
|
||||
$this->setSleeper($sleeper);
|
||||
$this->setKeyFrames($keyframes);
|
||||
|
||||
$this->art = $art;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run a basic animation
|
||||
*/
|
||||
public function run()
|
||||
{
|
||||
$files = $this->artDir($this->art);
|
||||
$animation = [];
|
||||
|
||||
foreach ($files as $file) {
|
||||
$animation[] = $this->parse($file);
|
||||
}
|
||||
|
||||
$this->animate($animation);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the speed of the animation based on a percentage
|
||||
* (50% slower, 200% faster, etc)
|
||||
*
|
||||
* @param int|float $percentage
|
||||
*
|
||||
* @return \League\CLImate\TerminalObject\Dynamic\Animation
|
||||
*/
|
||||
public function speed($percentage)
|
||||
{
|
||||
$this->sleeper->speed($percentage);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Scroll the art
|
||||
*
|
||||
* @param string $direction
|
||||
* @return bool
|
||||
*/
|
||||
public function scroll($direction = 'right')
|
||||
{
|
||||
$this->setupKeyframes();
|
||||
|
||||
$mapping = $this->getScrollDirectionMapping();
|
||||
|
||||
if (!array_key_exists($direction, $mapping)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$lines = $this->getLines();
|
||||
$enter_from = $mapping[$direction];
|
||||
$exit_to = $mapping[$enter_from];
|
||||
|
||||
$this->animate($this->keyframes->scroll($lines, $enter_from, $exit_to));
|
||||
}
|
||||
|
||||
/**
|
||||
* Animate the art exiting the screen
|
||||
*
|
||||
* @param string $direction top|bottom|right|left
|
||||
*/
|
||||
public function exitTo($direction)
|
||||
{
|
||||
$this->setupKeyframes();
|
||||
|
||||
$this->animate($this->keyframes->exitTo($this->getLines(), $direction));
|
||||
}
|
||||
|
||||
/**
|
||||
* Animate the art entering the screen
|
||||
*
|
||||
* @param string $direction top|bottom|right|left
|
||||
*/
|
||||
public function enterFrom($direction)
|
||||
{
|
||||
$this->setupKeyframes();
|
||||
|
||||
$this->animate($this->keyframes->enterFrom($this->getLines(), $direction));
|
||||
}
|
||||
|
||||
protected function getScrollDirectionMapping()
|
||||
{
|
||||
return [
|
||||
'left' => 'right',
|
||||
'right' => 'left',
|
||||
'top' => 'bottom',
|
||||
'bottom' => 'top',
|
||||
'up' => 'bottom',
|
||||
'down' => 'top',
|
||||
];
|
||||
}
|
||||
|
||||
protected function getLines()
|
||||
{
|
||||
return $this->parse($this->artFile($this->art));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \League\CLImate\TerminalObject\Helper\Sleeper $sleeper
|
||||
*/
|
||||
protected function setSleeper($sleeper = null)
|
||||
{
|
||||
$this->sleeper = $sleeper ?: new Sleeper();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param League\CLImate\TerminalObject\Dynamic\Animation\Keyframe $keyframes
|
||||
*/
|
||||
protected function setKeyFrames($keyframes)
|
||||
{
|
||||
$this->keyframes = $keyframes ?: new Keyframe;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up the necessary properties on the Keyframe class
|
||||
*/
|
||||
protected function setupKeyframes()
|
||||
{
|
||||
$this->keyframes->parser($this->parser);
|
||||
$this->keyframes->util($this->util);
|
||||
}
|
||||
|
||||
/**
|
||||
* Animate the given keyframes
|
||||
*
|
||||
* @param array $keyframes Array of arrays
|
||||
*/
|
||||
protected function animate(array $keyframes)
|
||||
{
|
||||
$count = 0;
|
||||
|
||||
foreach ($keyframes as $lines) {
|
||||
$this->writeKeyFrame($lines, $count);
|
||||
$this->sleeper->sleep();
|
||||
$count = count($lines);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the current keyframe to the terminal, line by line
|
||||
*
|
||||
* @param array $lines
|
||||
* @param integer $count
|
||||
*/
|
||||
protected function writeKeyFrame(array $lines, $count)
|
||||
{
|
||||
foreach ($lines as $key => $line) {
|
||||
$content = $this->getLineFormatted($line, $key, $count);
|
||||
$this->output->write($this->parser->apply($content));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the line to re-write previous lines, if necessary
|
||||
*
|
||||
* @param string $line
|
||||
* @param integer $key
|
||||
* @param integer $last_frame_count
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getLineFormatted($line, $key, $last_frame_count)
|
||||
{
|
||||
// If this is the first thing we're writing, just return the line
|
||||
if ($last_frame_count == 0) {
|
||||
return $line;
|
||||
}
|
||||
|
||||
$content = '';
|
||||
|
||||
// If this is the first line of the frame,
|
||||
// move the cursor up the total number of previous lines from the previous frame
|
||||
if ($key == 0) {
|
||||
$content .= $this->util->cursor->up($last_frame_count);
|
||||
}
|
||||
|
||||
$content .= $this->util->cursor->startOfCurrentLine();
|
||||
$content .= $this->util->cursor->deleteCurrentLine();
|
||||
$content .= $line;
|
||||
|
||||
return $content;
|
||||
}
|
||||
}
|
||||
265
vendor/league/climate/src/TerminalObject/Dynamic/Animation/Keyframe.php
vendored
Normal file
265
vendor/league/climate/src/TerminalObject/Dynamic/Animation/Keyframe.php
vendored
Normal file
@@ -0,0 +1,265 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic\Animation;
|
||||
|
||||
use League\CLImate\Decorator\Parser\ParserImporter;
|
||||
use League\CLImate\TerminalObject\Helper\StringLength;
|
||||
use League\CLImate\Util\UtilImporter;
|
||||
|
||||
class Keyframe
|
||||
{
|
||||
use StringLength, ParserImporter, UtilImporter;
|
||||
|
||||
/**
|
||||
* Get the enter keyframes for the desired direction
|
||||
*
|
||||
* @param array $lines
|
||||
* @param string $direction
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function enterFrom($lines, $direction)
|
||||
{
|
||||
return array_reverse($this->exitTo($lines, $direction));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the exit keyframes for the desired direction
|
||||
*
|
||||
* @param array $lines
|
||||
* @param string $direction
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function exitTo($lines, $direction)
|
||||
{
|
||||
$lines = $this->adjustLines($lines, $direction);
|
||||
$line_method = $this->getLineMethod($direction);
|
||||
|
||||
$direction_keyframes = $this->getDirectionFrames($direction, $lines, $line_method);
|
||||
|
||||
$keyframes = array_fill(0, 4, $lines);
|
||||
$keyframes = array_merge($keyframes, $direction_keyframes);
|
||||
$keyframes[] = array_fill(0, count($lines), '');
|
||||
|
||||
return $keyframes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get scroll keyframes
|
||||
*
|
||||
* @param array $lines
|
||||
* @param string $enter_from
|
||||
* @param string $exit_to
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function scroll($lines, $enter_from, $exit_to)
|
||||
{
|
||||
$keyframes = $this->enterFrom($lines, $enter_from);
|
||||
$keyframes = array_merge($keyframes, $this->exitTo($lines, $exit_to));
|
||||
$keyframes = array_unique($keyframes, SORT_REGULAR);
|
||||
$keyframes[] = reset($keyframes);
|
||||
|
||||
return $keyframes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the line parser for the direction
|
||||
*
|
||||
* @param string $direction
|
||||
* @return string
|
||||
*/
|
||||
protected function getLineMethod($direction)
|
||||
{
|
||||
return 'current' . ucwords(strtolower($direction)) . 'Line';
|
||||
}
|
||||
|
||||
/**
|
||||
* Adjust the array of lines if necessary
|
||||
*
|
||||
* @param array $lines
|
||||
* @param string $direction
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function adjustLines(array $lines, $direction)
|
||||
{
|
||||
$adjust_method = 'adjust' . ucwords(strtolower($direction)) . 'Lines';
|
||||
|
||||
if (method_exists($this, $adjust_method)) {
|
||||
return $this->$adjust_method($lines);
|
||||
}
|
||||
|
||||
return $lines;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pad the array of lines for "right" animation
|
||||
*
|
||||
* @param array $lines
|
||||
* @return array
|
||||
*/
|
||||
protected function adjustRightLines(array $lines)
|
||||
{
|
||||
return $this->padArray($lines, $this->util->width());
|
||||
}
|
||||
|
||||
/**
|
||||
* Pad the array of lines for "left" animation
|
||||
*
|
||||
* @param array $lines
|
||||
* @return array
|
||||
*/
|
||||
protected function adjustLeftLines(array $lines)
|
||||
{
|
||||
return $this->padArray($lines, $this->maxStrLen($lines));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the keyframes appropriate for the animation direction
|
||||
*
|
||||
* @param string $direction
|
||||
* @param array $lines
|
||||
* @param string $line_method
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getDirectionFrames($direction, array $lines, $line_method)
|
||||
{
|
||||
$mapping = [
|
||||
'exitHorizontalFrames' => ['left', 'right'],
|
||||
'exitVerticalFrames' => ['top', 'bottom'],
|
||||
];
|
||||
|
||||
foreach ($mapping as $method => $directions) {
|
||||
if (in_array($direction, $directions)) {
|
||||
return $this->$method($lines, $line_method);
|
||||
}
|
||||
}
|
||||
|
||||
// Fail gracefully, simply return an array
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Create horizontal exit animation keyframes for the art
|
||||
*
|
||||
* @param array $lines
|
||||
* @param string $line_method
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function exitHorizontalFrames(array $lines, $line_method)
|
||||
{
|
||||
$keyframes = [];
|
||||
$length = mb_strlen($lines[0]);
|
||||
|
||||
for ($i = $length; $i > 0; $i--) {
|
||||
$keyframes[] = $this->getHorizontalKeyframe($lines, $i, $line_method, $length);
|
||||
}
|
||||
|
||||
return $keyframes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the keyframe for a horizontal animation
|
||||
*
|
||||
* @param array $lines
|
||||
* @param int $frame_number
|
||||
* @param string $line_method
|
||||
* @param int $length
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getHorizontalKeyframe(array $lines, $frame_number, $line_method, $length)
|
||||
{
|
||||
$keyframe = [];
|
||||
|
||||
foreach ($lines as $line) {
|
||||
$keyframe[] = $this->$line_method($line, $frame_number, $length);
|
||||
}
|
||||
|
||||
return $keyframe;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create vertical exit animation keyframes for the art
|
||||
*
|
||||
* @param array $lines
|
||||
* @param string $line_method
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function exitVerticalFrames(array $lines, $line_method)
|
||||
{
|
||||
$keyframes = [];
|
||||
$line_count = count($lines);
|
||||
|
||||
for ($i = $line_count - 1; $i >= 0; $i--) {
|
||||
$keyframes[] = $this->$line_method($lines, $line_count, $i);
|
||||
}
|
||||
|
||||
return $keyframes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current line as it is exiting left
|
||||
*
|
||||
* @param string $line
|
||||
* @param int $frame_number
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function currentLeftLine($line, $frame_number)
|
||||
{
|
||||
return mb_substr($line, -$frame_number);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the current line as it is exiting right
|
||||
*
|
||||
* @param string $line
|
||||
* @param int $frame_number
|
||||
* @param int $length
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function currentRightLine($line, $frame_number, $length)
|
||||
{
|
||||
return str_repeat(' ', $length - $frame_number) . mb_substr($line, 0, $frame_number);
|
||||
}
|
||||
|
||||
/**
|
||||
* Slice off X number of lines from the bottom and fill the rest with empty strings
|
||||
*
|
||||
* @param array $lines
|
||||
* @param integer $total_lines
|
||||
* @param integer $current
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function currentTopLine($lines, $total_lines, $current)
|
||||
{
|
||||
$keyframe = array_slice($lines, -$current, $current);
|
||||
|
||||
return array_merge($keyframe, array_fill(0, $total_lines - $current, ''));
|
||||
}
|
||||
|
||||
/**
|
||||
* Slice off X number of lines from the top and fill the rest with empty strings
|
||||
*
|
||||
* @param array $lines
|
||||
* @param integer $total_lines
|
||||
* @param integer $current
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function currentBottomLine($lines, $total_lines, $current)
|
||||
{
|
||||
$keyframe = array_fill(0, $total_lines - $current, '');
|
||||
|
||||
return array_merge($keyframe, array_slice($lines, 0, $current));
|
||||
}
|
||||
}
|
||||
222
vendor/league/climate/src/TerminalObject/Dynamic/Checkbox/Checkbox.php
vendored
Normal file
222
vendor/league/climate/src/TerminalObject/Dynamic/Checkbox/Checkbox.php
vendored
Normal file
@@ -0,0 +1,222 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic\Checkbox;
|
||||
|
||||
use League\CLImate\Decorator\Parser\ParserImporter;
|
||||
use League\CLImate\TerminalObject\Helper\StringLength;
|
||||
use League\CLImate\Util\UtilImporter;
|
||||
|
||||
class Checkbox
|
||||
{
|
||||
use StringLength, ParserImporter, UtilImporter;
|
||||
|
||||
/**
|
||||
* The value of the checkbox
|
||||
*
|
||||
* @var string|int|bool $value
|
||||
*/
|
||||
protected $value;
|
||||
|
||||
/**
|
||||
* The label for the checkbox
|
||||
*
|
||||
* @var string|int $label
|
||||
*/
|
||||
protected $label;
|
||||
|
||||
/**
|
||||
* Whether the checkbox is checked
|
||||
*
|
||||
* @var bool $checked
|
||||
*/
|
||||
protected $checked = false;
|
||||
|
||||
/**
|
||||
* Whether pointer is currently pointing at the checkbox
|
||||
*
|
||||
* @var bool $current
|
||||
*/
|
||||
protected $current = false;
|
||||
|
||||
/**
|
||||
* Whether the checkbox is the first in the group
|
||||
*
|
||||
* @var bool $first
|
||||
*/
|
||||
protected $first = false;
|
||||
|
||||
/**
|
||||
* Whether the checkbox is the last in the group
|
||||
*
|
||||
* @var bool $last
|
||||
*/
|
||||
protected $last = false;
|
||||
|
||||
public function __construct($label, $value)
|
||||
{
|
||||
$this->value = (!is_int($value)) ? $value : $label;
|
||||
$this->label = $label;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isCurrent()
|
||||
{
|
||||
return $this->current;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isChecked()
|
||||
{
|
||||
return $this->checked;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isFirst()
|
||||
{
|
||||
return $this->first;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isLast()
|
||||
{
|
||||
return $this->last;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set whether the pointer is currently pointing at this checkbox
|
||||
*
|
||||
* @param bool $current
|
||||
*
|
||||
* @return Checkbox
|
||||
*/
|
||||
public function setCurrent($current = true)
|
||||
{
|
||||
$this->current = $current;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set whether the checkbox is currently checked
|
||||
*
|
||||
* @param bool $checked
|
||||
*
|
||||
* @return Checkbox
|
||||
*/
|
||||
public function setChecked($checked = true)
|
||||
{
|
||||
$this->checked = $checked;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Checkbox
|
||||
*/
|
||||
public function setFirst()
|
||||
{
|
||||
$this->first = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Checkbox
|
||||
*/
|
||||
public function setLast()
|
||||
{
|
||||
$this->last = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string|int|bool
|
||||
*/
|
||||
public function getValue()
|
||||
{
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build out basic checkbox string based on current options
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function buildCheckboxString()
|
||||
{
|
||||
$parts = [
|
||||
($this->isCurrent()) ? $this->pointer() : ' ',
|
||||
$this->checkbox($this->isChecked()),
|
||||
$this->label,
|
||||
];
|
||||
|
||||
$line = implode(' ', $parts);
|
||||
|
||||
return $line . $this->getPaddingString($line);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the padding string based on the length of the terminal/line
|
||||
*
|
||||
* @param string $line
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getPaddingString($line)
|
||||
{
|
||||
$length = $this->util->width() - $this->lengthWithoutTags($line);
|
||||
if ($length < 1) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return str_repeat(' ', $length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the checkbox symbol
|
||||
*
|
||||
* @param bool $checked
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function checkbox($checked)
|
||||
{
|
||||
if ($checked) {
|
||||
return html_entity_decode("●");
|
||||
}
|
||||
|
||||
return html_entity_decode("○");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the pointer symbol
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function pointer()
|
||||
{
|
||||
return html_entity_decode("❯");
|
||||
}
|
||||
|
||||
public function __toString()
|
||||
{
|
||||
if ($this->isFirst()) {
|
||||
return $this->buildCheckboxString();
|
||||
}
|
||||
|
||||
if ($this->isLast()) {
|
||||
return $this->buildCheckboxString() . $this->util->cursor->left(10) . '<hidden>';
|
||||
}
|
||||
|
||||
return $this->buildCheckboxString();
|
||||
}
|
||||
}
|
||||
191
vendor/league/climate/src/TerminalObject/Dynamic/Checkbox/CheckboxGroup.php
vendored
Normal file
191
vendor/league/climate/src/TerminalObject/Dynamic/Checkbox/CheckboxGroup.php
vendored
Normal file
@@ -0,0 +1,191 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic\Checkbox;
|
||||
|
||||
use League\CLImate\Decorator\Parser\ParserImporter;
|
||||
use League\CLImate\Util\OutputImporter;
|
||||
use League\CLImate\Util\UtilImporter;
|
||||
|
||||
class CheckboxGroup
|
||||
{
|
||||
use OutputImporter, ParserImporter, UtilImporter;
|
||||
|
||||
protected $checkboxes = [];
|
||||
|
||||
protected $count;
|
||||
|
||||
public function __construct(array $options)
|
||||
{
|
||||
foreach ($options as $key => $option) {
|
||||
$this->checkboxes[] = new Checkbox($option, $key);
|
||||
}
|
||||
|
||||
$this->count = count($this->checkboxes);
|
||||
|
||||
$this->checkboxes[0]->setFirst()->setCurrent();
|
||||
$this->checkboxes[$this->count - 1]->setLast();
|
||||
}
|
||||
|
||||
public function write()
|
||||
{
|
||||
array_map([$this, 'writeCheckbox'], $this->checkboxes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the checked option values
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getCheckedValues()
|
||||
{
|
||||
return array_values(array_map([$this, 'getValue'], $this->getChecked()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the newly selected option based on the direction
|
||||
*
|
||||
* @param string $direction 'previous' or 'next'
|
||||
*/
|
||||
public function setCurrent($direction)
|
||||
{
|
||||
list($option, $key) = $this->getCurrent();
|
||||
|
||||
$option->setCurrent(false);
|
||||
|
||||
$new_key = $this->getCurrentKey($direction, $option, $key);
|
||||
|
||||
$this->checkboxes[$new_key]->setCurrent();
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggle the current option's checked status
|
||||
*/
|
||||
public function toggleCurrent()
|
||||
{
|
||||
list($option) = $this->getCurrent();
|
||||
|
||||
$option->setChecked(!$option->isChecked());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the number of checkboxes
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function count()
|
||||
{
|
||||
return $this->count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the checked options
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getChecked()
|
||||
{
|
||||
return array_filter($this->checkboxes, [$this, 'isChecked']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the option is checked
|
||||
*
|
||||
* @param Checkbox $option
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function isChecked($option)
|
||||
{
|
||||
return $option->isChecked();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the option's value
|
||||
*
|
||||
* @param Checkbox $option
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
protected function getValue($option)
|
||||
{
|
||||
return $option->getValue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the currently selected option
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getCurrent()
|
||||
{
|
||||
foreach ($this->checkboxes as $key => $option) {
|
||||
if ($option->isCurrent()) {
|
||||
return [$option, $key];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the correct current key
|
||||
*
|
||||
* @param string $direction 'previous' or 'next'
|
||||
* @param Checkbox $option
|
||||
* @param int $key
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function getCurrentKey($direction, $option, $key)
|
||||
{
|
||||
$method = 'get' . ucwords($direction). 'Key';
|
||||
|
||||
return $this->{$method}($option, $key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Checkbox $option
|
||||
* @param int $key
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function getPreviousKey($option, $key)
|
||||
{
|
||||
if ($option->isFirst()) {
|
||||
return count($this->checkboxes) - 1;
|
||||
}
|
||||
|
||||
return --$key;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Checkbox $option
|
||||
* @param int $key
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function getNextKey($option, $key)
|
||||
{
|
||||
if ($option->isLast()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return ++$key;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Checkbox $checkbox
|
||||
*/
|
||||
protected function writeCheckbox($checkbox)
|
||||
{
|
||||
$checkbox->util($this->util);
|
||||
$checkbox->parser($this->parser);
|
||||
|
||||
$parsed = $this->parser->apply((string) $checkbox);
|
||||
|
||||
if ($checkbox->isLast()) {
|
||||
$this->output->sameLine()->write($parsed);
|
||||
return;
|
||||
}
|
||||
|
||||
$this->output->write($parsed);
|
||||
}
|
||||
}
|
||||
38
vendor/league/climate/src/TerminalObject/Dynamic/Checkbox/RadioGroup.php
vendored
Normal file
38
vendor/league/climate/src/TerminalObject/Dynamic/Checkbox/RadioGroup.php
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic\Checkbox;
|
||||
|
||||
class RadioGroup extends CheckboxGroup
|
||||
{
|
||||
/**
|
||||
* Toggle the currently selected option, uncheck all of the others
|
||||
*/
|
||||
public function toggleCurrent()
|
||||
{
|
||||
list($checkbox, $checkbox_key) = $this->getCurrent();
|
||||
|
||||
$checkbox->setChecked(!$checkbox->isChecked());
|
||||
|
||||
foreach ($this->checkboxes as $key => $checkbox) {
|
||||
if ($key == $checkbox_key) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$checkbox->setChecked(false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the checked option
|
||||
*
|
||||
* @return string|bool|int
|
||||
*/
|
||||
public function getCheckedValues()
|
||||
{
|
||||
if ($checked = $this->getChecked()) {
|
||||
return reset($checked)->getValue();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
159
vendor/league/climate/src/TerminalObject/Dynamic/Checkboxes.php
vendored
Normal file
159
vendor/league/climate/src/TerminalObject/Dynamic/Checkboxes.php
vendored
Normal file
@@ -0,0 +1,159 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic;
|
||||
|
||||
use League\CLImate\Util\Reader\ReaderInterface;
|
||||
use League\CLImate\Util\Reader\Stdin;
|
||||
|
||||
class Checkboxes extends InputAbstract
|
||||
{
|
||||
/**
|
||||
* The options to choose from
|
||||
*
|
||||
* @var Checkbox\CheckboxGroup $checkboxes
|
||||
*/
|
||||
protected $checkboxes;
|
||||
|
||||
public function __construct($prompt, array $options, ReaderInterface $reader = null)
|
||||
{
|
||||
$this->prompt = $prompt;
|
||||
$this->reader = $reader ?: new Stdin();
|
||||
|
||||
$this->checkboxes = $this->buildCheckboxes($options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Do it! Prompt the user for information!
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function prompt()
|
||||
{
|
||||
$this->output->write($this->parser->apply($this->promptFormatted()));
|
||||
|
||||
$this->writeCheckboxes();
|
||||
|
||||
$this->util->system->exec('stty sane');
|
||||
|
||||
return $this->checkboxes->getCheckedValues();
|
||||
}
|
||||
|
||||
/**
|
||||
* Build out the checkboxes
|
||||
*
|
||||
* @param array $options
|
||||
*
|
||||
* @return Checkbox\CheckboxGroup
|
||||
*/
|
||||
protected function buildCheckboxes(array $options)
|
||||
{
|
||||
return new Checkbox\CheckboxGroup($options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the prompt string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function promptFormatted()
|
||||
{
|
||||
return $this->prompt . ' (use <space> to select)';
|
||||
}
|
||||
|
||||
/**
|
||||
* Output the checkboxes and listen for any keystrokes
|
||||
*/
|
||||
protected function writeCheckboxes()
|
||||
{
|
||||
$this->updateCheckboxView();
|
||||
|
||||
$this->util->system->exec('stty -icanon');
|
||||
$this->output->sameLine()->write($this->util->cursor->hide());
|
||||
|
||||
$this->listenForInput();
|
||||
}
|
||||
|
||||
/**
|
||||
* Listen for input and act on it
|
||||
*/
|
||||
protected function listenForInput()
|
||||
{
|
||||
while ($char = $this->reader->char(1)) {
|
||||
if ($this->handleCharacter($char)) {
|
||||
break;
|
||||
}
|
||||
|
||||
$this->moveCursorToTop();
|
||||
$this->updateCheckboxView();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Take the appropriate action based on the input character,
|
||||
* returns whether to stop listening or not
|
||||
*
|
||||
* @param string $char
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function handleCharacter($char)
|
||||
{
|
||||
switch ($char) {
|
||||
case "\n":
|
||||
$this->output->sameLine()->write($this->util->cursor->defaultStyle());
|
||||
$this->output->sameLine()->write("\e[0m");
|
||||
return true; // Break the while loop as well
|
||||
|
||||
case "\e":
|
||||
$this->handleAnsi();
|
||||
break;
|
||||
|
||||
case ' ':
|
||||
$this->checkboxes->toggleCurrent();
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Move the cursor to the top of the option list
|
||||
*/
|
||||
protected function moveCursorToTop()
|
||||
{
|
||||
$output = $this->util->cursor->up($this->checkboxes->count() - 1);
|
||||
$output .= $this->util->cursor->startOfCurrentLine();
|
||||
|
||||
$this->output->sameLine()->write($output);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle any ANSI characters
|
||||
*/
|
||||
protected function handleAnsi()
|
||||
{
|
||||
switch ($this->reader->char(2)) {
|
||||
// Up arrow
|
||||
case '[A':
|
||||
$this->checkboxes->setCurrent('previous');
|
||||
break;
|
||||
|
||||
// Down arrow
|
||||
case '[B':
|
||||
$this->checkboxes->setCurrent('next');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Re-write the checkboxes based on the current objects
|
||||
*/
|
||||
protected function updateCheckboxView()
|
||||
{
|
||||
$this->checkboxes->util($this->util);
|
||||
$this->checkboxes->output($this->output);
|
||||
$this->checkboxes->parser($this->parser);
|
||||
|
||||
$this->checkboxes->write();
|
||||
}
|
||||
}
|
||||
44
vendor/league/climate/src/TerminalObject/Dynamic/Confirm.php
vendored
Normal file
44
vendor/league/climate/src/TerminalObject/Dynamic/Confirm.php
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic;
|
||||
|
||||
use League\CLImate\Util\Reader\ReaderInterface;
|
||||
use function in_array;
|
||||
use function strtolower;
|
||||
use function substr;
|
||||
|
||||
class Confirm extends Input
|
||||
{
|
||||
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function __construct($prompt, ReaderInterface $reader = null)
|
||||
{
|
||||
parent::__construct($prompt, $reader);
|
||||
|
||||
$this->default = "n";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Let us know if the user confirmed.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function confirmed()
|
||||
{
|
||||
if (in_array($this->default, ["y", "yes"], true)) {
|
||||
$this->prompt .= " [Y/n]";
|
||||
} else {
|
||||
$this->prompt .= " [y/N]";
|
||||
}
|
||||
|
||||
$this->accept(['y', 'yes', 'n', 'no'], false);
|
||||
|
||||
$response = strtolower($this->prompt());
|
||||
|
||||
return (substr($response, 0, 1) === 'y');
|
||||
}
|
||||
}
|
||||
18
vendor/league/climate/src/TerminalObject/Dynamic/DynamicTerminalObject.php
vendored
Normal file
18
vendor/league/climate/src/TerminalObject/Dynamic/DynamicTerminalObject.php
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic;
|
||||
|
||||
use League\CLImate\Decorator\Parser\ParserImporter;
|
||||
use League\CLImate\Settings\SettingsImporter;
|
||||
use League\CLImate\Util\OutputImporter;
|
||||
use League\CLImate\Util\UtilImporter;
|
||||
|
||||
/**
|
||||
* The dynamic terminal object doesn't adhere to the basic terminal object
|
||||
* contract, which is why it gets its own base class
|
||||
*/
|
||||
|
||||
abstract class DynamicTerminalObject implements DynamicTerminalObjectInterface
|
||||
{
|
||||
use SettingsImporter, ParserImporter, OutputImporter, UtilImporter;
|
||||
}
|
||||
27
vendor/league/climate/src/TerminalObject/Dynamic/DynamicTerminalObjectInterface.php
vendored
Normal file
27
vendor/league/climate/src/TerminalObject/Dynamic/DynamicTerminalObjectInterface.php
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic;
|
||||
|
||||
use League\CLImate\Decorator\Parser\Parser;
|
||||
use League\CLImate\Util\UtilFactory;
|
||||
|
||||
interface DynamicTerminalObjectInterface
|
||||
{
|
||||
public function settings();
|
||||
|
||||
/**
|
||||
* @param $setting
|
||||
* @return void
|
||||
*/
|
||||
public function importSetting($setting);
|
||||
|
||||
/**
|
||||
* @param \League\CLImate\Decorator\Parser\Parser $parser
|
||||
*/
|
||||
public function parser(Parser $parser);
|
||||
|
||||
/**
|
||||
* @param UtilFactory $util
|
||||
*/
|
||||
public function util(UtilFactory $util);
|
||||
}
|
||||
283
vendor/league/climate/src/TerminalObject/Dynamic/Input.php
vendored
Normal file
283
vendor/league/climate/src/TerminalObject/Dynamic/Input.php
vendored
Normal file
@@ -0,0 +1,283 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic;
|
||||
|
||||
use League\CLImate\Util\Reader\ReaderInterface;
|
||||
use League\CLImate\Util\Reader\Stdin;
|
||||
|
||||
class Input extends InputAbstract
|
||||
{
|
||||
/**
|
||||
* An array of acceptable responses
|
||||
*
|
||||
* @var array|object $acceptable
|
||||
*/
|
||||
protected $acceptable;
|
||||
|
||||
/**
|
||||
* Whether we should be strict about the response given
|
||||
*
|
||||
* @var boolean $strict
|
||||
*/
|
||||
protected $strict = false;
|
||||
|
||||
/**
|
||||
* Whether to accept multiple lines of input
|
||||
*
|
||||
* Terminated by ^D
|
||||
*
|
||||
* @var boolean $multiLine
|
||||
*/
|
||||
protected $multiLine = false;
|
||||
|
||||
/**
|
||||
* Whether we should display the acceptable responses to the user
|
||||
*
|
||||
* @var boolean $show_acceptable
|
||||
*/
|
||||
protected $show_acceptable = false;
|
||||
|
||||
/**
|
||||
* A default answer in the case of no user response,
|
||||
* prevents re-prompting
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $default = '';
|
||||
|
||||
public function __construct($prompt, ReaderInterface $reader = null)
|
||||
{
|
||||
$this->prompt = $prompt;
|
||||
$this->reader = $reader ?: new Stdin();
|
||||
}
|
||||
|
||||
/**
|
||||
* Do it! Prompt the user for information!
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function prompt()
|
||||
{
|
||||
$this->writePrompt();
|
||||
|
||||
$response = $this->valueOrDefault($this->getUserInput());
|
||||
|
||||
if ($this->isValidResponse($response)) {
|
||||
return $response;
|
||||
}
|
||||
|
||||
return $this->prompt();
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the acceptable responses and whether or not to
|
||||
* display them to the user
|
||||
*
|
||||
* @param array|object $acceptable
|
||||
* @param boolean $show
|
||||
*
|
||||
* @return \League\CLImate\TerminalObject\Dynamic\Input
|
||||
*/
|
||||
public function accept($acceptable, $show = false)
|
||||
{
|
||||
$this->acceptable = $acceptable;
|
||||
$this->show_acceptable = $show;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Define whether we should be strict about exact responses
|
||||
*
|
||||
* @return \League\CLImate\TerminalObject\Dynamic\Input
|
||||
*/
|
||||
public function strict()
|
||||
{
|
||||
$this->strict = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a default response
|
||||
*
|
||||
* @param string $default
|
||||
*
|
||||
* @return \League\CLImate\TerminalObject\Dynamic\Input
|
||||
*/
|
||||
public function defaultTo($default)
|
||||
{
|
||||
$this->default = $default;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set multiline input to true
|
||||
*
|
||||
* @return \League\CLImate\TerminalObject\Dynamic\Input
|
||||
*/
|
||||
public function multiLine()
|
||||
{
|
||||
$this->multiLine = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
protected function getUserInput()
|
||||
{
|
||||
if ($this->multiLine) {
|
||||
return $this->reader->multiLine();
|
||||
}
|
||||
|
||||
return $this->reader->line();
|
||||
}
|
||||
|
||||
/**
|
||||
* Write out the formatted prompt
|
||||
*/
|
||||
protected function writePrompt()
|
||||
{
|
||||
$prompt = $this->parser->apply($this->promptFormatted());
|
||||
|
||||
$this->output->sameLine()->write($prompt);
|
||||
}
|
||||
|
||||
/**
|
||||
* If no response was given and there is a default, return it,
|
||||
* otherwise return response
|
||||
*
|
||||
* @param string $response
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function valueOrDefault($response)
|
||||
{
|
||||
if (strlen($response) == 0 && strlen($this->default)) {
|
||||
return $this->default;
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the acceptable responses as options
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function acceptableFormatted()
|
||||
{
|
||||
if (!is_array($this->acceptable)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$acceptable = array_map([$this, 'acceptableItemFormatted'], $this->acceptable);
|
||||
|
||||
return '[' . implode('/', $acceptable) . ']';
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the acceptable item depending on whether it is the default or not
|
||||
*
|
||||
* @param string $item
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function acceptableItemFormatted($item)
|
||||
{
|
||||
if ($item == $this->default) {
|
||||
return '<bold>' . $item . '</bold>';
|
||||
}
|
||||
|
||||
return $item;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the prompt incorporating spacing and any acceptable options
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function promptFormatted()
|
||||
{
|
||||
$prompt = $this->prompt . ' ';
|
||||
|
||||
if ($this->show_acceptable) {
|
||||
$prompt .= $this->acceptableFormatted() . ' ';
|
||||
}
|
||||
|
||||
return $prompt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply some string manipulation functions for normalization
|
||||
*
|
||||
* @param string|array $var
|
||||
* @return array
|
||||
*/
|
||||
protected function levelPlayingField($var)
|
||||
{
|
||||
$levelers = ['trim', 'mb_strtolower'];
|
||||
|
||||
foreach ($levelers as $leveler) {
|
||||
if (is_array($var)) {
|
||||
$var = array_map($leveler, $var);
|
||||
} else {
|
||||
$var = $leveler($var);
|
||||
}
|
||||
}
|
||||
|
||||
return $var;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether or not the acceptable property is of type closure
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
protected function acceptableIsClosure()
|
||||
{
|
||||
return (is_object($this->acceptable) && $this->acceptable instanceof \Closure);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the user's response is in the acceptable responses array
|
||||
*
|
||||
* @param string $response
|
||||
*
|
||||
* @return boolean $response
|
||||
*/
|
||||
protected function isAcceptableResponse($response)
|
||||
{
|
||||
if ($this->strict) {
|
||||
return in_array($response, $this->acceptable);
|
||||
}
|
||||
|
||||
$acceptable = $this->levelPlayingField($this->acceptable);
|
||||
$response = $this->levelPlayingField($response);
|
||||
|
||||
return in_array($response, $acceptable);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the user's response is valid based on the current settings
|
||||
*
|
||||
* @param string $response
|
||||
*
|
||||
* @return boolean $response
|
||||
*/
|
||||
protected function isValidResponse($response)
|
||||
{
|
||||
if (empty($this->acceptable)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($this->acceptableIsClosure()) {
|
||||
return call_user_func($this->acceptable, $response);
|
||||
}
|
||||
|
||||
return $this->isAcceptableResponse($response);
|
||||
}
|
||||
}
|
||||
37
vendor/league/climate/src/TerminalObject/Dynamic/InputAbstract.php
vendored
Normal file
37
vendor/league/climate/src/TerminalObject/Dynamic/InputAbstract.php
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic;
|
||||
|
||||
use League\CLImate\Util\Reader\ReaderInterface;
|
||||
use League\CLImate\Util\Reader\Stdin;
|
||||
|
||||
abstract class InputAbstract extends DynamicTerminalObject
|
||||
{
|
||||
/**
|
||||
* The prompt text
|
||||
*
|
||||
* @var string $prompt
|
||||
*/
|
||||
protected $prompt;
|
||||
|
||||
/**
|
||||
* An instance of ReaderInterface
|
||||
*
|
||||
* @var \League\CLImate\Util\Reader\ReaderInterface $reader
|
||||
*/
|
||||
protected $reader;
|
||||
|
||||
/**
|
||||
* Do it! Prompt the user for information!
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract public function prompt();
|
||||
|
||||
/**
|
||||
* Format the prompt incorporating spacing and any acceptable options
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract protected function promptFormatted();
|
||||
}
|
||||
141
vendor/league/climate/src/TerminalObject/Dynamic/Padding.php
vendored
Normal file
141
vendor/league/climate/src/TerminalObject/Dynamic/Padding.php
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic;
|
||||
|
||||
class Padding extends DynamicTerminalObject
|
||||
{
|
||||
/**
|
||||
* The length that lines should be padded to
|
||||
*
|
||||
* @var integer $length
|
||||
*/
|
||||
protected $length = 0;
|
||||
|
||||
/**
|
||||
* The character(s) that should be used to pad
|
||||
*
|
||||
* @var string $char
|
||||
*/
|
||||
protected $char = '.';
|
||||
|
||||
|
||||
/**
|
||||
* If they pass in a padding character, set the char
|
||||
*
|
||||
* @param int $length
|
||||
* @param string $char
|
||||
*/
|
||||
public function __construct($length = null, $char = null)
|
||||
{
|
||||
if ($length !== null) {
|
||||
$this->length($length);
|
||||
}
|
||||
|
||||
if (is_string($char)) {
|
||||
$this->char($char);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the character(s) that should be used to pad
|
||||
*
|
||||
* @param string $char
|
||||
*
|
||||
* @return \League\CLImate\TerminalObject\Dynamic\Padding
|
||||
*/
|
||||
public function char($char)
|
||||
{
|
||||
$this->char = $char;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the length of the line that should be generated
|
||||
*
|
||||
* @param integer $length
|
||||
*
|
||||
* @return \League\CLImate\TerminalObject\Dynamic\Padding
|
||||
*/
|
||||
public function length($length)
|
||||
{
|
||||
$this->length = $length;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the length of the line based on the width of the terminal window
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
protected function getLength()
|
||||
{
|
||||
if (!$this->length) {
|
||||
$this->length = $this->util->width();
|
||||
}
|
||||
|
||||
return $this->length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pad the content with the characters
|
||||
*
|
||||
* @param string $content
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function padContent($content)
|
||||
{
|
||||
if (strlen($this->char) > 0) {
|
||||
$length = $this->getLength();
|
||||
$padding_length = ceil($length / mb_strlen($this->char));
|
||||
|
||||
$padding = str_repeat($this->char, $padding_length);
|
||||
$content .= mb_substr($padding, 0, $length - mb_strlen($content));
|
||||
}
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
/**
|
||||
* Output the content and pad to the previously defined length
|
||||
*
|
||||
* @param string $content
|
||||
*
|
||||
* @return \League\CLImate\TerminalObject\Dynamic\Padding
|
||||
*/
|
||||
public function label($content)
|
||||
{
|
||||
// Handle long labels by splitting them across several lines
|
||||
$lines = [];
|
||||
$stop = mb_strlen($content);
|
||||
$width = $this->util->width();
|
||||
for ($i = 0; $i < $stop; $i += $width) {
|
||||
$lines[] = mb_substr($content, $i, $width);
|
||||
}
|
||||
$content = array_pop($lines);
|
||||
|
||||
foreach ($lines as $line) {
|
||||
$this->output->write($this->parser->apply($line));
|
||||
}
|
||||
|
||||
$content = $this->padContent($content);
|
||||
$content = $this->parser->apply($content);
|
||||
|
||||
$this->output->sameLine();
|
||||
$this->output->write($content);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Output result
|
||||
*
|
||||
* @param string $content
|
||||
*/
|
||||
public function result($content)
|
||||
{
|
||||
$this->output->write($this->parser->apply(' ' . $content));
|
||||
}
|
||||
}
|
||||
13
vendor/league/climate/src/TerminalObject/Dynamic/Password.php
vendored
Normal file
13
vendor/league/climate/src/TerminalObject/Dynamic/Password.php
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic;
|
||||
|
||||
class Password extends Input
|
||||
{
|
||||
public function prompt()
|
||||
{
|
||||
$this->writePrompt();
|
||||
|
||||
return $this->reader->hidden();
|
||||
}
|
||||
}
|
||||
315
vendor/league/climate/src/TerminalObject/Dynamic/Progress.php
vendored
Normal file
315
vendor/league/climate/src/TerminalObject/Dynamic/Progress.php
vendored
Normal file
@@ -0,0 +1,315 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic;
|
||||
|
||||
use League\CLImate\Exceptions\UnexpectedValueException;
|
||||
|
||||
class Progress extends DynamicTerminalObject
|
||||
{
|
||||
/**
|
||||
* The total number of items involved
|
||||
*
|
||||
* @var integer $total
|
||||
*/
|
||||
protected $total = 0;
|
||||
|
||||
/**
|
||||
* The current item that the progress bar represents
|
||||
*
|
||||
* @var integer $current
|
||||
*/
|
||||
protected $current = 0;
|
||||
|
||||
/**
|
||||
* The current percentage displayed
|
||||
*
|
||||
* @var string $current_percentage
|
||||
*/
|
||||
protected $current_percentage = '';
|
||||
|
||||
/**
|
||||
* The string length of the bar when at 100%
|
||||
*
|
||||
* @var integer $bar_str_len
|
||||
*/
|
||||
protected $bar_str_len;
|
||||
|
||||
/**
|
||||
* Flag indicating whether we are writing the bar for the first time
|
||||
*
|
||||
* @var boolean $first_line
|
||||
*/
|
||||
protected $first_line = true;
|
||||
|
||||
/**
|
||||
* Current status bar label
|
||||
*
|
||||
* @var string $label
|
||||
*/
|
||||
protected $label;
|
||||
|
||||
/**
|
||||
* Force a redraw every time
|
||||
*
|
||||
* @var boolean $force_redraw
|
||||
*/
|
||||
protected $force_redraw = false;
|
||||
|
||||
/**
|
||||
* If this progress bar ever displayed a label.
|
||||
*
|
||||
* @var boolean $has_label_line
|
||||
*/
|
||||
protected $has_label_line = false;
|
||||
|
||||
/**
|
||||
* If they pass in a total, set the total
|
||||
*
|
||||
* @param integer $total
|
||||
*/
|
||||
public function __construct($total = null)
|
||||
{
|
||||
if ($total !== null) {
|
||||
$this->total($total);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the total property
|
||||
*
|
||||
* @param integer $total
|
||||
*
|
||||
* @return Progress
|
||||
*/
|
||||
public function total($total)
|
||||
{
|
||||
$this->total = $total;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines the current percentage we are at and re-writes the progress bar
|
||||
*
|
||||
* @param integer $current
|
||||
* @param mixed $label
|
||||
*
|
||||
* @return void
|
||||
* @throws UnexpectedValueException
|
||||
*/
|
||||
public function current($current, $label = null)
|
||||
{
|
||||
if ($this->total == 0) {
|
||||
// Avoid dividing by 0
|
||||
throw new UnexpectedValueException('The progress total must be greater than zero.');
|
||||
}
|
||||
|
||||
if ($current > $this->total) {
|
||||
throw new UnexpectedValueException('The current is greater than the total.');
|
||||
}
|
||||
|
||||
$this->drawProgressBar($current, $label);
|
||||
|
||||
$this->current = $current;
|
||||
$this->label = $label;
|
||||
}
|
||||
|
||||
/**
|
||||
* Increments the current position we are at and re-writes the progress bar
|
||||
*
|
||||
* @param integer $increment The number of items to increment by
|
||||
* @param string $label
|
||||
*/
|
||||
public function advance($increment = 1, $label = null)
|
||||
{
|
||||
$this->current($this->current + $increment, $label);
|
||||
}
|
||||
|
||||
/**
|
||||
* Force the progress bar to redraw every time regardless of whether it has changed or not
|
||||
*
|
||||
* @param boolean $force
|
||||
* @return Progress
|
||||
*/
|
||||
public function forceRedraw($force = true)
|
||||
{
|
||||
$this->force_redraw = !!$force;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update a progress bar using an iterable.
|
||||
*
|
||||
* @param iterable $items Array or any other iterable object
|
||||
* @param callable $callback A handler to run on each item
|
||||
*/
|
||||
public function each($items, callable $callback = null)
|
||||
{
|
||||
if ($items instanceof \Traversable) {
|
||||
$items = iterator_to_array($items);
|
||||
}
|
||||
|
||||
$total = count($items);
|
||||
if (!$total) {
|
||||
return;
|
||||
}
|
||||
$this->total($total);
|
||||
|
||||
foreach ($items as $key => $item) {
|
||||
if ($callback) {
|
||||
$label = $callback($item, $key);
|
||||
} else {
|
||||
$label = null;
|
||||
}
|
||||
|
||||
$this->advance(1, $label);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Draw the progress bar, if necessary
|
||||
*
|
||||
* @param string $current
|
||||
* @param string $label
|
||||
*/
|
||||
protected function drawProgressBar($current, $label)
|
||||
{
|
||||
$percentage = $this->percentageFormatted($current / $this->total);
|
||||
|
||||
if ($this->shouldRedraw($percentage, $label)) {
|
||||
$progress_bar = $this->getProgressBar($current, $label);
|
||||
$this->output->write($this->parser->apply($progress_bar));
|
||||
}
|
||||
|
||||
$this->current_percentage = $percentage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the progress bar str and return it
|
||||
*
|
||||
* @param integer $current
|
||||
* @param string $label
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getProgressBar($current, $label)
|
||||
{
|
||||
if ($this->first_line) {
|
||||
// Drop down a line, we are about to
|
||||
// re-write this line for the progress bar
|
||||
$this->output->write('');
|
||||
$this->first_line = false;
|
||||
}
|
||||
|
||||
// Move the cursor up and clear it to the end
|
||||
$line_count = $this->has_label_line ? 2 : 1;
|
||||
|
||||
$progress_bar = $this->util->cursor->up($line_count);
|
||||
$progress_bar .= $this->util->cursor->startOfCurrentLine();
|
||||
$progress_bar .= $this->util->cursor->deleteCurrentLine();
|
||||
$progress_bar .= $this->getProgressBarStr($current, $label);
|
||||
|
||||
// If this line has a label then set that this progress bar has a label line
|
||||
if (strlen($label) > 0) {
|
||||
$this->has_label_line = true;
|
||||
}
|
||||
|
||||
return $progress_bar;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the progress bar string, basically:
|
||||
* =============> 50% label
|
||||
*
|
||||
* @param integer $current
|
||||
* @param string $label
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getProgressBarStr($current, $label)
|
||||
{
|
||||
$percentage = $current / $this->total;
|
||||
$bar_length = round($this->getBarStrLen() * $percentage);
|
||||
|
||||
$bar = $this->getBar($bar_length);
|
||||
$number = $this->percentageFormatted($percentage);
|
||||
|
||||
if ($label) {
|
||||
$label = $this->labelFormatted($label);
|
||||
// If this line doesn't have a label, but we've had one before,
|
||||
// then ensure the label line is cleared
|
||||
} elseif ($this->has_label_line) {
|
||||
$label = $this->labelFormatted('');
|
||||
}
|
||||
|
||||
return trim("{$bar} {$number}{$label}");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the string for the actual bar based on the current length
|
||||
*
|
||||
* @param integer $length
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getBar($length)
|
||||
{
|
||||
$bar = str_repeat('=', $length);
|
||||
$padding = str_repeat(' ', $this->getBarStrLen() - $length);
|
||||
|
||||
return "{$bar}>{$padding}";
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the length of the bar string based on the width of the terminal window
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
protected function getBarStrLen()
|
||||
{
|
||||
if (!$this->bar_str_len) {
|
||||
// Subtract 10 because of the '> 100%' plus some padding, max 100
|
||||
$this->bar_str_len = min($this->util->width() - 10, 100);
|
||||
}
|
||||
|
||||
return $this->bar_str_len;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the percentage so it looks pretty
|
||||
*
|
||||
* @param integer $percentage
|
||||
* @return float
|
||||
*/
|
||||
protected function percentageFormatted($percentage)
|
||||
{
|
||||
return round($percentage * 100) . '%';
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the label so it is positioned correctly
|
||||
*
|
||||
* @param string $label
|
||||
* @return string
|
||||
*/
|
||||
protected function labelFormatted($label)
|
||||
{
|
||||
return "\n" . $this->util->cursor->startOfCurrentLine() . $this->util->cursor->deleteCurrentLine() . $label;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the progress bar has changed and we need to redrew
|
||||
*
|
||||
* @param string $percentage
|
||||
* @param string $label
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
protected function shouldRedraw($percentage, $label)
|
||||
{
|
||||
return ($this->force_redraw || $percentage != $this->current_percentage || $label != $this->label);
|
||||
}
|
||||
}
|
||||
51
vendor/league/climate/src/TerminalObject/Dynamic/Radio.php
vendored
Normal file
51
vendor/league/climate/src/TerminalObject/Dynamic/Radio.php
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic;
|
||||
|
||||
class Radio extends Checkboxes
|
||||
{
|
||||
/**
|
||||
* Build out the checkboxes
|
||||
*
|
||||
* @param array $options
|
||||
*
|
||||
* @return Checkbox\RadioGroup
|
||||
*/
|
||||
protected function buildCheckboxes(array $options)
|
||||
{
|
||||
return new Checkbox\RadioGroup($options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Take the appropriate action based on the input character,
|
||||
* returns whether to stop listening or not
|
||||
*
|
||||
* @param string $char
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function handleCharacter($char)
|
||||
{
|
||||
# Ignore space, as we can't select multiple options
|
||||
if ($char === " ") {
|
||||
return false;
|
||||
}
|
||||
|
||||
# Use enter to select the current option
|
||||
if ($char === "\n") {
|
||||
$this->checkboxes->toggleCurrent();
|
||||
}
|
||||
|
||||
return parent::handleCharacter($char);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format the prompt string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function promptFormatted()
|
||||
{
|
||||
return $this->prompt . ' (press <Enter> to select)';
|
||||
}
|
||||
}
|
||||
159
vendor/league/climate/src/TerminalObject/Dynamic/Spinner.php
vendored
Normal file
159
vendor/league/climate/src/TerminalObject/Dynamic/Spinner.php
vendored
Normal file
@@ -0,0 +1,159 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Dynamic;
|
||||
|
||||
use League\CLImate\Exceptions\UnexpectedValueException;
|
||||
use function array_merge;
|
||||
use function count;
|
||||
use function microtime;
|
||||
use function range;
|
||||
use function str_repeat;
|
||||
use function substr;
|
||||
use function trim;
|
||||
|
||||
final class Spinner extends DynamicTerminalObject
|
||||
{
|
||||
/**
|
||||
* @var string[] The characters to be used to present progress.
|
||||
*/
|
||||
private $characters = ["[=---]", "[-=--]", "[--=-]", "[---=]", "[--=-]", "[-=--]"];
|
||||
|
||||
/**
|
||||
* @var int The current item of the sequence
|
||||
*/
|
||||
private $current = 0;
|
||||
|
||||
/**
|
||||
* @var bool Flag indicating whether we are writing the bar for the first time.
|
||||
*/
|
||||
private $firstLine = true;
|
||||
|
||||
/**
|
||||
* @var string Current label.
|
||||
*/
|
||||
private $label;
|
||||
|
||||
/**
|
||||
* @var float When the spinner was last drawn.
|
||||
*/
|
||||
private $lastDrawn;
|
||||
|
||||
/**
|
||||
* @var float How long to wait in seconds between drawing each stage.
|
||||
*/
|
||||
private $timeLimit = 0.1;
|
||||
|
||||
|
||||
/**
|
||||
* If they pass in a sequence, set the sequence
|
||||
*
|
||||
* @param string $label
|
||||
* @param string ...$characters
|
||||
*/
|
||||
public function __construct($label = null, ...$characters)
|
||||
{
|
||||
if ($label !== null) {
|
||||
$this->label = $label;
|
||||
}
|
||||
|
||||
if (count($characters) < 1) {
|
||||
$characters = [];
|
||||
$size = 5;
|
||||
$positions = array_merge(range(0, $size - 1), range($size - 2, 1, -1));
|
||||
foreach ($positions as $pos) {
|
||||
$line = str_repeat("-", $size);
|
||||
$characters[] = "[" . substr($line, 0, $pos) . "=" . substr($line, $pos + 1) . "]";
|
||||
}
|
||||
}
|
||||
$this->characters(...$characters);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the length of time to wait between drawing each stage.
|
||||
*
|
||||
* @param float $timeLimit
|
||||
*
|
||||
* @return Spinner
|
||||
*/
|
||||
public function timeLimit($timeLimit)
|
||||
{
|
||||
$this->timeLimit = (float) $timeLimit;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the character to loop around.
|
||||
*
|
||||
* @param string $characters
|
||||
*
|
||||
* @return Spinner
|
||||
*/
|
||||
public function characters(...$characters)
|
||||
{
|
||||
if (count($characters) < 1) {
|
||||
throw new UnexpectedValueException("You must specify the characters to use");
|
||||
}
|
||||
|
||||
$this->characters = $characters;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Re-writes the spinner
|
||||
*
|
||||
* @param string $label
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function advance($label = null)
|
||||
{
|
||||
if ($label === null) {
|
||||
$label = $this->label;
|
||||
}
|
||||
|
||||
if ($this->lastDrawn) {
|
||||
$time = microtime(true) - $this->lastDrawn;
|
||||
if ($time < $this->timeLimit) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
++$this->current;
|
||||
if ($this->current >= count($this->characters)) {
|
||||
$this->current = 0;
|
||||
}
|
||||
|
||||
$characters = $this->characters[$this->current];
|
||||
$this->drawSpinner($characters, $label);
|
||||
$this->lastDrawn = microtime(true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Draw the spinner
|
||||
*
|
||||
* @param string $characters
|
||||
* @param string $label
|
||||
*/
|
||||
private function drawSpinner($characters, $label)
|
||||
{
|
||||
$spinner = "";
|
||||
|
||||
if ($this->firstLine) {
|
||||
$this->firstLine = false;
|
||||
} else {
|
||||
$spinner .= $this->util->cursor->up(1);
|
||||
$spinner .= $this->util->cursor->startOfCurrentLine();
|
||||
$spinner .= $this->util->cursor->deleteCurrentLine();
|
||||
}
|
||||
|
||||
$spinner .= trim("{$characters} {$label}");
|
||||
|
||||
$this->output->write($this->parser->apply($spinner));
|
||||
}
|
||||
}
|
||||
160
vendor/league/climate/src/TerminalObject/Helper/Art.php
vendored
Normal file
160
vendor/league/climate/src/TerminalObject/Helper/Art.php
vendored
Normal file
@@ -0,0 +1,160 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Helper;
|
||||
|
||||
use League\CLImate\Exceptions\UnexpectedValueException;
|
||||
|
||||
use function preg_quote;
|
||||
|
||||
trait Art
|
||||
{
|
||||
/**
|
||||
* The directories we should be looking for art in
|
||||
*
|
||||
* @var array $art_dirs
|
||||
*/
|
||||
protected $art_dirs = [];
|
||||
|
||||
/**
|
||||
* The default art if we can't find what the user requested
|
||||
*
|
||||
* @var string $default_art
|
||||
*/
|
||||
protected $default_art = '404';
|
||||
|
||||
/**
|
||||
* The art requested by the user
|
||||
*
|
||||
* @var string $art
|
||||
*/
|
||||
protected $art = '';
|
||||
|
||||
/**
|
||||
* Specify which settings Draw needs to import
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function settings()
|
||||
{
|
||||
return ['Art'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Import the Art setting (any directories the user added)
|
||||
*
|
||||
* @param \League\CLImate\Settings\Art $setting
|
||||
*/
|
||||
public function importSettingArt($setting)
|
||||
{
|
||||
foreach ($setting->dirs as $dir) {
|
||||
$this->addDir($dir);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a directory to search for art in
|
||||
*
|
||||
* @param string $dir
|
||||
*/
|
||||
protected function addDir($dir)
|
||||
{
|
||||
// Add any additional directories to the top of the array
|
||||
// so that the user can override art
|
||||
array_unshift($this->art_dirs, rtrim($dir, \DIRECTORY_SEPARATOR));
|
||||
|
||||
// Keep the array clean
|
||||
$this->art_dirs = array_unique($this->art_dirs);
|
||||
$this->art_dirs = array_filter($this->art_dirs);
|
||||
$this->art_dirs = array_values($this->art_dirs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a valid art path
|
||||
*
|
||||
* @param string $art
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function artDir($art)
|
||||
{
|
||||
return $this->fileSearch($art, preg_quote(\DIRECTORY_SEPARATOR) . '*.*');
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a valid art path
|
||||
*
|
||||
* @param string $art
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function artFile($art)
|
||||
{
|
||||
$files = $this->fileSearch($art, '(\.[^' . preg_quote(\DIRECTORY_SEPARATOR) . ']*)?$');
|
||||
|
||||
if (count($files) === 0) {
|
||||
$this->addDir(__DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'ASCII');
|
||||
$files = $this->fileSearch($this->default_art, '.*');
|
||||
}
|
||||
|
||||
if (count($files) === 0) {
|
||||
throw new UnexpectedValueException("Unable to find an art file with the name '{$art}'");
|
||||
}
|
||||
|
||||
return reset($files);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find a set of files in the current art directories
|
||||
* based on a pattern
|
||||
*
|
||||
* @param string $art
|
||||
* @param string $pattern
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function fileSearch($art, $pattern)
|
||||
{
|
||||
foreach ($this->art_dirs as $dir) {
|
||||
$directory_iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir));
|
||||
|
||||
$paths = [];
|
||||
$regex = '~' . preg_quote($art) . $pattern . '~';
|
||||
|
||||
foreach ($directory_iterator as $file) {
|
||||
if ($file->isDir()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Look for anything that has the $art filename
|
||||
if (preg_match($regex, $file)) {
|
||||
$paths[] = $file->getPathname();
|
||||
}
|
||||
}
|
||||
|
||||
asort($paths);
|
||||
|
||||
// If we've got one, no need to look any further
|
||||
if (!empty($paths)) {
|
||||
return $paths;
|
||||
}
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the contents of the file and return each line
|
||||
*
|
||||
* @param string $path
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function parse($path)
|
||||
{
|
||||
$output = file_get_contents($path);
|
||||
$output = explode("\n", $output);
|
||||
$output = array_map('rtrim', $output);
|
||||
|
||||
return $output;
|
||||
}
|
||||
}
|
||||
37
vendor/league/climate/src/TerminalObject/Helper/Sleeper.php
vendored
Normal file
37
vendor/league/climate/src/TerminalObject/Helper/Sleeper.php
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Helper;
|
||||
|
||||
class Sleeper implements SleeperInterface
|
||||
{
|
||||
/**
|
||||
* The default length of the sleep
|
||||
*
|
||||
* @var int|float $speed
|
||||
*/
|
||||
protected $speed = 50000;
|
||||
|
||||
/**
|
||||
* Set the speed based on a percentage (50% slower, 200% faster, etc)
|
||||
*
|
||||
* @param int|float $percentage
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
public function speed($percentage)
|
||||
{
|
||||
if (is_numeric($percentage) && $percentage > 0) {
|
||||
$this->speed *= (100 / $percentage);
|
||||
}
|
||||
|
||||
return $this->speed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sleep for the specified amount of time
|
||||
*/
|
||||
public function sleep()
|
||||
{
|
||||
usleep($this->speed);
|
||||
}
|
||||
}
|
||||
13
vendor/league/climate/src/TerminalObject/Helper/SleeperInterface.php
vendored
Normal file
13
vendor/league/climate/src/TerminalObject/Helper/SleeperInterface.php
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Helper;
|
||||
|
||||
interface SleeperInterface
|
||||
{
|
||||
/**
|
||||
* @param int|float $percentage
|
||||
*/
|
||||
public function speed($percentage);
|
||||
|
||||
public function sleep();
|
||||
}
|
||||
112
vendor/league/climate/src/TerminalObject/Helper/StringLength.php
vendored
Normal file
112
vendor/league/climate/src/TerminalObject/Helper/StringLength.php
vendored
Normal file
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Helper;
|
||||
|
||||
trait StringLength
|
||||
{
|
||||
/**
|
||||
* Tags the should not be ultimately considered
|
||||
* when calculating any string lengths
|
||||
*
|
||||
* @var array $ignore_tags
|
||||
*/
|
||||
protected $ignore_tags = [];
|
||||
|
||||
/**
|
||||
* Set the ignore tags property
|
||||
*/
|
||||
protected function setIgnoreTags()
|
||||
{
|
||||
if (!count($this->ignore_tags)) {
|
||||
$this->ignore_tags = array_keys($this->parser->tags->all());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the length of the string without any tags
|
||||
*
|
||||
* @param string $str
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
protected function lengthWithoutTags($str)
|
||||
{
|
||||
$this->setIgnoreTags();
|
||||
|
||||
return mb_strwidth($this->withoutTags($str), 'UTF-8');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the string without the tags that are to be ignored
|
||||
*
|
||||
* @param string $str
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function withoutTags($str)
|
||||
{
|
||||
$this->setIgnoreTags();
|
||||
|
||||
return str_replace($this->ignore_tags, '', $str);
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply padding to a string
|
||||
*
|
||||
* @param string $str
|
||||
* @param string $final_length
|
||||
* @param string $padding_side
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function pad($str, $final_length, $padding_side = 'right')
|
||||
{
|
||||
$padding = $final_length - $this->lengthWithoutTags($str);
|
||||
|
||||
if ($padding_side == 'left') {
|
||||
return str_repeat(' ', $padding) . $str;
|
||||
}
|
||||
|
||||
return $str . str_repeat(' ', $padding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply padding to an array of strings
|
||||
*
|
||||
* @param array $arr
|
||||
* @param integer $final_length
|
||||
* @param string $padding_side
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function padArray($arr, $final_length, $padding_side = 'right')
|
||||
{
|
||||
foreach ($arr as $key => $value) {
|
||||
$arr[$key] = $this->pad($value, $final_length, $padding_side);
|
||||
}
|
||||
|
||||
return $arr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find the max string length in an array
|
||||
*
|
||||
* @param array $arr
|
||||
* @return int
|
||||
*/
|
||||
protected function maxStrLen(array $arr)
|
||||
{
|
||||
return max($this->arrayOfStrLens($arr));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an array of the string lengths from an array of strings
|
||||
*
|
||||
* @param array $arr
|
||||
* @return array
|
||||
*/
|
||||
protected function arrayOfStrLens(array $arr)
|
||||
{
|
||||
return array_map([$this, 'lengthWithoutTags'], $arr);
|
||||
}
|
||||
}
|
||||
89
vendor/league/climate/src/TerminalObject/Router/BaseRouter.php
vendored
Normal file
89
vendor/league/climate/src/TerminalObject/Router/BaseRouter.php
vendored
Normal file
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Router;
|
||||
|
||||
abstract class BaseRouter implements RouterInterface
|
||||
{
|
||||
protected $extensions = [];
|
||||
|
||||
/**
|
||||
* Add a custom extension to CLImate
|
||||
*
|
||||
* @param string $key
|
||||
* @param string $class
|
||||
*/
|
||||
public function addExtension($key, $class)
|
||||
{
|
||||
$this->extensions[$key] = $class;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the full path for the class based on the key
|
||||
*
|
||||
* @param string $class
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function path($class)
|
||||
{
|
||||
return $this->getExtension($class) ?: $this->getPath($this->shortName($class));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines if the requested class is a
|
||||
* valid terminal object class
|
||||
*
|
||||
* @param string $class
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function exists($class)
|
||||
{
|
||||
$class = $this->path($class);
|
||||
|
||||
return (is_object($class) || class_exists($class));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the full path for the terminal object class
|
||||
*
|
||||
* @param string $class
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getPath($class)
|
||||
{
|
||||
return 'League\CLImate\TerminalObject\\' . $this->pathPrefix() . '\\' . $class;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an extension by its key
|
||||
*
|
||||
* @param string $key
|
||||
*
|
||||
* @return string|false Full class path to extension
|
||||
*/
|
||||
protected function getExtension($key)
|
||||
{
|
||||
if (array_key_exists($key, $this->extensions)) {
|
||||
return $this->extensions[$key];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the class short name
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function shortName($name)
|
||||
{
|
||||
$name = str_replace('_', ' ', $name);
|
||||
$name = ucwords($name);
|
||||
|
||||
return str_replace(' ', '', $name);
|
||||
}
|
||||
}
|
||||
42
vendor/league/climate/src/TerminalObject/Router/BasicRouter.php
vendored
Normal file
42
vendor/league/climate/src/TerminalObject/Router/BasicRouter.php
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Router;
|
||||
|
||||
use League\CLImate\Util\Helper;
|
||||
use League\CLImate\Util\OutputImporter;
|
||||
|
||||
class BasicRouter extends BaseRouter
|
||||
{
|
||||
use OutputImporter;
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function pathPrefix()
|
||||
{
|
||||
return 'Basic';
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a basic terminal object
|
||||
*
|
||||
* @param \League\CLImate\TerminalObject\Basic\BasicTerminalObject $obj
|
||||
* @return void
|
||||
*/
|
||||
public function execute($obj)
|
||||
{
|
||||
$results = Helper::toArray($obj->result());
|
||||
|
||||
$this->output->persist();
|
||||
|
||||
foreach ($results as $result) {
|
||||
if ($obj->sameLine()) {
|
||||
$this->output->sameLine();
|
||||
}
|
||||
|
||||
$this->output->write($obj->getParser()->apply($result));
|
||||
}
|
||||
|
||||
$this->output->persist(false);
|
||||
}
|
||||
}
|
||||
32
vendor/league/climate/src/TerminalObject/Router/DynamicRouter.php
vendored
Normal file
32
vendor/league/climate/src/TerminalObject/Router/DynamicRouter.php
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Router;
|
||||
|
||||
use League\CLImate\Util\OutputImporter;
|
||||
|
||||
class DynamicRouter extends BaseRouter
|
||||
{
|
||||
use OutputImporter;
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function pathPrefix()
|
||||
{
|
||||
return 'Dynamic';
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a dynamic terminal object using given arguments
|
||||
*
|
||||
* @param \League\CLImate\TerminalObject\Dynamic\DynamicTerminalObject $obj
|
||||
*
|
||||
* @return \League\CLImate\TerminalObject\Dynamic\DynamicTerminalObject
|
||||
*/
|
||||
public function execute($obj)
|
||||
{
|
||||
$obj->output($this->output);
|
||||
|
||||
return $obj;
|
||||
}
|
||||
}
|
||||
147
vendor/league/climate/src/TerminalObject/Router/ExtensionCollection.php
vendored
Normal file
147
vendor/league/climate/src/TerminalObject/Router/ExtensionCollection.php
vendored
Normal file
@@ -0,0 +1,147 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Router;
|
||||
|
||||
use League\CLImate\Exceptions\InvalidArgumentException;
|
||||
use League\CLImate\Exceptions\UnexpectedValueException;
|
||||
use League\CLImate\Util\Helper;
|
||||
|
||||
class ExtensionCollection
|
||||
{
|
||||
/**
|
||||
* @var array collection
|
||||
*/
|
||||
protected $collection = ['basic' => [], 'dynamic' => []];
|
||||
|
||||
/**
|
||||
* @var string $basic_interface
|
||||
*/
|
||||
protected $basic_interface = 'League\CLImate\TerminalObject\Basic\BasicTerminalObjectInterface';
|
||||
|
||||
/**
|
||||
* @var string $dynamic_interface
|
||||
*/
|
||||
protected $dynamic_interface = 'League\CLImate\TerminalObject\Dynamic\DynamicTerminalObjectInterface';
|
||||
|
||||
public function __construct($key, $class)
|
||||
{
|
||||
$this->createCollection($key, $class);
|
||||
}
|
||||
|
||||
public function collection()
|
||||
{
|
||||
return $this->collection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create the collection from the key/class
|
||||
*
|
||||
* @param string $original_key
|
||||
* @param string|object|array $original_class
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function createCollection($original_key, $original_class)
|
||||
{
|
||||
$collection = $this->convertToArray($original_key, $original_class);
|
||||
|
||||
foreach ($collection as $key => $class) {
|
||||
$this->validateExtension($class);
|
||||
$this->collection[$this->getType($class)][$this->getKey($key, $class)] = $class;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the given class and key to an array of classes
|
||||
*
|
||||
* @param string|object|array $class
|
||||
* @param string $key Optional custom key instead of class name
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function convertToArray($key, $class)
|
||||
{
|
||||
if (is_array($class)) {
|
||||
return $class;
|
||||
}
|
||||
|
||||
return [$this->getKey($key, $class) => $class];
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that the extension is valid
|
||||
*
|
||||
* @param string|object|array $class
|
||||
*/
|
||||
protected function validateExtension($class)
|
||||
{
|
||||
$this->validateClassExists($class);
|
||||
$this->validateClassImplementation($class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|object $class
|
||||
*
|
||||
* @throws UnexpectedValueException if extension class does not exist
|
||||
*/
|
||||
protected function validateClassExists($class)
|
||||
{
|
||||
if (is_string($class) && !class_exists($class)) {
|
||||
throw new UnexpectedValueException('Class does not exist: ' . $class);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string|object $class
|
||||
*
|
||||
* @throws InvalidArgumentException if extension class does not implement either Dynamic or Basic interface
|
||||
*/
|
||||
protected function validateClassImplementation($class)
|
||||
{
|
||||
$str_class = is_string($class);
|
||||
|
||||
$valid_implementation = (is_a($class, $this->basic_interface, $str_class)
|
||||
|| is_a($class, $this->dynamic_interface, $str_class));
|
||||
|
||||
if (!$valid_implementation) {
|
||||
throw new InvalidArgumentException('Class must implement either '
|
||||
. $this->basic_interface . ' or ' . $this->dynamic_interface);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the extension key based on the class
|
||||
*
|
||||
* @param string|null $key
|
||||
* @param string|object $class
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getKey($key, $class)
|
||||
{
|
||||
if ($key === null || !is_string($key)) {
|
||||
$class_path = (is_string($class)) ? $class : get_class($class);
|
||||
|
||||
$key = explode('\\', $class_path);
|
||||
$key = end($key);
|
||||
}
|
||||
|
||||
return Helper::snakeCase($key);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the type of class the extension implements
|
||||
*
|
||||
* @param string|object $class
|
||||
*
|
||||
* @return string 'basic' or 'dynamic'
|
||||
*/
|
||||
protected function getType($class)
|
||||
{
|
||||
if (is_a($class, $this->basic_interface, is_string($class))) {
|
||||
return 'basic';
|
||||
}
|
||||
|
||||
return 'dynamic';
|
||||
}
|
||||
}
|
||||
157
vendor/league/climate/src/TerminalObject/Router/Router.php
vendored
Normal file
157
vendor/league/climate/src/TerminalObject/Router/Router.php
vendored
Normal file
@@ -0,0 +1,157 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Router;
|
||||
|
||||
use League\CLImate\Decorator\Parser\ParserImporter;
|
||||
use League\CLImate\Settings\Manager;
|
||||
use League\CLImate\Settings\SettingsImporter;
|
||||
use League\CLImate\Util\OutputImporter;
|
||||
use League\CLImate\Util\UtilImporter;
|
||||
|
||||
class Router
|
||||
{
|
||||
use ParserImporter, SettingsImporter, OutputImporter, UtilImporter;
|
||||
|
||||
/**
|
||||
* An instance of the Settings Manager class
|
||||
*
|
||||
* @var \League\CLImate\Settings\Manager $settings;
|
||||
*/
|
||||
protected $settings;
|
||||
|
||||
/**
|
||||
* An instance of the Dynamic Router class
|
||||
*
|
||||
* @var \League\CLImate\TerminalObject\Router\DynamicRouter $dynamic;
|
||||
*/
|
||||
protected $dynamic;
|
||||
|
||||
/**
|
||||
* An instance of the Basic Router class
|
||||
*
|
||||
* @var \League\CLImate\TerminalObject\Router\BasicRouter $basic;
|
||||
*/
|
||||
protected $basic;
|
||||
|
||||
public function __construct(DynamicRouter $dynamic = null, BasicRouter $basic = null)
|
||||
{
|
||||
$this->dynamic = $dynamic ?: new DynamicRouter();
|
||||
$this->basic = $basic ?: new BasicRouter();
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a custom class with the router
|
||||
*
|
||||
* @param string $key
|
||||
* @param string $class
|
||||
*/
|
||||
public function addExtension($key, $class)
|
||||
{
|
||||
$extension = new ExtensionCollection($key, $class);
|
||||
|
||||
foreach ($extension->collection() as $obj_type => $collection) {
|
||||
foreach ($collection as $obj_key => $obj_class) {
|
||||
$this->{$obj_type}->addExtension($obj_key, $obj_class);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the name matches an existing terminal object
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function exists($name)
|
||||
{
|
||||
return ($this->basic->exists($name) || $this->dynamic->exists($name));
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a terminal object using given arguments
|
||||
*
|
||||
* @param string $name
|
||||
* @param mixed $arguments
|
||||
*
|
||||
* @return null|\League\CLImate\TerminalObject\Basic\BasicTerminalObjectInterface
|
||||
*/
|
||||
public function execute($name, $arguments)
|
||||
{
|
||||
$router = $this->getRouter($name);
|
||||
|
||||
$router->output($this->output);
|
||||
|
||||
$obj = $this->getObject($router, $name, $arguments);
|
||||
|
||||
$obj->parser($this->parser);
|
||||
$obj->util($this->util);
|
||||
|
||||
// If the object needs any settings, import them
|
||||
foreach ($obj->settings() as $obj_setting) {
|
||||
$setting = $this->settings->get($obj_setting);
|
||||
|
||||
if ($setting) {
|
||||
$obj->importSetting($setting);
|
||||
}
|
||||
}
|
||||
|
||||
return $router->execute($obj);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the object whether it's a string or already instantiated
|
||||
*
|
||||
* @param \League\CLImate\TerminalObject\Router\RouterInterface $router
|
||||
* @param string $name
|
||||
* @param array $arguments
|
||||
*
|
||||
* @return \League\CLImate\TerminalObject\Dynamic\DynamicTerminalObjectInterface|\League\CLImate\TerminalObject\Basic\BasicTerminalObjectInterface
|
||||
*/
|
||||
protected function getObject($router, $name, $arguments)
|
||||
{
|
||||
$obj = $router->path($name);
|
||||
|
||||
if (is_string($obj)) {
|
||||
$obj = (new \ReflectionClass($obj))->newInstanceArgs($arguments);
|
||||
}
|
||||
|
||||
if (method_exists($obj, 'arguments')) {
|
||||
call_user_func_array([$obj, 'arguments'], $arguments);
|
||||
}
|
||||
|
||||
return $obj;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine which type of router we are using and return it
|
||||
*
|
||||
* @param string $name
|
||||
*
|
||||
* @return \League\CLImate\TerminalObject\Router\RouterInterface|null
|
||||
*/
|
||||
protected function getRouter($name)
|
||||
{
|
||||
if ($this->basic->exists($name)) {
|
||||
return $this->basic;
|
||||
}
|
||||
|
||||
if ($this->dynamic->exists($name)) {
|
||||
return $this->dynamic;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the settings property
|
||||
*
|
||||
* @param \League\CLImate\Settings\Manager $settings
|
||||
*
|
||||
* @return Router
|
||||
*/
|
||||
public function settings(Manager $settings)
|
||||
{
|
||||
$this->settings = $settings;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
29
vendor/league/climate/src/TerminalObject/Router/RouterInterface.php
vendored
Normal file
29
vendor/league/climate/src/TerminalObject/Router/RouterInterface.php
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\TerminalObject\Router;
|
||||
|
||||
interface RouterInterface
|
||||
{
|
||||
/**
|
||||
* @param $class
|
||||
* @return string
|
||||
*/
|
||||
public function path($class);
|
||||
|
||||
/**
|
||||
* @param $class
|
||||
* @return boolean
|
||||
*/
|
||||
public function exists($class);
|
||||
|
||||
/**
|
||||
* @param $obj
|
||||
* @return null|\League\CLImate\TerminalObject\Dynamic\DynamicTerminalObject
|
||||
*/
|
||||
public function execute($obj);
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function pathPrefix();
|
||||
}
|
||||
94
vendor/league/climate/src/Util/Cursor.php
vendored
Normal file
94
vendor/league/climate/src/Util/Cursor.php
vendored
Normal file
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util;
|
||||
|
||||
class Cursor
|
||||
{
|
||||
/**
|
||||
* Move the cursor up in the terminal x number of lines.
|
||||
*
|
||||
* @param int $lines
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function up($lines = 1)
|
||||
{
|
||||
return "\e[{$lines}A";
|
||||
}
|
||||
|
||||
/**
|
||||
* Move the cursor down in the terminal x number of lines.
|
||||
*
|
||||
* @param int $lines
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function down($lines = 1)
|
||||
{
|
||||
return "\e[{$lines}B";
|
||||
}
|
||||
|
||||
/**
|
||||
* Move the cursor right in the terminal x number of columns.
|
||||
*
|
||||
* @param int $cols
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function right($columns = 1)
|
||||
{
|
||||
return "\e[{$columns}C";
|
||||
}
|
||||
|
||||
/**
|
||||
* Move the cursor left in the terminal x number of columns.
|
||||
*
|
||||
* @param int $cols
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function left($cols = 1)
|
||||
{
|
||||
return "\e[{$cols}D";
|
||||
}
|
||||
|
||||
/**
|
||||
* Move cursor to the beginning of the current line.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function startOfCurrentLine()
|
||||
{
|
||||
return "\r";
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the current line to the end.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function deleteCurrentLine()
|
||||
{
|
||||
return "\e[K";
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the style for hiding the cursor
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function hide()
|
||||
{
|
||||
return "\e[?25l";
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the style for returning the cursor to its default
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function defaultStyle()
|
||||
{
|
||||
return "\e[?25h";
|
||||
}
|
||||
}
|
||||
50
vendor/league/climate/src/Util/Helper.php
vendored
Normal file
50
vendor/league/climate/src/Util/Helper.php
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util;
|
||||
|
||||
class Helper
|
||||
{
|
||||
/**
|
||||
* @param string|array $var
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function toArray($var)
|
||||
{
|
||||
if (!is_array($var)) {
|
||||
return [$var];
|
||||
}
|
||||
|
||||
return $var;
|
||||
}
|
||||
|
||||
/**
|
||||
* Flatten a multi-dimensional array
|
||||
*
|
||||
* @param array $arr
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function flatten(array $arr)
|
||||
{
|
||||
$flattened = [];
|
||||
|
||||
array_walk_recursive($arr, function ($a) use (&$flattened) {
|
||||
$flattened[] = $a;
|
||||
});
|
||||
|
||||
return $flattened;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a string to snake case
|
||||
*
|
||||
* @param string $str
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public static function snakeCase($str)
|
||||
{
|
||||
return strtolower(preg_replace('/(.)([A-Z])/', '$1_$2', $str));
|
||||
}
|
||||
}
|
||||
315
vendor/league/climate/src/Util/Output.php
vendored
Normal file
315
vendor/league/climate/src/Util/Output.php
vendored
Normal file
@@ -0,0 +1,315 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util;
|
||||
|
||||
use League\CLImate\Exceptions\InvalidArgumentException;
|
||||
use League\CLImate\Exceptions\UnexpectedValueException;
|
||||
use League\CLImate\Util\Writer\WriterInterface;
|
||||
|
||||
class Output
|
||||
{
|
||||
/**
|
||||
* The content to be output
|
||||
*
|
||||
* @var string $content
|
||||
*/
|
||||
protected $content;
|
||||
|
||||
/**
|
||||
* Whether or not to add a new line after the output
|
||||
*
|
||||
* @var boolean $new_line
|
||||
*/
|
||||
protected $new_line = true;
|
||||
|
||||
/**
|
||||
* The array of available writers
|
||||
*
|
||||
* @var array[] $writers
|
||||
*/
|
||||
protected $writers = [];
|
||||
|
||||
/**
|
||||
* Default writers when one isn't specifed
|
||||
*
|
||||
* @var WriterInterface[] $default
|
||||
*/
|
||||
protected $default = [];
|
||||
|
||||
/**
|
||||
* Writers to be used just once
|
||||
*
|
||||
* @var null|array $once
|
||||
*/
|
||||
protected $once;
|
||||
|
||||
protected $persist = false;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->add('out', new Writer\StdOut);
|
||||
$this->add('error', new Writer\StdErr);
|
||||
$this->add('buffer', new Writer\Buffer);
|
||||
|
||||
$this->defaultTo('out');
|
||||
}
|
||||
|
||||
/**
|
||||
* Dictate that a new line should not be added after the output
|
||||
*/
|
||||
public function sameLine()
|
||||
{
|
||||
$this->new_line = false;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a writer to the available writers
|
||||
*
|
||||
* @param string $key
|
||||
* @param WriterInterface|array $writer
|
||||
*
|
||||
* @return \League\CLImate\Util\Output
|
||||
*/
|
||||
public function add($key, $writer)
|
||||
{
|
||||
$this->writers[$key] = $this->resolve(Helper::toArray($writer));
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the default writer
|
||||
*
|
||||
* @param string|array $keys
|
||||
*/
|
||||
public function defaultTo($keys)
|
||||
{
|
||||
$this->default = $this->getWriters($keys);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a default writer
|
||||
*
|
||||
* @param string|array $keys
|
||||
*/
|
||||
public function addDefault($keys)
|
||||
{
|
||||
$this->default = array_merge($this->default, $this->getWriters($keys));
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a writer to be used just once
|
||||
*
|
||||
* @param string|array $keys
|
||||
*
|
||||
* @return \League\CLImate\Util\Output
|
||||
*/
|
||||
public function once($keys)
|
||||
{
|
||||
$this->once = $this->getWriters($keys);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Persist or un-persist one time writers (for multi-line output)
|
||||
*
|
||||
* @param bool $persist
|
||||
*
|
||||
* @return \League\CLImate\Util\Output
|
||||
*/
|
||||
public function persist($persist = true)
|
||||
{
|
||||
$this->persist = (bool) $persist;
|
||||
|
||||
if (!$this->persist) {
|
||||
$this->resetOneTimers();
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a specific writer
|
||||
*
|
||||
* @param string $writer
|
||||
*
|
||||
* @return WriterInterface|array
|
||||
* @throws UnexpectedValueException if writer key doesn't exist
|
||||
*/
|
||||
public function get($writer)
|
||||
{
|
||||
if (!array_key_exists($writer, $this->writers)) {
|
||||
throw new UnexpectedValueException('Unknown writer [' . $writer . ']');
|
||||
}
|
||||
|
||||
if (count($this->writers[$writer]) == 1) {
|
||||
return reset($this->writers[$writer]);
|
||||
}
|
||||
|
||||
return $this->writers[$writer];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the currently available writers
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getAvailable()
|
||||
{
|
||||
$writers = [];
|
||||
|
||||
foreach ($this->writers as $key => $writer) {
|
||||
$writers[$key] = $this->getReadable($writer);
|
||||
}
|
||||
|
||||
return $writers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the content using the provided writer
|
||||
*
|
||||
* @param string $content
|
||||
*/
|
||||
public function write($content)
|
||||
{
|
||||
if ($this->new_line) {
|
||||
$content .= PHP_EOL;
|
||||
}
|
||||
|
||||
foreach ($this->getCurrentWriters() as $writer) {
|
||||
$writer->write($content);
|
||||
}
|
||||
|
||||
$this->resetOneTimers();
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the writer(s) down to an array of WriterInterface classes
|
||||
*
|
||||
* @param WriterInterface|array|string $writer
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function resolve($writer)
|
||||
{
|
||||
$resolver = 'resolve' . ucwords(gettype($writer)) . 'Writer';
|
||||
|
||||
if (method_exists($this, $resolver) && $resolved = $this->{$resolver}($writer)) {
|
||||
return $resolved;
|
||||
}
|
||||
|
||||
$this->handleUnknownWriter($writer);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $writer
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function resolveArrayWriter($writer)
|
||||
{
|
||||
return Helper::flatten(array_map([$this, 'resolve'], $writer));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param object $writer
|
||||
*
|
||||
* @return WriterInterface|false
|
||||
*/
|
||||
protected function resolveObjectWriter($writer)
|
||||
{
|
||||
if ($writer instanceof WriterInterface) {
|
||||
return $writer;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $writer
|
||||
*
|
||||
* @return array|false
|
||||
*/
|
||||
protected function resolveStringWriter($writer)
|
||||
{
|
||||
if (is_string($writer) && array_key_exists($writer, $this->writers)) {
|
||||
return $this->writers[$writer];
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $writer
|
||||
* @throws InvalidArgumentException For non-valid writer
|
||||
*/
|
||||
protected function handleUnknownWriter($writer)
|
||||
{
|
||||
// If we've gotten this far and don't know what it is,
|
||||
// let's at least try and give a helpful error message
|
||||
if (is_object($writer)) {
|
||||
throw new InvalidArgumentException('Class [' . get_class($writer) . '] must implement '
|
||||
. 'League\CLImate\Util\Writer\WriterInterface.');
|
||||
}
|
||||
|
||||
// No idea, just tell them we can't resolve it
|
||||
throw new InvalidArgumentException('Unable to resolve writer [' . $writer . ']');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the readable version of the writer(s)
|
||||
*
|
||||
* @param array $writer
|
||||
*
|
||||
* @return string|array
|
||||
*/
|
||||
protected function getReadable(array $writer)
|
||||
{
|
||||
$classes = array_map('get_class', $writer);
|
||||
|
||||
if (count($classes) == 1) {
|
||||
return reset($classes);
|
||||
}
|
||||
|
||||
return $classes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the writers based on their keys
|
||||
*
|
||||
* @param string|array $keys
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getWriters($keys)
|
||||
{
|
||||
$writers = array_flip(Helper::toArray($keys));
|
||||
|
||||
return Helper::flatten(array_intersect_key($this->writers, $writers));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return WriterInterface[]
|
||||
*/
|
||||
protected function getCurrentWriters()
|
||||
{
|
||||
return $this->once ?: $this->default;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset anything only used for the current content being written
|
||||
*/
|
||||
protected function resetOneTimers()
|
||||
{
|
||||
// Reset new line flag for next time
|
||||
$this->new_line = true;
|
||||
|
||||
if (!$this->persist) {
|
||||
// Reset once since we only want to use it... once.
|
||||
$this->once = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
23
vendor/league/climate/src/Util/OutputImporter.php
vendored
Normal file
23
vendor/league/climate/src/Util/OutputImporter.php
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util;
|
||||
|
||||
trait OutputImporter
|
||||
{
|
||||
/**
|
||||
* An instance of the OutputFactory
|
||||
*
|
||||
* @var \League\CLImate\Util\Output $output
|
||||
*/
|
||||
protected $output;
|
||||
|
||||
/**
|
||||
* Sets the $output property
|
||||
*
|
||||
* @param Output $output
|
||||
*/
|
||||
public function output(Output $output)
|
||||
{
|
||||
$this->output = $output;
|
||||
}
|
||||
}
|
||||
16
vendor/league/climate/src/Util/Reader/ReaderInterface.php
vendored
Normal file
16
vendor/league/climate/src/Util/Reader/ReaderInterface.php
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util\Reader;
|
||||
|
||||
interface ReaderInterface
|
||||
{
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function line();
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function multiLine();
|
||||
}
|
||||
95
vendor/league/climate/src/Util/Reader/Stdin.php
vendored
Normal file
95
vendor/league/climate/src/Util/Reader/Stdin.php
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util\Reader;
|
||||
|
||||
use League\CLImate\Exceptions\RuntimeException;
|
||||
use Seld\CliPrompt\CliPrompt;
|
||||
|
||||
class Stdin implements ReaderInterface
|
||||
{
|
||||
protected $stdIn = false;
|
||||
|
||||
/**
|
||||
* Read the line typed in by the user
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function line()
|
||||
{
|
||||
return trim(fgets($this->getStdIn(), 1024));
|
||||
}
|
||||
|
||||
/**
|
||||
* Read from STDIN until EOF (^D) is reached
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function multiLine()
|
||||
{
|
||||
return trim(stream_get_contents($this->getStdIn()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Read one character
|
||||
*
|
||||
* @param int $count
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function char($count = 1)
|
||||
{
|
||||
return fread($this->getStdIn(), $count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the line, but hide what the user is typing
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function hidden()
|
||||
{
|
||||
return CliPrompt::hiddenPrompt();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a valid STDIN, even if it previously EOF'ed
|
||||
*
|
||||
* Lazily re-opens STDIN after hitting an EOF
|
||||
*
|
||||
* @return resource
|
||||
* @throws RuntimeException
|
||||
*/
|
||||
protected function getStdIn()
|
||||
{
|
||||
if ($this->stdIn && !feof($this->stdIn)) {
|
||||
return $this->stdIn;
|
||||
}
|
||||
|
||||
try {
|
||||
$this->setStdIn();
|
||||
} catch (\Error $e) {
|
||||
throw new RuntimeException('Unable to read from STDIN', 0, $e);
|
||||
}
|
||||
|
||||
return $this->stdIn;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to set the stdin property
|
||||
*
|
||||
* @return void
|
||||
* @throws RuntimeException
|
||||
*/
|
||||
protected function setStdIn()
|
||||
{
|
||||
if ($this->stdIn !== false) {
|
||||
fclose($this->stdIn);
|
||||
}
|
||||
|
||||
$this->stdIn = fopen('php://stdin', 'r');
|
||||
|
||||
if (!$this->stdIn) {
|
||||
throw new RuntimeException('Unable to read from STDIN');
|
||||
}
|
||||
}
|
||||
}
|
||||
109
vendor/league/climate/src/Util/System/Linux.php
vendored
Normal file
109
vendor/league/climate/src/Util/System/Linux.php
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util\System;
|
||||
|
||||
use function getenv;
|
||||
|
||||
class Linux extends System
|
||||
{
|
||||
/**
|
||||
* Get the width of the terminal
|
||||
*
|
||||
* @return integer|null
|
||||
*/
|
||||
public function width()
|
||||
{
|
||||
return $this->getDimension($this->tput("cols"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the height of the terminal
|
||||
*
|
||||
* @return integer|null
|
||||
*/
|
||||
public function height()
|
||||
{
|
||||
return $this->getDimension($this->tput("lines"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a value from the tput command.
|
||||
*
|
||||
* @param string $type
|
||||
*
|
||||
* @return array|null|string
|
||||
*/
|
||||
private function tput($type)
|
||||
{
|
||||
return $this->exec("tput {$type} 2>/dev/null");
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if system has access to bash commands
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function canAccessBash()
|
||||
{
|
||||
return (rtrim($this->exec("/usr/bin/env bash -c 'echo OK'")) === 'OK');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a hidden response prompt and return the response
|
||||
*
|
||||
* @param string $prompt
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function hiddenResponsePrompt($prompt)
|
||||
{
|
||||
$bash_command = 'read -s -p "' . $prompt . '" response && echo $response';
|
||||
|
||||
return rtrim($this->exec("/usr/bin/env bash -c '{$bash_command}'"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if dimension is numeric and return it
|
||||
*
|
||||
* @param integer|string|null $dimension
|
||||
*
|
||||
* @return integer|null
|
||||
*/
|
||||
protected function getDimension($dimension)
|
||||
{
|
||||
return (is_numeric($dimension)) ? $dimension : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the stream supports ansi escape characters.
|
||||
*
|
||||
* Based on https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Console/Output/StreamOutput.php
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function systemHasAnsiSupport()
|
||||
{
|
||||
if ('Hyper' === getenv('TERM_PROGRAM')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
# If we're running in a web context then we can't use stdout
|
||||
if (!defined('STDOUT')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$stream = \STDOUT;
|
||||
|
||||
if (function_exists('stream_isatty')) {
|
||||
return @stream_isatty($stream);
|
||||
}
|
||||
|
||||
if (function_exists('posix_isatty')) {
|
||||
return @posix_isatty($stream);
|
||||
}
|
||||
|
||||
$stat = @fstat($stream);
|
||||
// Check if formatted mode is S_IFCHR
|
||||
return $stat ? 0020000 === ($stat['mode'] & 0170000) : false;
|
||||
}
|
||||
}
|
||||
68
vendor/league/climate/src/Util/System/System.php
vendored
Normal file
68
vendor/league/climate/src/Util/System/System.php
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util\System;
|
||||
|
||||
abstract class System
|
||||
{
|
||||
protected $force_ansi;
|
||||
|
||||
/**
|
||||
* Force ansi on or off
|
||||
*
|
||||
* @param bool $force
|
||||
*/
|
||||
public function forceAnsi($force = true)
|
||||
{
|
||||
$this->force_ansi = $force;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return integer|null
|
||||
*/
|
||||
abstract public function width();
|
||||
|
||||
/**
|
||||
* @return integer|null
|
||||
*/
|
||||
abstract public function height();
|
||||
|
||||
/**
|
||||
* Check if the stream supports ansi escape characters.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
abstract protected function systemHasAnsiSupport();
|
||||
|
||||
/**
|
||||
* Check if we are forcing ansi, fallback to system support
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function hasAnsiSupport()
|
||||
{
|
||||
if (is_bool($this->force_ansi)) {
|
||||
return $this->force_ansi;
|
||||
}
|
||||
|
||||
return $this->systemHasAnsiSupport();
|
||||
}
|
||||
|
||||
/**
|
||||
* Wraps exec function, allowing the dimension methods to decouple
|
||||
*
|
||||
* @param string $command
|
||||
* @param boolean $full
|
||||
*
|
||||
* @return string|array
|
||||
*/
|
||||
public function exec($command, $full = false)
|
||||
{
|
||||
if ($full) {
|
||||
exec($command, $output);
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
return exec($command);
|
||||
}
|
||||
}
|
||||
44
vendor/league/climate/src/Util/System/SystemFactory.php
vendored
Normal file
44
vendor/league/climate/src/Util/System/SystemFactory.php
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util\System;
|
||||
|
||||
class SystemFactory
|
||||
{
|
||||
/**
|
||||
* @var \League\CLImate\Util\System\System $instance
|
||||
*/
|
||||
|
||||
protected static $instance;
|
||||
|
||||
/**
|
||||
* Get an instance of the appropriate System class
|
||||
*
|
||||
* @return \League\CLImate\Util\System\System
|
||||
*/
|
||||
|
||||
public static function getInstance()
|
||||
{
|
||||
if (static::$instance) {
|
||||
return static::$instance;
|
||||
}
|
||||
|
||||
static::$instance = self::getSystem();
|
||||
|
||||
return static::$instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the $instance property to the appropriate system
|
||||
*
|
||||
* @return \League\CLImate\Util\System\System
|
||||
*/
|
||||
|
||||
protected static function getSystem()
|
||||
{
|
||||
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
|
||||
return new Windows();
|
||||
}
|
||||
|
||||
return new Linux();
|
||||
}
|
||||
}
|
||||
78
vendor/league/climate/src/Util/System/Windows.php
vendored
Normal file
78
vendor/league/climate/src/Util/System/Windows.php
vendored
Normal file
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util\System;
|
||||
|
||||
class Windows extends System
|
||||
{
|
||||
/**
|
||||
* Get the width of the terminal
|
||||
*
|
||||
* @return integer|null
|
||||
*/
|
||||
public function width()
|
||||
{
|
||||
return $this->getDimension('width');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the height of the terminal
|
||||
*
|
||||
* @return integer|null
|
||||
*/
|
||||
public function height()
|
||||
{
|
||||
return $this->getDimension('height');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get specified terminal dimension
|
||||
*
|
||||
* @param string $key
|
||||
*
|
||||
* @return integer|null
|
||||
*/
|
||||
|
||||
protected function getDimension($key)
|
||||
{
|
||||
$index = array_search($key, ['height', 'width']);
|
||||
$dimensions = $this->getDimensions();
|
||||
|
||||
return (!empty($dimensions[$index])) ? $dimensions[$index] : null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get information about the dimensions of the terminal
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
protected function getDimensions()
|
||||
{
|
||||
$output = $this->exec('mode CON', true);
|
||||
|
||||
if (!is_array($output)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$output = implode("\n", $output);
|
||||
|
||||
preg_match_all('/.*:\s*(\d+)/', $output, $matches);
|
||||
|
||||
return (!empty($matches[1])) ? $matches[1] : [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the stream supports ansi escape characters.
|
||||
*
|
||||
* Based on https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Console/Output/StreamOutput.php
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function systemHasAnsiSupport()
|
||||
{
|
||||
return (function_exists('sapi_windows_vt100_support') && @sapi_windows_vt100_support(STDOUT))
|
||||
|| false !== getenv('ANSICON')
|
||||
|| 'ON' === getenv('ConEmuANSI')
|
||||
|| 'Hyper' === getenv('TERM_PROGRAM')
|
||||
|| 'xterm' === getenv('TERM');
|
||||
}
|
||||
}
|
||||
66
vendor/league/climate/src/Util/UtilFactory.php
vendored
Normal file
66
vendor/league/climate/src/Util/UtilFactory.php
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util;
|
||||
|
||||
use League\CLImate\Util\System\SystemFactory;
|
||||
use League\CLImate\Util\System\System;
|
||||
|
||||
class UtilFactory
|
||||
{
|
||||
/**
|
||||
* A instance of the appropriate System class
|
||||
*
|
||||
* @var \League\CLImate\Util\System\System
|
||||
*/
|
||||
|
||||
public $system;
|
||||
|
||||
/**
|
||||
* A instance of the Cursor class
|
||||
*
|
||||
* @var \League\CLImate\Util\Cursor
|
||||
*/
|
||||
public $cursor;
|
||||
|
||||
public function __construct(System $system = null, Cursor $cursor = null)
|
||||
{
|
||||
$this->system = $system ?: SystemFactory::getInstance();
|
||||
$this->cursor = $cursor ?: new Cursor();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the width of the terminal
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
|
||||
public function width()
|
||||
{
|
||||
return (int) $this->getDimension($this->system->width(), 80);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the height of the terminal
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
|
||||
public function height()
|
||||
{
|
||||
return (int) $this->getDimension($this->system->height(), 25);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the value is numeric, fallback to a default if not
|
||||
*
|
||||
* @param integer|null $dimension
|
||||
* @param integer $default
|
||||
*
|
||||
* @return integer
|
||||
*/
|
||||
|
||||
protected function getDimension($dimension, $default)
|
||||
{
|
||||
return (is_numeric($dimension)) ? $dimension : $default;
|
||||
}
|
||||
}
|
||||
23
vendor/league/climate/src/Util/UtilImporter.php
vendored
Normal file
23
vendor/league/climate/src/Util/UtilImporter.php
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util;
|
||||
|
||||
trait UtilImporter
|
||||
{
|
||||
/**
|
||||
* An instance of the UtilFactory
|
||||
*
|
||||
* @var \League\CLImate\Util\UtilFactory $util
|
||||
*/
|
||||
protected $util;
|
||||
|
||||
/**
|
||||
* Sets the $util property
|
||||
*
|
||||
* @param UtilFactory $util
|
||||
*/
|
||||
public function util(UtilFactory $util)
|
||||
{
|
||||
$this->util = $util;
|
||||
}
|
||||
}
|
||||
44
vendor/league/climate/src/Util/Writer/Buffer.php
vendored
Normal file
44
vendor/league/climate/src/Util/Writer/Buffer.php
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util\Writer;
|
||||
|
||||
class Buffer implements WriterInterface
|
||||
{
|
||||
/**
|
||||
* @var string $contents The buffered data.
|
||||
*/
|
||||
protected $contents = "";
|
||||
|
||||
/**
|
||||
* Write the content to the buffer.
|
||||
*
|
||||
* @param string $content
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function write($content)
|
||||
{
|
||||
$this->contents .= $content;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the buffered data.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get()
|
||||
{
|
||||
return $this->contents;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clean the buffer and throw away any data.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function clean()
|
||||
{
|
||||
$this->contents = "";
|
||||
}
|
||||
}
|
||||
101
vendor/league/climate/src/Util/Writer/File.php
vendored
Normal file
101
vendor/league/climate/src/Util/Writer/File.php
vendored
Normal file
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util\Writer;
|
||||
|
||||
use League\CLImate\Exceptions\RuntimeException;
|
||||
|
||||
class File implements WriterInterface
|
||||
{
|
||||
/** @var resource|string */
|
||||
protected $resource;
|
||||
|
||||
/** @var boolean $close_locally */
|
||||
protected $close_locally = false;
|
||||
|
||||
/** @var boolean $use_locking */
|
||||
protected $use_locking = false;
|
||||
|
||||
/** @var boolean $gzip_file */
|
||||
protected $gzip_file = false;
|
||||
|
||||
/**
|
||||
* @param string|resource $resource
|
||||
* @param bool $use_locking
|
||||
* @param bool $gzip_file
|
||||
*/
|
||||
public function __construct($resource, $use_locking = false, $gzip_file = false)
|
||||
{
|
||||
$this->resource = $resource;
|
||||
$this->use_locking = $use_locking;
|
||||
$this->gzip_file = $gzip_file;
|
||||
}
|
||||
|
||||
public function lock()
|
||||
{
|
||||
$this->use_locking = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function gzipped()
|
||||
{
|
||||
$this->gzip_file = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write the content to the stream
|
||||
*
|
||||
* @param string $content
|
||||
*/
|
||||
public function write($content)
|
||||
{
|
||||
$resource = $this->getResource();
|
||||
|
||||
if ($this->use_locking) {
|
||||
flock($resource, LOCK_EX);
|
||||
}
|
||||
|
||||
gzwrite($resource, $content);
|
||||
|
||||
if ($this->use_locking) {
|
||||
flock($resource, LOCK_UN);
|
||||
}
|
||||
}
|
||||
|
||||
protected function getResource()
|
||||
{
|
||||
if (is_resource($this->resource)) {
|
||||
return $this->resource;
|
||||
}
|
||||
|
||||
$this->close_locally = true;
|
||||
|
||||
if (!is_writable($this->resource)) {
|
||||
throw new RuntimeException("The resource [{$this->resource}] is not writable");
|
||||
}
|
||||
|
||||
if (!($this->resource = $this->openResource())) {
|
||||
throw new RuntimeException("The resource could not be opened");
|
||||
}
|
||||
|
||||
return $this->resource;
|
||||
}
|
||||
|
||||
protected function openResource()
|
||||
{
|
||||
if ($this->gzip_file) {
|
||||
return gzopen($this->resource, 'a');
|
||||
}
|
||||
|
||||
return fopen($this->resource, 'a');
|
||||
}
|
||||
|
||||
public function _destruct()
|
||||
{
|
||||
if ($this->close_locally) {
|
||||
gzclose($this->getResource());
|
||||
}
|
||||
}
|
||||
}
|
||||
16
vendor/league/climate/src/Util/Writer/StdErr.php
vendored
Normal file
16
vendor/league/climate/src/Util/Writer/StdErr.php
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util\Writer;
|
||||
|
||||
class StdErr implements WriterInterface
|
||||
{
|
||||
/**
|
||||
* Write the content to the stream
|
||||
*
|
||||
* @param string $content
|
||||
*/
|
||||
public function write($content)
|
||||
{
|
||||
fwrite(\STDERR, $content);
|
||||
}
|
||||
}
|
||||
16
vendor/league/climate/src/Util/Writer/StdOut.php
vendored
Normal file
16
vendor/league/climate/src/Util/Writer/StdOut.php
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util\Writer;
|
||||
|
||||
class StdOut implements WriterInterface
|
||||
{
|
||||
/**
|
||||
* Write the content to the stream
|
||||
*
|
||||
* @param string $content
|
||||
*/
|
||||
public function write($content)
|
||||
{
|
||||
fwrite(\STDOUT, $content);
|
||||
}
|
||||
}
|
||||
13
vendor/league/climate/src/Util/Writer/WriterInterface.php
vendored
Normal file
13
vendor/league/climate/src/Util/Writer/WriterInterface.php
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace League\CLImate\Util\Writer;
|
||||
|
||||
interface WriterInterface
|
||||
{
|
||||
/**
|
||||
* @param string $content
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function write($content);
|
||||
}
|
||||
Reference in New Issue
Block a user