Ë  ö{æD< ãó¾—ddlmZddlmZmZmZmZddlmZGd„d«Z ejd¬«Gd„d ««Z dd „Z Gd „d «Z Gd„d«Zd„Zy )é)Úattr)ÚencodingÚerrorÚpycompatÚutil)ÚurlutilcóT—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z dd „Z d „Z d „Z d „Z d „Zy)Ú multidictz¨A dict like object that can store multiple values for a key. Used to store parsed request parameters. This is inspired by WebOb's class of the same name. có—i|_y©N©Ú_items©Úselfs ú;usr/lib/python3.12/site-packages/mercurial/hgweb/request.pyÚ__init__zmultidict.__init__ s €Øˆ� ócó&—|j|dS)z%Returns the last set value for a key.éÿÿÿÿr ©rÚkeys rÚ __getitem__zmultidict.__getitem__#s€à�{‰{˜3Ñ Ñ#Ð#rcó$—|g|j|<y)z,Replace a values for a key with a new value.Nr ©rrÚvalues rÚ __setitem__zmultidict.__setitem__'s€à!˜7ˆ� ‰ �CÒrcó—|j|=y)zDelete all values for a key.Nr rs rÚ __delitem__zmultidict.__delitem__+s€à �K‰K˜Ñ rcó—||jvSr r rs rÚ __contains__zmultidict.__contains__/s€Ø�d—k‘kÐ!Ð!rcó,—t|j«Sr )Úlenrrs rÚ__len__zmultidict.__len__2s€Ü�4—;‘;ÓÐrNcóH— |j|«S#t$r|cYSwxYwr )rÚKeyError)rrÚdefaults rÚgetz multidict.get5s,€ð Ø×#Ñ# CÓ(Ð (øÜò ØŠNð ús ‚“ ! !cóZ—|jj|g«j|«y)z„ñòò$ò#òò"ò óò 6ò(ò ó.tobytes§s@€Ü˜!œSÔ!؈HÜ × Ò ô×&Ñ& qÓ)Ð )ô×$Ñ$ QÓ'Ð 'rs REPO_NAMEswsgi.url_schemes://có`—|jd«r|dk7r|d|zz }|S|dk7r|d|zz }|S)Nshttps://ó443ó:ó80)Ú startswith)rZÚports rÚaddportz$parserequestfromenv..addportÈsF€Ø �<‰<˜ Ô $Ø�vŠ~Ø�T˜D‘[Ñ �ð ˆð�uŠ}Ø�T˜D‘[Ñ �àˆrs HTTP_HOSTs SERVER_NAMEs SERVER_PORTshttpr_shttpsr]s SCRIPT_NAMErs PATH_INFOó/s QUERY_STRINGó?sreponame requires PATH_INFOs0PATH_INFO does not begin with repo name: %s (%s)NsDreponame prefix of PATH_INFO does not end at path delimiter: %s (%s)T)Úkeep_blank_valuessHTTP_ó_ó-r/©Ú wsgiheaderssCONTENT_LENGTHsHTTP_CONTENT_LENGTHóContent-Lengths CONTENT_TYPEsHTTP_CONTENT_TYPEs Content-Types wsgi.inputó0rBsREQUEST_METHODrCrDrErFrGrHs REMOTE_USERrIs REMOTE_HOSTrJrKrLrMrNrOrPrQrRr=)r4r'rrCÚschemeÚhostrarÚurlreqÚquoteÚpathr`ÚstriprÚProgrammingErrorr"ÚrstripÚsplitÚjoinr Úparseqslr+r*ÚreplaceÚriÚHeadersÚ cappedreaderÚintr@)ÚenvrMÚ altbaseurlrQr[r6r7ÚfullurlÚadvertisedfullurlrbrarDrFrprJÚ repoprefixrLrKrNrOrPris rÚparserequestfromenvr�„s€òF (ð/2¯i©i¬kÔ :©k¡d a¨‰7�1‹:‘w˜q“zÑ !¨k€CÑ :ñ Ø—7‘7˜<Ó(ˆáÜ—[‘[ Ó,ˆ ð Ð$Ñ%¨Ñ.€Gá�j×'Ò'Ø&×-Ñ-°Ñ6Ñà#Ðòð ‡w�wˆ|ÔØ�3�|Ñ$Ñ$‰à�3�~Ñ&Ñ&ˆÙ˜' 3 ~Ñ#6Ó7ˆá�j—o’oؘZŸ_™_Ñ,Ðà �?Š?Ø—?‘?‰DØ × Ñ  'Ò )°*·/²/؉DØ × Ñ  (Ò *°:·?²?؉Dà�~Ñ&ˆDá#Ð$5°tÓ<Ñà˜S Ñ0Ñ0ÐÙ#Ð$5°s¸>Ñ7JÓKÐà€GØ)Ðà Œt�{‰{× Ñ  §¡¨¸Ó!=Ó>Ñ>€GØ Œt�{‰{× Ñ  §¡¨°sÓ!;Ó<Ñ<€GáØ�‰Ò% #ˆÙ ˜Ÿ™¨Ô-ؘ$‘;ˆDØœTŸ[™[×.Ñ.¨tÓ4Ñ4ÑàœTŸ[™[×.Ñ.¨s¯w©w°~ÀsÓ/KÓLÑLÐàœŸ™×*Ñ*¨3¯7©7°<ÀÓ+EÓFÑFÐà ‡w�wˆÔØ�4˜#˜oÑ.Ñ.Ñ.ˆØ˜T C¨Ñ$8Ñ8Ñ8Ðñ Ø—/‘/Ò( SˆÙ ˜7×-Ñ-¨dÔ3ؘW‘n‰Gà—'‘'˜.¨#Ó.ˆáؘHŸN™N¨4Ó0Ñ0ˆ à�w‰w�|Ô$Ü×(Ñ(Ð)GÓHÐ Hà�<Ñ ×+Ñ+¨JÔ7Ü×(Ñ(ð!Ø$'¨ Ñ$5°xÐ#@ñAóð ð ˜<Ñ(¬¨Z«Ð):Ð;ˆ á   × 7Ñ 7¸Ô =Ü×(Ñ(ð6à�|Ñ$ hÐ/ñ0óð ð —.‘. Ó&¨Ñ3ˆØ$×*Ñ*¨4Ó0×6Ñ6°tÓ<ˆ Ø—y‘y Ó/‰ à ˜Ñ Ø ˆ|Ñ × "Ñ " 4Ô (Ø  Ñ-×3Ñ3°DÓ9×?Ñ?ÀÓEˆMØŸ9™9 ]Ó3‰LàˆM؉Làˆ Øˆ à—'‘'˜/¨3Ó/€Kô‹{€HÜ— ‘ ×$Ñ$ [ÀDÐ$ÖI‰ˆˆ1Ø� ‰ �Q˜ÕðJð €GØ— ‘ – ‰ˆˆ1Ø �<‰<˜Õ !Ø �N‰N˜Aœc (›m˜oÐ.×6Ñ6°t¸TÓBÀAÐFÕ Gðõà×!Ñ! 'Ó*€Gð ˜CÑÐ$:À#Ñ$EØ%(Ð):Ñ%;ˆÐ!Ñ"à˜#ÑÐ"6¸cÑ"AØ#& Ñ#7ˆ�Ñ à €~Ø�]Ñ#ˆØ  Ñ 'Ü×&Ñ&Øœ˜GÐ$5Ñ6Ò>¸$Ó?óˆFô ò ØÐ$Ò%ð á ð ñð ñ(ð  ñ ,ð  ð Ð(Ò)ð  ð—7‘7˜>Ô*ð ð—7‘7˜>Ô*ð ñð ñ$ð ñ"ð ñð ñ ð ñð ñð ñ ð! ñ"ð# ðùó ;s—V có(—eZdZdZd„Zd„Zd„Zd„Zy)ÚoffsettrackingwriteraüA file object like object that is append only and tracks write count. Instances are bound to a callable. This callable is called with data whenever a ``write()`` is attempted. Instances track the amount of written data so they can answer ``tell()`` requests. The intent of this class is to wrap the ``write()`` function returned by a WSGI ``start_response()`` function. Since ``write()`` is a callable and not a file object, it doesn't implement other file object methods. có —||_d|_y)Nr0)Ú_writeÚ_offset)rÚwritefns rrzoffsettrackingwriter.__init__ts€ØˆŒ ؈� rcó’—|j|«}|€|xjt|«z c_y|xj|z c_yr )r…r†r")rrZÚress rÚwritezoffsettrackingwriter.writexs4€Ø�k‰k˜!‹nˆà ˆ;Ø �LŠLœC ›FÑ "ŽLà �LŠL˜CÑ ŽLrcó—yr r=rs rÚflushzoffsettrackingwriter.flush€s€Ø rcó—|jSr )r†rs rÚtellzoffsettrackingwriter.tellƒs €Ø�|‰|ÐrN)r9r:r;r<rrŠrŒrŽr=rrrƒrƒfs„ñ òò ò órrƒcó:—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z y ) Ú wsgiresponseaPRepresents a response to a WSGI request. A response consists of a status line, headers, and a body. Consumers must populate the ``status`` and ``headers`` fields and make a call to a ``setbody*()`` method before the response can be issued. When it is time to start sending the response over the wire, ``sendresponse()`` is called. It handles emitting the header portion of the response message. It then yields chunks of body data to be written to the peer. Typically, the WSGI application itself calls and returns the value from ``sendresponse()``. có¬—||_||_d|_ddlm}|j g«|_d|_d|_d|_ d|_ d|_ y)zÃCreate an empty response tied to a specific request. ``req`` is a ``parsedrequest``. ``startresponse`` is the ``start_response`` function passed to the WSGI application. Nr/rhF) Ú_reqÚ_startresponseÚstatusrxriryrPÚ _bodybytesÚ_bodygenÚ_bodywillwriteÚ_startedÚ _bodywritefn)rÚreqÚ startresponseris rrzwsgiresponse.__init__—sT€ð ˆŒ Ø+ˆÔàˆŒ Ý!à"×*Ñ*¨2Ó.ˆŒ àˆŒØˆŒ Ø#ˆÔ؈Œ Ø ˆÕrcóv—|j€|j€ |jrtjd«‚y)Ns!cannot define body multiple times)r•r–r—rrrrs rÚ _verifybodyzwsgiresponse._verifybody«s6€à �O‰OÐ 'Ø�}‰}Ð(Ø×"Ò"ä×(Ñ(Ð)MÓNÐ Nð#rcóh—|j«||_dt|«z|jd<y)ztDefine the response body as static bytes. The empty string signals that there is no response body. s%drjN)r�r•r"rP)rÚbs rÚ setbodybyteszwsgiresponse.setbodybytes³s.€ð ×ÑÔØˆŒØ*/´#°a³&©.ˆ� ‰ Ð&Ò'rcó2—|j«||_y)z1Define the response body as a generator of bytes.N)r�r–)rÚgens rÚ setbodygenzwsgiresponse.setbodygen¼s€à ×ÑÔØˆ� rcó2—|j«d|_y)aSignal an intent to use write() to emit the response body. **This is the least preferred way to send a body.** It is preferred for WSGI applications to emit a generator of chunks constituting the response body. However, some consumers can't emit data this way. So, WSGI provides a way to obtain a ``write(data)`` function that can be used to synchronously perform an unbuffered write. Calling this function signals an intent to produce the body in this manner. TN)r�r—rs rÚsetbodywillwritezwsgiresponse.setbodywillwriteÁs€ð ×ÑÔØ"ˆÕrc#ó:K—|jrtjd«‚d|_|jstjd«‚|j€F|j €:|j s.|jjdk7rtjd«‚|jjd«rÃ|jjd«d k(r |jd=|jj«D�chc]}|j«d vr|’Œ}}|r0tjd d jt|««z«‚|j € |j rtjd «‚d}d}|jjjdd«j«dk(rnL|jjdvrn3t!|jj"t$j&«sd}nd}|rd|jd<|rZt!|jj"t$j&«sJ‚ |jj"j)d«}|snŒ)|jj+«D��cgc]/\}}t-j.|«t-j.|«f‘Œ1}}}|j1t-j2|j«|«}|jr|j–—y|j r1|j D]!}t!|t4«r t7|«}|–—Œ#y|j r||_y|jjdk(rytjd«ycc}wcc}}w­w)zðSend the generated response to the client. Before this is called, ``status`` must be set and one of ``setbodybytes()`` or ``setbodygen()`` must be called. Calling this method multiple times is not allowed. s$sendresponse() called multiple timesTsstatus line not definedNsHEADsresponse body not defineds304 rjrk)sdatesetagsexpiress cache-controlscontent-locationscontent-security-policysvarys"illegal header on 304 response: %ss, s,must use setbodybytes('') with 304 responsesFsExpectrs 100-continue)sPOSTsPUTsCloses Connectioni€sdo not know how to send body)r˜rrrr”r•r–r—r’rBr`rPr'ÚkeysÚlowerruÚsortedrUrQrrzÚreadr4rÚstrurlr“ÚsysstrÚ bytearrayÚbytesr™) rr6Ú badheadersÚdrainÚcloseÚchunkr7Ú strheadersrŠs rÚ sendresponsezwsgiresponse.sendresponseÒs%èø€ð �=Š=Ü×(Ñ(Ø7óð ðˆŒ à�{Š{Ü×(Ñ(Ð)CÓDÐ Dð �O‰OÐ #Ø— ‘ Ð%Ø×'Ò'Ø— ‘ × Ñ  GÒ+ä×(Ñ(Ð)EÓFÐ Fð �;‰;× !Ñ ! 'Ô *ð�|‰|×ÑÐ 1Ó2°dÒ:Ø—L‘LÐ!2Ð3ð Ÿ™×*Ñ*Ô,ó á,�AØ—7‘7“9ðñ òØ,ð ð ñÜ×,Ñ,Ø9Ø—j‘j¤¨ Ó!3Ó4ñ5óðð �}‰}Ð(¨D×,?Ò,?Ü×,Ñ,ØCóððˆØˆð �9‰9× Ñ × Ñ  ¨CÓ 0× 6Ñ 6Ó 8¸OÒ KØ ð�Y‰Y× Ñ Ð%6Ñ 6Ø ô˜dŸi™i×.Ñ.´×0AÑ0AÔBØ‘ð�á Ø*2ˆD�L‰L˜Ñ 'á ܘdŸi™i×.Ñ.´×0AÑ0AÔBÐ BÐBØØŸ ™ ×(Ñ(×-Ñ-¨eÓ4�ÙØð🠙 ×*Ñ*Ô,ô á,‘��1ô�_‰_˜QÓ ¤§¡°Ó!3Ò 4Ø,ð ñ ð×#Ñ#¤H§O¡O°D·K±KÓ$@À*ÓMˆà �?Š?Ø—/‘/Ó !Ø �]Š]ØŸœ�ô˜e¤YÔ/Ü! %›L�Eà“ ñ'ð× Ò Ø %ˆDÕ Ø �Y‰Y× Ñ  Ò (Ø ä × "Ñ "Ð#BÕ Cùò} ùóP ùs ‚C>NÄNÄE3NÊ4NËCNcóÌ—|jstjd«‚|jstjd«‚|jsJ‚t |j«S)aÕObtain a file object like object representing the response body. For this to work, you must call ``setbodywillwrite()`` and then ``sendresponse()`` first. ``sendresponse()`` is a generator and the function won't run to completion unless the generator is advanced. The generator yields not items. The easiest way to consume it is with ``list(res.sendresponse())``, which should resolve to an empty list - ``[]``. s"must call setbodywillwrite() firstsWmust call sendresponse() first; did you remember to consume it since it is a generator?)r—rrrr˜r™rƒrs rÚ getbodyfilezwsgiresponse.getbodyfile[s`€ð×"Ò"Ü×(Ñ(Ð)NÓOÐ Oà�}Š}Ü×(Ñ(ð#óð ð × Ò Ð Ð Ü# D×$5Ñ$5Ó6Ð6rN) r9r:r;r<rr�r r£r¥r´r¶r=rrr�r�‡s.„ñ ò!ò(Oò9òò #ò"GDóR7rr�có ‡—|«Šˆfd„}|S)z{For compatibility with old CGI scripts. A plain hgweb() or hgwebdir() can and should now be used as a WSGI application.có•—‰||«Sr r=)r|ÚrespondÚ applications €rÚrun_wsgiz!wsgiapplication..run_wsgixsø€Ù˜3 Ó(Ð(rr=)Ú app_makerr»rºs @rÚwsgiapplicationr½ssø€ñ“+€Kô)ð €Or)NNN)Ú thirdpartyrrxrrrrÚutilsrr rZr@r�rƒr�r½r=rrÚrÀsmðõ÷óõ ÷ 8<ñ8<ðv€‡�ˆtÔ÷-ð-óð-ó`_÷Dñ÷Bi7ñi7óXr