一、前言

2022年圣诞节到来了,给大家画一棵圣诞树,希望大家都能安全地度过这个困难的时刻,希望所有糟糕的都是经历,所有的美好都会在之后到来,希望明年的还能画下新的一棵圣诞树。

总所周知,圣诞树(Christmas tree) 是圣诞节期间最有名的传统摆设。在过去,通常人们在圣诞前后把一棵常绿植物如松树弄进屋里或者在户外,并用圣诞灯和彩色的装饰物装饰。圣诞树在早期基督教活动是没有的,来源可能是早期欧洲部落里面的农作神祭祀习俗,基督教传至欧洲后成为崇拜的形式出现,最后被移植入圣诞节里面成为今天的圣诞树,现时圣诞树的摆设已和宗教毫无关系。

二、创意名

让我们用程序员的方式庆祝一下 2022 年这个特殊的圣诞节,使用 C 语言画出一棵带有装饰的简易圣诞树。

三、效果展示

画出的效果如下,非常的简易。

*
                  ***
                 *****
                *oo****
               *********
              *******o***
                **O**OO
               *********
              ***********
             *************
            **o************
           **************o**
             *************
            *********Q**o**
           **o***********Q**
          Q*****o***O********
         ********J*****O******
        ***********************
          *******************
         *********************
        *******J*****o*********
       ************O**o*********
      **o******A**O******J*******
     ***************O*************
       *****************O*******
      **********A****************
     *****************A*Ao*O***O**
    **********o***O****************
   *****************J***************
  ************o*Jo**************Q***o
                |||||||
                |||||||
                |||||||
                |||||||
                |||||||

四、实现步骤

绘制圣诞树,主要分为两个部分,分别为绘制圣诞树的树叶部分和绘制圣诞树的树干部分。

  1. 绘制树叶部分:
    树叶部分考虑要分成多少层,每层的高度要多少,每层比上一层宽多少。
    定义好之后,循环打印出树叶部分即可。
    代码中还利用随机函数,随机给圣诞树添加一些装饰物,每次生成的装饰物位置都不一样,你可以更改不同礼物出现的几率和出现的类型,详见下一节的代码实现。
  2. 绘制树干部分:
    定义好树干的宽度和高度,循环打印出树干部分即可。

五、编码实现

绘制圣诞树的代码非常地简洁,所以直接在一个main函数中实现了所有的功能,代码如下:

int main(void)
{
    srand(time(NULL));
    
    int leaf_level = 5;     //圣诞树层数
    int leaf_height = 6;    //每层的高度
    int leaf_add_width = 3; //每一层比上一层的宽度增加的倍数
    int trunk_width = 3;    //树干宽度
    int trunk_height = 5;   //树干高度
    
    int canvas_width = (leaf_height + leaf_level * leaf_add_width - 1) * 2 - 1; //画出这颗圣诞树的画布宽度
    int mid = canvas_width / 2; //圣诞树的中点
    
    //画出圣诞树的叶子部分
    for(int i = 0; i < leaf_level; i++) {
        for(int j = 0; j < leaf_height; j++) {
            for(int k = 0; k < mid - i * leaf_add_width - j; k++) {
                printf(" ");
            }
            for(int k = mid - i * leaf_add_width - j; k <= mid + i * leaf_add_width + j; k++) {
                //随机画出一些礼物在圣诞树上
                int shape = rand() % 120;
                switch(shape) {
                    case 1 ... 5: printf("O"); break;
                    case 6 ... 10: printf("o"); break;
                    case 11: printf("J"); break;
                    case 12: printf("Q"); break;
                    case 13: printf("A"); break;
                    default: printf("*");
                }
            }
            printf("\r\n");
        }
    }
    
    //画出圣诞树的树干部分
    for(int i = 0; i < trunk_height; i++) {
        for(int k = 0; k < mid - trunk_width; k++) {
            printf(" ");
        }
        for(int k = mid - trunk_width; k <= mid + trunk_width; k++) {
            printf("|");
        }
        printf("\r\n");
    }
    
    return 0;
}

 

有了圣诞树之后,怎么能没有圣诞老人呢?

在文章的最后附赠一个圣诞老人的字符画,可以直接放在代码注释中,让圣诞老人给你带来祝福。

/*
....................................................................................................................................................:..........:::...................:.......:::``::................................................................................................................................................................
....................................................................................................................................................:`;,'!>+}*XKE%%%%%%W$EEEEEEE$$$$$W%%N%WRX*]>!;`.................................................................................................................................................................
.........................................................................................................................................:...:.:,!/*K$WNNN%%#KY]1>!';,````::::::::::```,'~i1IKEN@NWF/;:::`.....::.:.................................................................................................................................................
..................................................................................................................................:::`,~i]F$N%$#&Y}+"'`..................................::::...:`;i*R%NEIi;:::::.:.................................................................................................................................................
................................................................................................................................:`~/*K%@@EY/!'`:.:.....::...................................::.:.....:;>l$%$Xi:.:::.................................................................................................................................................
.........................................................................................................................`:`;!lKWN$I1!`...::...::..............................................:::::....:.:"I$@R1;..................................................................................................................................................
.........................................................................................................................`>Y$@WX+'::......................................................................::`,1$NK/:..:`............................................................................................................................................
....................................................................................................................:,iY$NK]"`.:::.......................................................................::.::..!YN%*~.:.::.........................................................................................................................................
...................................................................................................................`l$NE*!,::.::.........................................................................:..:..::`i#N&i.:.:::.......................................................................................................................................
...............................................................................................................:;}#NR/;:..:::........................................,!,..................................:...:..:::+RNK~`:::.......................................................................................................................................
............................................................................................................:.:1#%Ki,::.:...........................................!F%K/,.:..:......................................"FM#":::.......................................................................................................................................
............................................................................................................"IN%*!:::::..........................................::..:+#@E1`::.:....................................:.,}N%l,........................................................................................................................................
.........................................................................................................../R%X~`.::...:``````::........::::......:::::..........:..:..~*%@I~::.:.::...............................:.::,*%$}:.......................................................................................................................................
.....................................................................................................``;!/EN%$W%%%%W$$$$$$$$$$WWW%%WW%%%%%N@@@%#FY]/>',`:.........:..:...'lNNFi:.::.................................::.::/#Wl`......................................................................................................................................
................................................................................................:..`!}F$@%EKI1i~;;,,``````````````````,,,;'!"i1I&#%NNNN%#X]i'`::..::::..:.:i&WE]`..:::...:...............................,]$%>:.....................................................................................................................................
..............................................................................................:;~Y$NEl>;..:::::.................................::....:'!+lFEWN@N$&*+!'`:.::.~*NMX>,:::.::..............................:.'lN#i:....................................................................................................................................
.............................................................................................`i#N$I"`....:...................................................`'!il&$@MNWRY}";``~&%$I,::::...............................:.."EMl;....................................................................................................................................
..........................................................................................:~XW$*;::...............................................::................:..`~i]K$NNEIlYE@R/;.:.................................`i%$}`...................................................................................................................................
.......................................................................................:.`+WNF>`...........................................................................:`'i*EN@%W%%&i.::..`:........:...................;K%Y'...................................................................................................................................
........................................................................................>F@R>:..............................................................................::::..`~1K$%@M#/'``::::....:`...................`1$#/...................................................................................................................................
...................................................................................::..!X%K!:.::..............::::.............................................................:.....:;iI$@NR};:::`:::::....................:!#Wl...................................................................................................................................
.................................................................................:..::!R%F;:.........:..:,;~">i}l*YX&KR#E$WWW%%WWW$E#RK&YI]1+"!~',`:.................................:..:`:"YWN%F+,.::::.....................,FWF;..................................................................................................................................
.....................................................................................`*%Ri.......:::,~1FE%%%NNN%WE#KXYIl]]]]}}}]]]]]]*IYK#$%@@@N%W$RY]i'`:......:....:....................::,~1WN%#],:::......:...:...........lWR'..................................................................................................................................
....................................................................................:~#%*,.:..:`'*E%N$F1!,...:``..:`...............::............:`'i]XR$N@%$F]",:``:..::::.....................'l$@@R]~:......:::............/#Ei:.................................................................................................................................
.................................................................................:..`"W%]:..:,>Y%@El;```,~>iii>~;:...:..............................::.::,~ilKWNNW&]",...:`::::...:.............::!KNWWEl,:::.::............../R$/:.................................................................................................................................
..................................................................................:..;FNF!.,lEN$W1'"X%N%$RFYYXF#%$*`.........................:,'~~'';,``:..:`::..,i*R%@%Rl~;`:....................:."RNN%MK1;....:............/R$1`.................................................................................................................................
.....................................................................................:+E$l;&W%WW/,i#@Fi;``:::::"E@F;:....................::.,*#%N%@NNWEI/~`.;`:.:.:``,>I#NM%F+;.....:...............`i&%KI$NK":.:`:.........../R$1`.................................................................................................................................
.......................................................................................'*%@$%NK'`:;}$@@%#XYXKE%NR};........................~YN&+`.:::`'1KNNR>`...`:...:..:,X%@N@K}!`:...............::+RN1;iKNK>:.:.........../R$1`.................................................................................................................................
..................................................................................::.:.:/R@NNK/:....`!i}IFKKF*+~,:.:.......................:"RN$I"`.::.:,/KM&~.........::.`*WR}+E@W&]~:..`..........:.~YNX'.'I@%l,............1#E+`.................................................................................................................................
.................................................................................`..:,1E%ERM&>.:,+&%@%$%N%&1':,:::............................'ilKEWN@N@N$&};.............,RNF":..~l$@$*":..........::~*@&":.:'YWE1`:.........IWR~:.................................................................................................................................
........................................................................::.:::::`.:,iK%R}1WMY~.,IWWY>,`,>X@N*;..,~>/111+>,`:..:.........:..,"l&#E#YI}>~"',`:.:::.........`>WN*,::..:,/#%$F~:.:......:`~*NF':`:.`]WN*'..:.....'RNF:..::..............................................................................................................................
............................................................................,..`,+#N$Y,.;}@$i`..:``:::::,~"1IK$@%E&Y**IXKEWN%K+':.:`::`:`*$%Rli'`;>}KN$]':............:`,i#@X":........,1$ME1`.......:1E%/`:,.`;>*$MKi:..:::,Y%E];,:................................................................................................................................
.......................................................................:.::..:!I%@K1'...;}%%/`...`:.:']K$%N%%NW*i;:.:...:,;"l$@$K&&l+;.`:~>"`::::`.:~]ENY"::.........:`:!INE+`........::`'XNWY!`:.:`.~I$R'..`"IEN$FK%$I'..`>FN$$%%&i,::.............................................................................................................................
.......................................................................:...'I%%F":.:::..:"&@R+::`~lE@W&1''#N&>:..:.........:::~F%$**KW%%&i,`;:....::::;]]!::...........i&NR!..:......:.....;lWNY~:.:iR%F':'*WWX'..:.,}#W%NN$Fi,::~FW#]`.............................................................................................................................
........................................................................::!K@&i:........:`"ENR]i&%N#]',:'l@#/`................."KNX;`;>X%N#},..:..:..:..............:`>RNK~:..:...........:.,/R@E1;iENX!.:*$E},:::...:`;'';`:.:::.:l$#>:............................................................................................................................
.......................................................................`."&NI~``:1$MWX1>~~"}RW%WY>`.....'YNKi..................;Y@R'::..."*E@R1'::.................`i#@E1`....................`/#NN$I"`.`1WE/......................~X%&`............................................................................................................................
..................................................................::....:iKN},.`'&NEFKWN@@@N#l!;`:......`/NWl;..:........:..::.iKNF,:...:.`!IN%&+...::...:...:::.:!IW%X!:....................:.:i&%#!::::1$R+..::::................'X%Y`............................................................................................................................
...................................................................`!1X%N$X+,..`i$N*,:....::..:`:.::..:`::"KNE}':..:........:'*W%Y;.....::::../#@$+,..`:...::`'+Y%%#l;:.::...................:...!Y@R":.:"K$Y':.:::..............:;IWE>:............................................................................................................................
...............................................................::.,}R%#1~:.....,i%W],.:::.......::....:..:.~*$NEIi':....:..'}#@#};............:>X%N*~.:..`'"lR%NWY>,:`:::........................`1@E>:.:.}$%I:.`,............:::'XWE]..............................................................................................................................
................................................................`>W%Y!...:....:::1#WF':``..::.............:...,>I#N@@NWW@@@$X1;..:`..........::.:~*$@@NW%%$K]+~:.......::.......................`+K@X!::.::']W@E*>;::...:..:,~+Y$NR1'::.............................................................................................................................
................................................................!RMY!:...........:/R@E]~:..::.........::.:..:::.,]$M@@R}~!'`:................:::..`i&N%F1'::.....:......:::...................../R%F;::::.:``'iX$%%ERFYIYXK#$N%R*"`:::..........................:...................................................................................................
...............................................................`+@$i:............:`:;]E@@R1~,:.::.......:...:`;l$%X~iKN#+,:.................::::..`..`>X$NN%@@@NN%/`..:........................'K@&`:........`:::.::;~!~!~;`:...:`:...........................::```,,,;;;;;;;;;'';,```::............................................................................
...............................................................:i%N+`:................`!]RMNWKl+',`:::..:`'"}&%@R1,..!F@NI~..,:.........................`;~>!i*EN&":.:..........................1#WI,.:`................::........:::.........:....`,;~>/]IXK#$$$$W%%%%%%%%%%%%%N%%%W$E#RF*}+";:............:.......................................................
...............................................................:!INRi::...............::....;i]X#$%NN@@NNW$#Y/~`.:`.::.;]$%WFi;:::`.....:....::.....:::.:`'+#N%X~:.............................:.!YN#/`..................::::::..::..:`;'!+]X#%N%%W#&Y]1i~;;,`:.....:..................:::,~+]&EW%WEX1~,:::.........................................................
..............................................................:::'F%R+..........................:`,;'''';,`::...::::::..:,>IE@%R*i~`.........:...::..:,"*RWN$l!`.`::...........................::.,1NW],:............::...::...:`'>]FREWW$#Fl/";,,``:......:::.....::....................:....:`,'!+I#%$Kl",...:`:..:...............................................
.............................................................`::;+R%#}:..........................................:::.....`:::``!]KW%N@@%$EE#R##$WN@@@N%#Y/':......................................::+EWl..............:```~/YE%%WR]",.....................:...::..........................:::...::..:::.`/&WN&1~:.:.................................................
..............................................................:!I%$}'.............................................................:,~"+/]llllll]}/i"~;,:...........................................:>RWI.:...:::.....,"lR$$KY/";:......................................................................:.:`;!XWWF>,..:`.............................................
..............................................................iKWY,.....................................................................::::...................................................::::;lWR+::...::`~/Y%%#Yi':.....................................................................................,+R%$I!.:::..........................................
.............................................................:}EEi::::..........................................................................................................................:.,lNWl;.,:.`!l#%W&/~`.::.....................................................................................:::`!X$EX>,::::.......................................
..............................................................}$#~:::.......................................................................................................................::`!I$%K+'`:;>X$%R1;:::..:``.........................................................................................``..'l%%F>...::....................................
..............................................................+R$]`:::.......................................................................................................................~Y%$Xi`.:!lWNR]!`..::::...................................................................................................,]E%&~:......................................
.............................................................:.iRN&"`:.......................................................................................................................:~&%K1>&%$*':................................................................................................................~&N$],....................................
...............................................................`"I%NRl!`....................................................................................................................``.;KNNWR+,::..................:::.........................................................................................:.:`:i#%&>...:..:::..........................
...............................................................::..,+&@#i`.`.:..............................................................................................................,"*W@NF``..............:::::``,,;,,,,,`:....................................................................................::....~YNR/;:`:...:.........................
..................................................................:..!KM*'...:.............................................................................................................!*$MWI":..::......:,~i}YKR#$W%%%NNW%%NN#1,.:........................................................................................,/$%Y!::::::.........................
....................................................................:iNN},:::.........................................................................................................:`;i#%WX~::::..`~i}&$NN$&Y]>;`::.......::...::............................................................................................../R$Y':............................
.....................................................................!E%];..:.::..............................................................................................:..:..::`i&@%Y"```.`!}&$$EKl/!,`:...................:..............................................................................................::"F@K>`.:.........................
..................................................................:..`iW%X"..::.:..........................................................................................:..::"IFYIF$NE/`:,"lW@WX+':.:`:.......................................................................................................................::.`>K$I~..........................
......................................................................:!XW$]~`.....::..::::..................................................................................:::}$%$WMWI~:>Y$%El>;...................................................................................................................................:!&WF,::....:..................
.......................................................................:.`>XN@$Y/~;,`,!1l1,............................................................::...................,,,>$NNN%I!/RNR]~:....::...................................................................................................................................`1#N1;::.:..:................
........................................................................::::,"]&$WWW%N%%@Ei::`:................................................................:``:....::::.:,+E@N@WI*#$F",,:.....::....................................................................................................................................`+$N};...::.:...............
........................................................................:::..:::.......~YNNE}'::,`.........::::.........................................~1X#N@N%$RF*1>~'~"+*ENN%N%E$M%1,.`:..:........................................................................................................................................::.:;&%F".:.::................
........................................:.....................................::::.:,+KWWRYW%$F+;:..:...::`iY#R>,::`:...:.::.........:``.:`:.......:::;IEW#X}}}]l*FE%NNN%%%@R**#NNN%Y':...:,;'!"i+i"!';`....::...........................................................................................................................::~&WF,::..................
...............................:``:....::..............................:...::..`'1K%NE]~::`:,"}&N@@@@MN%NNN$X*#N#l!`:.::.....::~*W@NX+;.:.::::....:.~YM$};..,"lRNMWRFXYYYXF&K$N%%EX1>]I&$MN#K&Y*l]l*X&RE$%N%R]!;:.::::::....................................................................................................................~IWR~:.:................
.............................,+#W%$F/~`..............................::::...;i*#NNK}~:..:``::...`;~>1]1}]+~;``;]ENEI/~`:..::'}K$EKYW@NEF1!,```:.:`~]#%K>,;iYWWRl"',:..:::..`:`'>l#%NNKIY#@W]':......:..:`;'>]F$W#Y1':.:``...................................................................................................................."XN*;..................
..........................::;]M#>`~IN%I'..........................:..:,'+Y$M%K}~:.:.....'}E#i`.:...:`.`:.:`...`,``~}#@M@%N%WEKi,.'Y@},`>]&WN%@NNN%EIi,`"KNE/,........:::.....:``:.;1E@Ki`'Y%R+:...::........:`..`!}%@E*'.:`:..................................................................................................................!RN];.................
......................:::.::,}@&!:.:i#%X;..::.:::.......:::.....:`!1YRE%EF}",`...:::::.:/#NY~...................`:.'K%X!,'';`::.."RN+:....:,,,,,,,``:'YN#]'..:.............:...:...:;I%E}.;FWY`....................`"*E%I!`................................................................................................................:::;1NK>.:...............
..................::```:``,:;}N$i:.::;1RNEI+!;```````'!">/lXK%NN%$&l>;.............:::.}EW*`....................::,/%#/:......:.'*MF~:............:`}E%/;::`..::......................>&NKl#$*........................`>$NI;...................................................................................................................,XWY'................
........:::..:'i]XREEE$$$E&*]IE@*'.:::`'iIK$NNW$$$W$%%N%$$%%K1>~;`:................:.:"RNK'....................:..'*NX!.:.....::!YN];........:..:.`}E$/:.::.::.........................+RM@#}'.......................:::!#$l:..................................................................................................................:+#Ki................
......:::`~I$@WY+':.....:`,!/IR$#}`.:...:::.::..,1$@l;.:;&N#!:..::...::.............`>$NX!.......................:i$%1,.:......:/EW!:............`}$R+::...:...::.............::::::::..!#%1,.......................:::..iKE/:.................................................................................................................:,&$*................
......`.'}E@&/;....::.........:,;`:.............'*@#>:.`}$$]:......................:~Y@E/::....................:.,1@Ei:........:}$R':.........:..;R$l,.:...:.........:,'>1*YXFKR######R&&EM&i``..........................,I%F,...................................................................................................................*$K'...............
.......'I%#~:..................................:+#N*'.`"E@X!:......................~YME>:.:......................!X@I'.........'X%*`............`>N#+:.....:.:'il#%N%$& />!`:........:.:`~KNY;............................+R%!:..................................................................................................................1E#":..............
....:../#$/:...................................`]%%>`.,}N$1:......................:1$%];.........................iRN},........."&W1:............,/@Ri:.:::;iIRWWK}>'`::...:`;~">++++++>!~;1EKi............................>KN+,::................................................................................................................/#Ei:..............
..:..::FNK~.:..................................iK%F,..!RMY~.:.....................+R%Y;.........................:}W$!:..:......iR$i:............,/@Ri`~iFW%F>,::,:`~+IEN@N$#&Y]1>>>>>>i/*K#W%&~...........................>&N1,..:...............................................................................................................>&Ei:..............
.......XNR'.:..................................1EW]:.,1NM],.:..................:.`X%R>.........................:;IN#~:..:......1EE":.........:..`i%E]/RN&1~:..`!*#WWEX}>',`::.........:::::!XNR!:...:..::.................>&N1,.::...............................................................................................................!FEi:..............
......:+R$]`:................................:,FN#":.!Y@K"..:................:..`lWE}:..........................~FNX`..........*%#!:..........::.,F%@$l`:.:!I$NE1'`:.::..................:`::"FN%Fi`.`:.:.................>&N>`..:.............................................................................................................:.+REi:..............
......:;I%R~`................................:'RNF;..iKMI'...................:.:!ENX!..........................."&%Y`.........:X%R!:.............`]W$l`.:>X%$*",.`:........................:.:,~}&#X;:..:................:/E%~:..:...............................................................................................................1##>:..............
........,}NN*~...............................:+$W*..:}$N},.:...................'INR+:...........................iKWl`.........`F%&':..............`l$#iY$#]`:............................:::....:::...:..................'YWI`...................................................................................................................l$K~:..............
........:;+$%X":.............................`]$$}..`]%%+,::..................:>EM*~............................1EW]`.........,&%F;................'INN@X"::`::..........................................................+#Ei:...................................................................................................................Y$Y`...............
............>F%NK+,.:....::..................`I%#+..,*N%>`..................`.~IN#>:.:.........................:}E$}`.........,&%F;.................,]N$i:..............................................................~K$*:..................................................................................................................:"E#/................
.............`!*#WEY+,:..::..................`X%Ki..;IN$>`.................:..+#NI~..:.........................:l$$/:.........,&%F;...........:......;}NR+:..:.........................................................`YWF".................................................................................................................::`lW&"................
............:.:`..'/Y%N@%&]>;:.::::..........`Y%R+..,*%W>`................::,"Y%%>`............................:*W$/:.........,&%F;..........:..:..::..~RNK!:.........................................................~X@Y":................................................................................................................:.:"WE1::...............
.....................`'i]XE%%$RKX]+"';`:.....,I%#/..`]W%i`...:....:..:;~i]FEEWN%X;.............................:I%E+:.........`&%F':.................::.'lEE};..:........................................:...........~I@K":................................................................................................................:..;*NX":`...............
...............................`'i]IK#$%@N@M@%N@%#FYYK%NKYYF#WN@MMMM@%#K*+~`:+KE}`.............................:I%E+:.........:Y%K~:......................,1W%Fi::........................................::..:....`1#Wl:...................................................................................................................:;1WE>:.:...............
.....................................:`,''~"i//1]l**IYYYYI*l]]]1+>!',`::..:..]$#>:.............................:I%E+:..........*W#!:.......................:!*EW&!`..:......................................::.::.,*W#}`....................................................................................................................."FNl;..................
..................................................:`:...:::..:.............:`XWF`..............................:I%E+:........../##":........................:.:~]%W&1;:....................................::..:>F@E+,.::...................................................................................................................>&WI`...................
...........................................................................:'KWY:..............................:*W$+:..........iREi:............................:,/&W$I>,............................:::.:...`!XWW*~:......................................................................................................................`IWK~:...................
..........................................................................::1$E}.:..............................lWW1:..........~X$l`.................................,1#N%&>'`.::...............:::......:'1K@%*~........................................................................................................................:;&%X~.....................
.........................................................................,~>l$#1...............................:l$$}`..........,*WF,..................................:`~/Y%$RY+;`::......:::::.....::,>*KW$X>,::::......................................................................................................................'I@Ki:.....................
.......................................................................`:+#@NM@$&]i~,`....:.....................]$W]`...........+#%>`...............................:::...::..'}$@M@@NW#&XIIIIIY&E%NN@MW*;...`..::......................................................................................................................>&N*'.......................
........................................................................'Y%X!~>}X#$WWEKF /"';`..................1#$]:.........::!Y@}'............:.................::`;~i1lYFREW%W#KX11}lIFFFFFI*]Y%NF&W$+,.::......................................................................................................................::."&%F;........................
........................................................................"&$]:::::`...:`~>1lREWN@MMM@N%$#&X*]111+l#WY~,`::,```,,`'}WRi,````,;';'~!">i/}lIYF&R$%N@MMM@N%RF*}+!',:...:::.::::.....:.`>&NX>>#@X>`....................................................................................................................:..:,l$#1..........................
........................................................................+KE1`:.....:::::....:`,;~~!>i}l*IYK&&K#WNN%N%WWW$E$W$E$$$%@NW$W%WWWW%N%%W$EE#K&FXY*l1/i>!';,`:::...............:....:...:.!EMY~:~FWR1,:::..................................................................................................................:~YNR+:..........................
.......................................................................`lE$l':...:`::::.........::...:::.....:'KWl`.......:::.......:}W%>`:::::.......::...................................::`;+I#N%W@%Y;:~*$@X~..:...............................................................................................................'IWW1,............................
.......................................................................:'l$NWEKI+~;`:.......:::......::::....`"W#/:.:...............:/EN1;::........................................:`!>i1*&#WNN$Kl"!l#NW$$%N@M$I!.:.......:................................................................................................:.:::!&$F!:.............................
........................................................................+KE1`:,~+YRW@@NNEX1i!;`:::...``:.....,/%F":`:..............:.iRN1,.::..........:::::::.........:,'~i}Y#%MMMM@NN#Y]~>+}Y&KKX]IWWI``:...:>F@%*'..`..:`:...........................................................................................:..::`,+$@X!................................
..............................................................::..`'!">1#E*;.::..`::,~">1I&R#$WW$#K&&FXYIl11/}&MX"::....:::::........>K@]~,,:```,,;;'''''''''!i1]YX&#E$$WWW&R##KY]1i~;:;/&$NEFIll*XE@%]`:.:::...;1RN$Y>:::::............................................................................................:::::>FWR/;.................................
.............................................................::!I%%KI]l%MK}}&$N@@MM@@@NR]~............`,,`:,~/&@WRYl1i"~',,,,,;;''~i1YEMNNNN@N%%%W##RRR&&&&&KF*}+~,:...:,!1NN$RXIY&#%M%%EI'..::.:...`...,:......::'KW%N@&+;:...........................................................................................::`~*%%*;....................................
.............................................................`*$WI!:.::;lE@WI1"';,,;;'+I#EF!:.::.`,;~,::.:...:;!i}IX&KR####E$E##RRR&FXYl!;,,```::`......:..........:``:iX$$}";:....:;>F$K~..:......::..:......:...`I$Xii&W$X+,:::...:..................................................................................`iX$$*~::....................................
...........................................................`1NE1:..:....:``....:........:iE@%%NNW#&XF$N%F"`:..`:::::..:``:::......:...::`::.......:::`;,::;+IRW@@%EY+~XW&>:..............::...:...................'KW*,`..'/XNM$*'..:``:::::....................................................................:`.:!l$@E]'..:......................................
..........................................................:>#%/`.`:.::.......::........:.,}W&1~,`:..:.!I$$1,,!>]]ll]/~:.:`:;i]**IY*li',...,>*&K#EEE#X/'!I#$#Y]+"">1Y#NM%]`:...........::::..:.................:`,iKNY~.:`:::`;i*RW$F1~:.....:..................................................................:`~}K$#Y",:..........................................
..........................................................,}@$i`:.::..:..............::..:..```.::...:::!X@@Rli~;,,!IW%X~Y$El'`..:,']EN$$@WY>,:....`>XMM&>:......:....::.............:::.:................`l%MN@%&/,...........:::.;1KNM%K]!,:..............................................................,1&WN#l~:..:............................................
..........................................................`iR%},.:::::...::...........:....::.........::,+Kl~.:..::..!*E@W*!:..:.....;1$W*!`:.....:..`!]>;:.......:.............:..:.::............::......1$W1~,`...................:,"+*KE$E&l/~`:..:...:.................................::........:,!1X#WW&}~`..................................................
........................................................:::.:1E@$I/+l#@X~............................:::.............:..::..``.:....::.........................................:``:.......::::::,!>!....../#%&!`.......................``:...:;!/&ENMN%#Y/!',`.............................::``,!1YE%@@$*i;::..``...................................................
.............................................................:,!}IYXXF$N*'..:..::....:`:..:..............:.:::......:......::..:............:...............................:.:;'`.....:::::.:;}E%$$%EK&KEWNN#+,:...............................:::,'"+}IF#$$$E#KFY*l/+ii>!!~~~~~!">+/1]lYFK#EW$#&Y}i~`...::........................................................
................................................................::....:+#NE*;`;~"]&RY"...:.............:.........................::........................................,`']%MM%#X1>~,;~+Y$@&1'::.....`:,1@N1,..........................................:......:,;">i++11}}}]}11/i>!~;.....::.....:..............................................................
........................................................................,>l&##$%$#X&EE1;::..::.:.:~+i:.::..........::::.....:::........:...:............`::'lYl>:..........,1R%Ri!i]XE$$W%$#F}!,:.........::'*@R+:..................................................................................................................................................
............................................................................::}$E~:`!lENN%%KK#EWMMNW@#}'.::...::.`!}Ili;.:::.........:~1$$*~.:..........`+&@#YX$@%F1"~'"]R@@&+,:``:.:........::.............:`]W#/:.................................................................................................................................................
.............................................................................:/EN},..``'>/}l]}1/i!;'+F$$KIl/i+}YRWWRK#EER*+~,::`'"+}FEWEFK$EY1";:::.:,!]R%El~::;>]F#$E$$#X}!`::`.::`.....::..................:,X%R".:...............................................................................................................................................
..............................................................................'*MK!::.:........:..:`:`..`;"/}}/'`:.:....,i*KE$$$#Fli;:.....`"}XENNMMMW&]~:.::...``:...::::`:.....:::...........................,l%%/`...............................................................................................................................................
.............................................................................:`+N%/`....................:..........:.........:::....::.........:``,,`:...::...................................................::~I@R":..............................................................................................................................................
...............................................................................;*NX"............................................................................................................................:']@Ri.`............................................................................................................................................
...............................................................................`+%E/..........................................................................................................................::.:~&WY!.:...........................................................................................................................................
..............................................................................::`I%K>:.............................................................................................................................`Y%#":...........................................................................................................................................
................................................................................:>E$l:................................................................................................................::....::......>K%Y':..........................................................................................................................................
..................................................................................}$$+:...........................................................::::::.......................................:...:`:...:`;"1YRW@@M@@M%*'..........................................................................................................................................
..................................................................................!X%&;:::............................................................:::..............................:....:::.:::`,"1IKEW%%EKFIl}+ii*N$+`.........................................................................................................................................
..................................................................................:>&N*'.:...............................................................................................:`:::,"l#@MN$X/;::........:::'INK>.:.......................................................................................................................................
.................................................................................:.,1N%/`.:...................................................::::~/IKR#KX]>,:.:.....:.....:..........::..:'/XE@W&l>'`:...........:.:.`"EW],`'"i++/11/i!,:..........................................................................................................................
..................................................................................::,/WE1:...................................................:.:>K@K1;.``'1KN@R},:::........::.......`.;}E%N#]~:...::..............::`>&MMMN$EF*}/ii/]YK%NW&"`......................................................................................................................
....................................................................................:;X%&>...................................................::>&NF!::..::.:!]&$%Y>,.:..:....::.:::.:!I$%El",.:::..................`.:~]]+!;`..........`,>I$WX".....................................................................................................................
....................................................................................:.;XN#":.................................................:;*$#~:...........:;I$N#}':...:.....:!*NMFi,`.:`::....................::......::...........`:.:]$R/....................................................................................................................
......................................................................................."&NF':................................................."&%X`..............:'}#@El~:.:...:,]#%Ri;:.:.............................................:..::~&%F:...................................................................................................................
........................................................................................~IMR!..:........................................:::::.iKWI`................:.`>KN%*':.']%@F~....................................................::::!R%Y`...................................................................................................................
........................................................................................:!KNY!....:....................................:::...:+RE1:..................::,+&N$}i*MW]'.:.....................................................:'Y%R+....................................................................................................................
..........................................................................................,&NR}!;,:::..............................:...`!i}I&$NMEi`....................````1EM@#~::::..................................................`:'l%@I~.....................................................................................................................
...........................................................................................~F%NW%WERKFY*}1/+i>""!!~~~~~~~~~~!!>+1}lFK#$%NW#K&lX$$}`.........................']#NFi`.`............................................::...:;}KW#i`.::...................................................................................................................
...........................................................................................:,l%$i,`,'~!>+/]IX&RR#EE$$$$$$$E#R&Y*}+>!~,:..:::::;I%R~:..........................`~R@E],.:..:.......................................:.:"I$@R};..:......................................................................................................................
...........................................................................................:.;]@%1,....:::.......::::::::::::::..............:./E%+,.........................:..`}EN&":......................................:::`!lR%$X>,.:`........................................................................................................................
............................................................................................::,+$@X~:``::......................................'*@W+`.:........................`..,/E@F>:...............................:.:,!*#@@$Y!::::............................................................................................................................
..........................................................................................:.,+F%W*~.:...........................................!R@I~..........................::::`!K%R1`.....::......................,>l&EWEF}!...................................................................................................................................
.........................................................................................,iK%$I'.::::........................................:..:'$N*,:..............................`~IN@Y~:::``::..::...:::.::;>]R%@@$X1!`:.......................................................................................................................................
........................................................................................"YN$l~:.::::.........................................:..:`]W#/...............................:.`>YWW&}!,:...:..:`'"+]YK$WWRFli'`.:..........................................................................................................................................
......................................................................................`YNE>:.:::.:..:............................................:,XNR,................................::..`>l&@MMMM@@@@NW&]>',:..``................................................................................................................................................
.....................................................................................:>E$]..:...:...:..........................................:`:;F%&,........................................`;~!""!~;`...........................................................................................................................................................
.....................................................................................:~R%X,.......:::........................................``:;]NWI!..............................................................................................................................................................................................................
......................................................................................:/R%Ri;::......::.....................::::............:~1XE%K1'...............................................................................................................................................................................................................
..................................................................................:..::.:']#N@N%WERKKK&XI*1/i"!''''''';;;'~~!!i/}lIIXK$N@@@N%&]"```.................................................................................................................................................................................................................
.......................................................................................::.::;!i/]]]l*IYX&KR#E$$E$W%%%%%%%W$$$EE#RK&XY*]}1+"',:.:`:..................................................................................................................................................................................................................
.....................................................................................................:::...........................::...............................................................................................................................................................................................................................
....................................................................................................................................................................................................................................................................................................................................................................

*/