ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllllccclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllllllllclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclccllccccclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllcccclllclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllcclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllccllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllccclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllllllcclclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllllllllcllllllllllllllclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllllllllclllllllllclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllcllllllllllllcllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclccllllllcllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllcclllllllllllllllllllcclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllllllllllccllllllllllllllllllllllllllllllllllllllllllllllllllllllcccccccccc:cclccclcccllllllllllllllllllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllllllllllllclllllllllllllllllllllllllllllllllllllllllllllllllcc::;:..,;;ccccllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcllllllllllllllllllllllllllllllllllllllllllllllllllllllllc,..';::::,;''',,,,;:clllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcccclllllcclllllllllllllllllllllllllllllllllllllllllllllllllll::c:,,,;;;;':::;.':,;:;;,,,;:cllllllllllllllllllllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllcclcclcllllllllllllllllllllllllllllllllllllllllllllllllllllc:clllll::clc,;,,,,;'..:::::c;':;;::::clllllllllllllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllccclllclllcllllllllllclllllllllllllllllllllllllllllllllllc:clllllllllc::,:;;,,,,.'....,:,,::;''.. .,:;:clllllllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcccclccclcccllclllllllllllllllllllllllllllllllllllllllllllllllccllllllllllllll;;clllll,lll;'.'..',;',,;.,.;,:;'..;::cllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllllllcccllllllllllllllllllllllllllllllllllllllllllclllllllllllllllllllc::lll;lllc:;,...,;;',' ....;,..',,:;;;;,;cllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcccclcccccccccccccccllllllllllllllllllllllllllllllllllllllllllccllllllllllllllllllllllc::c,:;;::::''. ';:,,.,,;...,''::,:cc,';,,;;;;:clllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclccccccccccccccclccclllllllllllllllllllllllllllllllllllllllllcclllllllllllllllllllllllllllc',:lllll,cc;...cl.c;.,;.c:.,;;,,;,,ccc;;:.;:;;;,,,;cllllllcclllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllllllllllllllllllllllllllllllllllllllllllccllllllllllllllllllllllllllllllll::clll;l;''.'';.,;c;;:.;;lcccl;'.,;;;;,.,;:;;;:ccllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclccllllllllllllllllllllllllllllllllllllllllllllccllllllllllllllllllllllllllllllllllllc::l';.::c.,, .;,::::.'lllc;;'.,','',:lllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllllllllllllllllllllllllllllllllllllllllllllcclllllllllllllllllllllllllllllllllllllllll; ..,,::...,.;:;,.. ',,,;::cllclllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllllllllllllllllllllllllllllllllllllllllllllcllllllllllllllllllllllllllllllllllllllllllll'',,,;,:' ':.'::'.'clllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcllllllllllllllllllllllllllllllllllllllllllllcllllllllllllllllllllllllllllllllllllllllllllll;c.,;:c:,.;:c'.,;c:clllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclccccccclclclclllllllllllllllllllllllllllllllllllllllcllllllllllllllllllllllllllllllllllllllllllllllll,c:..,,:l.cc,';.;c;:lllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcccclccllccclclllllllllllllllllllllllllllllllllllllllllclllllllllllllllllllllllllllllllllllllllllllllllllc:l,'..;;c.;,cc;:';c:lllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllcccccllccccccccllllllllllllllllllllllllllllllllllllllccllllllllllllllllllllllllllllllllllllllllllllllllllc:'.':,.c: .cccllc'';lllllllllllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllccccccccccccclcllllllllllllllllllllllllllllllllllccllllllllllllllllllllllllllllllllllllllllllllllllllll;.:cl:lc.;.:.;lllll.'lllllllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllccccccccccccccllllllllllllllllllllllllllllllllllccllllllllllllllllllllllllllllllllllllllllllllllllllllll:,':lcl:c' ;l,;llc,,;lllloolllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllllllllllllllllllllllllllllllllccllllllllllllllllllllllllllllllllllllllllllllllllllllllll:l:.;::c:' ;:c;,;;:o;looolllllllllllllllllllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllccccccccccccccclllllllllllllllllllllllllllllllllccllllllllllllllllllllllllllllllllllllllllllllllllllllllllll;cc,...,cl.cc:,,.,c:,looooooolllllllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllccccccccccccclllllllllllllllllllllllllllllllllllcllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll;cc,'.';:o.:;,:,,',c;looooolooolooooollollllllllllllllllll ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllccccccccccccccclllllllllllllllllllllllllllllllllcclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllooo;l,':c;;c, .cl:llc,;;looooooooooooooollollllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllclccllllllllllllllllllllllllllllllllllcllllllllllllllllllllllllllllllllllllllllllllllllllllllloooloooll.',;,',,.' .',;:::;' coooooooooooooooooooolloolooooolooool cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllllllllllllllllllllllllllllllllllclllllllllllllllllllllllllllllllllllllllllllllllllllllllolollllcc:. .,.,;lo;' ,',llllc' .:loooooooooooooooooooooooooooooooooo cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllclllllllllllllllllllllllllllllllllllcclllllllllllllllllllllllllllllllllllllllllllllllllllllllool:;,,,;::l''';';,,:. .c;.loo,.'colcclooooooooooooooooooooooooooooooo cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllllllllllllllllllllllllllllllllllllcclllllllllllllllllllllllllllllllllllllllllllllllll:,',::,,,',,.;:::loo'l'.c';l;, ',;'.:,;l;:oooolcccoooooooooooooooooooooooooooo cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllllllllllllllllllllllllllllllllllllllllcclllllllllllllllllllllllllllllllllllllllllllc;,',',;, . ...',,,;',;,,;'c;..',.cl :l:c..'::'.;ccccc::..:lllllllllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllccccccllllllllllllllllllllllllllllllllllllllllccllllllllllllllllllllllllllllllllllllllllll,.'',.'''. ......,,...'.....'..'....... ........'. .oooool;.,:c::ooooooooooooooooooolll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllllccccllllllllllllllllllllllllllllllllllllllccllllllllllllllllllllllllllllllllllllllllllll;:lc:';;;'...,';;;,,;.',::;''.. ......c;, ,,cl:cc'',.'';cc,.;..,;;.,::cllllllllllllllllll cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllllccccllllllllllllllllllllllllllllllllllllllllccllllllllllllllllllllllllllllllllllllllllllllll,.';..looool'cc:;,;;'.,:llll:c;.,.';.. . ;:;oooc,''lc,...,;cloocccoolcclooooooooooooooo ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccllcllllllllllllllllllllllllllllllllllllllllllllllcclllllllllllllllllllllllllllllllllllllllllllllll;..,..clooool,cllooooocc:;''''...;;'...... . .,...'.. ,cc'':';:lococ:oddool::loddooodooooo cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllllllllllllllllllllllllllllllllllllllllllllcclllllllllllllllllllllllllllllllllllllllllllllll:.....;looooool,coooooooooooooooc. ''''.;;.. . ''.,''. ,;,.',':c:',ll:ddolllo:lccloodddddoo cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcccccccclcclclcclllllllllllllllllllllllllllllllllllllllllllllclllllllllllllllllllllllllllllllllollllllllllllc:'.''..coooooooll;coooooooooooooooo,;.,;:c';;. '. ... . ,,..,'. .'....;cloooo:odlc:cloooooo ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcllcllllllcllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllolllollllll,'.....:,looooolooo:;oooooooooooooooo,ol. ',l:., ';cc. ..,'. ..'.',.cc:c.:;..';;,.::,,,;;',,;;; ccccccccccccccccccccccccccccccccccccccccccccccccccclccccccccccccccccccccccccccllllllllllllllllllllllllllllllllllllllllllllllllllllllllcllllllllllllllllllllllllllllllllllllloooooooooc:'. ..',cl,loolloooooc,oooooooooooooood'llc. ..,oo :d;..; .c:.;:'..;;;;::,;.::::',,::';:::::,lolcl ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccclcclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllloooooooooo:c;..;,;ccol,clloooooool,oooooooooooddodd'ol'...';;: .',o;,:'.;,,odccdddolcc;';:;;c:c,,';cccc:'...', ccccccccccccccccccccccccccccccccccccccccccccccccccccccccclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllloololoooooooooooooooolll::.,':ooool::oooooooooo;looooooooooodddo.:..:cc..o; :o;ldl'. :dd:cdddddddo:dddlccccc'......,;;,c: cccccccccccccccccccccccccccccccccccccccccccccccccccccccclllccclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllooooooooloooooooooooooooooooooollllcl:;::loollol;oooooooooo;loooooodoooodddl 'lloldd;.. '..ooc..:: ,dd::dddddddl;dddddddddooo;'':oddood ccccccccccccccccccccccccccccccccccccccccccccccccccclcclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllloooloooooooooooooooooooooooooooooooolllllollocolclooool,ooolllccc:';loooooddddddddl..cloldo;c. .c;.;:oo;..;ddc:dddddddo;dddddddddoccoo:ddooodd cccccccccccccccccccccccccccccccccccclcllclcccclclccllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllolloooooooooooooooooooooooooooooooooooooolllllollooolcocoooooo,;c:cllloooolllllododddddddc'o..clc:o:. .,cc.,:''cc,ddc:dddddddo;ddddddo:.,oddo;ooodddd ccccccccccccccccccccccccccccccclllllllllcllllcllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllollollollloloooooooooooooooooooooooooooooooooooooooooooolllllolloooooolocoooolc;,cooooooooooooodollllodddd:,dd'..,;.,; 'l:c:..;odl'ddl:oooooooolododo:.;odoooo;odddddd ccccccccccccccccccccccccclccccccllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllooooooooollooooooooooooooooooooooooooooooooooooooooooooooolllllolloooooooolocooolclcoooooooooooooooodddddollcc''cc,. .,:oc ,d:',,,.cdo.dooodddddddddddoocodddodddo;ddddddd ccccccccccccccccccccclllclllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllloloooooooooooooooooollooooooooooooooooooooooooooooooooooooooooooooooolllllollooooooooooollooococooooooooooooooooodddddddddd,;o,..;.'l;; .,cd:c:c''o.oddddddddddddoldddodddddddd:ddddddo ccccccccccccccccccclllllllllllllllllllllllllllllllllllllllllllllllolloooollllolllllooolollooooolooooooooooooooooooollooooooooooooooooooooooooooooooooooooooooooooooollllloloooooooooooooololococooooooooooooodddoddddddddddd,;.';l:l;.o: :o;odddc'..ddddddddddooldddddodddddddd;ooooood llllllllllllllllllllllllllllllllllllllllllllllllllllllloolooloolooooooooolooooooooooolooooooooooooooooooooooooooollooooooooooooooooooooooooooooooooooooooooooooooollllloloooooooooooooooooll:llloooooddodddodddddddddddddddd..lololddl.. '..odddddd' oddddddoodddddddddoodddddoooddddddd llllllllllllllllllllllllllllllllllllllllllllllllllllloooooooooooooooooooooooooooooooooooooooooooooooooooooooooollooooooooooooooooooooooooooooooooooooooooooooooololllolooooooooooooooooooooloooodddddddddddddddddddddddddddo..'oloodo:l. .l:.cdddl'..oddddooddddddddddddooddoodddddddddd llllllllllllllllllllllllllllllllllllllllllllllllllllooooooooooooooooooooooooooooooooooooooooooooooooooooooooollooooooooooooooooooooooooooooooooooooooooooooooololloolooooooooooooddoddoddddddddddddddddddddddddddddddddddood.o;.,loc:o;. .ldo.,o,.'o'ldooddddddddddddddddddddddddddddddd lllllllllllllllllllllllllllllllllllllllllllllllllooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooollooloooooooooooddddddddddddddddddddddddddddddddddddddddoodddd.ddc .'c;'cl ,l:lo. ':dd,cddddddxxdddddddddddddddddddddddddd lllllllllllllllllllllllllllllllllllllllllllolloooolooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooollooooooodododddddddddddddddddddddddddddddddddddddddddddoodddddd.dxo;...'dxo ,xd,.,,.;dd;:xxxxxxxxxxdddddddddddddddddddddddd lllllllllllllllllllllllllllllllllllllllllllooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooolloooooooddddddddddddddddddddddddddddddddddddddddddddddoodddddxxxo.xd;..,.c::l ,;.co,;:..d::xxxxxxxxxxxxxddddddddddddddddddddd lllllllllllllllllllllllllllllllllllllllllloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodooooooooooooooooooooolloooooooddddddddddddddddddddddddddddddddddddddddddddddoodddddxxxxxl'o..,cl:.:o, :dc:dxoc'.';xxxxxxxxxxxxdddddddddddddddddddddd lllllllllllllllllllllllllllllllllllllllolooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodddddddooooooodoooooloooooodddddddddddddddddddddddddddddddddddddddddddddddooddddddxxxxxxxc..cooldxd.', ..,lxxxxxo; .dxxxxxxxxxxxxddddddddddddddddddddd llllllllllllllllllllllllllllllllllllooolooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodddoddoodddddddddddddddddddooooloooooddddddddddddddddddddddddddddddddddddddddddddddddodddddddddxxxxxxx; :xoolxxxc'. .;.;xxxxxxc..dxxxxxxxxxdddddddddddddddddddddddd llllllllllllllllllllllllllllllooloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddddddddddddddddddddddddddddddddooollooooddddddddddddddddddddddddddddddddddddddddddddddddooddddddddddddxxxxxd;;,':olxo:ld' 'xx;'oxxl'.c.xxxxxxxxdddddddddddddddddddddddddd lllllllllllllllllllllllollolloooloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodoooddoooddddddddddddddddddddddddddddddooolloooodddddddddddddddddddddddddddddddddddddddddddddddoooddddddddddddddxddxxx,cdc.'cc:o;., .;ldl.;,,;dd.dxxxxxxddxdddddddddddddddddddddddd llllllllllllllllllllloollooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddddoddddddddddddddddddddddddddddooolloooddddddddddddddddddddddddddddddddddddddddddddddddoodddddddddddddddxxxxxxxx':lo:...''ldl ,xo;;...,lll.dxxxxxxxxxxxdddddddddddddddddddddd lllllllllllllllllllllllooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooododoooddddddddddddddddddddddddddoooloooodddddddddddddddddddddddddddddddddddddddddddddddooddddddddddddddddxxxxxxxxxd.:oo:,. ,:dxl ,xo'',.'.;lc.oxxxxxxxxxxxxxxxdddddddddddddddddd lllllllllllllllllloolooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddoddddddddddddddddddddddddoooloooodddddddddddddddddddddddddddddddddddddddddddddddoodddddddddddddddxxdxxxxxxdddd.cx:...,.:c,: .';ol:':c',d lxxxxxxxxxxxxxxxxxdddddxxxddddddxx llllllllllllllllllooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddoooooooodddddodddddddddddddddddddoooolooodddddddddddddddddddddddddddddddddddddddddddddddooddddddddddddddddddxxdxxxddddxxd c''cd,lo.,c. :l:cx,do:'. cxxxxxxxxxxxxxxxxxxxdxxxxxxxxdxxxx lllllllllllllloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddooooooooddooddddddddddddddddddddddooccloooddddddddddddddddddddddddddddddddddddddddddddddooddddddddddddddddddddxxxxxddddxxxxc .:l:c,:;;,.. ..,llc;ccc:. ,dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx llllllollllloolloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddddddddddddddddddddddddooolccloddddddddddddddddddddddddddddddddddddddddddddddooddddddddddddddddddddxxxxddddxxxolll' .c;''.;ll:;. .:.,locoool' .:loxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx llllllloollloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddddddddddddddddddddddoooloooodddddddddddddddddddddddddddddddddddddddddddddooddddddddddddddddddddxxxxddddxdlllloxxo:.;.cl::,o:ll. .;oc.oxxd:.';;xxdllldxxxxxxxxxxxxxxxxxxxxxxxxxx llloooooooollloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodddddddddddddddddddoooloooddddddddddddddddddddddddddddddddddddddddddddddodddddddddddddddddddddxxxddddolllc,:l:;c;;:'xd..;l:'l;,: .,,:;.;:,,cxc,xxxxxxolloxxxxxxxxxxxxxxxxxxxxxxx oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodddddddddddddddddddooooooodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddxdocc,..':cc:,c:oxxlx;'oxx;..:;':xo ,xo:;....cooc'xxxxxxxxxdllldxxxxxxxxxxxxxxxxxxx ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddddddddddddddddddoooloooodddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddolccc,:,',,;: .. ...',':,';..',;,...;llcl ,xx:,;,;..';;.oododc,clccc:..codddddddddddddddd ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddddddddddddddddddddddoooooooodddddddddddddddddddddddddddddddddddddddddddoddddddddddddddddddd;.;,;'' ...... ',,.';c,cc:,..;.... .... ....''..'. c .'::;.':lccl:l;dolccodddddddddddd ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodddddddddddddddddddddddoooooooddddddddddddddddddddddddddddddddddddddddddddoddddddddddddddddddddd::lc;.lddolc::,.',;:;;c,ccccc.'.,;..,:',' .. 'c:;odo;. ...:;.,,..'coo:ld;ddddoccccddddddddd oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodooddddddddddddddddddddoooooooodddddddddddddddddddddddddddddddddddddddddddooddddddddddddddddddddddo' .;.'dddxxxxxd::dddoc:,;,.',, .;lc,, .. .,,....',. ,:;'oc;,ll;oxx:xxxxdooccllldxxxxx oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooddoodddoddddddddddddddddddooooooooddddddddddddddddddddddddddddddddddddddddddoodddddddddddddddddddddddo,.....cddddxxxxxxl;dxxxxxxxxxxxd; ,,'.'.:;,'. ....,:',,,,. .,,:,,,...';lo:xdoodxxolxxxolloxx oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooodddodddddoddddddddddddddddddlooodooddddddddddddddddddddddddddddddddddddddddddoodddddddddddddddddddddddcc. '. ,ddddxxxxxxxxo;dxxxxxxxxxxxxx...xxccc,o:.. c; ...;co;. .;:,. ... .:dxxxxdcxxxxdl;,oPyscn tree-sitter analysis cover
How Pyscn Analyzes Python with Go and tree-sitter
Pyscn is a code quality analyzer for Python built by DaisukeYoda at ludo-technologies. It finds dead code, code clones, coupling issues, and complexity hotspots. It’s written in Go, uses tree-sitter for parsing, and processes over 100,000 lines per second. I’ve been studying its internals and the engineering decisions are worth writing about: how it detects dead code through control flow analysis, finds duplicated code across clone types 1-4 with LSH acceleration, and integrates with AI coding assistants via MCP. ...