View Full Version : Ken Perlins strange code
I could never get this to compile properly before, but did so tonight.
I got the code from here and made a codeblocks project for it in c. I did compile it to an executable too, so you can download and run it to see what it outputs without installing a c compiler or the codeblocks ide. Top of the page you see a message compile this:
http://cs.nyu.edu/~perlin/
Please run the exe file from a command window. I didn't want to alter the code, so if you run it from windows it runs and the command windows goes away quickly.
I decided to attach a screenshot if you don't want to download to see what it outputs.
danbaron
12-06-2011, 08:18
Mandelbrot Set:
7284
thanks for this, also he has many toys, i like the butterfly
http://mrl.nyu.edu/~perlin/experiments/butterfly/
Charles Pegge
12-06-2011, 12:08
This is my interpretation in OxygenBasic
sys x,y,k, single i,j,r, string b
for y=0 to 31
for x=1 to 84
b+=mid " .:-;!/>)|&IH%*#",1+(k and 15),1
i=0 : k=0 : r=0
do
j=r*r-i*i-2+x*.04 : i=2*r*i-1.6+y*.1 : r=j
if k++>110 or i*i+j*j>10 then exit do
end do
next
b+=chr(13)+chr(10)
next
putfile "m.txt",b
Charles
He does have a wonder of stuff there on his site.
Charles also has another version which can be scaled and customized character set that is fun to play with.
http://www.oxygenbasic.org/forum/index.php?topic=207.msg1261;topicseen#msg1261
John Spikowski
13-06-2011, 08:23
Here is the ScriptBasic version.
for y=0 to 31
for x=1 to 84
b&=mid(" .:-;!/>)|&IH%*#",1+(k and 15),1)
i=0
k=0
r=0
repeat
j=r*r-i*i-2+x*.04
i=2*r*i-1.6+y*.1
r=j
k+=1
until k>110 or i*i+j*j>10
next
b&="\n"
next
print b
:::::::::::::::::::::--------------------------------::::::::::::::::::::::::::::::
::::::::::::::::--------------------------------------------::::::::::::::::::::::::
:::::::::::------------------------------------------------------:::::::::::::::::::
::::::::----------------------------------;;;;;;;-------------------::::::::::::::::
:::::-----------------------------;;;;;;;;;;;;;;;;;;;;;;---------------:::::::::::::
:::--------------------------;;;;;;;;;;;;!!!/-%//!!!;;;;;;;;-------------:::::::::::
:------------------------;;;;;;;;;;;;;!!!!//>)I#&IH/!!!;;;;;;;-------------:::::::::
:---------------------;;;;;;;;;;;;;!!!!!//>>|&:# &)>/!!!!!;;;;;;-------------:::::::
:-----------------;;;;;;;;;;;;!!!!!!////>>)&-####/-&>>//!!!!!;;;;;-------------:::::
:--------------;;;;;;;;;;!!!!!!!//>))H))|&&H #####%I||)>>>>#/!!;;;;-------------::::
:---------;;;;;;;;;;!!!!!!!!!////>)%-## &#############.H%I#H >!!;;;;-------------:::
:-----;;;;;;;;;!!!!!//////////>>)&:%-##################### H)//!!;;;;-------------::
:--;;;;;;;;;!!!!/>&&)>>>))>>>))|&%.########################*&I>!!;;;;;-------------:
:;;;;;;;;!!!!!//>>|I.-!H#;% I&&I>############################|>/!!;;;;;------------:
:;;;;;!!!!!///>>)|H%-;######## ############################ I//!!;;;;;-------------
:!!!!/////>>>)|%*:##########################################|>/!!!;;;;;-------------
:########################################################.I|>//!!!;;;;;-------------
:!!!!/////>>>)|%*:##########################################|>/!!!;;;;;-------------
:;;;;;!!!!!///>>)|H%-;######## ############################ I//!!;;;;;-------------
:;;;;;;;;!!!!!//>>|I.-!H#;% I&&I>############################|>/!!;;;;;------------:
:--;;;;;;;;;!!!!/>&&)>>>))>>>))|&%.########################*&I>!!;;;;;-------------:
:-----;;;;;;;;;!!!!!//////////>>)&:%-##################### H)//!!;;;;-------------::
:---------;;;;;;;;;;!!!!!!!!!////>)%-## &#############.H%I#H >!!;;;;-------------:::
:--------------;;;;;;;;;;!!!!!!!//>))H))|&&H #####%I||)>>>>#/!!;;;;-------------::::
:-----------------;;;;;;;;;;;;!!!!!!////>>)&-####/-&>>//!!!!!;;;;;-------------:::::
:---------------------;;;;;;;;;;;;;!!!!!//>>|&:# &)>/!!!!!;;;;;;-------------:::::::
:------------------------;;;;;;;;;;;;;!!!!//>)I#&IH/!!!;;;;;;;-------------:::::::::
:::--------------------------;;;;;;;;;;;;!!!/-%//!!!;;;;;;;;-------------:::::::::::
:::::-----------------------------;;;;;;;;;;;;;;;;;;;;;;---------------:::::::::::::
::::::::----------------------------------;;;;;;;-------------------::::::::::::::::
:::::::::::------------------------------------------------------:::::::::::::::::::
::::::::::::::::--------------------------------------------::::::::::::::::::::::::
Hi John,
Your ScriptBasic version looks very cool !
Is fine structured.
I like also 'REPEAT / UNTIL' command .
John Spikowski
13-06-2011, 17:27
Thanks for the reply.
It doesn't take long to get spoiled with ScriptBasic's type-less variable design.
John Spikowski
14-06-2011, 06:53
This is my interpretation in OxygenBasic
sys x,y,k, single i,j,r, string b
for y=0 to 31
for x=1 to 84
b+=mid " .:-;!/>)|&IH%*#",1+(k and 15),1
i=0 : k=0 : r=0
do
j=r*r-i*i-2+x*.04 : i=2*r*i-1.6+y*.1 : r=j
if k++>110 or i*i+j*j>10 then exit do
end do
next
b+=chr(13)+chr(10)
next
putfile "m.txt",b
Charles
Charles,
I tried the above code (which I based the SB version on) and your output is different.
:::::::::::::::::::::--------------------------------::::::::::::::::::::::::::::::
::::::::::::::::--------------------------------------------::::::::::::::::::::::::
:::::::::::------------------------------------------------------:::::::::::::::::::
::::::::----------------------------------;;;;;;;-------------------::::::::::::::::
:::::-----------------------------;;;;;;;;;;;;;;;;;;;;;;---------------:::::::::::::
:::--------------------------;;;;;;;;;;;;!!!/-%//!!!;;;;;;;;-------------:::::::::::
:------------------------;;;;;;;;;;;;;!!!!//>)I#&I /!!!;;;;;;;--------------::::::::
:---------------------;;;;;;;;;;;;;!!!!!//>>|&:# &)>/!!!!!;;;;;;-------------:::::::
:-----------------;;;;;;;;;;;;!!!!!!////>>)&- /-&>>//!!!!!;;;;;-------------:::::
:--------------;;;;;;;;;;!!!!!!!//>))H))|&&H %I||)>>>>#/!!;;;;-------------::::
:---------;;;;;;;;;;!!!!!!!!!////>)%- & .H%I#H >!!;;;;-------------:::
:-----;;;;;;;;;!!!!!//////////>>)&:%- H)//!!;;;;-------------::
:--;;;;;;;;;!!!!/>&&)>>>))>>>))|&%. *&I>!!;;;;;-------------:
:;;;;;;;;!!!!!//>>|I. !H#;% I&&I> #|>/!!;;;;;------------:
:;;;;;!!!!!///>>)|H%-; I//!!;;;;;-------------
:!!!!/////>>>)|%*:## # |>/!!!;;;;;-------------
:#I. I )*%) # . .I|>//!!!;;;;;-------------
:!!!!/////>>>)|%*:## # |>/!!!;;;;;-------------
:;;;;;!!!!!///>>)|H%-; I//!!;;;;;-------------
:;;;;;;;;!!!!!//>>|I..!H#;% I&&I> #|>/!!;;;;;------------:
:--;;;;;;;;;!!!!/>&&)>>>))>>>))|&%. *&I>!!;;;;;-------------:
:-----;;;;;;;;;!!!!!//////////>>)&:%- H)//!!;;;;-------------::
:---------;;;;;;;;;;!!!!!!!!!////>)%- & .H%I#H >!!;;;;-------------:::
:--------------;;;;;;;;;;!!!!!!!//>))H))|&&H %I||)>>>>#/!!;;;;-------------::::
:-----------------;;;;;;;;;;;;!!!!!!////>>)&- /-&>>//!!!!!;;;;;-------------:::::
:---------------------;;;;;;;;;;;;;!!!!!//>>|&:# &)>/!!!!!;;;;;;-------------:::::::
:------------------------;;;;;;;;;;;;;!!!!//>)I#&I)/!!!;;;;;;;--------------::::::::
:::--------------------------;;;;;;;;;;;;!!!/-%//!!!;;;;;;;;-------------:::::::::::
:::::-----------------------------;;;;;;;;;;;;;;;;;;;;;;---------------:::::::::::::
::::::::----------------------------------;;;;;;;-------------------::::::::::::::::
:::::::::::------------------------------------------------------:::::::::::::::::::
::::::::::::::::--------------------------------------------::::::::::::::::::::::::
This is the original compiled with gcc under Ubuntu 64.
main(k){float i,j,r,x,y=-16;while(puts(""),y++<15)for(x
=0;x++<84;putchar(" .:-;!/>)|&IH%*#"[k&15]))for(i=k=r=0;
j=r*r-i*i-2+x/25,i=2*r*i+y/10,j*j+i*i<11&&k++<111;r=j);}
.............::::::::::::::::::::::::::::::::::::::::::::::::.......................
.........::::::::::::::::::::::::::::::::::::::::::::::::::::::::...................
.....::::::::::::::::::::::::::::::::::-----------:::::::::::::::::::...............
...:::::::::::::::::::::::::::::------------------------:::::::::::::::.............
:::::::::::::::::::::::::::-------------;;;!:H!!;;;--------:::::::::::::::..........
::::::::::::::::::::::::-------------;;;;!!/>&*|I !;;;--------::::::::::::::........
::::::::::::::::::::-------------;;;;;;!!/>)|.*#|>/!!;;;;-------::::::::::::::......
::::::::::::::::-------------;;;;;;!!!!//>|: !:|//!!!;;;;-----::::::::::::::.....
::::::::::::------------;;;;;;;!!/>)I>>)||I# H&))>////*!;;-----:::::::::::::....
::::::::----------;;;;;;;;;;!!!//)H: #| IH&*I#/;;-----:::::::::::::...
:::::---------;;;;!!!!!!!!!!!//>|.H: #I>/!;;-----:::::::::::::..
:----------;;;;!/||>//>>>>//>>)|% %|&/!;;----::::::::::::::.
--------;;;;;!!//)& |;I*-H#&||&/ *)/!;;-----::::::::::::::
-----;;;;;!!!//>)IH:- ## #&!!;;-----::::::::::::::
;;;;!!!!!///>)H%.** * )/!;;;------:::::::::::::
&)/!!;;;------:::::::::::::
;;;;!!!!!///>)H%.** * )/!;;;------:::::::::::::
-----;;;;;!!!//>)IH:- ## #&!!;;-----::::::::::::::
--------;;;;;!!//)& |;I*-H#&||&/ *)/!;;-----::::::::::::::
:----------;;;;!/||>//>>>>//>>)|% %|&/!;;----::::::::::::::.
:::::---------;;;;!!!!!!!!!!!//>|.H: #I>/!;;-----:::::::::::::..
::::::::----------;;;;;;;;;;!!!//)H: #| IH&*I#/;;-----:::::::::::::...
::::::::::::------------;;;;;;;!!/>)I>>)||I# H&))>////*!;;-----:::::::::::::....
::::::::::::::::-------------;;;;;;!!!!//>|: !:|//!!!;;;;-----::::::::::::::.....
::::::::::::::::::::-------------;;;;;;!!/>)|.*#|>/!!;;;;-------::::::::::::::......
::::::::::::::::::::::::-------------;;;;!!/>&*|I !;;;--------::::::::::::::........
:::::::::::::::::::::::::::-------------;;;!:H!!;;;--------:::::::::::::::..........
...:::::::::::::::::::::::::::::------------------------:::::::::::::::.............
.....::::::::::::::::::::::::::::::::::-----------:::::::::::::::::::...............
.........::::::::::::::::::::::::::::::::::::::::::::::::::::::::...................
.............::::::::::::::::::::::::::::::::::::::::::::::::.......................
Here is Matthew's Basic4GL version running under Wine.
http://files.allbasic.info/AllBasic/b4gl_fractal.png
It looks like the image from the GCC version contains a little more detail than the OxygenBasic version. It could be a difference caused by the datatypes being used to store variables or maybe you're using the 64-bit version of GCC?
If anyone's interested I knocked together a version in Basic4GL, it's here (http://matthew-4gl.wikispaces.com/text_fractal) on my wiki.
John Spikowski
14-06-2011, 17:23
Your example looks more like the ScriptBasic Version. It's interesting how the same code generates different results.
I would like to see a thinBasic version if anyone is willing to give it a try.
In looking at Mathews page and code, I really liked how variables were declared.
dim x, y, k, i#, j#, r#, b$
This would be neat to have this simplification in Oxygen... now there are too many types. I know the types are needed in the background for Oxygen to use C code, but it would be neat if the main oxygen user who just write in Oxygen had such a simple way of only 3 choices and maybe one more of bool.
In the above code it is obvious what are whole numbers, decimal and string. For bool perhaps a ? could be used.
Charles Pegge
16-06-2011, 10:10
Well we get fairly close. Oxygen will support these:
dim as long a,b,c,double d, string s,t="q"
dim long a,b,c, double d, string s,t="q"
long a,b,c, double d, string s,t="q"
dim x,y,z 'these default to sys type (long)
For casual programming it is not necessary to dim the variables, as long as the type can in inferred by the first assignment.
s="this is a dynamic string"
d=42.5 'double
a=32 'sys / long
Charles
Thanks for the clarification Charles, for instance didn't know about:
dim x,y,z 'these default to sys type (long)
I keep forgetting we are in alpha versions of oxygen.
It just seems so much further along and that it is time for a users manual :)
Charles Pegge
16-06-2011, 13:16
I keep on discovering new semantics :) . Fortunately the keyword list stopped growing some time ago and the manual covers these at least.
Charles
Charles Pegge
16-06-2011, 18:27
My worst effort so far:
/*
Ken Perlin's Original
C
main(k){float i,j,r,x,y=-16;while(puts(""),y++<15)for(x
=0;x++<84;putchar(" .:-;!/>)|&IH%*#"[k&15]))for(i=k=r=0;
j=r*r-i*i-2+x/25,i=2*r*i+y/10,j*j+i*i<11&&k++<111;r=j);}
*/
'OxygenBasic
single x,y,k,i,j,r:string b:for y=-16 to 16:for x=1 to 84
b+=mid" .:-;!/>)|&IH%*#",1+(k & 15),1:i=0:k=0:r=0:while 1
{j=r*r-i*i-2+x*.04:i=2*r*i+y*.1:r=j:if k++>110|i*i+j*j>11
{exit do}}next:b+=chr(13)chr(10):next:putfile"m.txt",b
Charles
John Spikowski
17-06-2011, 04:37
Charles,
I thought I would try your newest version under SB. All it printed was a # for the first position of the first line. I thought at first that SB must not support a FOR/NEXT with a negative value. (wrong)
'OxygenBasic
single x,y,k,i,j,r:string b:for y=-16 to 16:for x=1 to 84
b+=mid" .:-;!/>)|&IH%*#",1+(k & 15),1:i=0:k=0:r=0:while 1
{j=r*r-i*i-2+x*.04:i=2*r*i+y*.1:r=j:if k++>110|i*i+j*j>11
{exit do}}next:b+=chr(13)chr(10):next:putfile"m.txt",b
::::::::::::::::::--------------------------------------:::::::::::::::::::::::::::
::::::::::::::------------------------------------------------::::::::::::::::::::::
::::::::::--------------------------------------------------------::::::::::::::::::
::::::----------------------------------;;;;;;;;;;;-------------------::::::::::::::
::::-----------------------------;;;;;;;;;;;;;;;;;;;;;;;;---------------::::::::::::
:---------------------------;;;;;;;;;;;;;!!!/-%//!!!;;;;;;;;---------------:::::::::
:------------------------;;;;;;;;;;;;;!!!!//>)I#&H /!!!;;;;;;;;--------------:::::::
:--------------------;;;;;;;;;;;;;!!!!!!//>)|&:# &)>//!!!!;;;;;;;--------------:::::
:----------------;;;;;;;;;;;;;!!!!!!////>>)&- /-&>>///!!!!;;;;;--------------::::
:------------;;;;;;;;;;;;!!!!!!!//>)|H))|&&H %I||)>>>>#/!!;;;;;-------------:::
:--------;;;;;;;;;;!!!!!!!!!!///>>|%- & .H%I#H >!!;;;;;-------------::
:-----;;;;;;;;;!!!!///////////>>)&:%- H)>/!!;;;;;-------------:
:-;;;;;;;;;;!!!!/>&&)>>))))>>))|&*. *&I>/!!;;;;--------------
:;;;;;;;;!!!!!//>>|I..!H#;% I&&I> #|>/!!;;;;;-------------
-;;;;;!!!!!///>>)|H%-; I//!!;;;;;-------------
-!!!!/////>>>)|%*:## # |>/!!!;;;;;;------------
- .I|>//!!!;;;;;;------------
-!!!!/////>>>)|%*:## # |>/!!!;;;;;;------------
-;;;;;!!!!!///>>)|H%-; I//!!;;;;;-------------
-;;;;;;;;!!!!!//>>|I..!H#;% I&&I> #|>/!!;;;;;-------------
--;;;;;;;;;;!!!!/>&&)>>))))>>))|&*. *&I>/!!;;;;--------------
:-----;;;;;;;;;!!!!///////////>>)&:%- H)>/!!;;;;;-------------:
:--------;;;;;;;;;;!!!!!!!!!!///>>|%- & .H%I#H >!!;;;;;-------------::
:------------;;;;;;;;;;;;!!!!!!!//>)|H))|&&H %I||)>>>>#/!!;;;;;-------------:::
:----------------;;;;;;;;;;;;;!!!!!!////>>)&- /-&>>///!!!!;;;;;--------------::::
:--------------------;;;;;;;;;;;;;!!!!!!//>)|&:# &)>//!!!!;;;;;;;--------------:::::
:------------------------;;;;;;;;;;;;;!!!!//>)I#&H /!!!;;;;;;;;--------------:::::::
:---------------------------;;;;;;;;;;;;;!!!/-%//!!!;;;;;;;;---------------:::::::::
::::-----------------------------;;;;;;;;;;;;;;;;;;;;;;;;---------------::::::::::::
::::::----------------------------------;;;;;;;;;;;-------------------::::::::::::::
::::::::::--------------------------------------------------------::::::::::::::::::
::::::::::::::------------------------------------------------::::::::::::::::::::::
:::::::::::::::::::--------------------------------------:::::::::::::::::::::::::::
'ScriptBasic
for y=-16 to 16
for x=1 to 84
b&=mid(" .:-;!/>)|&IH%*#",1+(k & 15),1)
i=0
k=0
r=0
repeat
j=r*r-i*i-2+x*.04
i=2*r*i+y*.1
r=j
k+=1
until k>110 or i*i+j*j>11
next
b&="\n"
next
print b
Here is my test of FOR/NEXT in SB.
for x=-5 to 5
print x,"\n"
next
jrs@laptop:~/sb/test$ scriba testfor.sb
-5
-4
-3
-2
-1
0
1
2
3
4
5
jrs@laptop:~/sb/test$
My error. I forgot to change your & to and.
'ScriptBasic
for y=-16 to 16
for x=1 to 84
b&=mid(" .:-;!/>)|&IH%*#",1+(k and 15),1)
i=0
k=0
r=0
repeat
j=r*r-i*i-2+x*.04
i=2*r*i+y*.1
r=j
k+=1
until k>110 or i*i+j*j>11
next y
b&="\n"
next
print b
::::::::::::::::::--------------------------------------:::::::::::::::::::::::::::
::::::::::::::------------------------------------------------::::::::::::::::::::::
::::::::::--------------------------------------------------------::::::::::::::::::
::::::----------------------------------;;;;;;;;;;;-------------------::::::::::::::
::::-----------------------------;;;;;;;;;;;;;;;;;;;;;;;;---------------::::::::::::
:---------------------------;;;;;;;;;;;;;!!!/-%//!!!;;;;;;;;---------------:::::::::
:------------------------;;;;;;;;;;;;;!!!!//>)I#&HH/!!!;;;;;;;;--------------:::::::
:--------------------;;;;;;;;;;;;;!!!!!!//>)|&:# &)>//!!!!;;;;;;;--------------:::::
:----------------;;;;;;;;;;;;;!!!!!!////>>)&-####/-&>>///!!!!;;;;;--------------::::
:------------;;;;;;;;;;;;!!!!!!!//>)|H))|&&H #####%I||)>>>>#/!!;;;;;-------------:::
:--------;;;;;;;;;;!!!!!!!!!!///>>|%-## &#############.H%I#H >!!;;;;;-------------::
:-----;;;;;;;;;!!!!///////////>>)&:%-##################### H)>/!!;;;;;-------------:
:-;;;;;;;;;;!!!!/>&&)>>))))>>))|&*.########################*&I>/!!;;;;--------------
:;;;;;;;;!!!!!//>>|I.-!H#;% I&&I>############################|>/!!;;;;;-------------
-;;;;;!!!!!///>>)|H%-;######## ############################ I//!!;;;;;-------------
-!!!!/////>>>)|%*:##########################################|>/!!!;;;;;;------------
-########################################################.I|>//!!!;;;;;;------------
-!!!!/////>>>)|%*:##########################################|>/!!!;;;;;;------------
-;;;;;!!!!!///>>)|H%-;######## ############################ I//!!;;;;;-------------
-;;;;;;;;!!!!!//>>|I.-!H#;% I&&I>############################|>/!!;;;;;-------------
--;;;;;;;;;;!!!!/>&&)>>))))>>))|&*.########################*&I>/!!;;;;--------------
:-----;;;;;;;;;!!!!///////////>>)&:%-##################### H)>/!!;;;;;-------------:
:--------;;;;;;;;;;!!!!!!!!!!///>>|%-## &#############.H%I#H >!!;;;;;-------------::
:------------;;;;;;;;;;;;!!!!!!!//>)|H))|&&H #####%I||)>>>>#/!!;;;;;-------------:::
:----------------;;;;;;;;;;;;;!!!!!!////>>)&-####/-&>>///!!!!;;;;;--------------::::
:--------------------;;;;;;;;;;;;;!!!!!!//>)|&:# &)>//!!!!;;;;;;;--------------:::::
:------------------------;;;;;;;;;;;;;!!!!//>)I#&HH/!!!;;;;;;;;--------------:::::::
:---------------------------;;;;;;;;;;;;;!!!/-%//!!!;;;;;;;;---------------:::::::::
::::-----------------------------;;;;;;;;;;;;;;;;;;;;;;;;---------------::::::::::::
::::::----------------------------------;;;;;;;;;;;-------------------::::::::::::::
::::::::::--------------------------------------------------------::::::::::::::::::
::::::::::::::------------------------------------------------::::::::::::::::::::::
:::::::::::::::::::--------------------------------------:::::::::::::::::::::::::::
For grins, I swapped the first and last character of the mid() string and now it looks closer to yours and the original.
'ScriptBasic
for y=-16 to 16
for x=1 to 84
b&=mid("#.:-;!/>)|&IH%* ",1+(k and 15),1)
i=0
k=0
r=0
repeat
j=r*r-i*i-2+x*.04
i=2*r*i+y*.1
r=j
k+=1
until k>110 or i*i+j*j>11
next y
b&="\n"
next
print b
#::::::::::::::::::--------------------------------------:::::::::::::::::::::::::::
::::::::::::::------------------------------------------------::::::::::::::::::::::
::::::::::--------------------------------------------------------::::::::::::::::::
::::::----------------------------------;;;;;;;;;;;-------------------::::::::::::::
::::-----------------------------;;;;;;;;;;;;;;;;;;;;;;;;---------------::::::::::::
:---------------------------;;;;;;;;;;;;;!!!/-%//!!!;;;;;;;;---------------:::::::::
:------------------------;;;;;;;;;;;;;!!!!//>)I &HH/!!!;;;;;;;;--------------:::::::
:--------------------;;;;;;;;;;;;;!!!!!!//>)|&: #&)>//!!!!;;;;;;;--------------:::::
:----------------;;;;;;;;;;;;;!!!!!!////>>)&- /-&>>///!!!!;;;;;--------------::::
:------------;;;;;;;;;;;;!!!!!!!//>)|H))|&&H# %I||)>>>> /!!;;;;;-------------:::
:--------;;;;;;;;;;!!!!!!!!!!///>>|%- #& .H%I H#>!!;;;;;-------------::
:-----;;;;;;;;;!!!!///////////>>)&:%- #H)>/!!;;;;;-------------:
:-;;;;;;;;;;!!!!/>&&)>>))))>>))|&*. *&I>/!!;;;;--------------
:;;;;;;;;!!!!!//>>|I.-!H ;%#I&&I> |>/!!;;;;;-------------
-;;;;;!!!!!///>>)|H%-; ## #I//!!;;;;;-------------
-!!!!/////>>>)|%*: |>/!!!;;;;;;------------
- .I|>//!!!;;;;;;------------
-!!!!/////>>>)|%*: |>/!!!;;;;;;------------
-;;;;;!!!!!///>>)|H%-; ## #I//!!;;;;;-------------
-;;;;;;;;!!!!!//>>|I.-!H ;%#I&&I> |>/!!;;;;;-------------
--;;;;;;;;;;!!!!/>&&)>>))))>>))|&*. *&I>/!!;;;;--------------
:-----;;;;;;;;;!!!!///////////>>)&:%- #H)>/!!;;;;;-------------:
:--------;;;;;;;;;;!!!!!!!!!!///>>|%- #& .H%I H#>!!;;;;;-------------::
:------------;;;;;;;;;;;;!!!!!!!//>)|H))|&&H# %I||)>>>> /!!;;;;;-------------:::
:----------------;;;;;;;;;;;;;!!!!!!////>>)&- /-&>>///!!!!;;;;;--------------::::
:--------------------;;;;;;;;;;;;;!!!!!!//>)|&: #&)>//!!!!;;;;;;;--------------:::::
:------------------------;;;;;;;;;;;;;!!!!//>)I &HH/!!!;;;;;;;;--------------:::::::
:---------------------------;;;;;;;;;;;;;!!!/-%//!!!;;;;;;;;---------------:::::::::
::::-----------------------------;;;;;;;;;;;;;;;;;;;;;;;;---------------::::::::::::
::::::----------------------------------;;;;;;;;;;;-------------------::::::::::::::
::::::::::--------------------------------------------------------::::::::::::::::::
::::::::::::::------------------------------------------------::::::::::::::::::::::
:::::::::::::::::::--------------------------------------:::::::::::::::::::::::::::