以前发过基于PIL模块实现其他图像处理的文章https://blog.csdn.net/sm9sun/article/details/77703551
今天偶尔在网上看到了一些关于图片转换成字符画的相关内容。
其实这个也蛮简单的,无非就是把原画本身的颜色映射成不同的字符,字符可以按照填充系数排列(比如说@这个字符填充系数最大,.这个字符填充系数最小)从而实现字符画呈像的效果。
通常的做法是按照原画的灰度值来排列,比如说黑色我们用@,白色我们用. (文本的底色是白色的)
图像的灰度值公式:
1.浮点算法:Gray=R*0.229+G*0.587+B*0.114
2.整数方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*77+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
也可以用convert("L")方法将其转换成黑白图,再求取灰度值参数。
完整代码:
# -*- coding: utf-8 -*-from PIL import ImagecodeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. '''#生成字符画所需的字符集count = len(codeLib)def transform1(image_file):#黑白图image_file = image_file.convert("L")codePic = ''for h in range(0,image_file.size[1]):for w in range(0,image_file.size[0]):gray = image_file.getpixel((w,h))codePic = codePic + codeLib[int(((count-1)*gray)/256)]codePic = codePic+'\r\n'return codePicdef transform2(image_file):#灰度值公式codePic = ''for h in range(0,image_file.size[1]):for w in range(0,image_file.size[0]):g,r,b = image_file.getpixel((w,h))gray = int(r* 0.299+g* 0.587+b* 0.114)codePic = codePic + codeLib[int(((count-1)*gray)/256)]codePic = codePic+'\r\n'return codePicfp = open('img/nine_sun.jpg','rb')image_file = Image.open(fp)image_file=image_file.resize((int(image_file.size[0]*0.75), int(image_file.size[1]*0.5)))#调整大小,针对于记事本视图print (u'Info:',image_file.size[0],' ',image_file.size[1],' ',count)tmp = open('img/out.txt','w')tmp.write(transform2(image_file))tmp.close()
测试样例:
用记事本打开输出文本,选择(宋体 小六)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-<i!!!lllll!!!>+(@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@QQQQQLi!!llII;;;;;;;;;Illl!!<0QQQQQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@QQQQOtUQnI;;;;:::::::::::;;;II\QLu0QQQQ@@@@@@@@@@@@@@@@@@@@@@@@@@@@QQ_!!lI!Qn::::::::::::::::::;\Q<ll!<xQQQ@@@@@@@@@@@@@@@@@@@@@@@@@@@r>llI;;:QC:::::::::::::::::::vQ;;;ll!?@@@@@@@@@@@@@@@@@@@@@@@@@@@@>!lI;;::::::::::::::::::::::::::::;;;l!!_@@@@@@@@@@@@@@@@@@@@@@@@X<llI;;;:::::::::::::::::::::::::::::;;;ll![@@@@@@@@@@@@@@@@@@@@@@-i!lli+++~<!:::::::::::::::::::::::><~+~<;Il!<p@@@@@@@@@@@@@@@@@@@p])-^........':<{~;:::::::::::;~|i,........,<{_i@@@@@@@@@@@@@@@@@/)>Uz?..............^_;;;;;;;;>|[zY'............."1a@@@@@@@@@@@@@@|'\dddd,..............')I;;;;;)"Idddd1..............<\@@@@@@@@@@@@|+.tdddd<<-1)(1}?!:'....?>;;;;l..idddp(>[{)){[i,......!8@@@@@@@@@@@u1i+1->I;IlIII;;::,,l<+>;;;;;;;<!<|]<,,:;;;;;;;::+})>![#pI@@@@@@@@@@]li<_-?--_<ilIIIIIIIIIIIIIIIII:::IIIIIIIIIl!>+_-??_il>#kZ@@@@@@@@@%~~_-][}[[]+<iIIIIIIIIIIIIIIIIIIIIIIIIIIIIIi<+?][}[[?_+)*o@@@@@@@@@(<~+-][[[[]+<illIIIIIIIIIIIIIIIIIIIIIIIIIIIi<+?][[[[?_+_&%@@@@@@@@@?>><~__--_+<i!lllllllllllllllllllllllllllll!!>+__--_+~<<wB@@@@@@@@@+>ii!ii>>ii!!!lllllllllllllllllllllllllllllll!!ii>>>ii><r@@@@@@@@@@~>i!!!!!!!!!!lllllllllllllllllllllllllllllllll!!!!!!!ii<f@@@@@@@@@@+<iii!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!ii><n@@@@@@@@@@?<iii\1!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!x!!ii>~C@@@@@@@@@@)~>>i{X!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!/iii><+@@@@@@@@@@@L~<>iiL|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii?_ii><<1@@@@@@@@@@@@}<<>i)Qiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii~Lii><<~w@@@@@@@@@@@@w~<<>!j(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii?QXi>><~~@@@@@@@@@@@@@@~~<<>!QX<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Qcl>><~~]@@@@@@@@@@@@@@|~~<<>_LQ>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>(Q1l><<<~_&@@@@@@@@@@@@@@@(+~<<>l|Qv+>>>>>>>>>>>>>>>>>>>>>>>>>>>><QQxi<<<~~_W@@@@@@@@@@@@@@@@@f~~~<<i1LQx+>>>>>>>>>>>>>>>>>>>>>>>>tLQtl!<<<~~+@@@@@@@@@@@@@@@@@@@@_+~~<<iliQQQf-<<<<<<<<<<<<<<<<<<\UQQv<i<<<~~++/@@@@@@@@@@@@@@@@@@@@@)++~~<<<ll[QQQQYx}-~<<<<<[|rQQQQY)l!<<<~~~+-b@@@@@@@@@@@@@@@@@@@@@@@W+++~~~~~>ll!fYQQQQQQQQQQQQr{>l!i~~~~~~++_@@@@@@@@@@@@@@@@@@@@@@@@@@o]++++~~~~~~i!lllllllllllli><~~~~~~+++_c@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B+++++~~~~~~~~~~~~~~~~~~~~~~~~+++++]@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@h1_++++++++~~~~~~~~~~~++++++++_X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Bn?__+++++++++++++++++++__|b@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@pf____+++++++++____UB@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@WOXrf/frCb@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................''................................................................................................................................................''.`~,........''..',^'``........................................................................................................................''i;':;'.'''```'..'`l!:`;~i!<l"'......................................................................................................................`:\['.`-)I'',"'.....''...''.''........................................................................................................................'..>+''-l:.......`''',;:!,`'..'.......................................................................................................................[f>_''.'..'''';.^,.''+1_>~^''`'....................................................................................................................'"'I/<.''``':"''`^II'i;".'............`........................................................................................................'.;....''.'>;>I\)`'`^'...'^.''";^;''.'.......`........................................................................................................'..`'....'`|t\IIi^........,`..'``........'.........................................................................................................."'.,'''.'.<t<i/([''~:'....'.'lI!^l"'''..'`'..'.;`'..................................................................................................''!'`'l'`':'.`|_,``'`''..'^"``?|(|}!;'''...`^"`'`''...............................................................................................'....^;':...[`.;]);|1i,'.^;'.^[]:::"]+>>i:,,`'.'",,"'..............................................................................................",x:''...'.'''^'i]^'"I[;f.^!`''....`;"",^''.........................................................................................................'''1v|"''...'.^;,I'^:'..',*@BmI.'.''....'.`.''....''..............''umC`................................................................................;(r\l.!''''";l`''.'`.`t_f@@@@@8...'.`^```......................d@@@@@@@B''..........................................................................:`!|/:i~''''.;,''.''!';)fj`d@@@@@c.`'..........................-@@@@@@@@@@@B.........................................................................'.'^',\1,~.`!'...,`''^}{{I)?~w@@@@&@@@''..................'....B@@@@@@@8@@@@@k...............'...`.'.................................................''';)}x?1(`)~'....'^l,:l.'l<"'@@@@@@@@@@@B.................xu'.B_...l-...B@@@@%..........'.^:;'I!ruxXunr?^...........................................'.'^:]{'""<vYv.'....`'_..'`'.!B@@@@@@@@@@@@@................'@B@8'........B@@@@%......''+[-1xY0COZZZJdwkdZQcl`'......................................i,Il'`.;`"!,vn|{..'^"~..i,.j@@@@@@@@@@#.B@@@B.................B@@@'........B@@@@\.''',?jrvCLJwkUbhamQp#&W#hqk0c>.....................................'.`'''i':+['[ux1}_,''<.';%@@@@@@@@@@B...B@@@@..................@@@@v..'''...B@@@@l'i}//czvZbbpho*WWWMb#WW&&&WWp0n>..................................''''.[^'`'?x+t_;x[jll'd@@@@@@@@@@@@@@W...(@@@W...................B@@@?`B@@B`..B@@@@f(tYcYQZZqh###M#W&&&WM&W&&8W&MapX|'................................."'>f)|?'!;1v\.-,?;`,'.]@@@@@@@:@@@@@...(@@@B....................B@@@@@@@@@@0.B@@@@zjYO0qZ0Ydb*WWMWWW&WW&&&W&&&8W&MmX<................................".';,<[.'^^t)'``,I{}>'>^'._[...@@@@@....@@@@...................."@@@@@@@@@@@{.B@@@@vYCZqqbkhaMMMWWWWWWWWW&W&8W8&8&8hC\\'.............................`^_`,\1"':.+\`:!"`!xf+(]!......w@@@B....%@@@].....B..............l@@@B@@@%u....@@@@@zJzzdbhaaoWWWWW&&&8&WWW&&88&&&8&M*OYuI............................i<'Ir,>^(jt\[^..;,/ufx(]I'^...~@@@@....'@@@r.......k.............>@@@\........'@@@@@zcJUwZdo*o&M&&W&8MWWWWMW&&WWW8&&&WamU1'...........................'`i'>f>f[,v|'^'..+/xxj[!+;'..h@@@@'....@@@@........J8............I@@@`........'@@@@@uvuQLpkhoMMW&WMMWMMMWMWWW&WWW&WWWWWdZvI............................'.|,':/txr>`.'.'[_l\!`i!^..h@@@@[....n@@@Y.........@@L..........'@@@....'+'...@@@@@tUQQqdhk##MMWWMWM#WWWWWWWWWW&&W&&&W#kLf;.'......................_j?/xcr>`!|r1'};".I::)[lIX;'.B@@@@......z@@@..........@@@B..........B@@h@@@@@@B,'@@@@@YCQObkk*##MMWMMMWMMMWMWWWWW&&W&&&W&Mhmrl.....................'.'|cnr}`\]`I'l:"'^`'~"I)}<~|B%@@@@B.......<@@@@}......_@@@@@@l........B@@@@@@@@@@@}@@@@@/vJzddo#MM##MMMMWMMMWMMWWW&W8&&88WWW#mri......................'"~f?``+,':+'''.:~"!'._j:'>'@@@@@..........\@@@@@@@@@@@@@@@@@0........l@@@@@Bh).v@@@@@@@jtzQ0do*MMMMMMMWWMWWMW&WWW&&&&&8&&&&#dn)'.....................':'.^?||^_It/[';]'`'~jtt]!<..|?..............B@@@@@@@@@@@@B,...........>%B{...'..h@@@@@%/nrXCZpo*o##MMWMMWWWW&WW&&&&W8&&&&WWMpXx`.'....................``'';r|.''nr\''I`(\~fr|?I:.......................`li'............................B@@@@/\/fu0Zwba*M##WMWWMWW&W&&&&&W&&8&8&&WWawx>......................^.".>;'I!.|f;)ru?v)`jx(>'........................................................-@@B"+_/txCQmdho#*MMWWMWMWWW&&&&8W&&8&8&&&&#Oci'.....................;''``~l~^`l1`rUUXYzvYx|~-`........................................................Z|'",+(1rYOwbhao*##MMMMWWM&&&&&&&&W&&&&&&&MqJ<'.....................(,(\f(.,`^~!'/x/,1rvnj+)~`...........................................................`"!|1vULmqba###MMMMWM#WW&WW&&8W8&&8&&&W#Zv:.....................'''~'+t^.^';^'','`tfYzvI[~.............................................B@a`...........'^:~(1rULmd*#MMW#WWWWW&&&&&W&88&&8&88&WM0|'....................'Ifl'IzuI^~';,`.};\vnQYY()_.................d@B-........................-@@@L'..........'^lI))tzZqoMMMWMWMMW&&&&&&&&W&&W88&&W&Mdv'.'..................'`-/f(Yz?:cUu1,!}\vJUO0Lu|?'..............%@@@@@@J......................+@@@M...........'^:<_)tX0ma*MWWWWWWW&WW&&WWWWW&&&&&WW&MpzI'....................:`iI'I!]j\CLu`jc;,CcqZ0nf-'...........'@@@@@@@@@@'.....................d@@@@B`........k@B8-_/jvOwa##WW&W&WWW&&&&WW&&&&88&&&&WWqz;......................`!`:)}]l{zv)^;zJJwOQ0Ocf[.........M@@@@@@@@@@@@d.................tbu&@@@@@@@a..c@@1?@@@@@@v})cJZo##MWW&W&W&W&WWWW&WW&W&WW&WWWQt`.....................I''l<]_'I",{`'1[_YmJm0Czr1..'......./@@@@@@@@@@....................X@@@@@@@p'....B@@B8b.%@@U()zQZo#MMWWWW&W&WWWWWWWW&&W&&&&&&MbJ-'....................`.`it+!.`''itlICwpbppqwJXf`.'..........0@@o@@@Q......................U@@@@,^.....B@W'...%B@f|/cCm*##MMWW&WWWW&&&W&&WW&W&&&&&�v'.'...................`.I,'|{.''fjr;[UdbdkbdwUufi...............8@@B.......................t@@@@@@@Bh.'%@}'1..%@@](1jUOoM#MWMWWWWW&W&&&WWWWWW&&8&WW*v<'........................`'|?_I.`UX`!ZhbdbdbwCxv{'..............@@@h..................b..:@@@@@@['@@@8`%@@@@@a@@B>]/xCqo#MMWWWWW&M&&&&8&&&&W&&&W&WW*r,.......................`.)`jf',"?UOY_ZbahhhhbQXJf,'............w@@@@B.................B@BC'`(XL_.,@@@l'%@@@@@OB@&+ffcwaM#MM&WW&W&&&&&WW&8&&&&&&WW&Wh]`'......................'.}xuUz,njLZt^LdoaohhdwOLz-.......!OMB@@@@@@@@@Z...............i@@BC@@@@@~U@@o.B@@w'@B'B@w[1rQwh##MM&&MW&&&&&&&&&&&&&&&&&WMMw)'......................`+I-fivLZQcZkqnnboohaakbqOU/;....@@@@@@@@@@@@@@@B................;B@.'W@@h.%@@'@ZB@'&@'^BBq]\v0haoMWWW&&&8&&&W&88&8W&&&&WW&W*Y`''.....................'!x?`',?Y+YwhamQo*#*aohdkqwYt....@@@@@@@@@@@@@@M..................8@'X@@%h%@B..b:BB'%@@O*@0{/cZao#MMWWWWW&&&W&&&&W88&&&&&&8W*x..........................<?I"zw<:I)Lo#o####ohoakbqZU)'...zB'1Y'.#@@@@Y...................!@@@@@@@@@Y..#!%@.&@@Bz@dj\Cdho*MWWWW&&&&WW&&&&&W&&W&&&&WMk1'.........................".`._vX)]Jpo#*##M*oo*aahbwZc~....l@@BBB@@@@......................%@@@@@|.'....@@B..8@%c@btcLaaoMMWW&WWW&W&&&&&W&&&&88&&&Wo0"'.........................'i,jI^nrf_Xa#*a##M#*aohkbpwZu}'....M@@@@@@.......................`0`,@@@@@@@M.Y@8.Z@Q!f@#tUmdo*#WMW&&&MWWW&&&WW&8%&&&&W&Whr'...........................+-)u>uvx^/mo*#*o##*o*ahkahpZC{,...>@@@@@@dLLmoBB@'..............Q@@@@@r.'.'''%@@@@:~-u@8Ywpho#*#MMWWW&WW&&&&&&&&WW&&WWWMY/...........................''r;Xv`:<'|QhhoLoo####**oaabbqCt"B@@@@@@@@@@@@@@@@@;........>ZB@@Bb"'@@/......B@`@@<}}\@Bqhao#MW&&WWW&888&&&&&&&&&&8&&&Mon,.............................xCLzcvY~JL{baa#**o#ooo*aaap@@@@@@@@@@@@@@@@@@@@@@@1......h@@@*`...`@@r.....'@B',W@o|u@@qh#WWW&&&W&&&&88&8&8&88&8&8&&&Ww|`............................."YLc;!OwCJX0moMMM*#Mo*o*oab#@@@@@@@@@BOf!^``">C8@@@......'^[......'@@]....+%@^;!]#B@@@@oWM&&WW&&&888888&&8&&&&888&&&WMx``..............................|xl+'rwO"Cda#MMMMM#M##**oakw@%OYf!.'..............................B@.....'@;i-[}|Z@@@@aWW8&W&&&&&888&8&88&&&&WW&&8WMq~'...............................'//}jfzOX1}p#MWMMWMWWM##*##hwZZ0Lv}~..............................'%...',I~{1{\rzmpB@@*WWW&&W&&&8%8&8&&8&888&WW&W&Mbr....................................'"''Cqz?d#MMWMWM&WWMMM##MohdZO0Lv~''..............................'"I__1/jvz0bho#qwW&8W&&88888&88&&&&&&&8&88&&&#j`.'..................................)].([Cc'ZoMWMM#MWMM###M*M#**kqZZOU||i^^'........................`,>~?(rxXLwkho##MMW&8&&88&888&&&8888%88%%8&&WWoY^'....................................)f-,lvOZQjOoMMM*#MMMWW####*oohdmZZOQc(1_,"^''.'.........'''.,;<~l]/trzJZah**#MWWW&88&&&%8&8%8&&&8%%%8%%8888&&Mdl'......................................,Ir|,jZL_\baMMMMM#WWWWMM#M#o*hahdZZOmZz|{-~i>i,^`^`'^,"!l><]11ttxuJmbkho*#*oW&&&&&&&888&&&888888&88888&&&&&&pn........................................'_>.1I{-xqhhhMMWMMWMWWM##MM###*hbpwOmmQJYJYrtr{-]/}{-[r1j/|xzYLQwqdhhoo#M#WWW&&&&8&8&&WW&88888&8&8WW&&W&&WMbf^'..........................................~:}l;<JO\<wMM#WWWWWMMWM#MMWMM#oaabpwmZwmwqwZQ0QCJQUCCJmqmqpbdahao*#WMWW88&8&8&8&&888888W88&8&W&&&&MWWW#k\'............................................`"'`_1{<:)m#MMMMMMWWWW&&WMMWMWW###*ohbakdpppbppdbhdpdpdkkahaoo###M#MWW&&&&&8&&&&&&&&8&&W&WM8&888WWWWMaC['..............................................'''`(;<cUUmo##WWW&W&&&W&&&MWMWWMWMM##oo*ooaoo**##a**o#a##MM#MMMW&&888&&88&888888&&&&&88&88&8W&W&&WW#0_.'...............................................'l^'.'.\uXlk#MWWMM####WWWWWWWWWMMMMWM##*#MWMMoMM#oMMMMMMMMWMW8&88&&&&&8888&88&&88W&&8W8&88888&&&WhJ:'...................................................;]l\-''vwCkah#WWWMMMWMMMWWW&W&&&WWWWMW&MMMMWWWWWMMW8&&&MM&&&&&888&888&WW&8&W&W&&8&&&8&8WW&&&WM*ri......................................................^t^l>iXCQY{YmdoMMMWWW&WW&WW&&&WWWW&MMMM##oo##MMWWM&WM&&&&&&888&&&8&88WW&W&&&8&88888&&&W&M&8Mo).........................................................`,,,/)`:,^..`1dMW&WWMMMMW&&&W&WW&&WWW&WM&&WWW&&W&8WWW&8&888&&WWWWWW&&&&&W&8&88&8888W&&WM#azf'.........................................................'.._'`|:^'.?)'vdhMWM&MWW&&8&&&&&&&&&8W&&8&&WW&W&&&&&&MW&&&W&WWWMMWWW&&8&8&%88888&&888&MkO1^..............................................................''.`.''`'^_]'Qo##WWW&WM&&&WMWW&&W&&88&W&WW8&&&8W&WMMMMM#MMWWWW&8%88%8%%%8M&&&W#*##*w]^.........................................................................`[_Om_rOp*#WWWWMW&WMMWMMWMWWW&&W&&MMMWWWMMMW&&&888&&&888888&&&&WWMM**aamz+........................................................................'.'"jnJJc,UQljk*MWWMWWWW&WWWMWMWWMWWW&&&WMM#&%%&&88%8&8&&&&W8&WW&MMM#***kmX~'...........................................................................''':~vcfI!qp*MMM#MMWMWWMMMMMWWWMW&&WWW&&%8&W88&88WW&WWWWW&MWMWMMMM#ohL(:'...............................................................................'1/I'z/_OdqwMMMWMMMM##M#MMMWMWWWW&&&8M&WWWWMM#MWMWWWMMMWWWMMMW&*dX[''...................................................................................;xcCUXUphooa#hko#MMMMWMWWMMW&WWMWWMWMMMMMMWMMWMWWMMMWWWM#M*qX|''........................................................................................`i)tutlmOOUc;+mpqmko##W&WWWMWWWMM#MMMMM#MMMM&&&WWMM#od0c{.'...........................................................................................'..."+|{~x;_Yn!{':<?cCpaMWWMMMMWM####M#*#M&&&WWMoq0U}i''.'............................................................................................'....'.'`I1/f\-''..''"^<Ca#WMMMM#MM#*WWWW#MM#kmY]^''..'.........................................................................................................''''...........Uwo*#M##*ohhkbqOQUf<'''...............................................................................................................................'+(xuUXYXvf{>,''`'...................................................................................................................................................''....................................................................................................................................................''.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................