+
    üg©jŒ;  ã                   ó`  € ^ RI t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
Ht ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHtHt ^ RIt^R	IHt ^R
IHtHtHtH t  ]'       d   ^ RIH!t! R7t"]PF                  ! R4      t$RR8RRRRRRR]! 4       R^ RRR^2RRR^R^RRRR/R R llt%RR8RRRRRRR]! 4       R^ RRR^2RRRRRR/R  R! llt&]! R"4      t'R# R$ lt(R9R% R& llt)R' R( lt* ! R) R*4      t+R+ R, lt,R- R. lt-R/ R0 lt.] P^                  R1 R2 l4       t0R3 R4 lt1R5 R6 lt2R# ):é    N)ÚCallableÚ	Generator)Úimport_module)Úget_context)ÚSpawnProcess)ÚPath)Úsleep)ÚTYPE_CHECKINGÚAny)ÚDefaultFilter)ÚChangeÚ
FileChangeÚawatchÚwatch)ÚLiteralzwatchfiles.mainÚargsÚkwargsÚtarget_typeÚautoÚcallbackÚwatch_filterÚgrace_periodÚdebouncei@  ÚstepÚdebugÚsigint_timeoutÚsigkill_timeoutÚ	recursiveTÚignore_permission_deniedFc                 óê  € V ^8„  d   QhR\         \        ,          R\        \        R\        3,          ,          R\        \        R3,          R\
        \        \        3,          R,          RRR	\        \        \        ,          .R3,          R,          R
\        \        \        .\        3,          R,          R\        R\        R\        R\        R,          R\        R\        R\        R\        R\        /# )é   ÚpathsÚtarget.r   r   Nr   ú&Literal['function', 'command', 'auto']r   r   r   r   r   r   r   r   r   r   Úreturn©r   Ústrr   r   ÚtupleÚdictÚsetr   r   ÚboolÚfloatÚint)Úformats   "ÚI/var/www/html/bestweb/venv/lib/python3.14/site-packages/watchfiles/run.pyÚ__annotate__r0      s  € ÷ }ñ }Ü”3�Jð}ä”(˜3¤˜8Õ$Õ$ð}ô ”�S��/ð}ô ””c��N˜TÕ!ð	}ð
 :ð}ô œœJ�Ð(¨$Ð.Õ/°$Õ6ð}ô œF¤C˜=¬$Ð.Õ/°$Õ6ð}ô ð}ô ð}ô ð}ô �$�;ð}ô ð}ô ð}ô ð}ô #ð}ô  	ñ!}ó    c                óÔ  € VR8X  d   \        V 4      p\        P                  RW4       \        4        \	        WW4      p^ pV'       d"   \        P                  RV4       \        V4        \        VRVRVRVRV	RR	R
VRV/  F=  pT;'       d	    V! V4       VP                  W«R7       \	        WWV4      pV^,          pK?  	  VP                  4        V#   TP                  4        i ; i)uš  
Run a process and restart it upon file changes.

`run_process` can work in two ways:

* Using `multiprocessing.Process` â€  to run a python function
* Or, using `subprocess.Popen` to run a command

!!! note

    **â€ ** technically `multiprocessing.get_context('spawn').Process` to avoid forking and improve
    code reload/import.

Internally, `run_process` uses [`watch`][watchfiles.watch] with `raise_interrupt=False` so the function
exits cleanly upon `Ctrl+C`.

Args:
    *paths: matches the same argument of [`watch`][watchfiles.watch]
    target: function or command to run
    args: arguments to pass to `target`, only used if `target` is a function
    kwargs: keyword arguments to pass to `target`, only used if `target` is a function
    target_type: type of target. Can be `'function'`, `'command'`, or `'auto'` in which case
        [`detect_target_type`][watchfiles.run.detect_target_type] is used to determine the type.
    callback: function to call on each reload, the function should accept a set of changes as the sole argument
    watch_filter: matches the same argument of [`watch`][watchfiles.watch]
    grace_period: number of seconds after the process is started before watching for changes
    debounce: matches the same argument of [`watch`][watchfiles.watch]
    step: matches the same argument of [`watch`][watchfiles.watch]
    debug: matches the same argument of [`watch`][watchfiles.watch]
    sigint_timeout: the number of seconds to wait after sending sigint before sending sigkill
    sigkill_timeout: the number of seconds to wait after sending sigkill before raising an exception
    recursive: matches the same argument of [`watch`][watchfiles.watch]

Returns:
    number of times the function was reloaded.

```py title="Example of run_process running a function"
from watchfiles import run_process

def callback(changes):
    print('changes detected:', changes)

def foobar(a, b):
    print('foobar called with:', a, b)

if __name__ == '__main__':
    run_process('./path/to/dir', target=foobar, args=(1, 2), callback=callback)
```

As well as using a `callback` function, changes can be accessed from within the target function,
using the `WATCHFILES_CHANGES` environment variable.

```py title="Example of run_process accessing changes"
from watchfiles import run_process

def foobar(a, b, c):
    # changes will be an empty list "[]" the first time the function is called
    changes = os.getenv('WATCHFILES_CHANGES')
    changes = json.loads(changes)
    print('foobar called due to changes:', changes)

if __name__ == '__main__':
    run_process('./path/to/dir', target=foobar, args=(1, 2, 3))
```

Again with the target as `command`, `WATCHFILES_CHANGES` can be used
to access changes.

```bash title="example.sh"
echo "changers: ${WATCHFILES_CHANGES}"
```

```py title="Example of run_process running a command"
from watchfiles import run_process

if __name__ == '__main__':
    run_process('.', target='./example.sh')
```
r   úrunning "%s" as %sú3sleeping for %s seconds before watching for changesr   r   r   r   Úraise_interruptFr   r   )r   r   )Údetect_target_typeÚloggerr   Úcatch_sigtermÚstart_processr	   r   Ústop)r#   r   r   r   r   r   r   r   r   r   r   r   r   r   r"   ÚprocessÚreloadsÚchangess   $$$$$$$$$$$$$$*   r/   Úrun_processr>      s  € ð@ �fÔÜ(¨Ó0ˆä
‡L�LÐ% vÔ;Ü„OÜ˜F°Ó>€GØ€GçÜ�‰ÐJÈLÔYÜˆlÔðÜØð	
à%ð	
ð ð	
ð ð		
ð
 ð	
ð "ð	
ð  ð	
ð &>ô	
ˆGð ×*Ð*™ 'Ó*øØ�L‰L¨ˆLÔXÜ# F¸ÀwÓOˆGØ�q�LŠGñ	
ð 	�‰ŒØ€Nøð 	�‰�ús   Á+"C Â5C ÃC'c                óÚ  € V ^8„  d   QhR\         \        ,          R\        \        R\        3,          ,          R\        \        R3,          R\
        \        \        3,          R,          RRR	\        \        \        ,          .\        3,          R,          R
\        \        \        .\        3,          R,          R\        R\        R\        R\        R,          R\        R\        R\        /# )r!   r"   r#   .r   r   Nr   r$   r   r   r   r   r   r   r   r   r%   r&   )r.   s   "r/   r0   r0   ž   sø   € ÷ Mñ MÜ”3�JðMä”(˜3¤˜8Õ$Õ$ðMô ”�S��/ðMô ””c��N˜TÕ!ð	Mð
 :ðMô œœJ�Ð(¬#Ð-Õ.°Õ5ðMô œF¤C˜=¬$Ð.Õ/°$Õ6ðMô ðMô ðMô ðMô �$�;ðMô ðMô #ðMô 	ñMr1   c              ‡  ó:  "  € ^ RI pVR8X  d   \        V 4      p\        P                  RW4       \	        4        \
        P                  P                  \        WW4      G Rj  x€L
 p^ pV'       d5   \        P                  RV4       \
        P                  ! V4      G Rj  x€L
  \        VRVRVRVRV	R	V
R
V/   Rj  x€L
  pVe*   V! V4      pVP                  V4      '       d   VG Rj  x€L
  \
        P                  P                  VP                  4      G Rj  x€L
  \
        P                  P                  \        WWV4      G Rj  x€L
 pV^,          pK¡   Lø L¼ L  Lt LE LD§\
        P                  P                  TP                  4      G Rj  x€L 
  T# 5i)a³  
Async equivalent of [`run_process`][watchfiles.run_process], all arguments match those of `run_process` except
`callback` which can be a coroutine.

Starting and stopping the process and watching for changes is done in a separate thread.

As with `run_process`, internally `arun_process` uses [`awatch`][watchfiles.awatch], however `KeyboardInterrupt`
cannot be caught and suppressed in `awatch` so these errors need to be caught separately, see below.

```py title="Example of arun_process usage"
import asyncio
from watchfiles import arun_process

async def callback(changes):
    await asyncio.sleep(0.1)
    print('changes detected:', changes)

def foobar(a, b):
    print('foobar called with:', a, b)

async def main():
    await arun_process('.', target=foobar, args=(1, 2), callback=callback)

if __name__ == '__main__':
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print('stopped via KeyboardInterrupt')
```
Nr   r3   r4   r   r   r   r   r   r   )Úinspectr6   r7   r   r8   ÚanyioÚ	to_threadÚrun_syncr9   r	   r   Úisawaitabler:   )r#   r   r   r   r   r   r   r   r   r   r   r   r"   rA   r;   r<   r=   Úrs   $$$$$$$$$$$$*     r/   Úarun_processrG   ž   sx  é € óZ à�fÔÜ(¨Ó0ˆä
‡L�LÐ% vÔ;Ü„OÜ—O‘O×,Ñ,¬]¸FÐQUÓ^×^€GØ€GçÜ�‰ÐJÈLÔYÜ�kŠk˜,Ó'×'Ð'äØ	ðà!ðð ðð ð	ð
 ðð ðð ":ò÷ ð ˆgð ÒÙ˜Ó!ˆAØ×"Ñ" 1×%Ò%Ø—�ä�o‰o×&Ñ& w§|¡|Ó4×4Ð4ÜŸ™×0Ñ0´ÀÐUYÐcjÓk×kˆØ�1�Šñ/ _ñ
 	(ññ á4Ùkðô" �/‰/×
"Ñ
" 7§<¡<Ó
0×0Ñ0Ø€Nùs–   ‚AFÁ!EÁ"FÁ0/FÂEÂ FÂ9E&Â=EÂ>E&Ã$FÃ&FÃ+E Ã,0FÄE"Ä-FÅ
E$ÅFÅFÅE&Å FÅ"FÅ$FÅ&-FÆFÆFÚspawnc                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r!   Úcmdr%   )r'   Úlist)r.   s   "r/   r0   r0   ó   s   € ÷ )ñ )”3ð )œ4¤�9ñ )r1   c                 óŽ   € ^ RI pVP                  4       P                  P                  4       R8g  p\        P
                  ! WR7      # )r   NÚwindows)Úposix)ÚplatformÚunameÚsystemÚlowerÚshlexÚsplit)rJ   rO   rN   s   &  r/   Ú	split_cmdrU   ó   s4   € Ûà�N‰NÓ×#Ñ#×)Ñ)Ó+¨yÑ8€EÜ�;Š;�sÔ(Ð(r1   c                óî   € V ^8„  d   QhR\         \        R\        3,          ,          RRR\        \        R3,          R\        \         \        3,          R,          R\
        \        ,          R,          R	R
/# )r!   r#   .r   úLiteral['function', 'command']r   r   Nr=   r%   ÚCombinedProcess)r'   r   r   r(   r)   r*   r   )r.   s   "r/   r0   r0   ú   sp   € ÷ !$ñ !$Ü”(˜3¤˜8Õ$Õ$ð!$à1ð!$ô ”�S��/ð!$ô ””c��N˜TÕ!ð	!$ô
 ”�_˜tÕ#ð!$ð ñ!$r1   c                 ód  € Vf   RpM:\         P                  ! V UUu. uF  w  rgVP                  4       V.NK  	  upp4      pV\        P                  R&   VR8X  dc   T;'       g    / p\        V \        4      '       d   V \        4       W#3p\        p/ pMT p\        P                  W‚VR7      p	V	P                  4        McV'       g	   V'       d   \        P                  R4       \        V \        4      '       g   Q R4       h\        V 4      p
\        P                   ! V
4      p	\#        V	4      # u uppi )Nz[]ÚWATCHFILES_CHANGESÚfunction)r#   r   r   z-ignoring args and kwargs for "command" targetz+target must be a string to run as a command)ÚjsonÚdumpsÚraw_strÚosÚenvironÚ
isinstancer'   Úget_tty_pathÚrun_functionÚspawn_contextÚProcessÚstartr7   ÚwarningrU   Ú
subprocessÚPopenrX   )r#   r   r   r   r=   Úchanges_env_varÚcÚpÚtarget_r;   Ú
popen_argss   &&&&&      r/   r9   r9   ú   sú   € ð ‚Ø‰äŸ*š*Á7Ô%KÁ7¹4¸1 q§y¡y£{°AÓ&6Á7Ò%KÓLˆà'6„B‡J�JÐ#Ñ$ð �jÔ Ø—�˜2ˆÜ�fœc×"Ò"Øœ<›>¨4Ð7ˆDÜ"ˆGØ‰FàˆGä×'Ñ'¨wÈ&Ð'ÓQˆØ�‰�ç—6Ü�N‰NÐJÔKä˜&¤#×&Ò&ÐUÐ(UÓUÐ&Ü˜vÓ&ˆ
Ü×"Ò" :Ó.ˆÜ˜7Ó#Ð#ùó/ &Ls   �D,
c                óX   € V ^8„  d   QhR\         \        R\        3,          ,          RR/# )r!   r#   .r%   rW   )r'   r   r   )r.   s   "r/   r0   r0     s)   € ÷ ñ œs¤X¨c´3¨hÕ%7Õ7ð Ð<\ñ r1   c                ó¦   € \        V \        4      '       g   R# V P                  R4      '       d   R# \        P                  ! RV 4      '       d   R# R# )a&  
Used by [`run_process`][watchfiles.run_process], [`arun_process`][watchfiles.arun_process]
and indirectly the CLI to determine the target type with `target_type` is `auto`.

Detects the target type - either `function` or `command`. This method is only called with `target_type='auto'`.

The following logic is employed:

* If `target` is not a string, it is assumed to be a function
* If `target` ends with `.py` or `.sh`, it is assumed to be a command
* Otherwise, the target is assumed to be a function if it matches the regex `[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)+`

If this logic does not work for you, specify the target type explicitly using the `target_type` function argument
or `--target-type` command line argument.

Args:
    target: The target value

Returns:
    either `'function'` or `'command'`
r[   Úcommandz[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)+)z.pyz.sh)ra   r'   ÚendswithÚreÚ	fullmatch)r#   s   &r/   r6   r6     s>   € ô, �fœc×"Ò"ÙØ	�‰˜×	(Ò	(ÙÜ	�ŠÐ8¸&×	AÒ	AÙár1   c                   ó¤   a € ] tR tRt o V 3R lR ltRV 3R lR lltV 3R lR lt]V 3R lR	 l4       tV 3R
 lR lt	]V 3R lR l4       t
RtV tR# )rX   i>  c                ó   <€ V ^8„  d   QhRR/# )r!   rl   z&SpawnProcess | subprocess.Popen[bytes]© )r.   Ú__classdict__s   "€r/   r0   ÚCombinedProcess.__annotate__?  s   ø€ ÷ ?ñ ?ÐBñ ?r1   c                ó<   € Wn         V P                  f   Q R4       hR # )Nzprocess not yet spawned©Ú_pÚpid)Úselfrl   s   &&r/   Ú__init__ÚCombinedProcess.__init__?  s   € ØŒØ�x‰xÒ#Ð>Ð%>Ó>Ò#r1   c                ó*   <€ V ^8„  d   QhRS[ RS[ RR/# )r!   r   r   r%   N©r-   )r.   rx   s   "€r/   r0   ry   C  s'   ø€ ÷ Qñ Q¡3ð Q¹Sð QÈñ Qr1   c                ó¸  € \         P                  P                  R R4       V P                  4       '       dÓ   \        P                  R4       \         P                  ! V P                  \        P                  4        V P                  V4       V P                  fX   \        P                  R4       \         P                  ! V P                  \        P                  4       V P                  V4       R# \        P                  R4       R# \        P                  RV P                  4       R#   \        P                   d    \        P                  RT4        LËi ; i)rZ   Nzstopping process...z!SIGINT timed out after %r secondsz+process has not terminated, sending SIGKILLzprocess stoppedz#process already dead, exit code: %d)r_   r`   ÚpopÚis_aliver7   r   Úkillr}   ÚsignalÚSIGINTÚjoinrh   ÚTimeoutExpiredrg   ÚexitcodeÚSIGKILL)r~   r   r   s   &&&r/   r:   ÚCombinedProcess.stopC  sÚ   € Ü
�
‰
�‰Ð+¨TÔ2Ø�=‰=�?Š?Ü�L‰LÐ.Ô/ä�GŠG�D—H‘HœfŸm™mÔ,ðØ—	‘	˜.Ô)ð �}‰}Ò$Ü—‘ÐLÔMÜ—’˜Ÿ™¤&§.¡.Ô1Ø—	‘	˜/Ö*ä—‘Ð.Ö/ä�N‰NÐ@À$Ç-Á-ÖPøô ×,Ñ,ô ô —‘ÐBÀNÔSÙð	ús   Á<D+ Ä++EÅEc                ó    <€ V ^8„  d   QhRS[ /# ©r!   r%   )r+   )r.   rx   s   "€r/   r0   ry   [  s   ø€ ÷ *ñ *™$ñ *r1   c                ó®   € \        V P                  \        4      '       d   V P                  P                  4       # V P                  P	                  4       R J # ©N)ra   r|   r   r…   Úpoll©r~   s   &r/   r…   ÚCombinedProcess.is_alive[  s;   € Ü�d—g‘gœ|×,Ò,Ø—7‘7×#Ñ#Ó%Ð%à—7‘7—<‘<“> TÐ)Ð)r1   c                ó    <€ V ^8„  d   QhRS[ /# r�   r‚   )r.   rx   s   "€r/   r0   ry   b  s   ø€ ÷ ñ ‘Sñ r1   c                ó.   € V P                   P                  # r‘   r{   r“   s   &r/   r}   ÚCombinedProcess.pida  s   € ð �w‰w�{‰{Ðr1   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r!   Útimeoutr%   Nr‚   )r.   rx   s   "€r/   r0   ry   f  s   ø€ ÷ "ñ "™Cð " Dñ "r1   c                ó¶   € \        V P                  \        4      '       d   V P                  P                  V4       R # V P                  P	                  V4       R # r‘   )ra   r|   r   r‰   Úwait)r~   r™   s   &&r/   r‰   ÚCombinedProcess.joinf  s3   € Ü�d—g‘gœ|×,Ò,Ø�G‰G�L‰L˜Ö!à�G‰G�L‰L˜Ö!r1   c                ó.   <€ V ^8„  d   QhRS[ R,          /# ©r!   r%   Nr‚   )r.   rx   s   "€r/   r0   ry   m  s   ø€ ÷ &ñ &™# �*ñ &r1   c                óš   € \        V P                  \        4      '       d   V P                  P                  # V P                  P                  # r‘   )ra   r|   r   r‹   Ú
returncoder“   s   &r/   r‹   ÚCombinedProcess.exitcodel  s3   € ä�d—g‘gœ|×,Ò,Ø—7‘7×#Ñ#Ð#à—7‘7×%Ñ%Ð%r1   )r|   N)é   é   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r:   r…   Úpropertyr}   r‰   r‹   Ú__static_attributes__Ú__classdictcell__)rx   s   @r/   rX   rX   >  sW   ø‡ € ÷?ð ?÷Qò Q÷0*ð *ð ÷ó ð÷"ð "ð ÷&ó ö&r1   rX   c          
      ó–   € V ^8„  d   QhR\         R\         R,          R\        \        R3,          R\        \         \        3,          RR/# )r!   r[   Útty_pathNr   .r   r%   )r'   r(   r   r)   )r.   s   "r/   r0   r0   t  sI   € ÷ ñ œ3ð ¬#°­*ð ¼EÄ#ÀsÀ(½Oð ÔUYÔZ]Ô_bÐZbÕUcð Ðhlñ r1   c                 óŒ   € \        V4      ;_uu_ 4        \        V 4      pV! V/ VB  R R R 4       R #   + '       g   i     R # ; ir‘   )Úset_ttyÚimport_string)r[   r¬   r   r   Úfuncs   &&&& r/   rc   rc   t  s3   € Ü	�×	Õ	Ü˜XÓ&ˆÙˆdÐ�fÒ÷ 
×	×	Ò	ús	   ”2²A	c                ó0   € V ^8„  d   QhR\         R\        /# )r!   Údotted_pathr%   )r'   r   )r.   s   "r/   r0   r0   z  s   € ÷ gñ gœsð g¤sñ gr1   c                ó
  €  V P                  R4      P                  R^4      w  r\	        T4      p \        YB4      #   \         d   p\        RT  R24      ThRp?ii ; i  \         d   p\        RT RT R24      ThRp?ii ; i)	z®
Stolen approximately from django. Import a dotted module path and return the attribute/class designated by the
last name in the path. Raise ImportError if the import fails.
Ú Ú.Ú"z!" doesn't look like a module pathNzModule "z" does not define a "z" attribute)ÚstripÚrsplitÚ
ValueErrorÚImportErrorr   ÚgetattrÚAttributeError)r²   Úmodule_pathÚ
class_nameÚeÚmodules   &    r/   r¯   r¯   z  s£   € ð
VØ"-×"3Ñ"3°CÓ"8×"?Ñ"?ÀÀQÓ"GÑˆô ˜;Ó'€FðgÜ�vÓ*Ð*øô ô VÜ˜A˜k˜]Ð*LÐMÓNÐTUÐUûðVûô ô gÜ˜H [ MÐ1FÀzÀlÐR]Ð^Ó_ÐefÐfûðgús,   ‚#< ±
A ¼AÁAÁAÁBÁ*A=Á=Bc                ó2   € V ^8„  d   QhR\         R,          /# rž   )r'   )r.   s   "r/   r0   r0   ‹  s   € ÷ ñ ”c˜D•jñ r1   c                 ó¦   €  \         P                  ! \        P                  P	                  4       4      #   \
         d     R# \         d     R# i ; i)zf
Return the path to the current TTY, if any.

Virtually impossible to test in pytest, hence no cover.
z/dev/ttyN)r_   ÚttynameÚsysÚstdinÚfilenoÚOSErrorr¼   rw   r1   r/   rb   rb   ‹  s@   € ðÜ�zŠzœ#Ÿ)™)×*Ñ*Ó,Ó-Ð-øÜô âÜô âðús   ‚14 ´AÁAÁAÁAc                óL   € V ^8„  d   QhR\         R,          R\        R,          /# )r!   r¬   Nr%   )NNN)r'   r   )r.   s   "r/   r0   r0   œ  s$   € ÷ ñ ”c˜D•jð ¤YÐ/?Õ%@ñ r1   c              #   óÖ   "  € V '       d/    \        V 4      ;_uu_ 4       pV\        n        R x € R R R 4       R # R x € R #   + '       g   i     R # ; i  \         d	    R x €  R # i ; i5ir‘   )ÚopenrÄ   rÅ   rÇ   )r¬   Úttys   & r/   r®   r®   ›  sJ   é € çð	Ü�h—” 3Ø””	Û÷  ‘õ 	÷  —�ûô ô 	æð	üsG   ‚	A)ŒA Ÿ?¯A ·A)¿A	Á
A ÁA)ÁA ÁA&Á"A)Á%A&Á&A)c                ó4   € V ^8„  d   QhR\         R\        RR/# )r!   ÚsignumÚ_framer%   N)r-   r   )r.   s   "r/   r0   r0   ª  s!   € ÷ ñ ¤Sð ´#ð ¸$ñ r1   c                 ób   € \         P                  R \        P                  ! V 4      4       \        h)z-received signal %s, raising KeyboardInterrupt)r7   rg   r‡   ÚSignalsÚKeyboardInterrupt)rÍ   rÎ   s   &&r/   Úraise_keyboard_interruptrÒ   ª  s!   € Ü
‡N�NÐBÄFÇNÂNÐSYÓDZÔ[Ü
Ðr1   c                ó   € V ^8„  d   QhRR/# rž   rw   )r.   s   "r/   r0   r0   ¯  s   € ÷ <ñ <�tñ <r1   c                 óª   € \         P                  R\        P                  ! 4       4       \        P                  ! \        P
                  \        4       R# )a  
Catch SIGTERM and raise KeyboardInterrupt instead. This means watchfiles will stop quickly
on `docker compose stop` and other cases where SIGTERM is sent.

Without this the watchfiles process will be killed while a running process will continue uninterrupted.
z8registering handler for SIGTERM on watchfiles process %dN)r7   r   r_   Úgetpidr‡   ÚSIGTERMrÒ   rw   r1   r/   r8   r8   ¯  s,   € ô ‡L�LÐKÌRÏYÊYË[ÔYÜ
‡M‚M”&—.‘.Ô":Ö;r1   )r>   rG   r6   r¯   rw   r‘   )3Ú
contextlibr\   Úloggingr_   rs   rS   r‡   rh   rÄ   Úcollections.abcr   r   Ú	importlibr   Úmultiprocessingr   Úmultiprocessing.contextr   Úpathlibr   Útimer	   Útypingr
   r   rB   Úfiltersr   Úmainr   r   r   r   r   Ú__all__Ú	getLoggerr7   r>   rG   rd   rU   r9   r6   rX   rc   r¯   rb   Úcontextmanagerr®   rÒ   r8   rw   r1   r/   Ú<module>rå      s×  ðÛ Û Û Û 	Û 	Û Û Û Û 
ß /Ý #Ý 'Ý 0Ý Ý ß %ã å "ß 3Ó 3çÝà
N€Ø	×	Ò	Ð,Ó	-€ð}ð ð}ð %)ð	}ð
 =Cð}ð :>ð}ñ :G»ð}ð ð}ð ð}ð ð}ð ð}ð ð}ð ð}ð ð}ð &+÷}ð@Mð ðMð %)ð	Mð
 =CðMð 9=ðMñ :G»ðMð ðMð ðMð ðMð ðMð ðMð &+÷Mñd ˜GÓ$€õ)÷!$õH÷@3&ñ 3&õlõgõ"ð  ×Ñôó ðõ÷
<r1   