:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;::;;;;;;;;;;
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;:;;;;;;;;;
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::c:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;;;;
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::c::c:::c:cc:::::c::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::;;;
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::c:cccccccccllodddddxdOxxxxxkxxxxkOxxdxddddoollcccccccccc:::c:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::::::::ccc:::::c:c:c:cccccccclododdk0kkxxxdxddox0kOdkokoOoxoddOdOoOdOxkkKOOxxddlccccccccccccccccccccccc::c::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:::::::::::::::::::::::::::c::::c:::ccc:c:cc:ccccccccccccccccclddddxxxddoookOxxddoddolokkkOdkdkxxdxdxxkxxxxxxxdkOkOxOxxOkkkOxdlcccccccccccccccc::ccccccc::cccc:c::::c:c::cc:c:::::c:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
::::ccc::c:cccc:::cccc::ccc:ccccccc:cccccccccccccccccccccloooxlkOxddolocccxO0OOxOdkdolkOkkKO0x0kxxkxOOKO0OOKkxkOk0kOdkdxxOoO00kkxdoccccccccccccccccccccccccccccccccccccccc:ccccccccccccc:::::c::c:c:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ccccccccccccccccccccccccccccccccccccccccccccccccccccoooddooloclkOOxxxdoclcdOk00kkxxokdkOkkKx0x0kkkxxK000OKk0kOdK0XOK00KO0dxO0kkkOxOkxkxocccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:::c::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
ccccccccccccccccccccccccccccccccccccccccccccccccclllxkdoolc::llkk0OkxdlooolOx0O0xkxkkxkOkOKk0O0OOOxOKKOKOKOKOdOKKKKOXOXOOxKKX0OOdxkOd00OOxdlcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:c:cc::c::::::::::::::::::::::::::::::::::::::::::::::::::
ccccccccccccccccccccccccccccccccccccccccccccclllllcolxkdolclclloOx0Oxdodxdokx000Okk0OOOKk0000O00O000XXKX00XKOx0KNKXK0XOKxO0XKXKKXKKkx00O0kkkxdlcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:cc:ccccccc:ccccc::::::::::::::::::::::::::::::::::::::::
cccccccccccccccccccccccccccccccccccccccccclllcccc:ccxlOOolodollckdk0OddxOOkOkkKO0kxxddkdOxxxkdxOkddkOkxxkOOkkOOKKKKXXXK0OKXKNKKKKKO0XXKOxxO0Od0Kkocccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:c:c:cc:::::::::::::::::::::::::::::
ccccccccccccccccccccccccccccccccccccccccl:ollc::clloxolkkoddddolxxx00OxddooxoOOOkkxxdokkOxkxxdxxkkx0KkOOOkOkxxkKkOOdkxkX0XNNXXXXKO0XXXNXXKkkOkKX0kxocccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:c:::c::::::::::::::::::
cccccccccccccccccccccccccccccccccccccc:::::dlcccllllkllcdOxxxxxxOdlOOkkddolkoOxO0OOxxdk0kkOOkxkkxOO0KOK0K0kkk00K0kOkxxx0kxxOO0XKK0XNXXXXXXXKk0O0K0kxxdlcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:ccc:cc:::c::::::
ccccccccccccccccccccccccccccccccccccc:::::::lc:cclloxlcclk0kxdllddlOdOOOdodkdxd0O00kkxOKkOOOkxkOkkOKXKK0k0kx00K0K0K0OxK00Ok0xxdd0XKNWNXXXX00XNXKkk00kk0Oocccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc:::
ccccccccccccccccccccccccccccccccxdlcccc::::::cocclllxocldodOkoolokokokOOkdxOOxdk0O00kkKkk0OkOOOOOOOKXKKKOkOkKK0K0OK0k00X00KKK0xk00kkOKXNN0KXNNXXXKOkO00kOdcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccc;;doooocccc::::codoooxclolllk0koddkxoookkOOxO0ddd0OO0OOKkOOOOOOOkxxkKKOOOKKOOKX0O000O00K0K00000OKXKOxKOkx0XNXNNXNNNX000KKxkklcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccc:;;;;dllcoooc::::coxkclxllkoooldk0xdkOolooOkkOOKxox00kOxKk0OOO0kxddook00kkxxxOOOKKK000OKXKXK0OKO0KXXXXKKkkkXX0KNWNNNKKXNKkOXOxOxllccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccclcclc;;;;;;;:d:::clollcc::ldocxokdooolldxkxOOllodkOxk00xxxdkkkxkOkdkkxkkkxxdkK0kkOxxd0k0kKOOK00KXX0KO0OXXXXKXKKOON0OK0kOXNXXNNNNXOkXO0XKlccclclccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccclcclcclcccclclllc:oc;;:::;;:x::coolcooocclxlkddoolloooxkkO0dxxddxkxxkdoookxxxxldkOOxxdOOkxkK0OkxxdOxxxO0OkkK00O0OOOKKXNXXXKK0XNX0OkKKk0KKNWNNNNNK0KXXkkllllllllcclccllcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
llllclllllllcclllllllllc;,;cc:;::::::d::odccllcodoldOOxddkxxdlclod0kdooxokdxOdllldkxxddxxdkOOkxxxd0XOkOOkx0O000kdxkOxkkk0k00O0KXN0OKXXXKXNXX0OXK00NWNNNXKKOXXOxklllllllllllllllllllllllcllllcccccccccccclccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
llllllllllllllllllllll:,,;;:o:::;:::;ld::d:c::::clllxodooclccloloxoxxxxdodOkkOolookxddookxOxxkOkkxKXO0O0O00K00kxx000kOkxdkO0KK0OOOOXXXXKNNX0XKKKXOOXXKKKXNNO0XxkOolllllllllllllllllllllllllllllllllllcllllllllccclllcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
llllllllllllllllllllc:,,;;;;;l:clc;:::oo:ol::c::::lo:olclllllloloodlolkkxdx0kOxoldxxllooxkkkxdoooOXNK0OOOKKOKOxx000OKOOxkOOOxkkkO0K0O0KXXXXXNXWKKX0OXNXXNNNXk0KKN0lllllllllllllllllllllllllllllllllllllllllllllllllllllllllclllllllcclcccccccccccccccccccccccccccccccccccccccccccccccccc
lllllllllllllllllllc:;,,;;;;;;c:;coo;::docl:::cccoc::collddclldoollxoddooxkOOk0xdkxxddddkdokddoookO0kkkkkkO0O0k00OO0KKkOOKKKOOO0OkOOkddKKKXKXNNK0OOXKOXWWNWNN0NNOkolllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllcccccccccccccccccccccccccccccccccc
lllllllllllllllllll;,;;;;;;;;;;::;;lol::dll::::ldl:::ccoccldoodolllldxxddxxO0OkxOkooddxkddxdkooloOO0xxxxOkOkOO0OOOO0000K0KXK0O00KKOOOxxkx0KKX0K00K0OKOkXWNX00XKXOxxllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllclccccccccccccccccccccc
llllllllllllllllll:,,,;:;:;;;;;;;;;:d:ll:xkc::dd::::;::clc:cxkdooooddxolokxxdooxOdooooldkxdddxdlo00OxkkkkkOkxkk0O0OkkKKKK0K0KX00XX0000kkOx0K00NXKXX00K0XNKKNXWkO0xkdllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllcccccc
lllllllllllllllllc,,,;;;l;;;:::,,;::xc:::c0dcoc::::::::::c::lokdddoooddodooxlooxdkxooollodddddxldKK0OOO0OkkkkkkkkkkOO00OOOO0KKKKNXKKOKXkkKK0O0XNXXNNK0KKXXNNWNX0KKN0llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
llllllllllllllll:;,,,;;;;lc;;:c:;;;::o:;;:lOkdddooolllolllllxdddddolooxdooddookddodkkolllloxkkkxx0KKKXKOkkkOO0OOkOOkx0Oxk000kkOO0K0OK0OkKKK0kkKKNNNX0XKKkKNNNNK0XKkxllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
llllllllllllllll:,;;;,,,;;:;;,,:;:c:c:;;;;cll::::;:::::::cccoc:cooxolldxooxdookoddxkOO0xxdddoocdxNKOOOO0K00KXK000kkkk0kxkOOOOk0O0k0000KKOkKKkxONXX0XNN00x0NX0000KOxxolllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
olllllolllolooll;',;;;;;,,,;;;;;:;:lloc;;c:;ld:::::c;;;;c::ccll::lcdxllxdkxxkkOkkxxOxxdOkdloloxxOXKkkkOO000OXXXXK0k0000O00OkOkkXddkOKKXXN0O0K000XXXNKXX00NNXXKNO0kxkooooooooooollllollllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
oooooooooolloooc,,,;;;,;;;;;';;;c;;;;:dc:;;;:ol:::;:c::c::::::coc:lclOOkdxxkxkdddxxOOxxxdxkoxkxxKXKKkxk0000K0OOOO00K00XKKK0kxxXO0xdkKX00K0kOkOxd00K0NXO0XKKKNXN000XKoooooooooooooooooooooooolooooooollolllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
ooooooooooollll:,',,;;;;,,:;;;:l;:;;;;:ooc:;;;:c::;;;:c:lllc::::ll:dlodxxxdokxdoddddOooclok00Oxx0XKNX0xO0OOKK0OOOkkkxkXKXXO00Kkkkk0OkKK00OkxxkkxOXKK0KKKKOONXNKOXXkdoooooooooooooooooooooooooooooooooooooooooooooolooooolllloollllllllllllllllolllllllllllllllllllllllllllllllllllllllll
ooooooooooooooo:,,,,,,;;;;,,,:ccc:;;;c;,;;::::;lc;;;::::::::::::;cdllcxokXNO0kkxollcoklkO00OO0OkkXXWNNX0odO0xdxOO000O00OOXKOOOkk0K0OkOK0000OO0kOk0KKKNKkKkXN00OOKxxoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooloooooooolllllolllllllllllllllllllllllllllllllllllll
oooooooooooooooc;,;;;,,,;;'';,,;:ol:;;,;;;;;:c::cc::;;:::::::::;:cclldokkX000KKKOOkx0KOXOkxkkkxk00KXXXXK0OKKK00KXNNWWX0xkkkNOxOOkkOOOx0K0OK0kkOkxOKXKK000KXK0000xddooloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooloooooloolollllllllllllllllllllllll
oooooooooooooooc;,,,;;;;;;,';,,,,;:c:;cclc::c::;:cllc::::::::;:cc:::cldkkXKK0O0NNNX000xKN00OOOk0KKK0WMMWNNXNNWWWWWNNNKKkXOX00K0OkdkkOkxOOOkOkk0K0O0XXKkKKKK0XXOkOOddddooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooolllolllllllllll
ooooooooooollooc:',,,;,;;;';,;,,;;,:c',;;;;;;;;;:;;c;:llloollooc:;;::;cxKXKNWMNXXXNW0XOKK0OOO0koxOxxONNWWWXWMMMMMMMMMWKXXXK00K0kkxxOOxd0K0OK00kOOkk0OKXN0OKKKO0kxdoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooool
ooooooooooollool:;,,;;;;;;,,;;,;;,,;lc,,,,,,,,;;,;;:l;;;;;;;ccdkdolc:;;lod0NWXXXXNK00KO0KOOkOklloKoloONWWNNNNNNWWMMMMMXNXXK000O0OkkO00O0XKOOkO0kOK00K0Ox0XK0Okxddooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooc:,,,;;;;;,,;;;:;;,,,:;;;;,;;:,.',,;cx:;;;:c;;;;::;;;;;clollookKNNNN0XOkK0kc;;;;co:::;:kNNNNMMMWWNNWWWNXXXKK00KK0OxkOOxx0O0kxkxxkkOOOkdO0KK0kkddoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
oooooooooooooooolc,,;;,,,;;',,;;;;;,''c;,,,;c,;:;,,,,;x;;::,,,,;,,,:c:;clc;'..',;cldxkkdxOkkolccxOdolc:cd0XKNNNXK0OoxKXXKKOkkxO0kkxxkdxOOKK0OxxOkkxkxOOKXKK0k00doooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ooooooooooooooooocc',,;;,,;,'',;,,,:;;,:,,:o,c,,;;,,,;;cc:;;;;::ccccccccl,..'',,;;;:c:;c:;;;:cddxKxxcccc:llokdolc::,,lOKKkkddkO0OxddxkOOKKXKOxdxxkOkO00K0Oxkkxddoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ddooodoodddodddodo:;,,,,;;,,',,;,,,,,';;:ccllo;',;:::,,;c;',;:cccccccl::o,'',;;:cc:;',,;o:ldOkoldKOKXkccdc,,:oxdllc;;lkXKKO0OOO0O0dxkx0xooodkkxkk000kk0xddkxddddddddddodddoddddoddddddddodooooooododoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
ddddddddddddddddddocc,;,,,,;;,,,;,,,,,';;cccol;,.',,;cc,,o:';:cccccllc::d,,;:cc:''',,;;lxOkdlc:cOWocd0XKl:;',,;okxoc:o0WNKXKlloOlxkOOxoodoodk0kO0kllkOlok0xdddddddddddddddddddddxxxxxxxxxxxxxxxxxxxddddddddddddddoodoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
dddddddddddddddddddocc',;;;,;;,,;,,,;;,'',c,;:::;,,,,,::;,l;,:cccclccc::o;cc::',,,,;lxOOxollccdxkW0c:xk0XKd;,.',,cxdloKWWNXKdcddl00xcloodlokkkOkdodk0okOK0xddddddddddddddxxxdddkdoolokkdddooxxxxdxkkkkkxxxxddddddddddddddddddddddddoooodoooddooooooooooooooooooooooooooooooooooooooooooo
ddddddddddddddddddddocc'',,,,,;;;;;,,,,'.';c,,,,;;;:c:;;;:;:;:::cccccc:clc:ll:;,:dxOOxxOoollodxxkWXxxkkkkOXXd....,;lxd0MMMNWOlOkXKokllxxxkxkdlldkd0Od0OkdddddddddddddddlkdooclxOxdoldOkkxxxkOkkxkOOkkkdkOxdkxkxddddddddddddddddddddddddddddddddddddddoddooddoooooooooooooooooooooooooooo
ddddddddddddddddddddddl;;,,,,,;,,;;;,,,''.',::,,,''',,:,,;;;;;:cc:;,'..;l'',;coookdxddd0kkOOxxxkxOKOkkkkkkkOKXd;;;:clxdOXWMXX0K0okx0kkdocclocllokOXKKkdddddddddooldoccclxOxlooxkkxxoxkOOOkkO0OOKk0K0Okk0K00dkOxkxkxddddddddddddddddddddddddddddddddddddddddddddddddddddodoooooddoooooooo
dddddddddddddddddddddddocl;,,,,;;,,',,,,,,'',,',,','.',,''......... . .cOo,;lxxxxdldOkxOXkkkxxkxo;cOxxxxxxxxkd0Nk:';x0::lod0KKKkodxkclodlllxcdokxkNKxddddddollc:colxlooloxkddddxkxdldxxxdxoOxxxxkOOOkk0KKKO0KK0OxOOxxdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddoo
dddddddddddddddddddddddddllc,,,,,;;;,,,',;;;'',,,,,,,':kxl:;,,;:'......l0Kkkdc,:lodoxododXXOxodxo;;kddddddddo.;l0NKx0XdodloOkxdkdddKcclol::ddxxx0Kxdddddoc:;:cclcoccxxdoodkxdldxkOxlxkxdxxkOOOkxOOkkd0xkxx0KXK00XKOOkOxddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddoc:;,,,,,,,,,,,,,,,,,;;;;'''';;oo;;,;:dkxdl;.'0OkxOkxOkoxOO0ddddk0xdoOd;:Oddddooooc,:;oXXXKOdxkkkooddx0OOKoldooddolk00xddddollc:::::lclocclkdccddkkddkkkOoOxxxxkkKKOkOOkkk00O0k00xkkKXXXXK0Okkxddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddl::;,,,,;''.',,,,'',,,,,,''.lo:,,;,0WNNxO',0k0OOxxOkxkO00OkodkOKKxOo,:NWNWMWWWWNNNWNWMW00lN0ooodclddOxkOdooccxdOOxddddl:;;ccccc:::dllcollxxlxooxOkkxkxx0kxxdodOxdxkOOkOKOOO0KK0k0OO0XKXXK000xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddxddddddddollc;;,;;,,'','''',''';lc:ld::;:;xxoOkXc'ox0000kdooooooooddodokodl,;kxxkOOOOO00XK0K00Od'MXxdoloddx0dloococdxkxxdddcc;;;;;c:cclcc:loolllcddxoddddxoxdddxxdxdx0xoxxkkkOkkkO0KO0KKK0O00XXXX0Okxddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
xddddddddddddddxxxxxxxxxxdxxxxxxxdll::,,,;,,,''',,,''lddxxxcodddllONOXx,clxOkxl,.';:cccloxxdoxkl:':xoooc:;;::cld0XWXkc,XXNXxddkK0koodkkxxkxxxxdl;,;:c;;;;l:c;::ccddllcccloddoxddcdooodddodO0xxOOxxkkddxOOkOOKKKKX00KKNNX0Kkddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdolcc;,;;,,'''','cdoooxcdddxcokK00Kk,o00kdxXkc;,,:ldXXXXXXOc:.oNNXNNXXXkokXMWX0xc,kXKXNccokK0dccoxkdxxxxxd;,,;;;:;::;:lc;;;:c:cclclclolloxkdollloddlldk0kkOkxOOkkOOkx0Oxxk0OKK0OxXXXKOkxdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdooc:c;,;,,'',,lc:cxkWWNNOdOk0KXXd,.:oodoloooc:;dK00KK0dlc.dXKKKKK0KNMWK0OdkdoKXMXXXcdxOO0o:;cxkxxxxxd;,,;;;,;;;:c::l:;lc;;;c:oollloooxoodoloxooockdkdxxxkkkkOOOKOKOkkxkOKXNXk0NNXKKkxxxxxddxxxxdxdxxdddddddddddddddddddddddddddddddddddddddddddd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdoolc:,,,,:::cllodoodoo0OOKXKKXc'';d0OdlllolkO0000kllc.kK0000000XOOkl::coXXXNKOXOkOKX0KXXXXkxxxxo,,,,;:;;;;;;c;;cdoc::;;,;cdoololllllodocclodokOOkdxxxdxkkkkkOOOOkk0x0XKKKOXK0Kxxxxxxxxxxxxxxxxxxxxxxxxxxxddddxddxddddddddddddddddddddddddddd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdol::;:;;'''..;:;;::xOkO0kkdo;;,cxXXo,cokOOOOkooo:.OOOOOOOO0XOl:c;:dXWX00kKOOONkddddxxxxxxxd,,;,,,,,,,;;::,;::l:c:::ccclclcllooodddxxdlccd0OxkkO00kOkkkxdOxx000OOkKKK00XNKK0kOkkkkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxdxddddxxxdddddddddddddddd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdoc;::cc:,,;::co:oOkkKXNWO:,,ccxKKooxxkkxdddo;'Okkkkkkk0KxdkxokWWNK0kX0OKNOxxxxxxxxxxxx;,,,,,,,,;;;,,;c:,;:;,;:l:;;;:clddooooldoccdxlxX0odxOkxddO00xxkkxO0Oxkxk0KKKXO0OkkxOOkxOOkkOkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxdd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxolllccccc:c:okdkKXOOO0ol:cccoxkdkkxkxxxxd;oOkxkkkxkkkkkxo0WNXO0KK0OKXxxxxxxxxxxxxxd',,,,,,',,;:;;:,;;;;;,c;;;;,,;cclxOkkdccdxxxkxd0K0dxkkOKKkxkOxxOkdOkkkxOKOOXXKOOOOO00OOKKOO0Ok0kxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkxxxxxkxxxxkxxxoolc:::lxxd0NO0O0xdOxxldcxkkxddoold;OOOkkkkkkkkOOxKNNKOKXXK0KNkdxxxxxxxxxxxxl',,,,,',,',,,:;::,;,:c:;:;,;;;,;lxK0O0XkxxOxddx00NX0XWWWNK0kK0xdxoOOkOOO0O0XKkk0OkOOOk0Ok0KK0K0OOOkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxkxxxxxxxkxkxxkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxdo:'oxxxdxddlddxodcxkkkdlldool0XKOOO0XXkOKKXXN0OXKXXKKNOkkkkkkkkkkkkkko',,,,,',,,,'':,,'',;,,;,,:ccl:;,:oOKNXKKkxkxkkcx:dNXXNNWWWKK0OkkOxk0kkkxkk000OkKOO00OK00KKOOKKXXKOOOxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkc,k0dodxkokxk0klOKKKOkONKx,kK0kxKKKK0x0XXKk0KKXNONNkkkkOkkkkkkkkkkkd',,,,,''',,',';,;:,,,',c;'',',,';:c:;cxOkxxkoc:dcccO0WX0kOKkkOxdox0OkxdxOkkOkdkOdxkkOOO0XKKXKOKXXXKOkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkd;:XWOoxkxcdKK0XKKKXXXXXXKXXNNNNNXNNNNXNNXXNXNXNKNkkkkkOkkkkkkkkkkkkc',,,,''',''.,;:c'.',,',:,;;;;;;;c'..',;,,:;colOkl::;l:,.:OOoddcooloxkdkkkOxdxO0O0xOOxkkxO0KKXK0KNXKOkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkklx;l0WNK0kl:::c::;;;;::;:;:ldoddxxdxxxkkkkk00OX0OOkkkkkOkkkkkkkkkkkkx,',,,'',,,'''',;:,,,,;,'c;;;:::,c',;;,';lddlccKdkOl..;c:lXKcllklloxxdkdkxxdlkkOkkOkOO000OOx0XNX0XNK0OOOkkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkdd,,oXXWXklcccc:;;;;':,':,';;,::l:cldkdddxkXKXNOOOOkkkkOkkkkkkkkkkkkkx:,,,,'',,,'.'',,'',,;;,,;;::;;;c;ll:oxkdxddddO0ddkkc';cdXNOkkdkxoooxkkdloookOkxkxxkkxkOOOOO0XXKXXKKK0KOO0kkkxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxllOOkoccccccc::::;:,,:,,:;;:ccclxddxdkK0XK0KN0OOOkkkkOkkkkkkkkkkkkkkl'',,'',''''''''.''';;'..''..,x;coddodkxOddoooooocoOolx;dkxdodcoxdddxxddld0Okk0OOO0Oxxk00OOXKKXXKOO00KXKKOOkkkkkkkkkkkkkkkkkkxxkkkkkkxxxkxx
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkxlllccccccccc::::::;;:;,:;;:ccclloodddxkkX000WKO0OkkkOOOkkkkkkkkkkkkkxl;,,,'''''''','...'dol',ooc,kkkxxokO0ddOdxo,xxdccdX0xxoolokOodxkxdlddxkd00xOO00kOOkkk0OkkK0KNKO0K0K00KXX0Okkkkkkkkkkkkkkkkkkkkkkkkkkxxxxk
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkoccccccc:;;;;;;;,,,,;;;;;;,;;ccllloxxxxxkKKO0NX0OOkkxkOOkkkkkkkkkkkkkkxo:,','''...'''''';cl,:k0O;ckkdlodddoldkxo,kO00K0X0;XkodokdockK0XKkOkxdOKNKWWWX0KOxkO0OK0OKKOkOOOKKX0KNX0O0Okkkkkkkkkkkkkkkkkkkkkkkkxxxk
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkOkkkkOOkkOOOOOOOkOOOkOOOOOOOOOOOOOOOOOOOOkkkkkkkxo;,;::::cccoooodoooollcoxxxxkk00Ok0KOkKX0OOOOOOOOkOOOkkkkkkkkkkkkxo::,''''.'...;oOOxkl0Ok:dxoo;;;::xkOd:,odddxKKo,KXkloKoclcdkOK0kkdcl;xKNNXXK0OkkOOkkOO0O000KOO0XXKNXKXXK0Okkkkkkkkkkkkkkkkkkkkkkkkkk
kkkkkkOkkkkkkOOOOOOOOOOOkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOd::ccclldox0X0kWXOxOxkxxkOOOOOO00OkOX0OKW00OOOOOOOOOOOOOOOOOOOOOOOOOkxd::,,,'''ccloxK0k0KOl:oo::;,:000dc:K0000dlcKX0kokKOkx:,.',;::olxxc:ll'c0dodkodOkKKOOOkkk000KXXNXK0KNX00Okkkkkkkkkkkkkkkkkkkkkkkk
OkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOc:colokxOxkKWOkWMMXXKMWX0OOOOOOOOO0OkKKO0WXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkdol:;:::,,',;:dOOOo:lkolcdOOxl:lOOOOkcoXKOkxOO:cc:c;:;:lodllOxko'':dNkdkkkx0OOO000OkOOOO0KXX00KXKNXKX0Okkkkkkkkkkkkkkkkkkkkkk
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOx;:OOxxOkOkkKNOONWMNNMMMWNOOOOOOOOOOO0k0KO0XN0000OOOOOOOOOOOOOOOOOOOOOOOOOOOOOkxdddllclcodO00ododdoxxddo:xxxxxodXK0OkkO,,'.'l:ooddxxkoddolddlddOOdkOxk0XNWWK0kOO0000K0000XXNXKXNKOOkkkkkkkkkkkkkkkkkkkx
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOxoONKkxoco:loooOKOO0kcxXNNNXOOOOOOOO0O0OOXKOKN00OOOOOOOOOOOOOOOOkkxkxkkkOOOOOOOOOOOOOkxxo:kdxkxkxoddkkdcl0kk0kOX000Ox0o;;dk;xkkdkO0xxkx:kkx0Kkkookxxcocd0Ox00kxOOkO00O00OKXNKXKNKXKOkkkkkkkkkkkkkkkkxl:
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0NNkdoONxkkollxONOOO0kXNXO0XNKkkxkxOkOOO0OKKO0NK00OOOOOOOOOkdooookdkxkkOOOOO0000OOOOOOOOOc;0kxoxolddO0KkoX00KKX000XdOodclo0xckdlccccxkc:kOxKO:Xd:koookxl';:0kxkxkKXKOOO00KKK0XXNK0X0OkkOkkkkkkkkkkko:;:
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkOkOkO0O0000000XWKo,. :OW00,.,okW'lkK0WNx0odOXNKdkxkkOO0OOO0KO0NX0O0OOOOOxclcloldxxxkkxkkOO0000KXK0OOOOOOx,cKN0l;;c::cccccoddxkxkKOdccocodO00old::;c0kcl000oc0KOo0kOddxooood0kOxOOOKOkOOk0000KX0KKX0OOOOOOOOOOOOOkl;;;;
OOOOOOOOOOOOOOOOOOOOkOkOOO000000OOOOOOOOOOOOOOOOOOOOOOOOOOOOOkdddxxkkOOO00K0KKOWXoc;....,kNXO:'lxWoON0NMkkXllddkKNKOkdkkOOO000OOOKKO00OOx:;:clclllddxoddkkkOOOOOKKXX0OOOOOOl;oxc:::;;,;,,;,::llokOKk0kddlolcoOOdldolddocoxxdlK00O00kdxdoOx0OOxd0x:cxKOOk00O00O00O0K0OOOOOOOOOOOOOOx;;;;;
OkkkOOOOOOOOOOOxdddxkkOOO000KKKKKK00OOOOOOOOOOOOOOOOOOOOOOOxolooxdkkOkOOOO0KXWWXcccc.'',,;xNKdOK0WWOoKMKdkXdc:cldx0NXkOkkOOOkOk00O0XK0Ok;;;;:cc::looddooOxkkkkO0OKKK0OOOOOOx:::;:;;;;;;;;;,,:ldxOkO0OK000OxxckOxxdodkxocOxkkK00O0x;;dkllxx0l00oOoxkkkOOdOOOkOOOOkO0OOOOOOOOOOOOOOOd;;,;;
OOkkkOOkkOOOOdlllddxkOkkkOO00KKKXXXK0OOOOOOOOOOOOOOOOOOOOOo:cldollxxkkxxOOKWWX0dclo;;.cc';ldNNNMXNNoOWM0kOXdc:ccodxxONNKOOOkOOO00XO0NK0ll:;::;::::cOOxkkKKXXOkkOOOK0OOOOOOOx;;;;;;:c:coxO0OxkxxXXK0O0OK0K0OOd,OKkdlok0Oo0OKK00XOkdllkkcdkOo00OOdkONxKokdxOOkOxkxOOOOOOOOOOOOOOOOOOOl;,,,
doollllllllol;clollddxkxxOO000000XXXK0OOOOOOOOOOOOOOOOOOOk:;:clllllxOOOkKXWWKOxcc,';:';ccllddXMMKNNOWWXX0O0kldodd0000OOXNX0OkOOkO0X0OXKkldc:o:,;;::clddlddkdOxoxkkOOOOOOOOOOl;;;;;ddodxkk0NKWNkl:xKkk00K00OOO::Od::;'',',;lox000xdoddolkxOK000Ol00o0KOKOOkxxkkOOOOOOOOOOOOOOOOOOOOOOxl;,
llllllllllll:;::::cco0OOkXKXXKOO0OKK0doddxxxxddollcclclccc:;;::cccllkKKNWXXKXkcc;.,lc:c:lll;ddKWKXNXMWNNk000locdcd:lkOkxkKX00kkO0k0K0OKXkxcco;,;;;,ccoxlxdcoOkxxkOOOOOOOOOOOOxc:;xKkOxkcoK0OOX000kkkkkOk0Okddocll:;;,,;;;:odxxO00xoldkokO00000ddxkK00KOdKKOdKxkOOOOOOOOOOOOOOOOOOOOOOOkx
ooooollllllll;;;::cccoxxxO000XOkkkOOdollllllllcccccllllllllc:;;:::;:oKNW0xdoKl:;':xllcclcccco0kKXKNNKNXW0O0NxodkdOxkOkkkOkk0KNK000OOKKO0XKkod,,;loxxdodkokOOOkkkkkxxxxddddolllooKO:;lKNxXXXKNKxOO00kxcokdkko:::::;:cldOOKK0kkOdOOklc,;,;cox0kOkOOK0K0O0K00kOO000OOOOOOOOOOOOOOOOOOOOOOOO
ooooooooooooolc:;;::cdxOkOkxOOOxdxxooololllcccllllooollllllllc:;:loxNNKOOOk0kll:okkooooolloox00kO0XNKNXNXXXKkkO000Od0OOO000OOK0OXXXlolloxk0K0dlclokkolxddOk00ko::::cccclllccccxXd::cclkKWXN0W0Ok0KO0kdclkxxOocc::cOxkxdOKKK0kdooOkxocdxxxollxxoccox0OkO0K00000OOOOOOOkkxxxxxxddddddddddo
ooooooooolllllloollxOxxdxO0O0KkddllclclclllllloooooolllllllllllcclON0NXKk0XNXXXXXXXXXXXXXNXNXXXKO0KNX0kkOXNXXKKNNNXkxddxxxdolddOOdd::cclloxdxxolllcxkdkxkO00kc:::ccccllllcc:lK0c;:ccccdxNXXXX0k000dokO0OxOOdkdllo0c:dKOXNXOcoxxclxO0xd00XklodO0KKcldkOdcxkdxkxooolc:::;:;::::::::::::ccc
oooooollcllllloodooodOxkdkO0Xxlcc:cccccclcccllclcccclllllcccccccllxdOkkxxkO0l';ccccccc'lokxddoxKNNOocc:::;':cccccldc:cldk0oc:;,ckkc:cc:cccoldl::c:::l;;,;coOxl::::::c:::::cdXk:,;cccccckOKXNNK0OkOOddlok0OOodOxOk:ccco0NKNkllcoOxOkxKKXXX:x000kKX0OO0KO00Okoxxlc:cccclclcllc::::::;:::;;
llllcc:ccccccclllcllloolcldO0dollcccllllooollllllllollclllccclcllolllxxdoooOOdlcc:cc;cc:o000OXNNkcclcc:::c:cc::::c:odxkxcoOl,,cccoxdc:::::llo:;;:::::dxOKOlcxkc;;;;::;:;;;oK0xkOOOOOOk00000X0kXX000Okdddddkd::Od:lccclOOKXOxxllkOk0OxKXXKxkcdOKKKkOKXK00KOOkldx:;;,,;,,,;,,,;,,,,,,,,,,'
cccllccclllccclllllllldk0XKxdOkolllcllccccclccclccccclcccccllc:col::lxOOXKdddOd:::;:l:::c0XNN0dclc:::ccccccc:::::lxokKNklccllcccclxx::;;;:lco::::;clxld0XOclldklc::::::;:lxddc;:;;c;coxOkK0ddkNxlddkkd;;,:oo:dOdddddxkOO0xoxkxkkdkdxkkOKO00kkxkkO000OO00KkOkkxdxlc:::cc:cc:cc:c::;;;;;;,
;;;;;;;;;;;;;;;;;;;cdkdoKWKxxdxkd;;:;;;;;;;;;;;;;;;;;;;;;;;;c::ld:llldokK0kxkxxxc;cc'::d0XXkc',;:::::::::ccllcclk0ddxkklclooolllooxOllllccooolllloxKdxxoxololdxxollllcc::clcoo,...;odxO0Oxoxddxdxxxoddllcccll:oc..coxk0OolcllokklcccoO0l:;'lod0O0kxOOklldoclocxdooolollllloolooooloooooo
clolllllllllololloooKxoodddxxxkoxoooooooooooddoooddddddddddolo' .. ';;ldxxllxxxkoo:cXNKl;xo..:xxxxxxdoxxxxxxxddKcckoxxxxl''''''',,:cddddxxkdddxdlK:odlddddo;xodddooooc;...;l, ;k00o;,:.clclllll,cllc...':;c: cOOdcccc:cclkOc,'';cc;;;.cod:llodool;';cc:l,cllc:cclclllc,,;;;'.d:;;;;
dkkodooodddddddddddokdoldoddookoooooolooollooodoooddloolodxooc,''',,:dkOdlll:clc:doOXWO:..':;;':::c:::;;ccclcllcc:::;;,;;;,......'oxdlx,,;:;:,,,;;,,,,,,,,''''','.......;l::lol''':dd;,,,',,,,''';,,,'..::::c:::;,;ccccc::;,:lllloc::::::loooooloooooooc::coxdoooddddolllllccollllodddod
dOkddxxddxdxddddxdoodollcccc:::;::;;:;;,,;,;;cccc;;::ll:;;x:,'ccc:llldOOo:cccloook0WNc .;ll;coooollllclollllcc:cccccccccccllcllcdkxcxllllccc::c::cc:ccllc:ccccc:,''';:::,,dkk:lcololllclololllllllolllccccccllllcclloolooxolldldkkxxxdoooddodxxxxkxooolllooddooddoddxdloddxxxxxxxxkxdd
Structured logging cover When an AI coding assistant tries to help you debug a production issue, it reads your logs. If your logs are scattered console.log calls with inconsistent formatting, the AI can’t help you. It doesn’t know which log lines belong to the same request, what the timing was, or what the error context means.
Evlog is a structured logging library by Hugo Richard , designed around the “wide event” pattern. One structured event per request, with all context attached. I’ve been using it in my projects and it’s particularly useful when you’re debugging with AI tools, because the log output is machine-readable by design.
The Problem with console.log# A typical Node.js app logs like this:
[INFO] Processing order 12345
[INFO] User: john@example.com
[DEBUG] Fetching inventory for SKU-789
[WARN] Inventory low: 3 remaining
[INFO] Order processed in 847ms
[ERROR] Failed to send confirmation email
Six log lines for one request. To understand what happened, you need to mentally stitch them together, match the timing, and figure out which lines belong to which request when there are 50 concurrent users.
An AI assistant reading these logs has the same problem, but worse — it can’t infer the causal chain between lines without explicit correlation.
One Event Per Request# Evlog flips the model. Instead of many log calls, you build up a single event throughout the request lifecycle:
import { createRequestLogger } from 'evlog'
export default defineEventHandler (async (event ) => {
const log = createRequestLogger (event )
log .field ('user' , user .email )
log .field ('orderId' , orderId )
const items = await fetchInventory (skus )
log .field ('inventoryCount' , items .length )
if (items .some (i => i .stock < 5 )) {
log .field ('lowStock' , true )
}
await processOrder (order )
// Duration is tracked automatically from request start
// The event emits on request end with all fields attached
})
When the request finishes, evlog emits one structured JSON event:
{
"level" : "info" ,
"message" : "POST /api/orders" ,
"timestamp" : "2026-03-05T10:23:45.123Z" ,
"duration" : 847 ,
"user" : "john@example.com" ,
"orderId" : 12345 ,
"inventoryCount" : 3 ,
"lowStock" : true ,
"env" : { "service" : "api" , "environment" : "production" }
}
Every field is on the same event. Duration is automatic. The AI assistant can read one JSON object and understand the entire request — who made it, what happened, how long it took, and what was unusual.
Self-Documenting Errors# The most useful feature for AI debugging is evlog’s error structure. Instead of throw new Error("Failed to sync"), you create errors with why and fix fields:
throw new EvlogError ({
message : 'Failed to sync repository' ,
status : 503 ,
why : 'GitHub API rate limit exceeded' ,
fix : 'Wait 1 hour or use a different token' ,
link : 'https://docs.github.com/en/rest/rate-limit' ,
cause : originalError ,
})
When an AI reads this error in a log, it has three things it usually lacks:
What happened (the message)Why it happened (root cause, not just the symptom)How to fix it (actionable next step, not just “check the docs”)This is the difference between an AI saying “there’s an error on line 47” and “the GitHub sync failed because you’ve exceeded the rate limit — you can either wait an hour or switch to a different API token.”
Automatic Context Injection# Evlog’s framework integrations (Nuxt, Next.js, Express, Fastify, Hono, SvelteKit) automatically attach request context without manual wiring:
Request method and path from the HTTP layerDuration from request start to response endStatus code from the responseEnvironment (service name, deployment version, commit hash, region) from runtime detectionThe Nuxt module enables this with zero config:
// nuxt.config.ts
export default defineNuxtConfig ({
modules : ['evlog/nuxt' ],
evlog : {
env : { service : 'my-app' },
}
})
Every server route automatically gets a request logger with duration tracking. You don’t need to import anything or set up middleware — the module injects it.
Why This Matters for AI-Assisted Debugging# The trend is clear: developers are using AI tools to debug production issues. They paste logs into Claude or ChatGPT and ask “what went wrong?” The quality of the answer depends entirely on the quality of the logs.
Structured events with correlation, timing, and self-documenting errors give the AI everything it needs to reason about the problem. Scattered console.log calls force the AI to guess at relationships between log lines, often incorrectly.
The logging format you choose isn’t just about human readability anymore. It’s about machine readability too. JSON events with consistent structure, automatic context, and explicit error causation are the format that works for both.