
    ;OOf                     *   d dl mZmZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZ	 d dlZd dlZd dlZd dlmZ d dlmZmZ d dlmZ d dlmZmZ d dlmZmZmZ d dlm Z m!Z!m"Z"m#Z#m$Z$m%Z%  e"d	      Z& e'd
      Z(i d e'd      d e'd      d e'd      de(de(dz   de(dz   de(dz   de(dz   de(dz   de(dz   de(dz   d e(d!z   d"e(d#z   d$e(d%z   d&e(d'z   d(e(d)z   d*e(d+z   e(d,z   e(d-z   e(d.z   e(d/z   e(d0z   e(d1z   e(d2z   e(d3z   e(d4z   d5	Z)e(d6z   e(d7z   e(d8z   e(d9z   e(d:z   e(d;z   e(d<z   e(d=z   e(d>z   d?	Z*i  e"d@      dAdAdB f e"dC      dAdAdD f e"dE      dAdAdF f e"dG      dAdAdH f e"dI      dAdAdJ f e"dK      dAdAdL f e"dM      dAdAdN f e"dO      dAdAdP f e"dQ      dRdAdS f e"dT      dAd dU f e"dV      dAd dW f e"dX      dAdAdY f e"dZ      dAdAd[ f e"d\      dAdAd] f e"d^      dAdAd_ f e"d`      da e"dG      f e"db      d d dc f e"dd      dAdAde f e"df      da e"dE      f e"dg      da e"dQ      f e"dh      dAd di f e"dj      dAd dk f e"dl      dAd dm f e"dn      dAd do f e"dp      dAd dq f e"dr      dAd ds f e"dt      dRd du f e"dv      d d dw f e"dx      d d dy f e"dz      da e"dO      fiZ+dAZ,dRZ- G d{ d|e.      Z/ G d} d~e.      Z0 G d de1      Z2 G d de      Z3 G d de      Z4y# e$ r Y w xY w)    )divisionprint_functionN)util)DEC_SPECIAL_CHARSALT_DEC_SPECIAL_CHARS)Canvas)WidgetBOX)AttrSpecRealTerminal_BASIC_COLORS)ord2chr2BbytesPYTHON3xrange    enter   	backspace   tab	   escupz[Adownz[Brightz[Cleftz[Dhomez[1~insertz[2~deletez[3~endz[4~page upz[5~	page downz[6~f1z[[Af2z[[Bf3z[[Cz[[Dz[[Ez[17~z[18~z[19~z[20~z[21~z[23~z[24~)	f4f5f6f7f8f9f10f11f12OAOBOCODOPOQOROSz[15~)	r   r   r   r    r'   r(   r)   r*   r+   @   c                 ,    | j                  |d         S Nr   )chars)insert_charssnumberqs      L/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/urwid/vterm.py<lambda>rF   h       VAY(G     Ac                 2    | j                  d|d    d      S Nr   T)relativemove_cursorrB   rowsrD   s      rE   rF   rF   i   s    ammAQx$m&O rH   r   c                 0    | j                  d|d   d      S rK   rM   rO   s      rE   rF   rF   j   s    ammAtAwm&N rH   Cc                 0    | j                  |d   dd      S rK   rM   rB   colsrD   s      rE   rF   rF   k   s    ammDGQm&N rH   Dc                 2    | j                  |d    dd      S rK   rM   rT   s      rE   rF   rF   l   s    ammT!WHa$m&O rH   Ec                 0    | j                  d|d   d      S Nr   T
relative_yrM   rO   s      rE   rF   rF   m   s    ammAtAw4m&P rH   Fc                 2    | j                  d|d    d      S rZ   rM   rO   s      rE   rF   rF   n   s    ammAQxDm&Q rH   Gc                 6    | j                  |d   dz
  dd      S )Nr   r<   Tr[   rM   )rB   colrD   s      rE   rF   rF   o   s    Q]]3q6A:qT]%R rH   H   c                 >    | j                  |d   dz
  |d   dz
        S )Nr<   r   rM   )rB   x_yrD   s      rE   rF   rF   p   s!    Q]]3q6A:s1vz%J rH   Jc                 *    | j                  |d         S Nr   )csi_erase_displayrB   moderD   s      rE   rF   rF   q       a&9&9$q'&B rH   Kc                 *    | j                  |d         S rh   )csi_erase_linerj   s      rE   rF   rF   r   s    a&6&6tAw&? rH   Lc                 ,    | j                  |d         S Nr   )lines)insert_linesrA   s      rE   rF   rF   s   rG   rH   Mc                 ,    | j                  |d         S rr   )remove_linesrA   s      rE   rF   rF   t   rG   rH   Pc                 ,    | j                  |d         S r>   )remove_charsrA   s      rE   rF   rF   u   rG   rH   Xc                     | j                  | j                  | j                  d   |d   z   dz
  | j                  d   f      S Nr   r<   )eraseterm_cursorrA   s      rE   rF   rF   v   sB    12q1A&)1Ka1O12q1A1C)D rH   aaliascc                 $    | j                  |      S N)csi_get_device_attributesrB   nonerD   s      rE   rF   rF   z   s    a&A&A!&D rH   dc                 6    | j                  d|d   dz
  d      S )Nr   r<   T)
relative_xrM   )rB   rowrD   s      rE   rF   rF   {   s    Q]]1c!fqjT]%R rH   efgc                 *    | j                  |d         S rh   )csi_clear_tabstoprj   s      rE   rF   rF   ~   rl   rH   hc                 &    | j                  ||      S r   csi_set_modesrB   modesrD   s      rE   rF   rF      s    qua'@ rH   lc                 *    | j                  ||d      S )NTresetr   r   s      rE   rF   rF      s    quat'L rH   mc                 $    | j                  |      S r   )csi_set_attr)rB   attrsrD   s      rE   rF   rF      s    q~~e'< rH   nc                 *    | j                  |d         S rh   )csi_status_reportrj   s      rE   rF   rF      rl   rH   rD   c                 *    | j                  |d         S rh   )csi_set_keyboard_ledsrj   s      rE   rF   rF      s    a&=&=d1g&F rH   rc                 2    | j                  |d   |d         S r}   )csi_set_scroll)rB   t_brD   s      rE   rF   rF      s    Q%5%5c!fc!f%E rH   rB   c                 "    | j                         S r   )save_cursorr   s      rE   rF   rF      s    ammo rH   uc                 "    | j                         S r   )restore_cursorr   s      rE   rF   rF      s    a&6&6&8 rH   `c                       e Zd Zd Zd Zy)	TermModesc                 $    | j                          y r   r   selfs    rE   __init__zTermModes.__init__   s    

rH   c                     d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        t        | _	        y NFT)
display_ctrlr"   lfnlkeys_decckmreverse_videoconstrain_scrollingautowrapvisible_cursorCHARSET_DEFAULTmain_charsetr   s    rE   r   zTermModes.reset   sK    !	 !"#( " ,rH   N)__name__
__module____qualname__r   r    rH   rE   r   r      s    ,rH   r   c                   >    e Zd ZdddddZd Zd Zd Zd Zd	 Zd
 Z	y)TermCharsetN0U)defaultvt100ibmpcuserc                 F    ddg| _         d| _        | j                  d       y )Nr   r   Fr   )_g_sgr_mappingactivater   s    rE   r   zTermCharset.__init__   s'    

 "arH   c                 Z    || j                   |<   | j                  | j                         y)z1
        Redefine G'g' with new mapping.
        r   N)r   r   active)r   r   charsets      rE   definezTermCharset.define   s#     
$rH   c                 n    || _         | j                  j                  | j                  |   d      | _        y)z2
        Activate the given charset slot.
        N)r   MAPPINGgetr   current)r   r   s     rE   r   zTermCharset.activate   s+     ||''
D9rH   c                     d| _         y)zA
        Set graphics rendition mapping to IBM PC CP437.
        TN)r   r   s    rE   set_sgr_ibmpczTermCharset.set_sgr_ibmpc   s     !rH   c                 J    d| _         | j                  | j                         y)zC
        Reset graphics rendition mapping to IBM PC CP437.
        Fr   N)r   r   r   r   s    rE   reset_sgr_ibmpczTermCharset.reset_sgr_ibmpc   s     "$rH   c                     | j                   s| j                  | j                     dk(  rKt        j                  |j                  d            }|dk\  rd| _        t        t        |         S d| _        |S |S )Nr   cp437r   r   r   )	r   r   r   r   finddecoder   strr   )r   chardec_poss      rE   apply_mappingzTermCharset.apply_mapping   sh     4 ?',,T[[-ABG!|"09::"KrH   )
r   r   r   r   r   r   r   r   r   r   r   rH   rE   r   r      s3    	G%:!%
rH   r   c                   @     e Zd ZdZdZd Z fdZ fdZ fdZ xZ	S )TermScrollerzd
    List subclass that handles the terminal scrollback buffer,
    truncating it as necessary.
    i'  c                 X    t        |       | j                  k\  r| j                  d       y y rh   )lenSCROLLBACK_LINESpopr   s    rE   trunczTermScroller.trunc   s$    t9---HHQK .rH   c                 L    | j                          t        t        |   |       y r   )r   superr   append)r   obj	__class__s     rE   r   zTermScroller.append       

lD(-rH   c                 N    | j                          t        t        |   ||       y r   )r   r   r   r"   )r   idxr   r   s      rE   r"   zTermScroller.insert   s    

lD(c2rH   c                 L    | j                          t        t        |   |       y r   )r   r   r   extend)r   seqr   s     rE   r   zTermScroller.extend   r   rH   )
r   r   r   __doc__r   r   r   r"   r   __classcell__)r   s   @rE   r   r      s)     .3. .rH   r   c                      e Zd ZdZd Zd>dZd Zd?dZd Zd@dZ	dAd	Z
dBd
Z ed      fdZ ed      fdZd Zd Zd Zd ZdBdZd Zd Zd Zd Zd Zd Zd>dZd@dZd@dZd Zd Z	 	 dCdZd Z dBd Z!d@d!Z"d@d"Z#dDd#Z$d@d$Z%d% Z&d& Z'dEd'Z(dFd(Z)dFd)Z*dFd*Z+d+ Z,d, Z-d- Z.d@d.Z/d@d/Z0d0 Z1d@d1Z2dGd2Z3dHd3Z4d4 Z5d5 Z6d6 Z7d7 Z8dHd8Z9dBd9Z:d: Z;d; Z<	 	 dId<Z=d= Z>y)J
TermCanvasFc                     t        j                  |        ||c| _        | _        || _        |j
                  | _        d| _        t               | _	        d| _
        d | _        t               | _        d| j                  d<   | j                          y )NFr   )r   r   Ncursor)r   r   widthheightwidget
term_modesr   	has_focusr   scrollback_bufferscrolling_uputf8_eat_bytesr   utf8_buffercoordsr   )r   r   r   r   s       rE   r   zTermCanvas.__init__   st    "'
DK&&
!-" 7 ,H

rH   Nc                 .   || j                   d   }|| j                   d   }| j                  ||      | _         | j                  rI| j                  j                  r3| j
                  | j                  |z
  k  r||| j
                  z   f| _        yd| _        y)z
        Set terminal cursor to x/y and update canvas cursor. If one or both axes
        are omitted, use the values of the current position.
        Nr   r<   )r   constrain_coordsr   r   r   r  r   r   )r   xys      rE   set_term_cursorzTermCanvas.set_term_cursor  s    
 9  #A9  #A00A6>>JJ--%%a7a$"3"334DKDKrH   c                 :    d| _         | j                  dz
  | _        y)z?
        Reset scrolling region to full terminal size.
        r   r<   N)scrollregion_startr   scrollregion_endr   s    rE   reset_scrollzTermCanvas.reset_scroll  s     #$ $arH   c                 2   |rd| _         | j                          y|| j                  dz  }|s| }t        | j                        }| xj                   |z  c_         | j                   |kD  r|| _         n| j                   dk  rd| _         | j                          y)z
        Scroll the scrolling buffer up (up=True) or down (up=False) the given
        amount of lines or half the screen height.

        If just 'reset' is True, set the scrollbuffer view to the current
        terminal content.
        r   Nrc   )r  r
  r   r   r  )r   r   r   rs   	maxscrolls        rE   scroll_bufferzTermCanvas.scroll_buffer   s      !D  "=KK1$EFE../	U"y( )D" !DrH   c                 (   t               | _        d| _        d| _        d| _        t               | _        d| _        d| _        d| _	        | j                          | j                          | j                  j                          | j                          y)z%
        Reset the terminal.
        Fr   N)r   escbufwithin_escape
parsestateattrspecr   r   saved_cursorsaved_attrsis_rotten_cursorr  init_tabstopsr   r   clearr   s    rE   r   zTermCanvas.reset=  sy     g""}  % 	

 	

rH   c                     t        | j                  d      \  }}|dkD  r|dz  }|rNt        | j                        |k  r5| j                  j	                  d       t        | j                        |k  r4y y dg|z  | _        y )N   r   r<   )divmodr   r   tabstopsr   )r   r   tablenmods       rE   r  zTermCanvas.init_tabstopsW  so    TZZ+7aKFdmm$v-$$V, dmm$v- $Hv-DMrH   c                    |r3t        t        | j                              D ]  }d| j                  |<    y || j                  d   }t	        |d      \  }}|r| j                  |xx   d|z   z  cc<   y | j                  |xx   d|z  z  cc<   y Nr   r  r<   )r   r   r  r   r  )r   r  remover  r   divr!  s          rE   set_tabstopzTermCanvas.set_tabstopb  s    c$--01 '%&c"'9  #A!Q<SMM#AH+-MM#18,rH   c                 r    || j                   d   }t        |d      \  }}| j                  |   d|z  z  dkD  S r#  )r   r  r  )r   r  r%  r!  s       rE   
is_tabstopzTermCanvas.is_tabstopq  sC    9  #A!Q<Sc"a3h/144rH    c                 @    | j                  |      g| j                  z  S r   )
empty_charr   r   r   s     rE   
empty_linezTermCanvas.empty_linex  s    %&33rH   c                 H    | j                   | j                  j                  |fS r   )r  r   r   r,  s     rE   r+  zTermCanvas.empty_char{  s    t||33T::rH   c                     | j                   dk  s| j                  dk  ry |D ]  }| j                  t        |              y rh   )r   r   addbyter   )r   databytes      rE   addstrzTermCanvas.addstr~  s:    ::?dkkQ. 	%DLLd$	%rH   c                    | j                   \  }}|| j                  kD  rQt        | j                        D ]8  }| j                  |xx   | j                         g|| j                  z
  z  z  cc<   : nH|| j                  k  r9t        | j                        D ]!  }| j                  |   d| | j                  |<   # || _        || j                  kD  rt        | j                  |      D ]  }	 | j                  j                         }t        |      | j                  k  r.|| j                         g| j                  t        |      z
  z  z  }n|d| j                   }|dz  }| j                  j                  d|        n^|| j                  k  rOt        || j                        D ]6  }| j                  j                  | j                  j                  d             8 || _        | j                          | j                  ||      \  }}| j!                  ||       | j#                  d       y# t        $ rB | j                  j                  | j                                | xj                  dz  c_        Y w xY w)zD
        Resize the terminal to the given width and height.
        Nr<   r   T)r   )r   r   r   r   termr+  r  r   
IndexErrorr   r-  r  r   r"   r  r  r
  r  )r   r   r   r  r	  	last_lines         rE   resizezTermCanvas.resize  s.    14::DKK( K		!!2 3utzz7I JJKTZZDKK( 4#yy|FU3		!4 
DKKDKK0 / $ 6 6 : : <I y>DJJ.$//"3!4"&**s9~"="? ?I !*+4:: 6IQ		  I.%/& dkk!FDKK0 @&&--diimmA.>?@ $$Q*1Q" 	$'; " II$$T__%67))Q.)	s   (H**AI54I5c                    | j                   j                  t        k7  ry|t        d      k(  rd}nd}|t        d      k(  rd}n$|t        d      k(  rd}n|t        d	      k(  rd
}nd}| j                  j                  ||       y)zF
        Set G0 or G1 according to 'char' and modifier 'mod'.
        N(r   r<   r   r   r   r   rm   r   r   )r   r   r   r   r   r   )r   r   r!  r   csets        rE   set_g01zTermCanvas.set_g01  sw     ::""o5!C&=AA1S6>DQsV^DQsV^DDAt$rH   c                 t   | j                   j                  t        d            }g }| j                   |xr dxs dd j                  t        d            D ]  }	 t	        |      }|j                  |       ! t        |   t        |   d   dk(  rt        t        |   d      }n	t        |   }|\  }}}	t        |      |k  r |j                  |       t        |      |k  r t        t        |            D ]  }
||
   	||
   dk(  s|||
<    	  |	| ||       yy# t
        $ r d}Y w xY w# t
        $ r Y yw xY w)zL
        Parse ECMA-48 CSI (Control Sequence Introducer) sequences.
        ?r<   r   N;r   )
r  
startswithr   splitint
ValueErrorr   CSI_COMMANDSr   r   )r   r   qmarkr  argnumcsi_cmdnumber_of_argsdefault_valuecmdis              rE   	parse_csizTermCanvas.parse_csi  sU    &&qv.;;u{/a0177#? 	C#h MM#	 )D!!$/&T(:1(=?&t,18.NM3f+.m, f+.CK( .!9$q	Q -F1I.D&%( *  (   s$   D
D+ D('D(+	D76D7c                    |t        d      k(  r|t        d      k(  r| j                          y|t        d      k(  rH|t        d      k(  rt        | j                  _        y|t        d      v rt
        | j                  _        yy|t        d      k(  s|t        d      k(  r| j                  ||       y|t        d      k(  r| j                  d	
       y|t        d      k(  r| j                          y|t        d      k(  r| j                          y|t        d      k(  r| j                          y|t        d      k(  r| j                          y|t        d      k(  r#| j                  j                  t        dz          y|t        d      k(  r| j                  d	       y|t        d      k(  r| j                  d	       yy)z;
        Parse escape sequences which are not CSI.
        #8%r;   G8r:  )ru   TreverserV   r   rX   rb   Z[?6c7)
with_attrsN)r   decalnr   r   r   CHARSET_UTF8r<  linefeedr   newliner&  r   respondESCr   r   )r   r   r!  s      rE   parse_noncsizTermCanvas.parse_noncsi  sO    !C&=TQsV^KKMAcF]qv~*9

'4*6

' ! AcF]cQsVmLLs#QsV^MM$M'QsV^MMOQsV^JJLQsV^LLNQsV^QsV^KKf-QsV^-QsV^40 rH   c                     |j                  t        d            r| j                  j                  |dd        y|j                  t        d            r| j                  j                  |dd        yy)z1
        Parse operating system command.
        r?  r<   Nz3;rc   )r@  r   r   	set_title)r   bufs     rE   	parse_osczTermCanvas.parse_osc  sY     >>!C&!KK!!#ab'*^^AdG$KK!!#ab'* %rH   c                    | j                   dk(  ro|t        j                         v r| j                  |       d| _         n|t	        d      v s| j
                  s|t	        d      k(  r| xj
                  |z  c_        y | j                   dk(  r%|t	        d      k(  rt               | _        d| _         y | j                   dk(  rC|t	        d      k(  r5| j                  | j
                  j                  t	        d                   n,| j                   dk(  r]| j
                  d	d  |z   t	        t        d
z         k(  r8| j                  | j
                  d d	 j                  t	        d                   n| j                   dk(  r>| j
                  j                  t	        d            rt        | j
                        dk(  rns| j                   dk(  r| j
                  s|t	        d      k(  rnH| j                   dk(  r| xj
                  |z  c_        y | j                   dk(  r%|t	        d      k(  rt               | _        d| _         y | j                   dk(  r;|t	        d      t	        d      t	        d      t	        d      fv r|| _        d| _         y | j                   dk(  r| j                  || j
                         ny|t	        d      t	        d      t	        d      t	        d      t	        d      t	        d      t	        d      t	        d      t	        d      t	        d      f
v r| j                  |       | j                          y )Nr<   r   z0123456789;r>  ]rc   r   \rx   r  R[rQ  rO  r:  rS     r   rV   rX   rb   ru   rV  rX  rP  >=)r  rD  keysrM  r   r  r   rd  lstripr_  r@  r   r`  leave_escaper,  s     rE   parse_escapezTermCanvas.parse_escape  sm   ??a|((**t$"#=))$++$!C&.t#__!dafn'DKDO__!dai&7NN4;;--af56__!dkk"#&6&=3:&NNN4;;s+221S6:;__!dkk&<&<QsV&D"__!$++$!C&.__!KK4K__!dafn'DKDO__!dqvqvqvqv.N&NDKDO__!dDKK0afafafafafafafaPSfVWX[V\^_`c^deed#rH   c                 >    d| _         d| _        t               | _        y )NFr   )r  r  r   r  r   s    rE   rq  zTermCanvas.leave_escapeL  s    "grH   c                 4    d}|dz  r|dz  }|dz  }|dz  r|S )z
        Process startbyte and return the number of bytes following it to get a
        valid UTF-8 multibyte sequence.

        bytenum -- an integer ordinal
        r   @   r<   r   )r   bytenumlengths      rE   get_utf8_lenzTermCanvas.get_utf8_lenQ  s2     nMGaKF n rH   c                    | j                   j                  t        k(  st        j                  dk(  r|dk\  r'| j                  |      | _        t        |      | _        yd|cxk  rdk  rn n| j                  | j                  dkD  r4| xj                  dz  c_        | xj                  t        |      z  c_        yd| _        | j                  t        |      z   j                  dd      }t        |      dk(  ry|j                  t        j                  d	      }nd| _        t        |      }nt        |      }| j                  |       y)
z
        Parse main charset and add the processed byte(s) to the terminal state
        machine.

        byte -- an integer ordinal
        utf8   N   r<   utf-8ignorer   replace)r   r   r[  r   _target_encodingrx  r  r   r  r   r   encodeprocess_char)r   r2  sequencer   s       rE   r0  zTermCanvas.addbyte`  s    JJ##|3!!V+t|&*&7&7&=##': $$)<)<)H&&*''1,'$$T
2$ +/D' $ 0 0d ;CCGXVH8})#??4+@+@)LD&*#Dz:D$rH   c                 v   | j                   \  }}t        |t              rt        |      }| j                  j
                  }|t        d      k(  r| j                  dk7  rd| _        y|s|t        d      k(  r| j                          y|s*|t        d      k(  r| j                  j                  d       y|s*|t        d      k(  r| j                  j                  d       y|sE|t        d	      v r8| j                          | j                  j                  r| j                          yy|s|t        d
      k(  r| j                          y|s*|t        d      k(  r|dkD  r| j                  |dz
  |       yy|s8|t        d      k(  r*| j                  dk7  r| j                   j#                          y|s|t        d      v r| j%                          y|s|t        d      v ry| j                  r| j'                  |       y|s,|t        d      k(  rd| _        t)               | _        d| _        y| j-                  |       y)ze
        Process a single character (single- and multi-byte).

        char -- a byte string
        rc   Tr   r<   z
	rg  zz    N)r   
isinstancerB  chrr   r   r   r  r  carriage_returnr   r   r\  r   r   r
  r   beeprq  rr  r   r  push_cursor)r   r   r  r	  dcs        rE   r  zTermCanvas.process_char  s    1dC t9DZZ$$1V9A!5!%D&	)  "&	)LL!!!$&	)LL!!!$. 11MMOzz$$& &	)HHJ&	)1u$$QUA. &	)doo.B KK*-*-d#&	)!%D'DKDOT"rH   c                     || j                   d   }|| j                   d   }| j                  ||      \  }}| j                  | j                  j                  |f| j
                  |   |<   y)z~
        Set character of either the current cursor position
        or a position given by 'x' and/or 'y' to 'char'.
        Nr   r<   )r   r  r  r   r   r5  r   r   r  r	  s       rE   set_charzTermCanvas.set_char  sj    
 9  #A9  #A$$Q*1==$,,*>*>E		!QrH   c                 T   || j                   k\  r| j                   dz
  }n|dk  rd}| j                  j                  r@|s>|| j                  kD  r| j                  }||fS || j                  k  r| j                  }||fS || j
                  k\  r| j
                  dz
  }||fS |dk  rd}||fS )z
        Checks if x/y are within the terminal and returns the corrected version.
        If 'ignore_scrolling' is set, constrain within the full size of the
        screen and not within scrolling region.
        r<   r   )r   r   r   r  r  r   )r   r  r	  ignore_scrollings       rE   r  zTermCanvas.constrain_coords  s     

?

QAUA::))2B4((()) !t T,,,++ !t DKKKK!O !t Q!trH   c                 b   | j                   \  }}|rA|dcxk  r| j                  k  rn nns|| j                  k(  r| j                  d       nQ|dz  }nK|| j                  dz
  cxk\  r| j                  kD  rn nn%|| j                  k(  r| j                          n|dz  }| j                  ||       y)zw
        Move the cursor down (or up if reverse is True) one line but don't reset
        horizontal position.
        r   TrT  r<   N)r   r  scrollr   r  r
  )r   rU  r  r	  s       rE   r\  zTermCanvas.linefeed  s    
 1A////d---D)QDKK!O;d&;&;;d+++QQ"rH   c                 B    | j                  d| j                  d          y r}   )r
  r   r   s    rE   r  zTermCanvas.carriage_return  s    Q 0 0 34rH   c                 D    | j                          | j                          y)z?
        Do a carriage return followed by a line feed.
        N)r  r\  r   s    rE   r]  zTermCanvas.newline  s     	rH   c                     |rdx}}|r| j                   d   |z   }|r| j                   d   |z   }n%| j                  j                  r|| j                  z  }| j	                  ||       y)z
        Move cursor to position x/y while constraining terminal sizes.
        If 'relative' is True, x/y is relative to the current cursor
        position. 'relative_x' and 'relative_y' is the same but just with
        the corresponding axis.
        Tr   r<   N)r   r   r   r  r
  )r   r  r	  r   r\   rL   s         rE   rN   zTermCanvas.move_cursor  sn     &**J  #a'A  #a'AZZ++(((AQ"rH   c                     |U| j                   j                  |      }| j                  j                  r| j	                  |       n| j                  |       | j                  ||       y)zS
        Push one character to current position and advance cursor to x/y.
        N)r   )r   r   r   r"   r@   r  r
  r  s       rE   	push_charzTermCanvas.push_char  sX     <<--d3Dzz  !!t!,d#Q"rH   c                 
   | j                   \  }}| j                  j                  r|dz   | j                  k\  r'| j                  sd| _        | j                  |||       y|dz  }|| j                  k\  rE| j                  r9|| j                  k\  r| j                          n|dz  }d}| j                  d|       | j                  |||       d| _        y|dz   | j                  k  r|dz  }d| _        | j                  |||       y)z
        Move cursor one character forward wrapping lines as needed.
        If 'char' is given, put the character into the former position.
        r<   Tr   FN)	r   r   r   r   r  r  r  r  r
  r  s       rE   r  zTermCanvas.push_cursor  s    
 1::1u

"4+@+@ )-%tQ*Q

?t'<'<D111QA((A.tQ*(-%1utzz!Q$)D!NN4A&rH   c                     t        | j                        | _        |rDt        j                  | j                        t        j                  | j
                        f| _        y y r   )tupler   r  copyr  r   r  )r   rY  s     rE   r   zTermCanvas.save_cursorA  sG    !$"2"23 $		$-- 8 $		$,, 7 9D rH   c                    | j                   y | j                   \  }}| j                  ||       |r]| j                  Pt        j                  | j                  d         t        j                  | j                  d         c| _        | _        y y y r}   )r  r
  r  r  r  r   )r   rY  r  r	  s       rE   r   zTermCanvas.restore_cursorG  s    $  1Q"$**6+/99T5E5Ea5H+I+/99T5E5Ea5H+I (DM4< 7:rH   c                     | j                   \  }}|| j                  dz
  k  rD| j                  t        d             |dz  }| j	                  |      rn|| j                  dz
  k  rDd| _        | j                  ||       y)zg
        Moves cursor to the next 'tabstop' filling everything in between
        with spaces.
        r<   r)  FN)r   r   r  r   r(  r  r
  )r   tabstopr  r	  s       rE   r   zTermCanvas.tabR  sw    
 1$**q. MM!C&!FAq! $**q.  !&Q"rH   c                    |rZ| j                   j                  | j                         | j                   j                  | j                  | j                                y| j                   j                  | j                        }| j                  j                  |       | j                   j                  | j                  | j                                y)z
        Append a new line at the bottom and put the topmost line into the
        scrollback buffer.

        If reverse is True, do exactly the opposite, but don't save into
        scrollback buffer.
        N)r5  r   r  r"   r  r-  r  r   )r   rU  killeds      rE   r  zTermCanvas.scrollc  s     IIMM$//0IIT44doo6GHYY]]4#:#:;F""))&1IIT22DOO4EFrH   c                 t    t        | j                        D ]   }| j                  d      | j                  |<   " y)zB
        DEC screen alignment test: Fill screen with E's.
        rX   N)r   r   r-  r5  r   r   s     rE   rZ  zTermCanvas.decalns  s2     $++& 	2C!__S1DIIcN	2rH   c                 >    | j                         | j                  |<   y)zZ
        Blank a single line at the specified row, without modifying other lines.
        N)r-  r5  r  s     rE   
blank_linezTermCanvas.blank_linez  s     *		#rH   c                 >   || j                   }|dk(  rd}|| j                         }n#| j                  | j                  j                  |f}|\  }}|dkD  rH| j
                  |   j                  ||       | j
                  |   j                          |dz  }|dkD  rGyy)z
        Insert 'chars' number of either empty characters - or those specified by
        'char' - before 'position' (or the current position if not specified)
        pushing subsequent characters of the line to the right without wrapping.
        Nr   r<   )r   r+  r  r   r   r5  r"   r   )r   positionr?   r   r  r	  s         rE   r@   zTermCanvas.insert_chars  s     ''HA:E<??$DMM4<<#7#7>D1aiIIaL4(IIaLQJE airH   c                     || j                   }|dk(  rd}|\  }}|dkD  rV| j                  |   j                  |       | j                  |   j                  | j	                                |dz  }|dkD  rUyy)z
        Remove 'chars' number of empty characters from 'position' (or the current
        position if not specified) pulling subsequent characters of the line to
        the left without joining any subsequent lines.
        Nr   r<   )r   r5  r   r   r+  )r   r  r?   r  r	  s        rE   rz   zTermCanvas.remove_chars  sv     ''HA:E1aiIIaLQIIaL 12QJE airH   c                    || j                   d   }n| j                  }|dk(  rd}|dkD  r[| j                  j                  || j	                                | j                  j                  | j                         |dz  }|dkD  rZyy)z
        Insert 'lines' of empty lines after the specified row, pushing all
        subsequent lines to the bottom. If no 'row' is specified, the current
        row is used.
        Nr<   r   )r   r  r5  r"   r-  r   r  r   r   rs   s      rE   rt   zTermCanvas.insert_lines  sz     ;""1%C))CA:EaiIIS$//"34IIMM$//0QJE airH   c                    || j                   d   }n| j                  }|dk(  rd}|dkD  r[| j                  j                  |       | j                  j	                  | j
                  | j                                |dz  }|dkD  rZyy)z
        Remove 'lines' number of lines at the specified row, pulling all
        subsequent lines to the top. If no 'row' is specified, the current row
        is used.
        Nr<   r   )r   r  r5  r   r"   r  r-  r  s      rE   rw   zTermCanvas.remove_lines  sz     ;""1%C))CA:EaiIIMM#IIT22DOO4EFQJE airH   c                     | j                   | \  }} | j                   | \  }}||k(  r5t        ||dz         D ]"  }| j                         | j                  |   |<   $ y|}||k  r||k(  r<t        || j                        D ]"  }| j                         | j                  |   |<   $ nJ||k(  r4t        |dz         D ]"  }| j                         | j                  |   |<   $ n| j                  |       |dz  }||k  ryy)aB  
        Erase a region of the terminal. The 'start' tuple (x, y) defines the
        starting position of the erase, while end (x, y) the last position.

        For example if the terminal size is 4x3, start=(1, 1) and end=(1, 2)
        would erase the following region:

        ....
        .XXX
        XX..
        r<   N)r  r   r+  r5  r   r  )	r   startr$   sxsyexeyr  r	  s	            rE   r~   zTermCanvas.erase  s    '&&.B&&&,B 8BQ' 5#'??#4		"a 5 2gBwDJJ/ 8A&*oo&7DIIaLO8bQ 8A&*oo&7DIIaLO8 "FA 2grH   c                    |D ]  }d|cxk  rdk  r	n n|dz
  }d|cxk  rdk  r	n n|dz
  },|dk(  r|j                  d       d}E|dk(  r|j                  d       d}^|d	k(  rd}f|d
k(  r,| j                  j                          d| j                  _        |dv r,| j                  j                          d| j                  _        |dk(  r|j                  d       |dk(  r|j                  d       |dk(  r|j                  d       |dk(  r|j                  d       %|dk(  r|j                  d       =|dk(  r|j                  d       U|dk(  r|j                  d       m|dk(  stdx}}|j                           d|v r||dz  }d } ||      } ||      }t        |      dkD  rdj                  |gt        |      z         }|dk(  r|dk(  ryt        ||      S )z
        Parse SGI sequence and return an AttrSpec representing the sequence
        including all earlier sequences specified as 'fg', 'bg' and
        'attributes'.
           %   (   /   &   	underlineN'   1   
   F)      Tr<   bold      blink   standout      r   r   r  c                     | yt         |    S )Nr   )r   )colors    rE   
_defaulterz.TermCanvas.sgi_to_attrspec.<locals>._defaulter*  s    } $U++rH   ,r   )adddiscardr   r   r   r   r   r  r   joinlistr   )r   r   fgbg
attributesattrr  s          rE   sgi_to_attrspeczTermCanvas.sgi_to_attrspec  s     +	#DTRBYt!r!BY{+"";/,,.*/

'!**,*.

' v&{+w'z* "";/""7+"":.R  "W+	#Z ZBN!GB	, ^^z?Q2$j!112B?rYB##rH   c                 2   |d   dk(  rd| _         t               }| j                   dx}}nd| j                   j                  v rd}n | j                   j                  }|dk\  r|dz  }d| j                   j                  v rd}n | j                   j
                  }|dk\  r|dz  }dD ]*  }t        | j                   |      s|j                  |       , | j                  ||||      }| j                  j                  r| j                  |      | _         y|| _         y)z)
        Set graphics rendition.
        rh  r   Nr   r  )r  r  r  r  )r  set
foregroundforeground_number
backgroundbackground_numbergetattrr  r  r   r   reverse_attrspec)r   r   r  r  r  r  r  s          rE   r   zTermCanvas.csi_set_attr;  s    9> DMU
== NB DMM444]]447B!GBDMM444]]447B!GBB %t}}d3t$	% ''r2zB::## 11(;DM$DMrH   c                 P   |t        dd      }|j                  j                  d      D cg c]  }|j                          }}d|v r+|r)|j	                  d       dj                  |      |_        |S d|vr)|s'|j                  d       dj                  |      |_        |S c c}w )zd
        Put standout mode to the 'attrspec' given and remove it if 'undo' is
        True.
        r   r  r  )r   r  rA  stripr$  r  r   )r   r  undor  r   s        rE   r  zTermCanvas.reverse_attrspec`  s    
 	95H&.&9&9&?&?&DEEE4LL$"%((5/H  u$TLL$"%((5/H Fs   B#c                     t        | j                        D ]]  }t        | j                        D ]C  }| j                  |   |   }| j	                  |d   |      }|f|dd z   | j                  |   |<   E _ y)zP
        Reverse video/scanmode (DECSCNM) by swapping fg and bg colors.
        r   r  r<   N)r   r   r   r5  r  )r   r  r	  r  r   r   s         rE   r   zTermCanvas.reverse_videop  s|     $ 	6ADJJ' 6yy|A--d1gD-A#((T!"X"5		!Q6	6rH   c                 B   |r|dk(  r|| j                   _        y|dk(  r| j                          y|dk(  r>| j                   j                  |k7  r| j                  |        || j                   _        y|dk(  r$|| j                   _        | j                  dd       y|dk(  r|| j                   _        y|dk(  r"|| j                   _        | j                          yy|dk(  r|| j                   _        y|d	k(  r|| j                   _	        y|d
k(  r|| j                   _
        yy)zC
        Helper method for csi_set_modes: set single mode.
        r<   rl  r  r     r   r  r  r     N)r   r   r  r   r   r
  r   r   r   r"   r   )r   rk   flagrE  r   s        rE   set_modezTermCanvas.set_modez  s     qy)-

&

::++t3&&H&5+/

(15

.$$Q*&*

#,0

)$$& 
 qy*.

'$(

!"&

 rH   c                 @    | }|D ]  }| j                  ||||        y)zX
        Set (DECSET/ECMA-48) or reset modes (DECRST/ECMA-48) if reset is True.
        N)r  )r   r   rE  r   r  rk   s         rE   r   zTermCanvas.csi_set_modes  s,     y 	4DMM$eU3	4rH   c                    |dk(  rd}|dk(  r| j                   }||cxk  r| j                   k  rTn y| j                  d|dz
  d      d   | _        | j                  d|dz
  d      d   | _        | j	                  dd       yy)z
        Set scrolling region, 'top' is the line number of first line in the
        scrolling region. 'bottom' is the line number of bottom line. If both
        are set to 0, the whole screen will be used (default).
        r   r<   T)r  N)r   r  r  r  r
  )r   topbottoms      rE   r   zTermCanvas.csi_set_scroll  s     !8CQ;[[F&4;;&&*&;&;37T '< ''D# %)$9$96A: %: %%D!   A& 'rH   c                 d    |dk(  r| j                  d       y|dk(  r| j                  d       yy)zc
        Clear tabstop at current position or if 'mode' is 3, delete all
        tabstops.
        r   T)r$  rl  )r  N)r&  r   rk   s     rE   r   zTermCanvas.csi_clear_tabstop  s9    
 19D)QY4( rH   c                 N    |s#| j                   j                  t        dz          yy)zz
        Report device attributes (what are you?). In our case, we'll report
        ourself as a VT102 terminal.
        rW  N)r   r^  r_  )r   rE  s     rE   r   z$TermCanvas.csi_get_device_attributes  s"    
 KKf- rH   c                     |dk(  r#| j                   j                  t        dz          y|dk(  r=| j                  \  }}| j                   j                  t        d|dz   |dz   fz  z          yy)z
        Report various information about the terminal status.
        Information is queried by 'mode', where possible values are:
            5 -> device status report
            6 -> cursor position report
        r  z[0nr  z[%d;%dRr<   N)r   r^  r_  r   r   rk   r  r	  s       rE   r   zTermCanvas.csi_status_report  sd     19KKe,QY##DAqKKi1q5!a%.&@ @A rH   c                     | j                   \  }}|dk(  r,| j                  | j                   | j                  dz
  |f       y|dk(  r| j                  d|f||f       y|dk(  r| j                  |       yy)z
        Erase current line, modes are:
            0 -> erase from cursor to end of line.
            1 -> erase from start of line to cursor.
            2 -> erase whole line.
        r   r<   rc   N)r   r~   r   r  r  s       rE   ro   zTermCanvas.csi_erase_line  sp     119JJt''$**q.!)<=QYJJ1v1v&QYOOA rH   c                 0   |dk(  r8| j                  | j                  | j                  dz
  | j                  dz
  f       |dk(  r2| j                  d| j                  d   dz
  | j                  d   f       y|dk(  r| j	                  | j                         yy)z
        Erase display, modes are:
            0 -> erase from cursor to end of display.
            1 -> erase from start to cursor.
            2 -> erase the whole display.
        r   r<   r   r   rc   )r   N)r~   r   r   r   r  r  s     rE   ri   zTermCanvas.csi_erase_display  s     19JJt''$**q.$++/)JK19JJv 0 0 3a 79I9I!9LMNQYJJd..J/ rH   c                 X    ddddd}||v r| j                   j                  ||          yy)a0  
        Set keyboard LEDs, modes are:
            0 -> clear all LEDs
            1 -> set scroll lock LED
            2 -> set num lock LED
            3 -> set caps lock LED

        This currently just emits a signal, so it can be processed by another
        widget or the main application.
        r  scroll_locknum_lock	caps_lock)r   r<   rc   rl  N)r   leds)r   rk   statess      rE   r   z TermCanvas.csi_set_keyboard_leds  s;     	
 6>KKVD\* rH   c                     t        | j                        D cg c]  }| j                          c}| _        || j	                  dd       y | j                  |  yc c}w )z
        Clears the whole terminal screen and resets the cursor position
        to (0, 0) or to the coordinates given by 'cursor'.
        Nr   )r   r   r-  r5  r
  )r   r   r  s      rE   r  zTermCanvas.clear  sQ    
 17t{{0CD1T__&D	>  A& D  &) Es   Ac                     | j                   S r   )r   r   s    rE   rU   zTermCanvas.cols  s    zzrH   c                     | j                   S r   )r   r   s    rE   rP   zTermCanvas.rows  s    {{rH   c              #      K   | j                   dk(  r| j                  D ]  }|  y | j                  | j                  z   }|| j                  | j                   z    | j                     D ]  }|  y wrh   )r  r5  r  r   )r   	trim_left
trim_rightrU   rP   attr_maplinerc  s           rE   contentzTermCanvas.content  sx     !		 
 ((4994Cdkk$*;*;;<d>O>O=OP 
s   A1A3c                 n    || u r"| j                         g| j                         z  S | j                         S r   )rU   rP   r  )r   others     rE   content_deltazTermCanvas.content_delta(  s.    D=IIK=,,||~rH   )NN)TFNF)NFFr   )FFF)r  )Nr<   N)Nr<   r  )r   )r   r   NNN)?r   r   r   	cacheabler   r
  r  r  r   r  r&  r(  r   r-  r+  r3  r8  r<  rM  r`  rd  rr  rq  rx  r0  r  r  r  r\  r  r]  rN   r  r  r   r   r   r  rZ  r  r@   rz   rt   rw   r~   r  r   r  r   r  r   r   r   r   r   ro   ri   r   r  rU   rP   r  r  r   rH   rE   r   r      s]   I$&0:4	.-5  f 4  f ;%3(j%.!F1>+-^
" H-#^F0#05 >C"#*##'J9	K#"G 2+0&&&!FE$N#%J 6'B4'*).B 0+*
* BFrH   r   c                       e Zd ZdZ eeg      Zg dZ	 	 ddZd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zd ZddZd Zd ZddZd Zd Zy)TerminalT)closedr  r  titleNc                    t        j                  |        |xs d| _        t        |xs t        j
                        | _        |xs | j                  j                  dd      g| _        || _	        d| _
        d| _        g | _        t               | _        || _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        y)a  
        A terminal emulator within a widget.

        ``command`` is the command to execute inside the terminal, provided as a
        list of the command followed by its arguments.  If 'command' is None,
        the command is the current user's shell. You can also provide a callable
        instead of a command, which will be executed in the subprocess.

        ``env`` can be used to pass custom environment variables. If omitted,
        os.environ is used.

        ``main_loop`` should be provided, because the canvas state machine needs
        to act on input from the PTY master device. This object must have
        watch_file and remove_watch_file methods.

        ``escape_sequence`` is the urwid key symbol which should be used to break
        out of the terminal widget. If it's not specified, ``ctrl a`` is used.

        ``encoding`` specifies the encoding that is being used when local
        keypresses in Unicode are encoded into raw bytes. UTF-8 is used by default.
        Set this to the encoding of your terminal if you need to transmit
        characters to the spawned process in non-UTF8 encoding.
        Applies to Python 3.x only.

        .. note::

            If you notice your Terminal instance is not printing unicode glyphs
            correctly, make sure the global encoding for urwid is set to
            ``utf8`` with ``urwid.set_encoding("utf8")``. See
            :ref:`text-encodings` for more details.
        zctrl aSHELLz/bin/shFN)r	   r   escape_sequencedictosenvironenvr   commandencodingkeygrablast_keyresponse_bufferr   r   	main_loopmasterpidr   r   r5  r   
terminated)r   r  r  r  r  r  s         rE   r   zTerminal.__init__4  s    B 	.:()rzz*D488<<#C"D !#+"
	rH   c                    | j                   y| j                   j                  | j                   j                  }}|d   | j                   _        |d   | j                   _        | j                   j                  | j                   j                  d   | j                   j                  d         \  }}||c| j                   _        | j                   _        ||fS )z8Return the cursor coordinates for this terminal
        Nr   r<   )r5  r   r   r  r   )r   size
orig_widthorig_heightr  r	  s         rE   get_cursor_coordszTerminal.get_cursor_coordsq  s     99 #'))//4993C3CK
q'		7		yy))II!!!$II!!!$
1
 -7)		)1vrH   c                    | j                   }d|d<   t        j                         \  | _        | _        | j                  dk(  rkt        | j                        r(	 	 | j                          t        j                  d       n.t        j                  | j                  d   | j                  |       | j                   =t#        j"                  | j                  t"        j$                  t        j&                         t)        j*                  | j,                         y #  t        j                  j                  t        j                                t        j                  j                          Y xY w# t        j                  d       w xY w)NlinuxTERMr   )r  ptyforkr  r  callabler  sysstderrwrite	traceback
format_excflushr  _exitexecvper  fcntlF_SETFL
O_NONBLOCKatexitregister	terminate)r   r  s     rE   spawnzTerminal.spawn  s    hhF #
$+88q=% +
 HHQK

4<<?DLL#>>>!KKU]]BMMB'+

(()=)=)?@

((*HHQKs   D AE*'E- -Fc                    | j                   ry d| _         | j                          | j                  d       | j                  dkD  r| j	                  dd       t
        j                  t
        j                  t
        j                  t
        j                  t
        j                  fD ]p  }	 t        j                  | j                  |       t        j                  | j                  t        j                        \  }}|dk(  r nt!        j"                  d       r 	 t        j                  | j                  d       t        j$                  | j&                         y y # t        $ r Y  Nw xY w# t        $ r Y <w xY w)NTFr   g?)r  remove_watchchange_focusr  set_termsizesignalSIGHUPSIGCONTSIGINTSIGTERMSIGKILLr  killwaitpidWNOHANGOSErrortimesleepcloser  )r   sigr  statuss       rE   r6  zTerminal.terminate  s   ??% 88a<a#v~~v}}8 
 GGDHHc*"$**TXXrzz"BKC !8

3
 

488Q' HHT[[!%     s%   )AE E* 	E'&E'*	E65E6c                 &    | j                  d       y )Nr  _emitr   s    rE   r  zTerminal.beep  s    

6rH   c                 (    | j                  d|       y )Nr  rL  )r   whichs     rE   r  zTerminal.leds  s    

65!rH   c                 :    | j                   j                  |       y)zF
        Respond to the underlying application with 'string'.
        N)r  r   r   strings     rE   r^  zTerminal.respond  s     	##F+rH   c                     | j                   D ]1  }t        j                  | j                  |j	                  d             3 g | _         y )Nascii)r  r  r+  r  r  rQ  s     rE   flush_responseszTerminal.flush_responses  s:    ** 	:FHHT[[&--"89	:!rH   c                     t        j                  d||dd      }t        j                  | j                  t
        j                  |       y )NHHHHr   )structpackr1  ioctlr  termios
TIOCSWINSZ)r   r   r   winsizes       rE   r;  zTerminal.set_termsize  s2    ++ffeQ:DKK!3!3W=rH   c                 ^   d}| j                   | j                          d}| j                  |k(  r| j                  |k(  ry | j	                  ||       | j
                  st        |||       | _        n| j
                  j                  ||       || _        || _        |r| j                          y y r   )	r  r7  r   r   r;  r5  r   r8  	add_watch)r   r   r   process_openeds       rE   
touch_termzTerminal.touch_term  s    88JJL!N::4;;&#8%(yy"5&$7DIIIUF+
NN rH   c                 (    | j                  d|       y )Nr  rL  )r   r  s     rE   rb  zTerminal.set_title  s    

7E"rH   c                 l   | j                   ry|| _        | j                  +|| j                  _        | j                  j                          |r9t	               j                         | _         t	               j
                  dgdz    yt        | d      r" t	               j
                  | j                    yy)z9
        Ignore SIGINT if this widget has focus.
        N	undefinedr  old_tios)r  r   r5  r
  r   tty_signal_keysre  hasattr)r   r   s     rE   r:  zTerminal.change_focus  s     ??"99 "+DIIII%%'(N::<DM*LN**k]Q->@tZ(...> )rH   c                     | j                   sD| j                  |       |\  }}| j                  ||       | j                  | j	                          | j
                  S r   )r  r:  ra  r  feedr5  )r   r  focusr   r   s        rE   renderzTerminal.render  sK    e$ ME6OOE6*~~%		yyrH   c                 ~    | j                   y | j                   j                  | j                  | j                         y r   )r  
watch_filer  ri  r   s    rE   r_  zTerminal.add_watch
  s+    >>!!!$++tyy9rH   c                 h    | j                   y | j                   j                  | j                         y r   )r  remove_watch_filer  r   s    rE   r9  zTerminal.remove_watch  s%    >>!((5rH   c                     	 	 t        j                   | j                  gg g |       	 | j	                          y # t         j                  $ r}|j                  d   dk7  r Y d }~nd }~ww xY wj)Nr   r  )selectr  errorargsri  )r   timeoutr   s      rE   wait_and_feedzTerminal.wait_and_feed  sb    t{{mRW= 			 << 66!9> "	 s   #8 A(A##A(c                    t         }	 t        j                  | j                  d      }|t         k(  r"| j                          | j                  d       y | j                  j                  |       | j                          y # t        $ rC}|j
                  dk(  rt         }n#|j
                  t
        j                  k(  rY d }~y  Y d }~d }~ww xY w)Ni   r  r  )EOFr  readr  rE  errnoEWOULDBLOCKr6  rM  r5  r3  rU  )r   r1  r   s      rE   ri  zTerminal.feed  s    	774;;-D 3;NNJJx 		  	ww!|E---	 	s    A? ?	C3C CCc                 h   | j                   r|S |dk(  r|\  }}| j                  ||       y | j                  | j                  k(  r|| j                  k(  r|| _        d| _        n| j                  r| j                  |k(  rd| _        || _        y |dk(  r2| j
                  j                          || _        | j                          y |dk(  r4| j
                  j                  d       || _        | j                          y | j                  | j                  k(  r|| j                  k7  r	|| _        |S | j                  |k(  rd| _        || _        y | j                  |   |dk(  rd| _        n	|| _        |S || _        | j
                  j                  d       |j                  d	      ra|d
   j                         r't        t        |d
         t        d      z
  dz         }nqt        t        |d
         t        d      z
  dz         }nJ| j                  j                  r|t        v rt        j!                  |      }nt"        j!                  ||      }| j                  j$                  r
|dk(  r|dz  }t&        r|j)                  | j*                  d      }t-        j.                  | j0                  |       y )Nzwindow resizeTFr%   r&   )r   r   r   zctrl rh  r   r<   rI   r  
r~  )r  ra  r  r  r  r5  r  _invalidate_command_mapr@  islowerr  ordr   r   KEY_TRANSLATIONS_DECCKMr   KEY_TRANSLATIONSr   r   r  r  r  r+  r  )r   r  keyr   r   s        rE   keypresszTerminal.keypress4  sR   ??J/! ME6OOE6*MMT111t+++DMDL\\##s*$ #i		'') #  "#		''5'1 #  "--4#7#77T111 #
%%,# #""3'/3'>  $ !$
		d+>>'"2w #c"g,S1A56#c"g,S1A56**s6M/M-11#6&**34 ??C6M6MC**T]]H5C
c"rH   )NNNr}  r  )g      ?)r   r   r   _selectable	frozensetr
   _sizingsignalsr   r"  r7  r6  r  r  r^  rU  r;  ra  rb  r:  rk  r_  r9  ru  ri  r  r   rH   rE   r  r  .  sz    KG1GJN!; z,(0"8","
>.#?(
:
6
,J#rH   r  )5
__future__r   r   r  r)  rF  r  ry  rq  rX  r<  r4  r,  r&  r1  r[  ImportErrorurwidr   urwid.escaper   r   urwid.canvasr   urwid.widgetr	   r
   urwid.display_commonr   r   r   urwid.compatr   r   r   r   r   r   rw  r  r_  r  r  rD  r   r[  objectr   r   r  r   r   r  r   rH   rE   <module>r     s  . 0 	 
        	  A  $ F F > >e	"gRS 
Q 
	
 	t t t t u u u 
u u u  	u!" 	u#$ 	u%& uuvvvvvvv7 > ttttttttv
 ) cFQGH) cFQOP) cFQNO) cFQNO) cFQOP) cFQPQ) cFQQR)  cFQRS!)" cFQJK#)$ cFQBC%)& cFQ?@')( cFQGH))* cFQGH+), cFQGH-). cFQ D E/)4 cFWaf5)6 cFQDE7)8 cFQRScFWafcFWafcFQBCcFQ@AcFQLMcFQ<=cFQBCcFQFGcFQEFcFQ56cFQ89cFWafQ)V , ,(7& 7r.4 ..z zz!P#v P#M(  		s   L	 	LL