3 ­_VjIäã @s’ddlZddlZddlZddlZddlZddlZddlZddlmZm Z m Z ddl Z y ddl Z Wne k rxdZ YnXdZdZdZdZdZdZd'ZGd d „d ejƒZGd d „d eƒZGdd„deƒZGdd„dejƒZGdd„dejƒZGdd„deƒZGdd„dejƒZGdd„dejƒZGdd„dejƒZGdd„dejƒZ Gdd„dejƒZ!Gd d!„d!e!ƒZ"Gd"d#„d#ejƒZ#e �rŽGd$d%„d%e$ƒZ%dS)(éN)ÚST_DEVÚST_INOÚST_MTIMEi<#i=#i>#i?#iéé<c@s.eZdZd dd„Zdd„Zdd„Zd d „ZdS) ÚBaseRotatingHandlerNFcCs0tjj|||||ƒ||_||_d|_d|_dS)N)ÚloggingÚ FileHandlerÚ__init__ÚmodeÚencodingÚnamerÚrotator)ÚselfÚfilenamer r Údelay©rú(/usr/lib64/python3.6/logging/handlers.pyr 5s zBaseRotatingHandler.__init__c CsHy$|j|ƒr|jƒtjj||ƒWntk rB|j|ƒYnXdS)N)ÚshouldRolloverÚ doRolloverrr ÚemitÚ ExceptionÚ handleError)rÚrecordrrrr?s  zBaseRotatingHandler.emitcCst|jƒs|}n |j|ƒ}|S)N)Úcallabler )rZ default_nameÚresultrrrÚrotation_filenameMs  z%BaseRotatingHandler.rotation_filenamecCs4t|jƒs$tjj|ƒr0tj||ƒn |j||ƒdS)N)rrÚosÚpathÚexistsÚrename)rÚsourceÚdestrrrÚrotate`s  zBaseRotatingHandler.rotate)NF)Ú__name__Ú __module__Ú __qualname__r rrr#rrrrr/s rc@s&eZdZd dd„Zdd„Zd d „ZdS) ÚRotatingFileHandlerÚarNFcCs.|dkr d}tj|||||ƒ||_||_dS)Nrr()rr ÚmaxBytesÚ backupCount)rrr r)r*r rrrrr zs zRotatingFileHandler.__init__cCsÞ|jr|jjƒd|_|jdkrÊxtt|jdddƒD]^}|jd|j|fƒ}|jd|j|dfƒ}tjj|ƒr4tjj|ƒr†tj |ƒtj ||ƒq4W|j|jdƒ}tjj|ƒr¼tj |ƒ|j |j|ƒ|j sÚ|j ƒ|_dS)Nréz%s.%dz.1éÿÿÿÿ)ÚstreamÚcloser*ÚrangerÚ baseFilenamerrrÚremover r#rÚ_open)rÚiZsfnÚdfnrrrršs$        zRotatingFileHandler.doRollovercCs|tjj|jƒr"tjj|jƒ r"dS|jdkr6|jƒ|_|jdkrxd|j|ƒ}|jj ddƒ|jj ƒt |ƒ|jkrxdSdS)NFrz%s éT) rrrr0Úisfiler-r2r)ÚformatÚseekÚtellÚlen)rrÚmsgrrrr±s   z"RotatingFileHandler.shouldRollover)r(rrNF)r$r%r&r rrrrrrr'us r'c@s6eZdZddd„Zdd „Zd d „Zd d „Zdd„ZdS)ÚTimedRotatingFileHandlerÚhr+rNFc Csštj||d||ƒ|jƒ|_||_||_||_|jdkrNd|_d|_d|_ �nî|jdkrld|_d|_d |_ nÐ|jd krŠd|_d |_d |_ n²|jd ksž|jdkr²d|_d|_d|_ nŠ|jj dƒ�r.d|_t |jƒdkrât d|jƒ‚|jddk�s|jddk�rt d|jƒ‚t |jdƒ|_d|_d|_ nt d|jƒ‚tj|j tjƒ|_ |j||_|j}tjj|ƒ�r~tj|ƒt} n t tjƒƒ} |j| ƒ|_dS) Nr(ÚSr+z%Y-%m-%d_%H-%M-%Sz-^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}(\.\w+)?$ÚMrz%Y-%m-%d_%H-%Mz'^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}(\.\w+)?$ÚHz %Y-%m-%d_%Hz!^\d{4}-\d{2}-\d{2}_\d{2}(\.\w+)?$ÚDÚMIDNIGHTrz%Y-%m-%dz^\d{4}-\d{2}-\d{2}(\.\w+)?$ÚWér5zHYou must specify a day for weekly rollover from 0 to 6 (0 is Monday): %sÚ0Ú6z-Invalid day specified for weekly rollover: %sz'Invalid rollover interval specified: %siii€Qii€Qi€: )rr ÚupperÚwhenr*ÚutcÚatTimeÚintervalÚsuffixÚextMatchÚ startswithr:Ú ValueErrorÚintÚ dayOfWeekÚreÚcompileÚASCIIr0rrrÚstatrÚtimeÚcomputeRolloverÚ rolloverAt) rrrHrKr*r rrIrJÚtrrrr ÌsL        z!TimedRotatingFileHandler.__init__cCsd||j}|jdks"|jjdƒ�r`|jr4tj|ƒ}n tj|ƒ}|d}|d}|d}|d}|jdkrnt}n |jj d|jj d|jj }||d|d|} | dkrÂ| t7} |d d }|| }|jjdƒ�r`|} | |j k�r`| |j krþ|j | } nd| |j d } || d} |j�s\|d} tj| ƒd}| |k�r\| �sPd}nd }| |7} | }|S)NrBrCéééérrr+rDriii€Qr,r,iðñÿÿ) rKrHrNrIrVÚgmtimeÚ localtimerJÚ _MIDNIGHTZhourZminuteÚsecondrQ)rÚ currentTimerrYZ currentHourZ currentMinuteZ currentSecondZ currentDayZ rotate_tsÚrZdayZ daysToWaitÚ newRolloverAtÚdstNowÚ dstAtRolloverÚaddendrrrrWsH           z(TimedRotatingFileHandler.computeRollovercCs@tjj|jƒr"tjj|jƒ r"dSttjƒƒ}||jkr|jjdƒ�rx|j �rxtj| ƒd } || k�rx|�sld }nd}| |7} | |_dS) Nr+irhrrBrCr,r,iðñÿÿr,iðñÿÿ)r-r.rPrVr_rXrKrIr^rr0ZstrftimerLrrrr1r#r*rprr2rWrHrN) rrbrerYZ timeTupleZdstThenrgr4ÚsrdrfrrrrtsH            $ z#TimedRotatingFileHandler.doRollover)r=r+rNFFN)r$r%r&r rWrrprrrrrr<Äs  9Ir<c@s.eZdZd dd„Zdd„Zdd „Zd d „ZdS) ÚWatchedFileHandlerr(NFcCs,tjj|||||ƒd\|_|_|jƒdS)Nr+r,r,)r,r,)rr r ÚdevÚinoÚ _statstream)rrr r rrrrr ºs zWatchedFileHandler.__init__cCs0|jr,tj|jjƒƒ}|t|t|_|_dS)N)r-rÚfstatÚfilenorrrsrt)rÚsresrrrru¿szWatchedFileHandler._statstreamc Cs†ytj|jƒ}Wntk r(d}YnX| sL|t|jksL|t|jkr‚|jdk r‚|jj ƒ|jj ƒd|_|j ƒ|_|j ƒdS)N) rrUr0ÚFileNotFoundErrorrrsrrtr-Úflushr.r2ru)rrxrrrÚreopenIfNeededÄs  "    z!WatchedFileHandler.reopenIfNeededcCs|jƒtjj||ƒdS)N)r{rr r)rrrrrràszWatchedFileHandler.emit)r(NF)r$r%r&r rur{rrrrrrr¦s rrc@sNeZdZdd„Zddd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dS)Ú SocketHandlercCsZtjj|ƒ||_||_|dkr(||_n ||f|_d|_d|_d|_d|_ d|_ d|_ dS)NFgð?g>@g@) rÚHandlerr ÚhostÚportÚaddressÚsockÚ closeOnErrorÚ retryTimeÚ retryStartÚretryMaxÚ retryFactor)rr~rrrrr øs  zSocketHandler.__init__r+c Csj|jdk rtj|j|d�}nJtjtjtjƒ}|j|ƒy|j|jƒWntk rd|j ƒ‚YnX|S)N)Útimeout) rÚsocketZcreate_connectionr€ÚAF_UNIXÚ SOCK_STREAMZ settimeoutÚconnectÚOSErrorr.)rr‡rrrrÚ makeSockets  zSocketHandler.makeSocketc Cs–tjƒ}|jdkrd}n ||jk}|r’y|jƒ|_d|_WnVtk r�|jdkr^|j|_n"|j|j|_|j|jkr€|j|_||j|_YnXdS)NT) rVrƒr�r�rŒr„Z retryPeriodr†r…)rZnowZattemptrrrÚ createSocket"s       zSocketHandler.createSocketc CsR|jdkr|jƒ|jrNy|jj|ƒWn$tk rL|jjƒd|_YnXdS)N)r�rŽÚsendallrŒr.)rrqrrrÚsend>s  zSocketHandler.sendcCsj|j}|r|j|ƒ}t|jƒ}|jƒ|d<d|d<d|d<|jddƒtj|dƒ}tj dt |ƒƒ}||S)Nr;ÚargsÚexc_infoÚmessager+z>L) r’r7ÚdictÚ__dict__Z getMessageÚpopÚpickleÚdumpsÚstructZpackr:)rrZeiZdummyÚdrqZslenrrrÚ makePickleQs     zSocketHandler.makePicklecCs0|jr|jr|jjƒd|_ntjj||ƒdS)N)r‚r�r.rr}r)rrrrrrgs  zSocketHandler.handleErrorc Cs<y|j|ƒ}|j|ƒWntk r6|j|ƒYnXdS)N)r›r�rr)rrrqrrrrus  zSocketHandler.emitc Cs@|jƒz(|j}|r"d|_|jƒtjj|ƒWd|jƒXdS)N)Úacquirer�r.rr}Úrelease)rr�rrrr.„szSocketHandler.closeN)r+) r$r%r&r r�rŽr�r›rrr.rrrrr|ës  r|c@s$eZdZdd„Zdd„Zdd„ZdS)ÚDatagramHandlercCstj|||ƒd|_dS)NF)r|r r‚)rr~rrrrr �szDatagramHandler.__init__cCs*|jdkrtj}ntj}tj|tjƒ}|S)N)rrˆr‰ZAF_INETÚ SOCK_DGRAM)rZfamilyrqrrrr�¤s  zDatagramHandler.makeSocketcCs&|jdkr|jƒ|jj||jƒdS)N)r�rŽÚsendtor€)rrqrrrr�°s zDatagramHandler.sendN)r$r%r&r r�r�rrrrrž’s  ržc@seZdZdZdZdZdZdZdZdZ dZ dZ dZ dZ dZdZdZdZdZd Zd Zd Zd Zd ZdZdZdZdZdZdZdZeeee eeee eeeedœ Zeeeeee ee eeee eeeeeeeeedœZ ddddddœZ!de"fe dfdd „Z#d!d"„Z$d#d$„Z%d%d&„Z&d'd(„Z'd)Z(d*Z)d+d,„Z*dS)-Ú SysLogHandlerrr+r5rZr[r\r]rDéé é é éééééééé) ZalertZcritÚcriticalÚdebugZemergÚerrÚerrorÚinfoZnoticeZpanicÚwarnÚwarning)ZauthZauthprivZcronÚdaemonZftpZkernZlprZmailZnewsZsecurityZsyslogÚuserZuucpZlocal0Zlocal1Zlocal2Zlocal3Zlocal4Zlocal5Zlocal6Zlocal7r¯r²r´r±r®)ÚDEBUGÚINFOÚWARNINGÚERRORÚCRITICALZ localhostNcCs0tjj|ƒ||_||_||_t|tƒrTd|_y|j |ƒWnt k rPYnXnØd|_|dkrht j }|\}}t j ||d|ƒ}|sŒt dƒ‚x„|D]|}|\}}} } } d} } y(t j ||| ƒ} |t jkrÐ| j| ƒPWq’t k �r }z|} | dk rü| jƒWYdd}~Xq’Xq’W| dk �r | ‚| |_ ||_dS)NTFrz!getaddrinfo returns an empty list)rr}r r€ÚfacilityÚsocktypeÚ isinstanceÚstrÚ unixsocketÚ_connect_unixsocketrŒrˆrŸZ getaddrinforŠr‹r.)rr€r¼r½r~rZressÚresZafÚprotoÚ_Zsar°r�Úexcrrrr #sB      zSysLogHandler.__init__cCs¸|j}|dkrtj}tjtj|ƒ|_y|jj|ƒ||_Wnxtk r²|jjƒ|jdk r`‚tj}tjtj|ƒ|_y|jj|ƒ||_Wn tk r¬|jjƒ‚YnXYnXdS)N)r½rˆrŸr‰r‹rŒr.rŠ)rr€Z use_socktyperrrrÁYs&       z!SysLogHandler._connect_unixsocketcCs4t|tƒr|j|}t|tƒr(|j|}|d>|BS)NrZ)r¾r¿Úfacility_namesÚpriority_names)rr¼ZpriorityrrrÚencodePriorityqs     zSysLogHandler.encodePriorityc Cs2|jƒz|jjƒtjj|ƒWd|jƒXdS)N)rœrˆr.rr}r�)rrrrr.~s  zSysLogHandler.closecCs|jj|dƒS)Nr´)Ú priority_mapÚget)rZ levelNamerrrÚ mapPriority‰szSysLogHandler.mapPriorityÚTcCsyÜ|j|ƒ}|jr|j|}|jr*|d7}d|j|j|j|jƒƒ}|jdƒ}|jdƒ}||}|jr°y|j j |ƒWqÚt k r¬|j j ƒ|j |jƒ|j j |ƒYqÚXn*|jt jkrÎ|j j||jƒn |j j|ƒWntk rú|j|ƒYnXdS)Núz<%d>zutf-8)r7ÚidentÚ append_nulrÈr¼rËZ levelnameÚencoderÀrˆr�rŒr.rÁr€r½rŸr r�rr)rrr;Zpriorrrr–s.        zSysLogHandler.emit)+r$r%r&Z LOG_EMERGZ LOG_ALERTZLOG_CRITZLOG_ERRZ LOG_WARNINGZ LOG_NOTICEZLOG_INFOZ LOG_DEBUGZLOG_KERNZLOG_USERZLOG_MAILZ LOG_DAEMONZLOG_AUTHZ LOG_SYSLOGZLOG_LPRZLOG_NEWSZLOG_UUCPZLOG_CRONZ LOG_AUTHPRIVZLOG_FTPZ LOG_LOCAL0Z LOG_LOCAL1Z LOG_LOCAL2Z LOG_LOCAL3Z LOG_LOCAL4Z LOG_LOCAL5Z LOG_LOCAL6Z LOG_LOCAL7rÇrÆrÉÚSYSLOG_UDP_PORTr rÁrÈr.rËrÎrÏrrrrrr¡¼s–5   r¡c@s&eZdZd dd„Zdd„Zdd„ZdS) Ú SMTPHandlerNç@cCsŠtjj|ƒt|ttfƒr(|\|_|_n|d|_|_t|ttfƒrR|\|_|_ nd|_||_ t|t ƒrn|g}||_ ||_ ||_||_dS)N)rr}r r¾ÚlistÚtupleÚmailhostÚmailportÚusernameÚpasswordÚfromaddrr¿ÚtoaddrsÚsubjectÚsecurer‡)rrÖrÚrÛrÜÚ credentialsrÝr‡rrrr ¾s  zSMTPHandler.__init__cCs|jS)N)rÜ)rrrrrÚ getSubjectászSMTPHandler.getSubjectc CsyÞddl}ddlm}ddl}|j}|s.|j}|j|j||jd�}|ƒ}|j |d<dj |j ƒ|d<|j |ƒ|d<|j jƒ|d<|j|j|ƒƒ|jrÊ|jdk rº|jƒ|j|jŽ|jƒ|j|j|jƒ|j|ƒ|jƒWntk rü|j|ƒYnXdS) Nr)Ú EmailMessage)r‡ZFromú,ZToZSubjectZDate)ÚsmtplibZ email.messageràZ email.utilsr×Z SMTP_PORTZSMTPrÖr‡rÚrmrÛrßZutilsr_Z set_contentr7rØrÝZehloZstarttlsZloginrÙZ send_messageÚquitrr)rrrâràZemailrZsmtpr;rrrrês0      zSMTPHandler.emit)NNrÓ)r$r%r&r rßrrrrrrÒºs " rÒc@s>eZdZddd„Zdd„Zdd„Zd d „Zd d „Zd d„ZdS)ÚNTEventLogHandlerNÚ ApplicationcCsÜtjj|ƒy¨ddl}ddl}||_||_|s`tjj |jj ƒ}tjj |dƒ}tjj |ddƒ}||_ ||_ |jj|||ƒ|j|_tj|jtj|jtj|jtj|jtj|ji|_Wn"tk rÖtdƒd|_YnXdS)Nrzwin32service.pydzWThe Python Win32 extensions for NT (service, event logging) appear not to be available.)rr}r Úwin32evtlogutilÚ win32evtlogÚappnameÚ_welurrriÚ__file__rmÚdllnameÚlogtypeZAddSourceToRegistryZEVENTLOG_ERROR_TYPEÚdeftyper·ZEVENTLOG_INFORMATION_TYPEr¸r¹ZEVENTLOG_WARNING_TYPErºr»ÚtypemapÚ ImportErrorÚprint)rrèrërìrærçrrrr s* zNTEventLogHandler.__init__cCsdS)Nr+r)rrrrrÚ getMessageID.szNTEventLogHandler.getMessageIDcCsdS)Nrr)rrrrrÚgetEventCategory8sz"NTEventLogHandler.getEventCategorycCs|jj|j|jƒS)N)rîrÊÚlevelnorí)rrrrrÚ getEventTypeAs zNTEventLogHandler.getEventTypec Csn|jrjyD|j|ƒ}|j|ƒ}|j|ƒ}|j|ƒ}|jj|j||||gƒWntk rh|j|ƒYnXdS)N) rérñròrôr7Z ReportEventrèrr)rrÚidÚcatÚtyper;rrrrNs    zNTEventLogHandler.emitcCstjj|ƒdS)N)rr}r.)rrrrr._s zNTEventLogHandler.close)Nrå) r$r%r&r rñròrôrr.rrrrrä s     räc@s&eZdZd dd„Zdd„Zdd „ZdS) Ú HTTPHandlerÚGETFNcCsbtjj|ƒ|jƒ}|dkr$tdƒ‚| r:|dk r:tdƒ‚||_||_||_||_||_ ||_ dS)NrùÚPOSTzmethod must be GET or POSTz3context parameter only makes sense with secure=True)rùrú) rr}r rGrOr~ÚurlÚmethodrÝrÞÚcontext)rr~rûrürÝrÞrýrrrr qs zHTTPHandler.__init__cCs|jS)N)r•)rrrrrÚ mapLogRecord…szHTTPHandler.mapLogRecordc Csx�yPddl}ddl}|j}|jr4|jj||jd�}n |jj|ƒ}|j}|j j |j |ƒƒ}|j dkrŠ|j dƒdkrvd}nd}|d||f}|j|j |ƒ|j dƒ} | dkr¶|d| …}|j dkrà|jd d ƒ|jd tt|ƒƒƒ|j�r$ddl} d |jjd ƒ} d| j| ƒjƒjdƒ} |jd| ƒ|jƒ|j dk�rH|j|jd ƒƒ|jƒWn tk �rr|j|ƒYnXdS)Nr)rýrùú?ú&z%c%sú:rúz Content-typez!application/x-www-form-urlencodedzContent-lengthz%s:%szutf-8zBasic ÚasciiZ Authorization)Z http.clientZ urllib.parser~rÝZclientZHTTPSConnectionrýZHTTPConnectionrûÚparseZ urlencoderþrüÚfindZ putrequestZ putheaderr¿r:rÞÚbase64rÐZ b64encodeÚstripÚdecodeZ endheadersr�Z getresponserr) rrZhttpZurllibr~r=rûÚdataÚsepr3rrqrrrr�s@        zHTTPHandler.emit)rùFNN)r$r%r&r rþrrrrrrøls røc@s4eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd S) ÚBufferingHandlercCstjj|ƒ||_g|_dS)N)rr}r ÚcapacityÚbuffer)rr rrrr Ás zBufferingHandler.__init__cCst|jƒ|jkS)N)r:r r )rrrrrÚ shouldFlushÉszBufferingHandler.shouldFlushcCs"|jj|ƒ|j|ƒr|jƒdS)N)r rlr rz)rrrrrrÒs  zBufferingHandler.emitc Cs"|jƒz g|_Wd|jƒXdS)N)rœr r�)rrrrrzÝs zBufferingHandler.flushc Cs z |jƒWdtjj|ƒXdS)N)rzrr}r.)rrrrr.és zBufferingHandler.closeN)r$r%r&r r rrzr.rrrrr »s    r c@s>eZdZejddfdd„Zdd„Zdd„Zd d „Zd d „Z dS) Ú MemoryHandlerNTcCs"tj||ƒ||_||_||_dS)N)r r Ú flushLevelÚtargetÚ flushOnClose)rr rrrrrrr ús zMemoryHandler.__init__cCst|jƒ|jkp|j|jkS)N)r:r r rór)rrrrrr szMemoryHandler.shouldFlushcCs ||_dS)N)r)rrrrrÚ setTargetszMemoryHandler.setTargetc CsD|jƒz,|jr2x|jD]}|jj|ƒqWg|_Wd|jƒXdS)N)rœrr Úhandler�)rrrrrrzs  zMemoryHandler.flushcCsBz|jr|jƒWd|jƒzd|_tj|ƒWd|jƒXXdS)N)rrzrœrr r.r�)rrrrr.,s zMemoryHandler.close) r$r%r&rrºr r rrzr.rrrrrôs  rc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) Ú QueueHandlercCstjj|ƒ||_dS)N)rr}r Úqueue)rrrrrr Hs zQueueHandler.__init__cCs|jj|ƒdS)N)rÚ put_nowait)rrrrrÚenqueueOszQueueHandler.enqueuecCs"|j|ƒ|j|_d|_d|_|S)N)r7r“r;r‘r’)rrrrrÚprepareYs  zQueueHandler.preparec Cs8y|j|j|ƒƒWntk r2|j|ƒYnXdS)N)rrrr)rrrrrrrszQueueHandler.emitN)r$r%r&r rrrrrrrr=s  rc@sVeZdZdZddœdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dS)Ú QueueListenerNF)Úrespect_handler_levelcGs||_||_d|_||_dS)N)rÚhandlersÚ_threadr)rrrrrrrr †szQueueListener.__init__cCs |jj|ƒS)N)rrÊ)rÚblockrrrÚdequeue�szQueueListener.dequeuecCs&tj|jd�|_}d|_|jƒdS)N)rT)Ú threadingZThreadÚ_monitorrrµÚstart)rrYrrrr!™szQueueListener.startcCs|S)Nr)rrrrrr¤szQueueListener.preparecCsD|j|ƒ}x4|jD]*}|js"d}n |j|jk}|r|j|ƒqWdS)NT)rrrróÚlevelr)rrZhandlerZprocessrrrr®s   zQueueListener.handlec Csd|j}t|dƒ}xNy0|jdƒ}||jkr*P|j|ƒ|r@|jƒWqtjk rZPYqXqWdS)NÚ task_doneT)rÚhasattrrÚ _sentinelrr#ZEmpty)rÚqZ has_task_donerrrrr ¾s     zQueueListener._monitorcCs|jj|jƒdS)N)rrr%)rrrrÚenqueue_sentinelÓszQueueListener.enqueue_sentinelcCs|jƒ|jjƒd|_dS)N)r'rrm)rrrrÚstopÝs zQueueListener.stop) r$r%r&r%r rr!rrr r'r(rrrrr~s     ri i€Q)&rrˆrr—r™rVrRrUrrrrrrïZDEFAULT_TCP_LOGGING_PORTZDEFAULT_UDP_LOGGING_PORTZDEFAULT_HTTP_LOGGING_PORTZDEFAULT_SOAP_LOGGING_PORTrÑZSYSLOG_TCP_PORTr`r rr'r<rrr}r|ržr¡rÒrärør rrÚobjectrrrrrÚs@8  FOcE(*PbO9I@