ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ aNc@szdZddlmZddlmZddlZddlmZdgZddZ de fd YZ d Z dS( sZ Cascades through several applications, so long as applications return ``404 Not Found``. i(thttpexceptions(t convertersN(tStringIOtCascadet404cKstttj|}g}xj|jD]\\}}|jds_td||fn|j|d|}|j||fq+W|j g|D]\}}|^q}t |d|S(s! Entry point for Paste Deploy configuration Expects configuration like:: [composit:cascade] use = egg:Paste#cascade # all start with 'app' and are sorted alphabetically app1 = foo app2 = bar ... catch = 404 500 ... tappsLBad configuration key %r (=%r); all configuration keys must start with 'app't global_conftcatch( tmaptintRtaslisttitemst startswitht ValueErrortget_apptappendtsortR(tloaderRRt local_conftappstnametvalueR((s>/opt/alt/python27/lib/python2.7/site-packages/paste/cascade.pyt make_cascades cBs#eZdZddZdZRS(sf Passed a list of applications, ``Cascade`` will try each of them in turn. If one returns a status code listed in ``catch`` (by default just ``404 Not Found``) then the next application is tried. If all applications fail, then the last application's failure response is used. Instances of this class are WSGI applications. icCs||_i|_g|_x|D]}t|trVt|jddd}nt|tj rz|}|j }ntj |}|}||j|<|jj |q"Wt |j|_dS(Nii(Rt catch_codestcatch_exceptionst isinstancetstrR tsplittNoneRt HTTPExceptiontcodet get_exceptionRttuple(tselft applicationsRterrortexcR((s>/opt/alt/python27/lib/python2.7/site-packages/paste/cascade.pyt__init__9s      c s'gd fd}y"t|jddp9d}Wntk rYd}nX|dkrSt}|dks|dkr-tj}|dkr|j|djng|}x^|dkr|djt |d}|st dn|j||t |8}qW|j dnt |dj|}||d/opt/alt/python27/lib/python2.7/site-packages/paste/cascade.pytrepl_start_responseOs  tCONTENT_LENGTHiis wsgi.inputsRequest body truncateditcloseN(RR tgetR tTruettempfilet TemporaryFiletwritetreadtmintIOErrortlentseekRtFalseRtcopythasattrtlistR.R( R!tenvironR+R,tlengthtcopy_wsgi_inputtftcopy_lentchunkRt environ_copytvte((R*R!R+s>/opt/alt/python27/lib/python2.7/site-packages/paste/cascade.pyt__call__JsP"         (i(t__name__t __module__t__doc__R%RF(((s>/opt/alt/python27/lib/python2.7/site-packages/paste/cascade.pyR+s  cCsdS(N((ts((s>/opt/alt/python27/lib/python2.7/site-packages/paste/cascade.pyR&s( RItpasteRt paste.utilRR1t cStringIORt__all__RtobjectRR&(((s>/opt/alt/python27/lib/python2.7/site-packages/paste/cascade.pyts   Y