Ë
    Û�ði’3  ã            	       ó<  — d 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	m
Z
 dedefd„Zdedefd„Zdedefd	„Zdedefd
„Zdedefd„Zdedefd„Zdedefd„Zdededefd„Zddedededefd„Zddededefd„Zd„ Zedk(  r ej6                   e«       «       yy)zv
gunicornc - Gunicorn control interface CLI

Interactive and single-command modes for controlling Gunicorn instances.
é    N)Ú_get_default_control_socket)ÚControlClientÚControlClientErrorÚparse_commandÚdataÚreturnc           
      ó"  — | j                  dg «      }|syg }|j                  dd›ddd›ddd	›dd
› �«       |j                  d«       |D ]t  }|j                  dd«      }|j                  dd«      }|j                  d«      rdnd}|j                  d«      }|�|› d�nd}|j                  |d›d|d›d|d	›d|› �«       Œv |j                  d«       |j                  d| j                  dt        |«      «      › d�«       dj                  |«      S )z"Format workers output for display.ÚworkerszNo workers runningÚPIDú<10ú ÚAGEú<6ÚBOOTEDú<8Ú	LAST_BEATz(----------------------------------------Úpidú?ÚageÚbootedÚyesÚnoÚlast_heartbeatús agoún/aÚ úTotal: Úcountz workersú
©ÚgetÚappendÚlenÚjoin)	r   r
   ÚlinesÚwr   r   r   ÚhbÚhb_strs	            úK/var/www/html/Extract/venv/lib/python3.12/site-packages/gunicorn/ctl/cli.pyÚformat_workersr*      s  € à�h‰h�y "Ó%€GÙØ#à€EØ	‡L�L�E˜#�;˜a  b˜z¨¨8°B¨-°q¸¸ÐFÔGØ	‡L�L�Ôàò AˆØ�e‰e�E˜3ÓˆØ�e‰e�E˜3ÓˆØŸ%™% œ/‘¨tˆØ�U‰UÐ#Ó$ˆØ!# �B�4�u‘°Uˆà�‰˜˜C�y  # b ¨¨6°"¨+°Q°v°hÐ?Õ@ðAð 
‡L�L�ÔØ	‡L�L�7˜4Ÿ8™8 G¬S°«\Ó:Ð;¸8ÐDÔEà�9‰9�UÓÐó    c           
      ó  — | j                  d«      syg }|j                  d| j                  d«      › �«       |j                  d«       | j                  dg «      }|rÚ|j                  d«       |j                  dd	›d
dd›d
dd›d
d› �«       |j                  d«       |D ]ƒ  }|j                  dd«      }|j                  dd«      }dj                  |j                  dg «      «      dd }|j                  d«      }|�|› d�nd}|j                  |d	›d
|d›d
|d›d
|› �«       Œ… |j                  d«       | j                  dg «      }|r¦|j                  d«       |j                  dd›d
dd	›d
d› �«       |j                  d«       |D ]d  }	|	j                  dd«      dd }
|	j                  d d!«      }|	j                  d"«      }|�t        |«      nd#}|j                  |
d›d
|d	›d
|› �«       Œf d$j                  |«      S )%z(Format dirty workers output for display.ÚenabledzDirty arbiter not runningzDirty arbiter PID: r   r   r
   zDIRTY WORKERS:r   r   r   r   r   ÚAPPSz<30r   z<------------------------------------------------------------r   r   ú, ÚappsNé   r   r   r   zDIRTY APPS:ÚAPPÚWORKERSÚLIMITú2--------------------------------------------------Úimport_pathÚcurrent_workersr   Úworker_countÚnoner   )r!   r"   r$   Ústr)r   r%   r
   r&   r   r   r0   r'   r(   ÚappÚpathÚcurrentÚlimitÚ	limit_strs                 r)   Úformat_dirtyr@   -   s  € à�8‰8�IÔØ*à€EØ	‡L�LÐ& t§x¡x°£Ð&7Ð8Ô9Ø	‡L�L�Ôà�h‰h�y "Ó%€GÙØ�‰Ð%Ô&Ø�‰˜˜c�{ ! E¨" :¨Q¨v°c¨l¸!¸K¸=ÐIÔJØ�‰�XÔàò 	DˆAØ—%‘%˜˜sÓ#ˆCØ—%‘%˜˜sÓ#ˆCØ—9‘9˜QŸU™U 6¨2Ó.Ó/°°Ð4ˆDØ—‘Ð'Ó(ˆBØ%' ^˜�t˜5‘\¸ˆFà�L‰L˜C ˜9 A c¨" X¨Q¨t°C¨j¸¸&¸ÐBÕCð	Dð 	�‰�RÔà�8‰8�F˜BÓ€DÙØ�‰�]Ô#Ø�‰˜˜c�{ ! I¨c ?°!°G°9Ð=Ô>Ø�‰�XÔàò 	BˆCØ—7‘7˜=¨#Ó.¨s°Ð3ˆDØ—g‘gÐ/°Ó3ˆGØ—G‘G˜NÓ+ˆEØ&+Ð&7œ˜Eœ
¸VˆIà�L‰L˜D ˜: Q w¨s m°1°Y°KÐ@ÕAð	Bð �9‰9�UÓÐr+   c                 ó  — g }| j                  d«      }|rLt        |dz  «      }t        |dz  dz  «      }t        |dz  «      }|r|› d|› d|› d�}n|r	|› d|› d�}n|› d�}nd}|j                  d|› �«       |j                  d	| j                  d
d«      › �«       |j                  d| j                  dd«      › �«       |j                  d| j                  dd«      › �«       |j                  d| j                  dd«      › �«       |j                  d| j                  dd«      › �«       |j                  d| j                  dd«      › �«       | j                  d«      }|r|j                  d|› �«       dj                  |«      S )z Format stats output for display.Úuptimei  é<   zh zm ÚsÚunknownzUptime:           zPID:              r   zWorkers current:  Úworkers_currentr   zWorkers target:   Úworkers_targetzWorkers spawned:  Úworkers_spawnedzWorkers killed:   Úworkers_killedzReloads:          ÚreloadsÚdirty_arbiter_pidzDirty arbiter:    r   )r!   Úintr"   r$   )r   r%   rB   ÚhoursÚminutesÚsecondsÚ
uptime_strÚ	dirty_pids           r)   Úformat_statsrR   W   s”  € à€Eà�X‰X�hÓ€FÙÜ�F˜d‘NÓ#ˆÜ�v ‘}¨Ñ+Ó,ˆÜ�f˜r‘kÓ"ˆÙØ!˜7 " W I¨R°¨y¸Ð:‰JÙØ#˜9 B w i¨qÐ1‰Jà#˜9 A˜‰Jàˆ
à	‡L�LÐ% j \Ð2Ô3Ø	‡L�LÐ% d§h¡h¨u°iÓ&@Ð%AÐBÔCØ	‡L�LÐ% d§h¡hÐ/@À!Ó&DÐ%EÐFÔGØ	‡L�LÐ% d§h¡hÐ/?ÀÓ&CÐ%DÐEÔFØ	‡L�LÐ% d§h¡hÐ/@À!Ó&DÐ%EÐFÔGØ	‡L�LÐ% d§h¡hÐ/?ÀÓ&CÐ%DÐEÔFØ	‡L�LÐ% d§h¡h¨y¸!Ó&<Ð%=Ð>Ô?à—‘Ð,Ó-€IÙØ�‰Ð)¨)¨Ð5Ô6à�9‰9�UÓÐr+   c           	      óØ  — | j                  dg «      }|syg }|j                  dd›ddd›dd› �«       |j                  d	«       |D ]S  }|j                  d
d«      }|j                  dd«      }|j                  dd«      }|j                  |d›d|d›d|› �«       ŒU |j                  d«       |j                  d| j                  dt        |«      «      › d�«       dj                  |«      S )z$Format listeners output for display.Ú	listenerszNo listeners boundÚADDRESSz<40r   ÚTYPEr   ÚFDz7-------------------------------------------------------Úaddressr   ÚtypeÚfdr   r   r   z
 listenersr   r    )r   rT   r%   ÚlnrÚaddrÚltyperZ   s          r)   Úformat_listenersr^   x   sì   € à—‘˜ bÓ)€IÙØ#à€EØ	‡L�L�I˜c�? ! F¨2 ;¨a°¨vÐ6Ô7Ø	‡L�L�Ôàò 4ˆØ�w‰w�y #Ó&ˆØ—‘˜ Ó$ˆØ�W‰W�T˜3ÓˆØ�‰˜˜S�z  5¨ *¨A¨b¨TÐ2Õ3ð	4ð 
‡L�L�ÔØ	‡L�L�7˜4Ÿ8™8 G¬S°«^Ó<Ð=¸ZÐHÔIà�9‰9�UÓÐr+   c                 óê   — g }t        | j                  «       «      D ]E  }| |   }t        |t        «      rdj	                  d„ |D «       «      }|j                  |› d|› �«       ŒG dj	                  |«      S )z!Format config output for display.r/   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w©N)r:   )Ú.0Úvs     r)   ú	<genexpr>z format_config.<locals>.<genexpr>–   s   è ø€ Ò4¨œc !ŸfÑ4ùó   ‚z: r   )ÚsortedÚkeysÚ
isinstanceÚlistr$   r"   )r   r%   ÚkeyÚvalues       r)   Úformat_configrl   Ž   sr   € à€Eô �d—i‘i“kÓ"ò (ˆØ�S‘	ˆÜ�eœTÔ"Ø—I‘IÑ4¨eÔ4Ó4ˆEØ�‰˜�u˜B˜u˜gÐ&Õ'ð	(ð �9‰9�UÓÐr+   c                 óX  — | j                  di «      }g }|j                  d«       |j                  d«       |r t        d„ |j                  «       D «       «      nd}t	        |j                  «       «      D ]$  \  }}|j                  d|d|dz   › d�›d	|› �«       Œ& d
j                  |«      S )zFormat help output for display.ÚcommandszAvailable commands:r   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wra   )r#   )rb   Úcmds     r)   rd   zformat_help.<locals>.<genexpr>¤   s   è ø€ Ò6˜s”#�c—(Ñ6ùre   r   ú  ú<é   r   r   )r!   r"   Úmaxrg   rf   Úitemsr$   )r   rn   r%   Úmax_lenrp   Údescs         r)   Úformat_helprx   œ   s¥   € à�x‰x˜
 BÓ'€HØ€EØ	‡L�LÐ&Ô'Ø	‡L�L�Ôñ ;CŒcÑ6 h§m¡m£oÔ6Ô6È€Gä˜HŸN™NÓ,Ó-ò 7‰	ˆˆTØ�‰�r˜#˜a ¨!¡˜}¨@˜_Ð-¨Q¨t¨fÐ5Õ6ð7ð �9‰9�UÓÐr+   c                 ój  — g }| j                  di «      }|j                  d«       |j                  d|j                  dd«      › �«       |j                  d«       | j                  dg «      }|j                  d| j                  d	d
«      › d�«       |r¯|j                  ddd›ddd›ddd›dd› �«       |j                  dd› �«       |D ]u  }|j                  dd«      }|j                  dd«      }|j                  d«      rdnd}|j                  d«      }|�|› d�nd}	|j                  d|d›d|d›d|d›d|	› �«       Œw n|j                  d«       |j                  d«       | j                  d«      }
|
�r‰|j                  d «       |j                  d|
j                  dd«      › �«       |j                  d«       | j                  d!g «      }|j                  d"| j                  d#d
«      › d�«       |rø|j                  ddd›ddd›dd$› �«       |j                  dd%› �«       |D ]Â  }|j                  dd«      }|j                  dd«      }|j                  d&g «      }|rn|d
   j                  d'«      d(   }|j                  d|d›d|d›d|› �«       |d)d D ]2  }|j                  d'«      d(   }|j                  ddd›ddd›d|› �«       Œ4 Œ©|j                  d|d›d|d›d*�«       ŒÄ n4|j                  d«       n"|j                  d «       |j                  d+«       d,j                  |«      S )-z#Format show all output for display.ÚarbiterzARBITER (master)z  PID: r   r   r   Úweb_workerszWEB WORKERS (Úweb_worker_countr   ú)rq   r   r   r   r   r   r   r   r   z&--------------------------------------r   r   r   r   r   Nr   r   z  (none)Údirty_arbiterzDIRTY ARBITERÚdirty_workerszDIRTY WORKERS (Údirty_worker_countr.   r5   r0   ú:éÿÿÿÿé   z
 (no apps)z  (not running)r   )r!   r"   Úsplitr$   )r   r%   rz   r{   r&   r   r   r   r'   r(   r~   r   r0   Ú	first_appr;   Úapp_names                   r)   Ú
format_allr‡   ¬   sE  € à€Eð �h‰h�y "Ó%€GØ	‡L�LÐ#Ô$Ø	‡L�L�7˜7Ÿ;™; u¨cÓ2Ð3Ð4Ô5Ø	‡L�L�Ôð —(‘(˜=¨"Ó-€KØ	‡L�L�= §¡Ð*<¸aÓ!@Ð AÀÐCÔDÙØ�‰�r˜% ˜ A e¨B Z¨q°¸"°¸Q¸{¸mÐLÔMØ�‰�r˜(˜�_Ô%Øò 	GˆAØ—%‘%˜˜sÓ#ˆCØ—%‘%˜˜sÓ#ˆCØŸe™e Hœo‘U°4ˆFØ—‘Ð'Ó(ˆBØ%' ^˜�t˜5‘\¸ˆFØ�L‰L˜2˜c #˜Y a¨¨B x¨q°¸°¸1¸V¸HÐEÕFñ	Gð 	�‰�ZÔ Ø	‡L�L�Ôð —H‘H˜_Ó-€MÚØ�‰�_Ô%Ø�‰�w˜}×0Ñ0°¸Ó<Ð=Ð>Ô?Ø�‰�RÔð Ÿ™ °"Ó5ˆØ�‰� t§x¡xÐ0DÀaÓ'HÐ&IÈÐKÔLÙØ�L‰L˜2˜e C˜[¨¨%°¨°1°V°HÐ=Ô>Ø�L‰L˜2˜h˜Z˜Ô)Ø"ò D�Ø—e‘e˜E 3Ó'�Ø—e‘e˜E 3Ó'�Ø—u‘u˜V RÓ(�áØ $ Q¡§¡¨cÓ 2°2Ñ 6�IØ—L‘L 2 c¨# Y¨a°°B¨x°q¸¸Ð!DÔEØ# A B˜xò G˜Ø#&§9¡9¨S£>°"Ñ#5˜ØŸ™ r¨"¨S¨°°2°b°'¸¸8¸*Ð%EÕFñGð —L‘L 2 c¨# Y¨a°°B¨x°zÐ!BÕCñDð �L‰L˜Õ$à�‰�_Ô%Ø�‰Ð&Ô'à�9‰9�UÓÐr+   Úcommandc                 óR  — | j                  «       j                  «       }|dk(  rt        |«      S |dk(  rt        |«      S |dk(  rt	        |«      S |dk(  rt        |«      S |dk(  rt        |«      S |dk(  rt        |«      S |dk(  rt        |«      S |rt        j                  |d¬	«      S y
)z¾
    Format response data based on command.

    Args:
        command: Original command string
        data: Response data dictionary

    Returns:
        Formatted string for display
    zshow allzshow workersz
show dirtyz
show statszshow listenerszshow configÚhelprs   ©ÚindentÚOK)ÚlowerÚstripr‡   r*   r@   rR   r^   rl   rx   ÚjsonÚdumps)rˆ   r   Ú	cmd_lowers      r)   Úformat_responser“   ê   s¹   € ð —‘“×%Ñ%Ó'€Ið �JÒÜ˜$ÓÐØ	�nÒ	$Ü˜dÓ#Ð#Ø	�lÒ	"Ü˜DÓ!Ð!Ø	�lÒ	"Ü˜DÓ!Ð!Ø	Ð&Ò	&Ü Ó%Ð%Ø	�mÒ	#Ü˜TÓ"Ð"Ø	�fÒ	Ü˜4Ó Ð ñ Ü—:‘:˜d¨1Ô-Ð-Ør+   Úsocket_pathÚjson_outputc                 óÆ  — 	 t        | «      5 }t        |«      \  }}|r$|› ddj                  |«      › �j                  «       n|}|j	                  |«      }|r!t        t        j                  |d¬«      «       nt        ||«      }t        |«       	 ddd«       y# 1 sw Y   yxY w# t        $ r(}	t        d|	› �t        j                  ¬«       Y d}	~	yd}	~	wt        $ r Y y	w xY w)
zð
    Execute single command and exit.

    Args:
        socket_path: Path to control socket
        command: Command to execute
        json_output: If True, output raw JSON

    Returns:
        Exit code (0 for success, 1 for error)
    r   rs   r‹   Nr   úError: ©Úfilerƒ   é‚   )r   r   r$   r�   Úsend_commandÚprintr�   r‘   r“   r   ÚsysÚstderrÚKeyboardInterrupt)
r”   rˆ   r•   Úclientrp   ÚargsÚfull_commandÚresultÚoutputÚes
             r)   Úrun_commandr¦     sÉ   € ðÜ˜;Ó'ð 	¨6Ü% gÓ.‰IˆC�Ù@D˜c˜U ! C§H¡H¨T£NÐ#3Ð4×:Ñ:Ô<È#ˆLØ×(Ñ(¨Ó6ˆFáÜ”d—j‘j °Ô2Õ3ä(¨¨fÓ5�Ü�f”à÷	÷ 	ñ 	ûô ò Ü�˜�sˆm¤#§*¡*Õ-ÜûÜò Ùðús;   ‚B% �BBÂB% ÂB"ÂB% Â"B% Â%	C Â.CÃC ÃC c                 ó<  — 	 ddl }d}	 t        | «      }|j                  «        t        d| › �«       t        d	«       t        «        t        j                  j                  d
«      }|r	 j                  |«       d}	 	 	 t        d«      j                  «       }|sŒ|j!                  «       dv rn�	 t#        |«      \  }	}
|
r$|	› ddj%                  |
«      › �j                  «       n|	}|j'                  |«      }|r!t        t)        j*                  |d¬«      «       nt-        |	|«      }t        |«       t        «        Œ½|j/                  «        |r	 j3                  |«       |S |S # t        $ r d}Y �Œiw xY w# t        $ r(}t        d|› �t        j                  ¬«       Y d}~yd}~ww xY w# t        $ r Y �Œ;w xY w# t        $ r t        «        Y Œ“w xY w# t        $ r[}t        d|› �«       	 |j/                  «        |j                  «        n # t        $ r t        d«       d}Y Y d}~Œìw xY wY d}~�Œd}~ww xY w# t0        $ r t        «        d}Y �Œw xY w# t4        $ r Y |S w xY w# |j/                  «        |r"	 j3                  |«       w # t4        $ r Y w w xY ww xY w)z¹
    Run interactive CLI with readline support.

    Args:
        socket_path: Path to control socket
        json_output: If True, output raw JSON

    Returns:
        Exit code
    r   NTFr—   r˜   rƒ   zConnected to z3Type 'help' for available commands, 'quit' to exit.z~/.gunicornc_historyz
gunicorn> )ÚquitÚexitÚqr   rs   r‹   zConnection lost. Exiting.rš   )ÚreadlineÚImportErrorr   Úconnectr   rœ   r�   rž   Úosr<   Ú
expanduserÚread_history_fileÚFileNotFoundErrorÚinputr�   ÚEOFErrorrŽ   r   r$   r›   r�   r‘   r“   ÚcloserŸ   Úwrite_history_fileÚ	Exception)r”   r•   r«   Úhas_readliner    r¥   Úhistory_fileÚ	exit_codeÚlinerp   r¡   r¢   r£   r¤   s                 r)   Úrun_interactiver»   .  s•  € ðÛØˆðÜ˜{Ó+ˆØ�‰Ôô
 
ˆM˜+˜Ð
'Ô(Ü	Ð
?Ô@Ü	„Gô —7‘7×%Ñ%Ð&<Ó=€LÙð	Ø×&Ñ& |Ô4ð €Ið/ØðÜ˜\Ó*×0Ñ0Ó2�ñ
 Øà�z‰z‹|Ð4Ñ4ØðÜ)¨$Ó/‘	��TÙDH #  a¨¯©°«Ð'7Ð8×>Ñ>Ô@Èc�Ø×,Ñ,¨\Ó:�áÜœ$Ÿ*™* V°AÔ6Õ7ä,¨S°&Ó9�FÜ˜&”Mô ŒGðG ðR 	�‰ŒÙðØ×+Ñ+¨LÔ9ð Ðˆ9ÐøôS ò Ø‹ðûô ò Ü�˜�sˆm¤#§*¡*Õ-Üûðûô !ò 	Úð	ûô ò Ü”Ùðûô* &ò 	Ü˜ ˜s�mÔ$ðØ—L‘L”NØ—N‘NÕ$øÜ)ò ÜÐ5Ô6Ø !�IÝðúõ %ûð	ûô ò ÜŒØ‹	ðûô ò ØàÐðûð	 	�‰ŒÙðØ×+Ñ+¨LÕ9øÜò Ùðúð ús  ‚E# ‰E5 Á)F) Á=H9 Á?F9 ÂH9 Â/BG Ä0H9 ÅI Å#E2Å1E2Å5	F&Å>F!Æ!F&Æ)	F6Æ5F6Æ9GÇH9 ÇGÇH9 Ç	H6ÇH1Ç* HÈ
H1ÈH(È!H1È"H9 È'H(È(H1È+H9 È1H6È6H9 È9IÉI% ÉIÉI% É	I"É!I"É%JÉ9JÊ
JÊ	JÊJÊJÊJc                  ó¨  — t        j                  dt         j                  d¬«      } | j                  ddt	        «       d¬«       | j                  dd	d
¬«       | j                  dddd¬«       | j                  dddd¬«       | j                  «       }|j                  rddlm} t        d|› d�«       y|j                  }t        j                  j                  |«      s2t        j                  j                  t        j                  «       |«      }|j                   r!t#        ||j                   |j$                  «      S t'        ||j$                  «      S )z#Main entry point for gunicornc CLI.zGunicorn control interfacea?  
Examples:
  gunicornc                      # Interactive mode (default socket)
  gunicornc -s /tmp/myapp.ctl    # Interactive mode with custom socket
  gunicornc -c "show workers"    # Single command mode
  gunicornc -c "worker add 2"    # Add 2 workers
  gunicornc -c "show stats" -j   # Output stats as JSON
        )ÚdescriptionÚformatter_classÚepilogz-sz--socketzUControl socket path (default: auto-detected based on XDG_RUNTIME_DIR or ~/.gunicorn/))ÚdefaultrŠ   z-cz	--commandzExecute single command and exit)rŠ   z-jz--jsonÚ
store_truezOutput raw JSON (for scripting))ÚactionrŠ   z-vz	--versionzShow version and exitr   )Ú__version__zgunicornc (gunicorn r}   )ÚargparseÚArgumentParserÚRawDescriptionHelpFormatterÚadd_argumentr   Ú
parse_argsÚversionÚgunicornrÃ   rœ   Úsocketr®   r<   Úisabsr$   Úgetcwdrˆ   r¦   r�   r»   )Úparserr¡   rÃ   r”   s       r)   ÚmainrÏ   ˆ  s6  € ä×$Ñ$Ø0Ü ×<Ñ<ðô€Fð ×ÑØˆjÜ+Ó-Ødð ô ð ×ÑØˆkØ.ð ô ð
 ×ÑØˆhØØ.ð ô ð ×ÑØˆkØØ$ð ô ð ×ÑÓ€Dà‡|‚|Ý(ÜÐ$ [ M°Ð3Ô4Øà—+‘+€Kô �7‰7�=‰=˜Ô%Ü—g‘g—l‘l¤2§9¡9£;°Ó<ˆà‡|‚|Ü˜;¨¯©°d·i±iÓ@Ð@ä˜{¨D¯I©IÓ6Ð6r+   Ú__main__)F)Ú__doc__rÄ   r�   r®   r�   Úgunicorn.configr   Úgunicorn.ctl.clientr   r   r   Údictr:   r*   r@   rR   r^   rl   rx   r‡   r“   ÚboolrL   r¦   r»   rÏ   Ú__name__r©   © r+   r)   ú<module>rØ      s*  ðñ
ó Û Û 	Û 
å 7ß PÑ Pð˜ð  #ó ð2'�tð ' ó 'ðT�tð  ó ðB˜4ð  Có ð,˜ð  ó ð�dð ˜só ð ;�Tð ;˜có ;ð| ˜Sð  ¨ð  °ó  ñF˜Sð ¨3ð ¸Tð Ècó ñBW ð W°4ð WÀCó Wòt67ðr ˆzÒØ€C‡H�H‰T‹VÕð r+   