ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙ (i܎dZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z m Z dZ ej ZdaddZdZdZd Zd Zd Zd Zd ZejdejZdZGddeZGddeeZGdde eZ!Gdde"eZ#GddeZ$Gdde$Z%e%Z&dZ'e dfdZ(dZ)dS) a Configuration functions for the logging package for Python. The core package is based on PEP 282 and comments thereto in comp.lang.python, and influenced by Apache's log4j system. Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! N)ThreadingTCPServerStreamRequestHandleriF#Tcddl}t||jr|}nf||}t |dr||n+t j|}|||t|}tj  tt||}t|||tjdS#tjwxYw)aD Read the logging configuration from a ConfigParser-format file. This can be called several times from an application, allowing an end user the ability to select from various pre-canned configurations (if the developer provides a mechanism to present the choices and load the chosen configuration). rNreadline)encoding) configparser isinstanceRawConfigParser ConfigParserhasattr read_fileio text_encodingread_create_formatterslogging _acquireLock_clearExistingHandlers_install_handlers_install_loggers _releaseLock)fnamedefaultsdisable_existing_loggersrrcp formattershandlerss %/usr/lib/python3.11/logging/config.py fileConfigr2s %566.   & &x 0 0 5* % % . LL    '11H GGEHG - - -#B''J    %R44X'?@@@s &/C**C?c|d}|d}t|}|D]J}|dz|z} t||}#t$r"t|t||}YGwxYw|S)z)Resolve a dotted name to a global object..r)splitpop __import__getattrAttributeError)nameusedfoundns r_resolver+Us ::c??D 88A;;D t  E &&czA~ &E1%%EE & & & t   E1%%EEE & LsA)BBc6ttj|SN)mapstrstrip)alists r _strip_spacesr2cs sy%  c|dd}t|siS|d}t|}i}|D]}d|z}||ddd}||d dd}||d dd }tj}||d } | rt | }||||} | ||<|S) zCreate and return formattersrkeys,z formatter_%sformatTN)rawfallbackdatefmtstyle%class)lenr"r2getr Formatterr+) rflistrformsectnamefsdfsstlc class_namefs rrrfs | V $E u:: KK  E % EJ  !D( VVHhD4V @ @ffXydTfBBffXwD3f??  \%%g..  %$$A Ab#sOO 4 r3c"|dd}t|siS|d}t|}i}g}|D]}|d|z}|d}|dd} t |t t }n&#ttf$rt|}YnwxYw|dd } t | t t } |d d } t | t t } || i| } || _ d |vr|d } | | t|r| ||t|t jjr<|d d} t| r|| | f| ||<|D] \} }| ||!|S)zInstall and return handlersrr5r6z handler_%sr= formatterargs()kwargsz{}leveltarget)r>r"r2r?evalvarsrr& NameErrorr+r'setLevel setFormatter issubclassr MemoryHandlerappend setTarget)rrhlistrfixupshandsectionklassfmtrMrOhrPrQts rrr|s zN6 "E u:: KK  E % EH F\D() kk+r** $W ..EE * $ $ $UOOEEE ${{64((D$w--((Xt,,fd7mm,, E4 "6 " " g  G$E JJu    s88 , NN:c? + + + eW-; < < +[[2..F6{{ + q&k***!!1 HQK    Os7"B B=<B=ctj}|D]g}|jj|}||vrHt |tjs-|tjg|_d|_ `||_ hdS)a When (re)configuring logging, handle loggers which were in the previous configuration but are not in the new configuration. There's no point deleting them as other threads may continue to hold references to them; and by disabling them, you stop them doing any logging. However, don't disable children of named loggers, as that's probably not what was intended by the user. Also, allow existing loggers to NOT be disabled if disable_existing is false. TN) rrootmanager loggerDictr PlaceHolderrUNOTSETr propagatedisabled)existing child_loggersdisable_existingrdlogloggers r_handle_existing_loggersrps  addHandlerrerfr5sortgetint getLoggerindexrYrirjrp)rrrmllistr^rdrnrPrar[r]rkrlqnriroiprefixedpflen num_existings rrrs yM& !E KK  E u%% & &E LLG  * * * *DL+002233H  MMOOOM22[3&' Z NN;N;; "2&& >>r""Q&ACxHMMEx==Ll""A;vv&(22!((!555Ql"" OOB    g  G$E OOE " " "# $ $A   # # # #$ # u:: 2KK$$E!%((E 2 2!!(4.1111X}6FGGGGGr3ctjtjtjddtjdd=dS)z!Clear and close existing handlersN)r _handlersclearshutdown _handlerListr3rrrsI  W)!!!,---QQQr3z^[a-z_][a-z0-9_]*$cbt|}|std|zdS)Nz!Not a valid Python identifier: %rT) IDENTIFIERmatch ValueError)sms r valid_identrs7A B[a-z]+)://(?P.*)$z ^\s*(\w+)\s*z^\.\s*(\w+)\s*z^\[\s*(\w+)\s*\]\s*z^\d+$ ext_convert cfg_convert)extcfgcFt||_||j_dSr-)rconfigr)rrs r__init__zBaseConfigurator.__init__us!$V,, #'    r3c|d}|d} ||}|D]P}|d|zz } t||}#t$r(||t||}YMwxYw|S#t $r}t d|d|}||d}~wwxYw)z` Resolve strings to objects using standard import and attribute syntax. r!rzCannot resolve z: N)r"r#importerr%r& ImportErrorr)rrr'r(r)fragevs rresolvezBaseConfigurator.resolveys wws||xx{{ MM$''E 1 1d "1#E400EE%111MM$'''#E400EEE1L    aaa;<D AHHJJqM*A A$**400 +!((**Q-(AA*0066A +hhjjm#177<<+ !#AA+$'HH$%aD#,+++$%cF+A>DD$*3855$$&@AAA' A,s D##D87D8ct|ts-t|trt|}||_nt|ts,t|t rt |}||_nt|t s22 .z%7N7N ."5))E!%E  E?33 .E5)) .29%2K2K .#E**E!%E   s # # .$**511A .KKMM8 155fdCC .x[F 'i 8 8I%If--E r3c,d}t|s||}dd}fdD}|di|}|r+|D]\}}t ||||S)z1Configure an object with a user-supplied factory.rNr!Nc@i|]}t|||Srr.0krs r z5BaseConfigurator.configure_custom..*AAA1+a..A!VAYAAAr3r)r#callableritemssetattr)rrrGpropsrOrr'rs ` rconfigure_customz!BaseConfigurator.configure_customs JJt  {{  QA 3%%AAAAAAAV  -${{}} - - ee,,,, r3cNt|trt|}|S)z0Utility function which converts lists to tuples.)r rvrrs ras_tuplezBaseConfigurator.as_tuples$ eT " " !%LLE r3N)rrrrrecompilerrrrrr staticmethodr$rrrrrrrrrr3rrras!bj!IJJO2:o..L"*.//KBJ566MBJx((M |J''H(((*###   D8   r3rcNeZdZdZdZdZdZdZdZdZ d d Z d d Z d d Z d S)DictConfiguratorz] Configure logging using a dictionary-like object to describe the configuration. c |j}d|vrtd|ddkrtd|dz|dd}i}tj |rm|d|}|D]}|tjvrtd|z tj|}||}|d d }|r'|tj|}#t$r} td |z| d } ~ wwxYw|d |} | D]E} | || |d !#t$r} td|z| d } ~ wwxYw|dd } | r; | | d n#t$r} td| d } ~ wwxYwn||dd } t|d|} | D]F} | | || |<"#t$r} td|z| d } ~ wwxYw|d|}|D]F} |||||<"#t$r} td|z| d } ~ wwxYw|d|}g}t|D]} |||}||_|||<+#t$rI} dt%| jvr||ntd |z| Yd } ~ yd } ~ wwxYw|D]O} |||}||_|||<+#t$r} td |z| d } ~ wwxYwtj} t-| jj}|g}|d |} | D]}||vr||dz}|dz}t9|}t9|}||kr:||d ||kr||||dz }||k:|| | || |#t$r} td|z| d } ~ wwxYwt=||| |dd } | r9 | | n"#t$r} td| d } ~ wwxYwtjd S#tjwxYw)zDo the configuration.versionz$dictionary doesn't specify a versionruzUnsupported version: %s incrementalFrzNo handler found with name %rrPNzUnable to configure handler %rrrTzUnable to configure logger %rrdzUnable to configure root loggerrrz Unable to configure formatter %rfilterszUnable to configure filter %rtarget not configured yetr!) rrr#rrr?rrU _checkLevel Exceptionconfigure_loggerconfigure_rootrconfigure_formatterconfigure_filtersortedconfigure_handlerr'r/ __cause__rYrdrvrerfr5rzr}r>rwrpr)rrr EMPTY_DICTrr'handlerhandler_configrPrrrrdrmrrdeferredrkrlrrrrs r configurezDictConfigurator.configuresG F " "CDD D )  ! !6 9JJKK Kjj66  Q #N :!::j*==$ A AD7#444(*36:*;<<<A&-&7&=G-5d^N$2$6$6w$E$EE$M ' 0 01DU1K1K L L L(AAA",.248.9#:#:?@AA!**Y ;;#==D=--dGDM4HHHH$===(*.04*566;<==zz&$//::++D$7777$:::(*23389:::$*::.H$#O#O &((($ZZ jAA &GGDG+/+C+C*?@@EFGG!**Y ;;#DDDD(,(=(=gdm(L(L $DDD(*57;*<==BCDD"::j*=="8,, A AD A"&"8"8$"H"H'+ )0$AAA6#ak:J:JJJ$OOD1111",.248.9#:#:?@A21111A%==D="&"8"8$"H"H'+ )0$===(*.04*566;<==| 7 < < > >??  !#  **Y ;;#==Dx''$NN40014#'#: #H '*8}} ,..'{6E62h>> - 4 4Xa[ A A AFA ,..!---=--dGDMBBBB$===(*.04*566;<==")=)9;;;zz&$//::++D1111$:::(*23389::  " " " " "G " " " "sY+=U,)ADU, D% D  D%%U,E! U,! F+E>>FU,F75U,7 GGGAU,H98U,9 IIIU,9JU, J:"J55J::,U,''LU, M"?MU,M""U,*'NU, N4N//N44C>U,3SU, S2S--S22,U,T54U,5 U?UUU,,Vc:d|vrz|d} ||}n#t$rN}dt|vr|d|d<||d<||}Yd}~nd}~wwxYw|dd}|dd}|dd}|d d}|s t j} nt|} d |vr| ||||d }n | |||}|S) z(Configure a formatter from a dictionary.rNz'format'r7r`Nr:r;r<r=validate)rrr/r#r?rr@r+) rrfactoryrter`dfmtr;cnamerGs rrz$DictConfigurator.configure_formattersJ 6>>TlG 7..v66 7 7 7SWW,, !' 8 4 4u &t ..v66 7**Xt,,C::i..DJJw,,EJJw--E $%UOOV##3eVJ-?@@3e,, s$ A<AA77A<cd|vr||}n*|dd}tj|}|S)z%Configure a filter from a dictionary.rNr'rL)rr?rFilter)rrrr's rrz!DictConfigurator.configure_filtersG 6>>**622FF::fb))D^D))F r3c |D]} t|stt|ddr|}n|jd|}||\#t$r}t d|z|d}~wwxYwdS)z/Add filters to a filterer from a list of names.filterNrzUnable to add filter %r)rr%r addFilterrr)rfiltererrrIfilter_rs r add_filterszDictConfigurator.add_filterss G GA GA;;8(71h+E+E"F"F8GG"k)4Q7G""7++++ G G G !:Q!>??QF G G GsAA B)A<<BcRt}dd}|r: |jd|}n%#t$r}t d|z|d}~wwxYwdd}dd}dvr=d}t |s||}|}n[d} || } t| tj j rd vr |jd d } t| tj s$ |td | d <n#t$r}t d d z|d}~wwxYwt| tj jr#d vr|d d <nAt| tj jr"dvr|dd<| }dd} fdD} |di| }nI#t$r<}dt%|vr| d| d<|di| }Yd}~nd}~wwxYw|r|||'|tj||r|||| r+| D]\}}t1||||S)z&Configure a handler from a dictionary.rKNrzUnable to set formatter %rrPrrNr=rQrrzUnable to set target handler %rmailhostaddressr!c@i|]}t|||Srrrs rrz6DictConfigurator.configure_handler..rr3z'stream'streamstrmr)rr#rrrrrrWrrrXr Handlerupdater SMTPHandlerr SysLogHandlerr/rVrUrrrr)rr config_copyrKrrPrrGrr r_thrrOrrr'rs ` rrz"DictConfigurator.configure_handlers6ll JJ{D11  : : K 5i@  : : : "&(1"23389: : 7D))**Y-- 6>> 4  AA;; $LLOOGGJJw''ELL''E%!1!?@@ EF""EZ01ABB%b'/::E k222'(CDDD')F8$$ EEE$&*,28,<&=>>CDEEE7#3#?@@ Ef$$%)]]6*3E%F%Fz""E7#3#ABB EV##$(MM&2C$D$Dy!G 3%%AAAAAAA 'W&&v&&FF ' ' 'R(( $ZZ11F6NW&&v&&FFFFFF '  +    * * *   OOG/66 7 7 7  .   VW - - -  -${{}} - - ee,,,, sF> A AA AE;; F#FF#I J#2JJc|D]N} ||jd|*#t$r}td|z|d}~wwxYwdS)z.Add handlers to a logger from a list of names.rzUnable to add handler %rN)ryrrr)rrorrars r add_handlerszDictConfigurator.add_handlerss H HA H!!$+j"9!"<==== H H H !;a!?@@aG H H Hs&- AA  AFc|dd}|'|tj||s|jddD]}|||dd}|r||||dd}|r|||dSdSdS)zU Perform configuration which is common to root and non-root loggers. rPNrr)r?rUrrrrxr r)rrorrrPrarrs rcommon_logger_configz%DictConfigurator.common_logger_configs 7D))   OOG/66 7 7 7 2_QQQ' ( ($$Q''''zz*d33H 4!!&(333jjD11G 2  11111 2 2 2 2r3ctj|}||||d|_|dd}| ||_dSdS)z.Configure a non-root logger from a dictionary.FriN)rr|r"rjr?ri)rr'rrroris rrz!DictConfigurator.configure_loggers`"4(( !!&&+>>>JJ{D11  (F    ! r3cZtj}||||dS)z*Configure a root logger from a dictionary.N)rr|r")rrrrds rrzDictConfigurator.configure_root#s. "" !!$ <<<<.ConfigStreamHandlerz Handler for a logging configuration request. It expects a completely new logging configuration and uses fileConfig to install it. c |j}|d}t|dkrtjd|d}|j|}t||kr;|||t|z z}t||k;|jj|j|}||d} ddl}| |}t|tsJt|nX#t$rKtj|} t!|n##t$rt#jYnwxYwYnwxYw|jjr"|jjdSdSdS#t*$r}|jt.krYd}~dSd}~wwxYw)z Handle a request. Each request is expected to be a 4-byte length, packed using struct.pack(">L", n), followed by the config file. Uses fileConfig() to do the grunt work. z>LrNzutf-8) connectionrecvr>structunpackserververifydecodejsonloadsr rr'rrStringIOr traceback print_excreadysetOSErrorerrno RESET_ERROR)rconnchunkslenr4rfilers rhandlez*listen..ConfigStreamHandler.handleJs   ! u::??!=u55a8D O0066Ee**t++ % $U2C(D(D De**t++{)5 $ 2 25 9 9( % W 5 5 6'KKK#zz%00A#-a#6#6666&qMMMM(666$&;u#5#5D6 *4 0 0 0 0#,666 ) 3 5 5 5 5 56 6{(0 )--//////#?,00   7k))*))))) s`C0F;3?D32F;3FE"!F"F?FFFF;F-F;; G!GG!N)rrrrrBrr3rConfigStreamHandlerr*Cs-  % % % % % r3rCc.eZdZdZdZdedddfdZdZdS)$listen..ConfigSocketReceiverzD A simple TCP socket-based logging config receiver. ru localhostNctj|||f|tjd|_tjd|_||_||_dS)Nrru) rrrrabortrtimeoutr9r2)rhostportrr9r2s rrz-listen..ConfigSocketReceiver.__init__xsY  'tTlG D D D  " " "DJ  " " "DLDJ DKKKr3c:ddl}d}|s~||jggg|j\}}}|r|t j|j}t j|~| dS)Nr) selectsocketfilenorIhandle_requestrrrHr server_close)rrMrHrdwrexs rserve_until_stoppedz8listen..ConfigSocketReceiver.serve_until_stoppeds MMME '#]]DK,>,>,@,@+A+-r+/<99 B*'')))$&&& $&&& '        r3)rrrrallow_reuse_addressDEFAULT_LOGGING_CONFIG_PORTrrUrr3rConfigSocketReceiverrEqsV    +2M!d ! ! ! ! r3rXc(eZdZfdZdZxZS)listen..Serverct|||_||_||_||_t j|_dSr-) superrrcvrhdlrrKr2 threadingEventr9)rr]r^rKr2Server __class__s rrzlisten..Server.__init__sN &$   ( ( * * *DIDIDI DK"**DJJJr3cD||j|j|j|j}|jdkr|jd|_|jtj|a tj | dS)N)rKrr9r2rru) r]rKr^r9r2server_addressr:rr _listenerrrU)rr1s rrunzlisten..Server.runsYYDIty%)Z&*k33FyA~~"1!4 JNN     " " "I  " " "  & & ( ( ( ( (r3)rrrrrf __classcell__)rbras@rrarZsM + + + + + + ) ) ) ) ) ) )r3ra)rrr_Thread)rKr2rCrXras @rlistenri/s(,,,,,2,,,\     1   >)))))))!))). 6&(;T6 J JJr3ctj trdt_datjdS#tjwxYw)zN Stop the listening server which was created with a call to listen(). ruN)rrrerHrrr3r stopListeningrksV    IOIs ?A)NTN)*rr<rrlogging.handlersrr/r_r7 socketserverrrrW ECONNRESETr=rerr+r2rrrprrrIrrobjectrrrrvrrrrrr&r'rirkrr3rrqs"  AAAAAAAA#       F   !!!,$$$L///,THTHTHn   RZ,bd 3 3 fB @ @ @ @ @T? @ @ @#####T?###@@@@@e_@@@AAAAAvAAAFB=B=B=B=B='B=B=B=H #((( ,DxKxKxKxKt     r3