Ë
    íéñi3K ã                   ó~  — d 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 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddlm$Z$ ddlm%Z% ddlm&Z& ddlm'Z' ddlm(Z( ddlm)Z) ddlm*Z* ddlm+Z+ g d¢Z,d Z-ej\                  j_                  d! ej`                  «       › d"�«      Z1ej\                  j_                  d! ej`                  «       › d#�«      Z2 e3ed$«      Z4 e3ed%«      Z5 ejl                  d&«      Z7 ejp                  «       Z9ejt                  d'k(  Z; e<«       Z=d(Z> ej~                  d)d* e@e
j‚                  «      i«      ZBeBj†                  ZC G d+„ d,ej~                  «      ZD eE«       j�                  eDjŽ                  «       ej�                  ej’                  ej”                  ej–                  ej˜                  ejš                  ejœ                  ejœ                  ejž                  ej                   ej¢                  ej¤                  d-œZSej¨                  ejª                  ej¬                  ej®                  ej°                  ej²                  ej´                  ej¶                  ej¸                  ejº                  ej¼                  d.œZ_d/„ Z`d0„ Zad1„ Zbe$d2„ «       Zc	  ecd3«      e_d        ejÈ                  Zdd8„ Zgd9„ Zhd:„ Zi e3ed;«      rejÔ                  ZjejÖ                  Zkd<„ Zld=„ Zmd>„ Znd?„ Zod@„ ZpdA„ Zqej\                  j_                  dB«      sej\                  j_                  dC«      rdD„ ZrndE„ Zrejæ                  Zs G dF„ dGee«      Zt G dH„ dI«      Zu eu«       Zvd\dJ„ZwdK„ ZxdL„ Zyejô                  Zzd]dM„Z{ G dN„ dO«      Z|d]dP„Z}dQ„ Z~dR„ ZdS„ Z€dT„ Z�dU„ Z‚dV„ ZƒdW„ Z„dX„ Z…dY„ Z† G dZ„ d[«      Z‡y# ee$ r,Zf e d4ef›�«         ed5d6«      d7d7d7«      e_d        Y dZf[f�Œ'dZf[fww xY w)^zLinux platform implementation.é    N)Údefaultdict)Ú
namedtupleé   )Ú_common)Ú_ntuples)Ú_psposix)Ú_psutil_linux)ÚENCODING)ÚNIC_DUPLEX_FULL)ÚNIC_DUPLEX_HALF)ÚNIC_DUPLEX_UNKNOWN)ÚAccessDenied)ÚNoSuchProcess)ÚZombieProcess)Úbcat)Úcat)Údebug)Údecode)Úget_procfs_path)Úisfile_strict)Úmemoize)Úmemoize_when_activated)Úopen_binary)Ú	open_text)Úparse_environ_block)Úpath_exists_strict)Úsupports_ipv6)Úusage_percent)ÚPROCFS_PATHÚIOPRIO_CLASS_NONEÚIOPRIO_CLASS_RTÚIOPRIO_CLASS_BEÚIOPRIO_CLASS_IDLEÚCONN_ESTABLISHEDÚCONN_SYN_SENTÚCONN_SYN_RECVÚCONN_FIN_WAIT1ÚCONN_FIN_WAIT2ÚCONN_TIME_WAITÚ
CONN_CLOSEÚCONN_CLOSE_WAITÚCONN_LAST_ACKÚCONN_LISTENÚCONN_CLOSINGz/sys/class/power_supplyú/proc/ú/smapsú/smaps_rollupÚproc_ioprio_getÚproc_cpu_affinity_getÚ
SC_CLK_TCKÚlittlei   ÚAddressFamilyÚAF_LINKc                   ó   — e Zd ZdZdZdZdZy)Ú
IOPriorityr   r   é   é   N)Ú__name__Ú
__module__Ú__qualname__r    r!   r"   r#   © ó    úQ/var/www/pod-logistic/pod-ai/venv/lib/python3.12/site-packages/psutil/_pslinux.pyr9   r9   d   s   „ ØÐØ€OØ€OØÑr@   r9   )ÚRÚSÚDÚTÚtÚZÚXÚxÚKÚWÚIÚP)Ú01Ú02Ú03Ú04Ú05Ú06Ú07Ú08Ú09Ú0AÚ0Bc                 óÈ   — t        | t        «      sJ | «       ‚t        j                  | «      } | j	                  d«      d   } | j                  d«      rt        | «      s| dd } | S )zWrapper around os.readlink().ú r   ú
 (deleted)Néöÿÿÿ)Ú
isinstanceÚstrÚosÚreadlinkÚsplitÚendswithr   )Úpaths    rA   r`   r`   •   s`   € ä�dœCÔ Ð& $Ó&Ð Ü�;‰;�tÓ€Dð �:‰:�fÓ˜aÑ €Dð ‡}�}�\Ô"Ô+=¸dÔ+CØ�D�SˆzˆØ€Kr@   c                 óJ  — t         j                  dt         j                  dt         j                  di}|| t         j                  t         j                  z  t         j                  z  z     }| t         j                  z  r|j                  ddd«      }|j                  dd«      }|S )zZConvert file's open() flags into a readable string.
    Used by Process.open_files().
    ÚrÚwzw+Úar   zr+)r_   ÚO_RDONLYÚO_WRONLYÚO_RDWRÚO_APPENDÚreplace)ÚflagsÚ	modes_mapÚmodes      rA   Úfile_flags_to_moderp   ©   sz   € ô —‘˜c¤2§;¡;°´R·Y±YÀÐE€IØ�UœbŸk™k¬B¯K©KÑ7¼"¿)¹)ÑCÑDÑE€DØŒr�{‰{ÒØ�|‰|˜C  aÓ(ˆØ�<‰<˜˜dÓ#€Dà€Kr@   c                 óŽ   — | j                  dd«      } d}|rd| › �}nd| › d�}t        j                  |t        j                  «      S )zÜReturn True if the given name refers to a root device (e.g.
    "sda", "nvme0n1") as opposed to a logical partition (e.g.  "sda1",
    "nvme0n1p1"). If name is a virtual device (e.g. "loop1", "ram")
    return True.
    ú/ú!Tz/sys/block/z/device)rl   r_   ÚaccessÚF_OK)ÚnameÚincluding_virtualrc   s      rA   Úis_storage_devicerx   ¶   sL   € ð �<‰<˜˜SÓ!€DØÐÙØ˜T˜FÐ#‰à˜T˜F 'Ð*ˆÜ�9‰9�Tœ2Ÿ7™7Ó#Ð#r@   c                 óD  — t        | › d�«      5 }|j                  «       j                  «       dd }ddd«       g d¢}t        «      }|dk\  r|j	                  d«       |dk\  r|j	                  d«       |d	k\  r|j	                  d
«       t        d|«      S # 1 sw Y   ŒfxY w)zûReturn a namedtuple of variable fields depending on the CPU times
    available on this Linux kernel version which may be:
    (user, nice, system, idle, iowait, irq, softirq, [steal, [guest,
     [guest_nice]]])
    Used by cpu_times() function.
    ú/statr   N)ÚuserÚniceÚsystemÚidleÚiowaitÚirqÚsoftirqé   Ústealé	   Úguesté
   Ú
guest_niceÚ	scputimes)r   Úreadlinera   ÚlenÚappendr   )Úprocfs_pathÚfÚvaluesÚfieldsÚvlens        rA   Ú_scputimes_ntupler‘   É   s™   € ô 
˜�} EÐ*Ó	+ð *¨qØ—‘“×#Ñ#Ó% a bÐ)ˆ÷*âK€FÜˆv‹;€DØˆq‚yà�‰�gÔØˆq‚yà�‰�gÔØˆr‚zà�‰�lÔ#Ü�k 6Ó*Ð*÷*ð *ús   �"BÂBú/proczignoring exception on import: rˆ   zuser system idleç        c                 ód  — | d   }|| j                  dd«      z   }	 | d   }| d   }| d   }	 t	        t        «       › d	�«      }d}|5  |D ]C  }	|	j                  «       }	|	j                  d
«      sŒ%|t        |	j                  «       d   «      z  }ŒE 	 ddd«       |t        z  }||z
  }
||z   }|t        |dz  |«      z  }|
|z  }
|
|t        |dz  |«      z
  z  }
t        |
«      S # t        $ r'}t        |j                  d   › d�«       |cY d}~S d}~ww xY w# t        $ r |cY S w xY w# 1 sw Y   Œ—xY w)ay  Fallback for kernels < 3.14 where /proc/meminfo does not provide
    "MemAvailable", see:
    https://blog.famzah.net/2014/09/24/.

    This code reimplements the algorithm outlined here:
    https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
        commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773

    We use this function also when "MemAvailable" returns 0 (possibly a
    kernel bug, see: https://github.com/giampaolo/psutil/issues/1915).
    In that case this routine matches "free" CLI tool result ("available"
    column).

    XXX: on recent kernels this calculation may differ by ~1.5% compared
    to "MemAvailable:", as it's calculated slightly differently.
    It is still way more realistic than doing (free + cached) though.
    See:
    * https://gitlab.com/procps-ng/procps/issues/42
    * https://github.com/famzah/linux-memavailable-procfs/issues/2
    ó   MemFree:ó   Cached:r   s   Active(file):s   Inactive(file):ó   SReclaimable:zW is missing from /proc/meminfo; using an approximation for calculating available memoryNz	/zoneinfos   lowr   r:   g       @)ÚgetÚKeyErrorr   Úargsr   r   ÚOSErrorÚstripÚ
startswithÚintra   ÚPAGESIZEÚmin)ÚmemsÚfreeÚfallbackÚlru_active_fileÚlru_inactive_fileÚslab_reclaimableÚerrr�   Úwatermark_lowÚlineÚavailÚ	pagecaches               rA   Úcalculate_avail_vmemr¬   ó   sw  € ð< �Ñ€DØ�d—h‘h˜z¨1Ó-Ñ-€Hð	ØÐ/Ñ0ˆØ Ð!3Ñ4ÐØÐ 0Ñ1ÐðÜœ?Ó,Ð-¨YÐ7Ó8ˆð €MØ	
ñ 6Øò 	6ˆDØ—:‘:“<ˆDØ�‰˜vÕ&Ø¤ T§Z¡Z£\°!¡_Ó!5Ñ5‘ñ	6÷6ð
 ”XÑ€Mà�=Ñ €EØÐ"3Ñ3€IØ”�Y ‘] MÓ2Ñ2€IØ	ˆYÑ€EØ	Ð¤Ð$4°sÑ$:¸MÓ JÑJÑJ€EÜˆu‹:Ðøô1 ò ÜØ�x‰x˜‰{ˆmð >ð >ô	
ð �ûðûô ò ØŠðú÷6ð 6ús@   œC" ¬D Á'D&Á.!D&Ã"	DÃ+DÄDÄDÄD#Ä"D#Ä&D/c                  óä  — g } i }t        t        «       › d�«      5 }|D ])  }|j                  «       }t        |d   «      dz  ||d   <   Œ+ 	 ddd«       |d   }|d   }	 |d   }	 |d
   }||j                  dd«      z  }	 |d   }		 |d   }
	 |d   }	 |d   }	 |d   }|dk(  rt        |«      }	 |dk  rd}| j                  d«       n||kD  r|}||z
  }t        ||z
  |d¬«      }| rMdj                  dj                  | «      t        | «      dk(  rdnd«      }t        j                  |t        d¬ «       t        j                   ||||||
||||	|«      S # 1 sw Y   �ŒxY w# t        $ r d}| j                  d	«       Y �Œw xY w# t        $ r d}| j                  d«       Y �Œ"w xY w# t        $ r- 	 |d   }	n"# t        $ r d}	| j                  d«       Y nw xY wY �ŒUw xY w# t        $ r d}
| j                  d«       Y �Œrw xY w# t        $ r9 	 |d   |d   z   |d   z   }n"# t        $ r d}| j                  d«       Y nw xY wY �Œ±w xY w# t        $ r d}Y �Œ½w xY w# t        $ r t        |«      }Y �ŒÁw xY w)!a7  Report virtual memory stats.
    This implementation mimics procps-ng-3.3.12, aka "free" CLI tool:
    https://gitlab.com/procps-ng/procps/blob/
        24fd2605c51fccc375ab0287cec33aa767f06718/proc/sysinfo.c#L778-791
    The returned values are supposed to match both "free" and "vmstat -s"
    CLI tools.
    ú/meminfor   é   r   Ns	   MemTotal:r•   s   Buffers:Úbuffersr–   r—   Úcacheds   Shmem:s
   MemShared:Úshareds   Active:Úactives	   Inactive:s   Inact_dirty:s   Inact_clean:s   Inact_laundry:Úinactives   Slab:s   MemAvailable:Ú	available©Úround_z6{} memory stats couldn't be determined and {} set to 0z, ÚwasÚwerer:   ©Ú
stacklevel)r   r   ra   rž   r™   r‹   r˜   r¬   r   ÚformatÚjoinrŠ   ÚwarningsÚwarnÚRuntimeWarningÚntpÚsvmem)Úmissing_fieldsr¡   r�   r©   r�   Útotalr¢   r°   r±   r²   r³   r´   Úslabrª   ÚusedÚpercentÚmsgs                    rA   Úvirtual_memoryrÉ   2  s  € ð €NØ€DÜ	œÓ)Ð*¨(Ð3Ó	4ð 4¸Øò 	4ˆDØ—Z‘Z“\ˆFÜ! &¨¡)›n¨tÑ3ˆD�˜‘ŠOñ	4÷4ð �Ñ€EØ�Ñ€Dð)Ø�{Ñ#ˆð
0Ø�jÑ!ˆð 	�$—(‘(Ð+¨QÓ/Ñ/ˆð,Ø�i‘ˆð(Ø�jÑ!ˆð
.Ø˜Ñ%ˆðØ�H‰~ˆð
/ØÐ%Ñ&ˆð �AŠ:ô
 )¨Ó.‰Eàˆq‚yØˆØ×Ñ˜kÕ*Ø	�Šð ˆà�5‰=€Dä˜U U™]¨U¸1Ô=€Gñ ØF×MÑMØ�I‰I�nÓ%Ü˜Ó(¨AÒ-‰E°6ó
ˆô 	�‰�cœ>°aÕ8ä�9‰9ØØØØØØØØØØØóð ÷Q4ñ 4ûô ò )àˆØ×Ñ˜i×(ð)ûô ò (ØˆØ×Ñ˜h×'ð(ûô ò ,ð	,Ø˜-Ñ(‰FøÜò 	,ØˆFØ×!Ñ! (Ö+ð	,ýð,ûô ò (ØˆØ×Ñ˜h×'ð(ûô ò 	.ð	.à�_Ñ%Ø�Ñ'ñ(àÐ(Ñ)ñ*ñ øô
 ò 	.ØˆHØ×!Ñ! *Ö-ð	.ýð	.ûô ò Ø‹ðûô ò +Ü$ TÓ*‹ð+úsÑ   ›/EÁE Á$F Á?F$ ÂG ÂH  ÂI ÂI ÅEÅE>Å=E>ÆF!Æ F!Æ$	GÆ.F4Æ3GÆ4GÇGÇGÇGÇGÇG=Ç<G=È 	IÈ
HÈIÈH;È8IÈ:H;È;IÉIÉIÉIÉI/É.I/c                  ó°  — i } t        t        «       › d�«      5 }|D ])  }|j                  «       }t        |d   «      dz  | |d   <   Œ+ 	 ddd«       	 | d   }| d   }||z
  }t        ||d¬«      }		 t        t        «       › d	�«      }|5  dx}
}|D ]r  }|j                  d
«      r$t        |j                  d«      d   «      dz  dz  }
n4|j                  d«      r#t        |j                  d«      d   «      dz  dz  }|
€Œo|€Œr n( d}|dz  }t        j                  |t        d¬«       dx}
}ddd«       t        j                  ||||	
«      S # 1 sw Y   �ŒxY w# t        $ r* t        j                  «       \  }}}}}}}||z  }||z  }Y �Œ0w xY w# 1 sw Y   ŒfxY w# t        $ r0}d|› d�}t        j                  |t        d¬«       dx}
}Y d}~Œ�d}~ww xY w)zReturn swap memory metrics.r®   r   r¯   r   Ns
   SwapTotal:s	   SwapFree:r¶   z/vmstats   pswpinó    é   s   pswpoutz,'sin' and 'sout' swap memory stats couldn't zbe determined and were set to 0r:   rº   zM'sin' and 'sout' swap memory stats couldn't be determined and were set to 0 (ú))r   r   ra   rž   r™   ÚcextÚlinux_sysinfor   r�   r¾   r¿   rÀ   r›   rÁ   Ússwap)r¡   r�   r©   r�   rÄ   r¢   Ú_Úunit_multiplierrÆ   rÇ   ÚsinÚsoutrÈ   r§   s                 rA   Úswap_memoryrÕ   ³  s  € à€DÜ	œÓ)Ð*¨(Ð3Ó	4ð 4¸Øò 	4ˆDØ—Z‘Z“\ˆFÜ! &¨¡)›n¨tÑ3ˆD�˜‘ŠOñ	4÷4ð Ø�]Ñ#ˆØ�LÑ!ˆð �4‰<€DÜ˜D %°Ô2€GðÜœ?Ó,Ð-¨WÐ5Ó6ˆð ñ 	ØÐˆC�$Øò �ð —?‘? 9Ô-Ü˜dŸj™j¨Ó.¨qÑ1Ó2°QÑ6¸Ñ=‘CØ—_‘_ ZÔ0Ü˜tŸz™z¨$Ó/°Ñ2Ó3°aÑ7¸$Ñ>�DØ‘? tÑ'7Ùðð E�ØÐ8Ñ8�Ü—‘˜c¤>¸aÕ@Ø���d÷%	ô& �9‰9�U˜D $¨°°dÓ;Ð;÷c4ñ 4ûô ò  Ü37×3EÑ3EÓ3GÑ0ˆˆ1ˆa��E˜4 Ø�Ñ ˆØ�Ñ‹ð ú÷&	ð 	ûô ò ð0Ø03¨u°Að7ð 	ô 	�‰�cœ>°aÕ8Øˆˆ�dûðúsN   ™/EÁ
E Á0F ÂA5FÃ>FÄ*FÅEÅ/FÆFÆFÆ	GÆ%&GÇGÚ	heap_infoc                  óV  — t        «       } t        | › d�«      5 }|j                  «       j                  «       }ddd«       dt	        t
        j                  j                  «      dz    }|D �cg c]  }t        |«      t        z  ‘Œ }}t        j                  |Ž S # 1 sw Y   ŒcxY wc c}w )zíReturn a named tuple representing the following system-wide
    CPU times:
    (user, nice, system, idle, iowait, irq, softirq [steal, [guest,
     [guest_nice]]])
    Last 3 fields may not be available on all Linux kernel versions.
    rz   Nr   )
r   r   r‰   ra   rŠ   rÁ   rˆ   Ú_fieldsÚfloatÚCLOCK_TICKS)rŒ   r�   rŽ   r�   rI   s        rA   Ú	cpu_timesrÛ   õ  s•   € ô "Ó#€KÜ	˜�} EÐ*Ó	+ð &¨qØ—‘“×#Ñ#Ó%ˆ÷&à�AœœCŸM™M×1Ñ1Ó2°QÑ6Ð7€FØ.4Ö5¨Œe�A‹hœÓ$Ð5€FÐ5Ü�=‰=˜&Ð!Ð!÷	&ð &üò 6s   ™BÁ-B&ÂB#c                  ó¸  — t        «       } g }t        | › d�«      5 }|j                  «        |D ]�  }|j                  d«      sŒ|j	                  «       }|dt        t        j                  j                  «      dz    }|D �cg c]  }t        |«      t        z  ‘Œ }}t        j                  |Ž }|j                  |«       Œ‘ |cddd«       S c c}w # 1 sw Y   yxY w)zfReturn a list of namedtuple representing the CPU times
    for every CPU available on the system.
    rz   s   cpur   N)r   r   r‰   r�   ra   rŠ   rÁ   rˆ   rØ   rÙ   rÚ   r‹   )rŒ   Úcpusr�   r©   rŽ   r�   rI   Úentrys           rA   Úper_cpu_timesrß     sÌ   € ô "Ó#€KØ€DÜ	˜�} EÐ*Ó	+ð 
¨qà	�
‰
ŒØò 	#ˆDØ�‰˜vÕ&ØŸ™›�Ø ¤C¬¯©×(=Ñ(=Ó$>ÀÑ$BÐC�Ø:@ÖA°Qœ% ›(¤[Ó0ÐA�ÐAÜŸ™ vÐ.�Ø—‘˜EÕ"ð	#ð ÷
ñ 
ùò B÷
ð 
ús#   ›'CÁ=CÂ CÂ(CÃCÃCc                  ó  — 	 t        j                  d«      S # t        $ rà d} t        t	        «       › d�«      5 }|D ]'  }|j                  «       j                  d«      sŒ#| dz  } Œ) 	 ddd«       n# 1 sw Y   nxY w| dk(  rtt        j                  d«      }t        t	        «       › d�«      5 }|D ]-  }|j                  d	«      d   }|j                  |«      sŒ)| dz  } Œ/ 	 ddd«       n# 1 sw Y   nxY w| dk(  rY y| cY S w xY w)
z0Return the number of logical CPUs in the system.ÚSC_NPROCESSORS_ONLNr   ú/cpuinfos	   processorr   Nzcpu\drz   ú )r_   ÚsysconfÚ
ValueErrorr   r   Úlowerr�   ÚreÚcompiler   ra   Úmatch)Únumr�   r©   Úsearchs       rA   Úcpu_count_logicalrì     s	  € ðÜ�z‰zÐ/Ó0Ð0øÜò àˆÜœOÓ-Ð.¨hÐ7Ó8ð 	¸AØò �Ø—:‘:“<×*Ñ*¨<Õ8Ø˜1‘H‘Cñ÷	÷ 	ñ 	úð �!Š8Ü—Z‘Z Ó)ˆFÜœoÓ/Ð0°Ð6Ó7ð !¸1Øò !�DØŸ:™: c›?¨1Ñ-�DØ—|‘| DÕ)Ø˜q™™ñ!÷!÷ !ñ !úð �!Š8áØŠ
ð-úsP   ‚ —!D ¸%A/ÁA/Á&	D Á/A8	Á47D Â++C(ÃC(Ã	D Ã(C1	Ã-D Ã;D Ã?D c                  óÒ  — t        «       } d}d}t        j                  |«      xs t        j                  |«      D ]C  }t        |«      5 }| j                  |j	                  «       j                  «       «       ddd«       ŒE t        | «      }|dk7  r|S i }i }t        t        «       › d�«      5 }|D ]f  }|j                  «       j                  «       }|s	 |d   ||d   <   i }Œ2|j                  d«      sŒD|j                  d	d
«      \  }	}
t        |
«      ||	<   Œh 	 ddd«       t        |j                  «       «      }|xs dS # 1 sw Y   �ŒxY w# t        $ r Y Œzw xY w# 1 sw Y   ŒDxY w)z-Return the number of CPU cores in the system.z9/sys/devices/system/cpu/cpu[0-9]*/topology/core_cpus_listz?/sys/devices/system/cpu/cpu[0-9]*/topology/thread_siblings_listNr   râ   ó	   cpu coresó   physical id)rï   rî   s   	:r   )ÚsetÚglobr   ÚaddÚreadrœ   rŠ   r   ræ   r™   r�   ra   rž   ÚsumrŽ   )ÚlsÚp1Úp2rc   r�   ÚresultÚmappingÚcurrent_infor©   ÚkeyÚvalues              rA   Úcpu_count_coresrý   4  sn  € ô 
‹€Bð 
E€BØ	J€BÜ—	‘	˜"“Ò.¤§¡¨2£ò %ˆÜ˜Óð 	% !Ø�F‰F�1—6‘6“8—>‘>Ó#Ô$÷	%ð 	%ð%ô �‹W€FØ�‚{Øˆð €GØ€LÜ	œÓ)Ð*¨(Ð3Ó	4ð /¸Øò 	/ˆDØ—:‘:“<×%Ñ%Ó'ˆDÙðØ<HØ$ñ=�G˜L¨Ñ8Ñ9ð
  "‘Ø—‘Ð!?Õ@à!ŸZ™Z¨°Ó2‘
��UÜ$'¨£J�˜SÒ!ñ	/÷/ô" �—‘Ó!Ó"€FØŠ>�TÐ÷7	%ñ 	%ûô$  ò Ùðú÷/ð /úsB   Á	.EÂ-&EÃEÃEÃ4%EÅE	Å	EÅEÅEÅEÅE&c                  óÌ  — t        t        «       › d�«      5 } d}d}d}| D ]•  }|j                  d«      rt        |j	                  «       d   «      }n[|j                  d«      rt        |j	                  «       d   «      }n-|j                  d«      rt        |j	                  «       d   «      }|€Œ�|€Œ’|€Œ• n ddd«       d}t        j                  |«      S # 1 sw Y   Œ#xY w)z*Return various CPU stats as a named tuple.rz   Ns   ctxtr   s   intrs   softirqr   )r   r   r�   rž   ra   rÁ   Ú	scpustats)r�   Úctx_switchesÚ
interruptsÚsoft_interruptsr©   Úsyscallss         rA   Ú	cpu_statsr  ^  sÛ   € ä	œÓ)Ð*¨%Ð0Ó	1ð °QØˆØˆ
ØˆØò 	ˆDØ�‰˜wÔ'Ü" 4§:¡:£<°¡?Ó3‘Ø—‘ Ô)Ü  §¡£¨a¡Ó1‘
Ø—‘ Ô,Ü"% d§j¡j£l°1¡oÓ"6�àÑ(Ø#Ñ/ØÑ*áð	÷	ð" €HÜ�=‰=˜ z°?ÀHÓMÐM÷%ð ús   —BCÂ/CÂ2CÂ5CÃC#c            
      óú   — t        t        «       › d�«      5 } | D �cg c]?  }|j                  «       j                  d«      rt	        |j                  dd«      d   «      ‘ŒA c}cddd«       S c c}w # 1 sw Y   yxY w)z7Return current CPU frequency from cpuinfo if available.râ   s   cpu mhzó   :r   N)r   r   ræ   r�   rÙ   ra   )r�   r©   s     rA   Ú_cpu_get_cpuinfo_freqr  u  sw   € ä	œÓ)Ð*¨(Ð3Ó	4ð 
¸ð ö
àØ�z‰z‹|×&Ñ& zÔ2ô �$—*‘*˜T 1Ó% aÑ(Õ)ò
÷
ñ 
ùò
÷
ð 
ús   —A1œAA,Á A1Á,A1Á1A:z'/sys/devices/system/cpu/cpufreq/policy0z$/sys/devices/system/cpu/cpu0/cpufreqc            	      ó  — t        «       } t        j                  d«      xs t        j                  d«      }|j                  d„ ¬«       g }t        j                  j
                  }t        |«      D �]  \  }}t        |«      t        | «      k(  r	| |   dz  }nt         ||d«      d¬«      }|€`t         ||d	«      d¬«      }|€Jd
|› d�}t        |d¬«      dk(  r'|j                  t        j                  ddd«      «       Œ�d}t        |«      ‚t        |«      dz  }t        t         ||d«      «      «      dz  }	t        t         ||d«      «      «      dz  }
|j                  t        j                  ||
|	«      «       �Œ |S )z‚Return frequency metrics for all CPUs.
        Contrarily to other OSes, Linux updates these values in
        real-time.
        z,/sys/devices/system/cpu/cpufreq/policy[0-9]*z)/sys/devices/system/cpu/cpu[0-9]*/cpufreqc                 ó\   — t        t        j                  d| «      j                  «       «      S )Nz[0-9]+)rž   rç   rë   Úgroup©rI   s    rA   ú<lambda>zcpu_freq.<locals>.<lambda>Œ  s   € ¤¤R§Y¡Y¨y¸!Ó%<×%BÑ%BÓ%DÓ!E€ r@   )rû   iè  Úscaling_cur_freqN©r£   Úcpuinfo_cur_freqz/sys/devices/system/cpu/cpuz/onlinez0
r“   z!can't find current frequency fileÚscaling_max_freqÚscaling_min_freq)r  rñ   Úsortr_   rc   r½   Ú	enumeraterŠ   r   r   r‹   rÁ   ÚscpufreqÚNotImplementedErrorrž   )Úcpuinfo_freqsÚpathsÚretÚpjoinÚirc   ÚcurrÚonline_pathrÈ   Úmax_Úmin_s              rA   Úcpu_freqr  ƒ  ss  € ô
 .Ó/ˆÜ—	‘	Ø:ó
ò Dä�Y‰YÐBÓCð 	ð 	�
‰
ÑEˆ
ÔFØˆÜ—‘—‘ˆÜ  Ó'ó 	7‰GˆAˆtÜ�5‹zœS Ó/Ò/ð % QÑ'¨$Ñ.‘ä™E $Ð(:Ó;ÀdÔK�Øˆ|ô ™E $Ð(:Ó;ÀdÔK�Ø�<Ø$?À¸sÀ'Ð"J�Kä˜;°Ô6¸%Ò?ØŸ
™
¤3§<¡<°°S¸#Ó#>Ô?Ø Ø=�CÜ-¨cÓ2Ð2Ü�t“9˜tÑ#ˆDÜ”t™E $Ð(:Ó;Ó<Ó=ÀÑDˆDÜ”t™E $Ð(:Ó;Ó<Ó=ÀÑDˆDØ�J‰J”s—|‘| D¨$°Ó5Ö6ð-	7ð. ˆ
r@   c                  óf   — t        «       D � cg c]  } t        j                  | dd«      ‘Œ c} S c c} w )z}Alternate implementation using /proc/cpuinfo.
        min and max frequencies are not available and are set to None.
        r“   )r  rÁ   r  r  s    rA   r  r  ª  s)   € ô 4IÓ3JÖK¨a”—‘˜Q  SÕ)ÒKÐKùÒKs   �.c                   ó   — e Zd Zy)Ú_Ipv6UnsupportedErrorN)r<   r=   r>   r?   r@   rA   r"  r"  ¹  s   „ Ør@   r"  c                   ó^   — e Zd ZdZd„ Zd„ Zd„ Zed„ «       Zed
d„«       Z	ed
d„«       Z
d
d	„Zy)ÚNetConnectionsaw  A wrapper on top of /proc/net/* files, retrieving per-process
    and system-wide open connections (TCP, UDP, UNIX) similarly to
    "netstat -an".

    Note: in case of UNIX sockets we're only able to determine the
    local endpoint/path, not the one it's connected to.
    According to [1] it would be possible but not easily.

    [1] http://serverfault.com/a/417946
    c                 ó’  — dt         j                  t         j                  f}dt         j                  t         j                  f}dt         j                  t         j                  f}dt         j                  t         j                  f}dt         j
                  d f}|||||f||f|f|f||f|f|f|f||||f||f||fdœ| _        d | _        y )NÚtcpÚtcp6ÚudpÚudp6Úunix)Úallr&  Útcp4r'  r(  Úudp4r)  r*  ÚinetÚinet4Úinet6)ÚsocketÚAF_INETÚSOCK_STREAMÚAF_INET6Ú
SOCK_DGRAMÚAF_UNIXÚtmapÚ_procfs_path)Úselfr,  r'  r-  r)  r*  s         rA   Ú__init__zNetConnections.__init__É  sÎ   € ð ”v—~‘~¤v×'9Ñ'9Ð:ˆØœŸ™¬×);Ñ);Ð<ˆØ”v—~‘~¤v×'8Ñ'8Ð9ˆØœŸ™¬×):Ñ):Ð;ˆØœŸ™¨Ð-ˆà˜$  d¨DÐ1Ø˜$�<Ø�GØ�GØ˜$�<Ø�GØ�GØ�GØ˜4  tÐ,Ø˜D�\Ø˜D�\ñ
ˆŒ	ð !ˆÕr@   c                 ó  — t        t        «      }t        j                  | j                  › d|› d�«      D ]Y  }	 t        | j                  › d|› d|› �«      }|j                  d«      sŒ3|dd  d d }||   j                  |t        |«      f«       Œ[ |S # t        t        f$ r Y Œot        $ rU}|j                  t        j                  k(  rY d }~Œ™|j                  t        j                  k(  rt        |«       Y d }~ŒÆ‚ d }~ww xY w)Nrr   ú/fdú/fd/zsocket:[r‚   éÿÿÿÿ)r   Úlistr_   Úlistdirr8  r`   r�   r‹   rž   ÚFileNotFoundErrorÚProcessLookupErrorr›   ÚerrnoÚEINVALÚENAMETOOLONGr   )r9  ÚpidÚinodesÚfdÚinoder§   s         rA   Úget_proc_inodeszNetConnections.get_proc_inodesà  sø   € ÜœTÓ"ˆÜ—*‘* × 1Ñ 1Ð2°!°C°5¸Ð<Ó=ò 	9ˆBð9Ü  D×$5Ñ$5Ð#6°a¸°u¸DÀÀÐ!EÓF�ð  ×#Ñ# JÕ/à! ! "˜I c r˜N�EØ˜5‘M×(Ñ(¨#¬s°2«w¨Õ8ð+	9ð, ˆøô' &Ô'9Ð:ò ñ Üò Ø—9‘9¤§¡Ò,äØ—9‘9¤× 2Ñ 2Ò2ä˜#”JÜØûðús)   ¹BÂDÂ$DÂ,C<Ã(C<Ã;C<Ã<Dc                 óž   — i }t        «       D ]#  }	 |j                  | j                  |«      «       Œ% |S # t        t        t
        f$ r Y Œ>w xY w©N)ÚpidsÚupdaterJ  rA  rB  ÚPermissionError)r9  rG  rF  s      rA   Úget_all_inodeszNetConnections.get_all_inodesú  sY   € ØˆÜ“6ò 	ˆCð
Ø—‘˜d×2Ñ2°3Ó7Õ8ð	ð ˆøô &Ô'9¼?ÐKò ñ ðús   ‘ 5µAÁAc           
      ó$  — | j                  d«      \  }}t        |d«      }|sy|j                  d«      }|t        j                  k(  r`t
        r0t        j                  |t        j                  |«      ddd…   «      }nßt        j                  |t        j                  |«      «      }nµt        j                  |«      }	 t
        rMt        j                  t        j                  t        j                  dgt        j                  d|«      ¢­Ž «      }nLt        j                  t        j                  t        j                  dgt        j                  d|«      ¢­Ž «      }t!        j"                  ||«      S # t        $ r t        «       st        d‚‚ w xY w)	a†  Accept an "ip:port" address as displayed in /proc/net/*
        and convert it into a human readable form, like:

        "0500000A:0016" -> ("10.0.0.5", 22)
        "0000000000000000FFFF00000100007F:9E49" -> ("::ffff:127.0.0.1", 40521)

        The IP address portion is a little or big endian four-byte
        hexadecimal number; that is, the least significant byte is listed
        first, so we need to reverse the order of the bytes to convert it
        to an IP address.
        The port is represented as a two-byte hexadecimal number.

        Reference:
        http://linuxdevcenter.com/pub/a/linux/2000/11/16/LinuxAdmin.html
        ú:é   r?   ÚasciiNr>  z>4Iz<4I)ra   rž   Úencoder1  r2  ÚLITTLE_ENDIANÚ	inet_ntopÚbase64Ú	b16decoder4  ÚstructÚpackÚunpackrå   r   r"  rÁ   Úaddr)r]  ÚfamilyÚipÚports       rA   Údecode_addresszNetConnections.decode_address
  s<  € ð" —:‘:˜c“?‰ˆˆDÜ�4˜‹}ˆñ ØØ�Y‰Y�wÓˆØ”V—^‘^Ò#åÜ×%Ñ% f¬f×.>Ñ.>¸rÓ.BÁ4ÀRÀ4Ñ.HÓI‘ä×%Ñ% f¬f×.>Ñ.>¸rÓ.BÓC‘ä×!Ñ! "Ó%ˆBðå Ü×)Ñ)ÜŸ™ÜŸ™ EÐE¬F¯M©M¸%ÀÓ,DÒEó‘Bô
  ×)Ñ)ÜŸ™ÜŸ™ EÐE¬F¯M©M¸%ÀÓ,DÒEó�Bô �x‰x˜˜DÓ!Ð!øô ò ä$”Ü/°TÐ9Øð	ús   Â>BE3 Å3FNc              #   ó   K  — | j                  d«      r t        j                  j                  | «      syt	        | «      5 }|j                  «        t        |d«      D ]¦  \  }}	 |j                  «       dd \
  }}	}
}}}}}}}||v r||   d   \  }}nd	\  }}|�||k7  rŒB|t        j                  k(  r
t        |   }nt        j                  }	 t        j!                  |	|«      }	t        j!                  |
|«      }
||||	|
||f–— Œ¨ 	 ddd«       y# t        $ r d| › d|› d|›�}t        |«      d‚w xY w# t"        $ r Y Œâw xY w# 1 sw Y   yxY w­w)
z.Parse /proc/net/tcp* and /proc/net/udp* files.Ú6Nr   r†   úerror while parsing ú; malformed line rã   r   ©Nr>  )rb   r_   rc   Úexistsr   r‰   r  ra   rå   ÚRuntimeErrorr1  r3  ÚTCP_STATUSESr   Ú	CONN_NONEr$  ra  r"  )Úfiler^  Útype_rG  Ú
filter_pidr�   Úlinenor©   rÑ   ÚladdrÚraddrÚstatusrI  rÈ   rF  rH  s                   rA   Úprocess_inetzNetConnections.process_inet=  s�  è ø€ ð �=‰=˜Ô¤b§g¡g§n¡n°TÔ&:àÜ�t‹_ð #	I Ø�J‰JŒLÜ )¨!¨Q£ò !I‘�˜ð	6àŸ
™
› S bÐ)ñ B�A�u˜e V¨Q°°1°a¸¸Eð ˜F‘?ð % U™m¨AÑ.‘G�C™à&‘G�C˜ØÐ)¨j¸CÒ.?Øà¤× 2Ñ 2Ò2Ü!-¨fÑ!5™ä!(×!2Ñ!2˜ð!Ü .× =Ñ =¸eÀVÓ L˜Ü .× =Ñ =¸eÀVÓ L˜ð ˜v u¨e°U¸FÀCÐHÓHñC!I÷#	Ið #	Iøô "ò 6à.¨t¨fð 5Ø"˜8 1 T Hð.ð ô ' sÓ+°Ð5ð6ûô4 1ò !Ù ð!ú÷C#	Ið #	IüsY   ‚=E¿#EÁ#DÂA
EÃ,D3Ã8EÄ	EÄ!D0Ä0EÄ3	D?Ä<EÄ>D?Ä?EÅEÅEc           
   #   óâ  K  — t        | «      5 }|j                  «        |D ]�  }|j                  «       }	 |dd \  }}}}}}}	|	|v r||	   }ndg}|D ]]  \  }}|�||k7  rŒt        |«      dk(  r|d	   nd
}t        j                  t        |«      «      }d
}t        j                  }|||||||f–— Œ_ Œ‘ 	 ddd«       y# t        $ r d|vrY Œ«d| › d|›�}
t	        |
«      ‚w xY w# 1 sw Y   yxY w­w)zParse /proc/net/unix files.r   é   rã   rd  re  rf  Nr‚   r>  Ú )
r   r‰   ra   rå   rh  rŠ   r   Úsocktype_to_enumrž   rj  )rk  r^  rG  rm  r�   r©   ÚtokensrÑ   rl  rI  rÈ   ÚpairsrF  rH  rc   rp  rq  s                    rA   Úprocess_unixzNetConnections.process_unixh  sB  è ø€ ô �t‹_ð 	L Ø�J‰JŒLØò L�ØŸ™›�ð	,Ø28¸¸1°+Ñ/�A�q˜!˜Q  q¨%ð ˜F‘?ð # 5™M‘Eà'˜L�EØ$ò L‘G�C˜Ø!Ð-°*ÀÒ2CØ ä-0°«[¸AÒ-=˜v bšzÀ2˜Ü '× 8Ñ 8¼¸U»Ó D˜ð !#˜Ü!(×!2Ñ!2˜Ø! 6¨5°$¸¸vÀsÐKÓKñLñ%L÷	Lð 	Løô "ò ,Ø $‘á à.¨t¨fÐ4EÀdÀXÐNð ô ' sÓ+Ð+ð,ú÷	Lð 	Lüs@   ‚C/Ž&C#µB=ÁA1C#Â4	C/Â=C Ã
C#ÃC Ã C#Ã#C,Ã(C/c                 ó6  — t        «       | _        |�| j                  |«      }|sg S | j                  «       }t	        «       }| j
                  |   D ]½  \  }}}| j                  › d|› �}|t        j                  t        j                  hv r| j                  |||||¬«      }	n| j                  ||||¬«      }	|	D ]S  \  }
}}}}}}|rt        j                  |
|||||«      }nt        j                  |
||||||«      }|j                  |«       ŒU Œ¿ t        |«      S )Nz/net/)rm  )r   r8  rJ  rP  rð   r7  r1  r2  r4  rr  ry  rÁ   ÚpconnÚsconnrò   r?  )r9  ÚkindrF  rG  r  Ú
proto_namer^  rl  rc   rõ   rH  ro  rp  rq  Ú	bound_pidÚconns                   rA   ÚretrievezNetConnections.retrieveŒ  s3  € Ü+Ó-ˆÔØˆ?Ø×)Ñ)¨#Ó.ˆFÙà�	à×(Ñ(Ó*ˆFÜ‹eˆØ)-¯©°4©ò 	Ñ%ˆJ˜ Ø×'Ñ'Ð(¨¨j¨\Ð:ˆDØœ&Ÿ.™.¬&¯/©/Ð:Ñ:Ø×&Ñ&Ø˜& %¨¸Cð 'ó ‘ð ×&Ñ& t¨V°VÈÐ&ÓL�ØFHò ÑB��F˜E 5¨%°¸ÙÜŸ9™9 R¨°¸¸uÀfÓM‘DäŸ9™9Ø˜F E¨5°%¸Àó�Dð —‘˜•ñð	ô  �C‹yÐr@   rL  )r<   r=   r>   Ú__doc__r:  rJ  rP  Ústaticmethodra  rr  ry  r�  r?   r@   rA   r$  r$  ½  s^   „ ñ	ò!ò.ò4ð  ñ0"ó ð0"ðd ò(Ió ð(IðT ò!Ló ð!LôFr@   r$  c                 ó,   — t         j                  | «      S )z$Return system-wide open connections.)Ú_net_connectionsr�  )r}  s    rA   Únet_connectionsr†  ¬  s   € ä×$Ñ$ TÓ*Ð*r@   c                  óª  — t        t        «       › d�«      5 } | j                  «       }ddd«       i }dd D ]�  }|j                  d«      }|dkD  sJ t	        |«      «       ‚|d| j                  «       }||dz   d j                  «       j                  «       }t        t        |«      \  }}}	}
}}}}}}}}}}}}|||||	||
|f||<   Œ� |S # 1 sw Y   Œ¢xY w)zsReturn network I/O statistics for every network interface
    installed on the system as a dict of raw tuples.
    z/net/devNr:   rR  r   r   )	r   r   Ú	readlinesÚrfindÚreprrœ   ra   Úmaprž   )r�   ÚlinesÚretdictr©   Úcolonrv   r�   Ú
bytes_recvÚpackets_recvÚerrinÚdropinÚ_fifoinÚ_frameinÚ_compressedinÚ_multicastinÚ
bytes_sentÚpackets_sentÚerroutÚdropoutÚ_fifooutÚ_collisionsoutÚ_carrieroutÚ_compressedouts                          rA   Únet_io_countersrŸ  ±  s  € ô 
”oÓ'Ð(¨Ð1Ó	2ð °aØ—‘“ˆ÷à€GØ�a�b�	ò $
ˆØ—
‘
˜3“ˆØ�qŠyÐ$œ$˜t›*Ó$ˆyØ�F�Uˆ|×!Ñ!Ó#ˆØ�e˜a‘i�kÐ"×(Ñ(Ó*×0Ñ0Ó2ˆô* ”�VÓñ'	
àØØØØØØØàØØØØØØØð ØØØØØØØð	
ˆ�Šð7$
ðJ €N÷Qð ús   —C	Ã	Cc                  ó0  — t         j                  t        t         j                  t        t         j
                  t        i} t        «       j                  «       }i }|D ]y  }	 t        j                  |«      }t        j                  |«      }t        j                  |«      \  }}dj                  |«      }d|v }	t        j                  |	| |   |||«      ||<   Œ{ |S # t        $ r3}
|
j                   t         j"                  k7  r‚ t%        |
«       Y d}
~
Œµd}
~
ww xY w)z)Get NIC stats (isup, duplex, speed, mtu).ú,ÚrunningN)rÎ   ÚDUPLEX_FULLr   ÚDUPLEX_HALFr   ÚDUPLEX_UNKNOWNr   rŸ  ÚkeysÚ
net_if_mtuÚnet_if_flagsÚnet_if_duplex_speedr½   rÁ   Ú	snicstatsr›   rC  ÚENODEVr   )Ú
duplex_mapÚnamesr  rv   Úmturm   ÚduplexÚspeedÚoutput_flagsÚisupr§   s              rA   Únet_if_statsr³  à  sû   € ô 	×Ñœ/Ü×Ñœ/Ü×ÑÔ/ð€Jô
 Ó×"Ñ"Ó$€EØ
€CØò ˆð	Ü—/‘/ $Ó'ˆCÜ×%Ñ% dÓ+ˆEÜ ×4Ñ4°TÓ:‰MˆF�Eð Ÿ8™8 E›?ˆLØ Ð%ˆDÜŸ™Ø�j Ñ(¨%°°lóˆC�ŠIðð  €Jøô ò 	à�y‰yœEŸL™LÒ(ØÜ�#�J‰Jûð		ús   ÁACÃ	DÃ")DÄDc                 ó|  — d„ }d„ }t         j                  j                  t        «       › d�«      r |«       }n?t         j                  j                  d«      r |«       }nt        «       › d�}t	        |«      ‚i }|D ]=  }|\
  }}}	}
}}}}}}| st        |«      sŒ|
t        z  }
|t        z  }||	|
||||||f	||<   Œ? |S )zcReturn disk I/O statistics for every disk installed on the
    system as a dict of raw tuples.
    c               3   ó(  K  — t        t        «       › d�«      5 } | j                  «       }d d d «       D ]Î  }|j                  «       }t	        |«      }|dk(  r2|d   }t        |d   «      }t        t
        |dd «      \
  }}}	}
}}}}}}nl|dk(  s|dk\  r%|d   }t        t
        |dd «      \  }}}}	}
}}}}}}n=|dk(  r(|d   }t        t
        |dd  «      \  }}}
}d	x}	x}x}x}}nd
|›�}t        |«      ‚|||
|||	||||f
–— ŒÐ y # 1 sw Y   ŒÝxY w­w)Nú
/diskstatsé   r;   r:   rÌ   é   é   rt  r   znot sure how to interpret line )r   r   rˆ  ra   rŠ   rž   r‹  rå   )r�   rŒ  r©   r�   Úflenrv   ÚreadsÚreads_mergedÚrbytesÚrtimeÚwritesÚwrites_mergedÚwbytesÚwtimerÑ   Ú	busy_timerÈ   s                    rA   Úread_procfsz%disk_io_counters.<locals>.read_procfs	  sb  è ø€ ô" œ/Ó+Ð,¨JÐ7Ó8ð 	"¸AØ—K‘K“MˆE÷	"àò 	;ˆDØ—Z‘Z“\ˆFÜ�v“;ˆDà�rŠzà˜a‘y�Ü˜F 1™I›�ä69¼#¸vÀaÈ¸|Ó6Lñ4�˜v u¨f°mØ˜E 1 i±Ø˜’˜t ršzà˜a‘y�ä69¼#¸vÀaÈ¸|Ó6Lñ4�˜ f¨e°V¸]Ø˜E 1 i±Ø˜’à˜a‘y�Ü03´C¸ÀÀ¸Ó0DÑ-��v˜v vØKLÐL�ÐL˜ÐL ÐL¨}¹yà7¸°xÐ@�Ü  “oÐ%Ø˜ ¨°¸¸uØ °	ð;ó ;ñ/	;÷	"ð 	"üs   ‚D™DªCDÄDÄDc               3   ó,  K  — t        j                  d«      D ]ì  } t        j                  t         j                  j	                  d| «      «      D ]´  \  }}}d|vrŒt        t         j                  j	                  |d«      «      5 }|j                  «       j                  «       j                  «       }d d d «       t         j                  j                  |«      }t        t        d d «      \
  }}}	}
}}}}}}||||	||
||||f
–— Œ¶ Œî y # 1 sw Y   ŒYxY w­w)Nú
/sys/blockÚstatr†   )r_   r@  Úwalkrc   r½   r   ró   rœ   ra   Úbasenamer‹  rž   )ÚblockÚrootrÑ   Úfilesr�   r�   rv   r»  r¼  r½  r¾  r¿  rÀ  rÁ  rÂ  rÃ  s                   rA   Ú
read_sysfsz$disk_io_counters.<locals>.read_sysfs7  s  è ø€ Ü—Z‘Z Ó-ò 	FˆEÜ"$§'¡'¬"¯'©'¯,©,°|ÀUÓ*KÓ"Lò 
F‘��a˜Ø Ñ&ØÜœrŸw™wŸ|™|¨D°&Ó9Ó:ð 6¸aØŸV™V›XŸ^™^Ó-×3Ñ3Ó5�F÷6ä—w‘w×'Ñ'¨Ó-�ô 47´s¸FÀ3ÀB¸KÓ3Hñ1�˜ f¨e°V¸]Ø˜E 1 iØ˜U F¨F°F¸EØ˜l¨M¸9ðFó Fñ
Fñ	F÷6ð 6üs   ‚BDÂ-DÂ0ADÄDÄDr¶  rÆ  z6/diskstats nor /sys/block are available on this system)r_   rc   rg  r   r  rx   ÚDISK_SECTOR_SIZE)ÚperdiskrÄ  rÍ  ÚgenrÈ   r�  rÞ   rv   r»  r¿  r½  rÁ  r¾  rÂ  r¼  rÀ  rÃ  s                    rA   Údisk_io_countersrÑ    sò   € ò
+;ò\Fô 
‡w�w‡~�~œÓ*Ð+¨:Ð6Ô7Ù‹m‰Ü	�‰�‰˜Ô	%Ù‹l‰ô Ó Ð!ð "ð ð 	ô " #Ó&Ð&à€GØò Aˆð ).ñ	&ˆˆu�f˜f f¨e°U¸LØ˜9ÙÔ0°Ô6ð àÔ"Ñ"ˆØÔ"Ñ"ˆØ ¨°¸¸uØ% }°iðAˆ�Šð)Að0 €Nr@   c                   ó6   — e Zd ZdZddgZd„ Zd„ Zd„ Zd„ Zd„ Z	y	)
ÚRootFsDeviceFinderaF  disk_partitions() may return partitions with device == "/dev/root"
    or "rootfs". This container class uses different strategies to try to
    obtain the real device path. Resources:
    https://bootlin.com/blog/find-root-device/
    https://www.systutorials.com/how-to-find-the-disk-where-root-is-on-in-bash-on-linux/.
    ÚmajorÚminorc                 óª   — t        j                  d«      j                  }t        j                  |«      | _        t        j                  |«      | _        y ©Nrr   )r_   rÇ  Úst_devrÔ  rÕ  )r9  Údevs     rA   r:  zRootFsDeviceFinder.__init__w  s3   € Ü�g‰g�c‹l×!Ñ!ˆÜ—X‘X˜c“]ˆŒ
Ü—X‘X˜c“]ˆ�
r@   c                 óÄ  — t        t        «       › d�«      5 }|j                  «       dd  D ]ž  }|j                  «       }t	        |«      dk  rŒ"|d   j                  «       rt        |d   «      nd }|d   j                  «       rt        |d   «      nd }|d   }|| j                  k(  sŒ}|| j                  k(  sŒ�|sŒ�d|› �c cd d d «       S  	 d d d «       y # 1 sw Y   y xY w)Nz/partitionsr:   rÌ   r   r   r;   ú/dev/)	r   r   rˆ  ra   rŠ   Úisdigitrž   rÔ  rÕ  )r9  r�   r©   r�   rÔ  rÕ  rv   s          rA   Úask_proc_partitionsz&RootFsDeviceFinder.ask_proc_partitions|  sÖ   € Üœ/Ó+Ð,¨KÐ8Ó9ð 
	.¸QØŸ™› a bÐ)ò 	.�ØŸ™›�Ü�v“; ’?ØØ*0°©)×*;Ñ*;Ô*=œ˜F 1™IœÀ4�Ø*0°©)×*;Ñ*;Ô*=œ˜F 1™IœÀ4�Ø˜a‘y�Ø˜DŸJ™JÓ&¨5°D·J±JÓ+>ÚØ!& t f˜~Ñ-÷
	.ñ 
	.ñ	.÷
	.÷ 
	.ñ 
	.ús$   —BCÂ(CÂ8CÂ;CÃCÃCc                 ó  — d| j                   › d| j                  › d�}t        |«      5 }|D ]H  }|j                  d«      sŒ|j	                  «       j                  d«      d   }|sŒ:d|› �c cd d d «       S  	 d d d «       y # 1 sw Y   y xY w)Nz/sys/dev/block/rR  z/ueventzDEVNAME=r:   rÛ  )rÔ  rÕ  r   r�   rœ   Ú
rpartition)r9  rc   r�   r©   rv   s        rA   Úask_sys_dev_blockz$RootFsDeviceFinder.ask_sys_dev_block‰  s‹   € Ø  §¡ ¨A¨d¯j©j¨\¸ÐAˆÜ�t‹_ð 	. Øò .�Ø—?‘? :Õ.ØŸ:™:›<×2Ñ2°:Ó>¸qÑA�DÚØ!& t f˜~Ñ-÷	.ñ 	.ñ.÷	.÷ 	.ñ 	.ús   ©BÁ$BÁ&BÁ6BÂB
c                 ó¶  — | j                   › d| j                  › �}t        j                  d«      }|D ]‰  }	 t	        |«      }|5  |j                  «       j                  «       }||k(  rLt        j                  j                  t        j                  j                  |«      «      }d|› �cd d d «       c S 	 d d d «       Œ‹ y # 1 sw Y   Œ–xY w# t        $ r Y Œ¤w xY w)NrR  z/sys/class/block/*/devrÛ  )rÔ  rÕ  rñ   Úiglobr   ró   rœ   r_   rc   rÉ  ÚdirnamerA  )r9  ÚneedlerÌ  rk  r�   Údatarv   s          rA   Úask_sys_class_blockz&RootFsDeviceFinder.ask_sys_class_block’  sÈ   € Ø—J‘J�<˜q §¡ Ð-ˆÜ—
‘
Ð3Ó4ˆØò 
	.ˆDð	.Ü˜d“O�ð ñ .ØŸ6™6›8Ÿ>™>Ó+�DØ˜v’~Ü!Ÿw™w×/Ñ/´·±·±ÀÓ0EÓF˜Ø!& t f˜~÷	.ó .à%÷.ð .ñ
	.÷.ð .ûô %ò Ùðús   ·CÁA$C Ã C		Ã	CÃCc                 óˆ  — d }|€	 | j                  «       }|€	 | j                  «       }|€	 | j	                  «       }|�"t
        j                  j                  |«      r|S y y # t        $ r}t        |«       Y d }~Œdd }~ww xY w# t        $ r}t        |«       Y d }~Œrd }~ww xY w# t        $ r}t        |«       Y d }~Œ€d }~ww xY wrL  )rÝ  r›   r   rà  ræ  r_   rc   rg  )r9  rc   r§   s      rA   ÚfindzRootFsDeviceFinder.find¡  sÆ   € ØˆØˆ<ðØ×/Ñ/Ó1�ð ˆ<ðØ×-Ñ-Ó/�ð ˆ<ðØ×/Ñ/Ó1�ð
 Ð¤§¡§¡¨tÔ 4ØˆKð !5Ðøô ò Ü�c—
‘
ûðûô
 ò Ü�c—
‘
ûðûô
 ò Ü�c—
‘
ûðúsE   †A! ™B ¬B# Á!	A?Á*A:Á:A?Â	B ÂBÂB Â#	CÂ,B<Â<CN)
r<   r=   r>   r‚  Ú	__slots__r:  rÝ  rà  ræ  rè  r?   r@   rA   rÓ  rÓ  m  s,   „ ñð ˜'Ð"€Iò#ò
.ò.ò.ór@   rÓ  c                 ó(  — t        «       }t        «       }| s‹t        |› d�«      5 }|D ]n  }|j                  «       }|j	                  d«      s |j                  |j                  «       «       ŒD|j                  d«      d   }|dk(  sŒ^|j                  d«       Œp 	 ddd«       |dk(  r?t        j                  j                  d«      r t        j                  j                  d«      }n"t        j                  j                  |› d	�«      }g }t        j                  |«      }|D ]b  }	|	\  }
}}}|
d
k(  rd}
|
dv rt        «       j                  «       xs |
}
| s|
r||vrŒ:t        j                   |
|||«      }|j#                  |«       Œd |S # 1 sw Y   ŒïxY w)z8Return mounted disk partitions as a list of namedtuples.z/filesystemsÚnodevú	r   ÚzfsNr’   z	/etc/mtabz/self/mountsÚnoneru  >   ú	/dev/rootÚrootfs)rð   r   r   rœ   r�   rò   ra   r_   rc   ÚisfileÚrealpathrÎ   Údisk_partitionsrÓ  rè  rÁ   Ú	sdiskpartr‹   )r+  ÚfstypesrŒ   r�   r©   ÚfstypeÚmounts_pathÚretlistÚ
partitionsÚ	partitionÚdeviceÚ
mountpointÚoptsÚntuples                 rA   ró  ró  ¸  sw  € ä‹e€GÜ!Ó#€KÙÜ˜+˜ lÐ3Ó4ð 		+¸Øò +�Ø—z‘z“|�Ø—‘ wÔ/Ø—K‘K §
¡
£Õ-ð "ŸZ™Z¨Ó-¨aÑ0�FØ “ØŸ™ EÕ*ñ+÷		+ð �gÒ¤"§'¡'§.¡.°Ô"=Ü—g‘g×&Ñ& {Ó3‰ä—g‘g×&Ñ&¨+¨°lÐ'CÓDˆà€GÜ×%Ñ% kÓ2€JØò 
ˆ	Ø+4Ñ(ˆ�
˜F DØ�VÒØˆFØÐ,Ñ,Ü'Ó)×.Ñ.Ó0Ò:°FˆFÙÙ˜V¨7Ñ2ØÜ—‘˜v z°6¸4Ó@ˆØ�‰�vÕð
ð €N÷?		+ð 		+ús   ¥A FÂFÆFc            	      ó²  — t        j                  t        «      } t        j                  d«      }|j	                  t        j                  d«      «       t        |D �ch c]  }|j                  d«      d   ’Œ c}«      }t        j                  d«      }t        j                  d«      }|D ]*  }|j                  d|«      }||vsŒ|j                  |«       Œ, |D ]í  }	 |dz   }t        t        |«      «      d	z  }	t        j                  j                  t        j                  j!                  |«      d
«      }t#        |«      j%                  «       }
t        |dz   d¬«      }t        |dz   d¬«      }t#        |dz   d¬«      j%                  «       }|�	 t        |«      d	z  }|�	 t        |«      d	z  }| |
   j                  ||	||f«       Œï |�sót        j                  d«      }t        t+        |«      «      }|D �]Ä  }	 t        j                  j                  |d«      }t        t        |«      «      d	z  }	t        j                  j                  |d«      }t#        |«      j%                  «       }
t        j                  |dz   «      }|D �ch c]B  }dj                  t        j                  j/                  |«      j                  d«      dd «      ’ŒD }}d}d}|D ]Ê  }t        j                  j                  ||dz   «      }t#        |d¬«      j%                  «       }|dk(  r/t        t        j                  j                  ||dz   «      d¬«      }n3|dk(  r.t        t        j                  j                  ||dz   «      d¬«      }|�	 t        |«      d	z  }|€Œ¼	 t        |«      d	z  }ŒÌ | |
   j                  d|	||f«       �ŒÇ t1        | «      S c c}w # t&        t(        f$ r Y �Œw xY w# t(        $ r d}Y �ŒUw xY w# t(        $ r d}Y �ŒVw xY w# t&        t(        f$ r}t-        |«       Y d}~�Œ2d}~ww xY wc c}w # t(        $ r d}Y Œ³w xY w# t(        $ r d}Y �Œ~w xY w)aø  Return hardware (CPU and others) temperatures as a dict
    including hardware name, label, current, max and critical
    temperatures.

    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    - /sys/class/thermal/thermal_zone* is another one but it's more
      difficult to parse
    z/sys/class/hwmon/hwmon*/temp*_*z&/sys/class/hwmon/hwmon*/device/temp*_*rÑ   r   z5/sys/devices/platform/coretemp.*/hwmon/hwmon*/temp*_*z'/sys/devices/platform/coretemp.*/hwmon/z/sys/class/hwmon/Ú_inputg     @�@rv   Ú_maxNr  Ú_critÚ_labelru  z /sys/class/thermal/thermal_zone*ÚtempÚtypez/trip_point*r;   Ú_typeÚcriticalÚ_tempÚhigh)Úcollectionsr   r?  rñ   ÚextendÚsortedra   rç   rè   Úsubr‹   rÙ   r   r_   rc   r½   rã  r   rœ   r›   rå   rð   r   rÉ  Údict)r  Ú	basenamesrI   Ú
basenames2Úreplrv   ÚaltnameÚbaserc   ÚcurrentÚ	unit_namer	  r  Úlabelr§   Ú
trip_pathsÚpÚtrip_pointsÚ
trip_pointÚ	trip_types                       rA   Úsensors_temperaturesr  ä  s(  € ô ×
!Ñ
!¤$Ó
'€CÜ—	‘	Ð;Ó<€Ið ×Ñ”T—Y‘YÐGÓHÔIÜ°Ö;¨A˜Ÿ™ › Q›Ò;Ó<€Iô —‘Ø?ó€Jô �:‰:Ð@ÓA€DØò #ˆØ—(‘(Ð.°Ó5ˆØ˜)Ò#Ø×Ñ˜TÕ"ð#ð
 ò  @ˆð	Ø˜(‘?ˆDÜœD ›JÓ'¨&Ñ0ˆGÜ—7‘7—<‘<¤§¡§¡°Ó 5°vÓ>ˆDÜ˜D›	Ÿ™Ó)ˆIô �D˜6‘M¨DÔ1ˆÜ˜˜w™°Ô6ˆÜ�D˜8‘O¨bÔ1×7Ñ7Ó9ˆàÐðÜ˜T“{ VÑ+�ð Ðð Ü  ›?¨VÑ3�ð 	ˆI‰×Ñ˜u g¨t°XÐ>Õ?ðA @òF Ü—I‘IÐ@ÓAˆ	Üœ3˜y›>Ó*ˆ	àó (	AˆDðÜ—w‘w—|‘| D¨&Ó1�Ü¤ T£
Ó+¨fÑ4�Ü—w‘w—|‘| D¨&Ó1�Ü ›IŸO™OÓ-�	ô
 Ÿ™ 4¨.Ñ#8Ó9ˆJð $öàð —‘œŸ™×)Ñ)¨!Ó,×2Ñ2°3Ó7¸¸!Ð<Õ=ðˆKð ð ˆHØˆDØ)ò (�
Ü—w‘w—|‘| D¨*°wÑ*>Ó?�Ü ¨rÔ2×8Ñ8Ó:�	Ø 
Ò*Ü#ÜŸ™Ÿ™ T¨:¸Ñ+?Ó@È4ô ‘Hð  &Ò(ÜÜŸ™Ÿ™ T¨:¸Ñ+?Ó@È4ô�Dð Ð#ð$Ü$ T›{¨VÑ3˜ð Ñ'ð(Ü#(¨£?°VÑ#;™ð'(ð. �	‰N×!Ñ! 2 w°°hÐ"?Ö@ðQ(	AôT �‹9ÐùòA <øô* œÐ$ò 		ò ð		ûô$ ò Ø“ðûô
 ò  Ø“ð ûô  œZÐ(ò Ü�c”
Ýûðüò
øô* &ò $Ø#šð$ûô
 &ò (Ø#'›ð(ús�   ÁO
ÃA2OÆO%Æ!O7Ç<A0P	ÊAP1ÎP6ÎQÏO"Ï!O"Ï%O4Ï3O4Ï7PÐPÐ	P.ÐP)Ð)P.Ð6QÑQÑQÑQc                  ó¶  — t        j                  t        «      } t        j                  d«      }|st        j                  d«      }t	        |D �ch c]  }|j                  d«      d   ’Œ c}«      }|D ]´  }	 t        t        |dz   «      «      }t        t        j                  j                  t        j                  j                  |«      d«      «      j                  «       }t        |dz   d	¬
«      j                  «       }| |   j!                  t#        j$                  ||«      «       Œ¶ t'        | «      S c c}w # t        $ r}t        |«       Y d}~Œàd}~ww xY w)a‡  Return hardware fans info (for CPU and other peripherals) as a
    dict including hardware label and current speed.

    Implementation notes:
    - /sys/class/hwmon looks like the most recent interface to
      retrieve this info, and this implementation relies on it
      only (old distros will probably use something else)
    - lm-sensors on Ubuntu 16.04 relies on /sys/class/hwmon
    z/sys/class/hwmon/hwmon*/fan*_*z%/sys/class/hwmon/hwmon*/device/fan*_*rÑ   r   r   Nrv   r  ru  r  )r
  r   r?  rñ   r  ra   rž   r   r›   r   r   r_   rc   r½   rã  rœ   r‹   rÁ   Úsfanr  )r  r  rI   r  r  r§   r  r  s           rA   Úsensors_fansr  Z  s  € ô ×
!Ñ
!¤$Ó
'€CÜ—	‘	Ð:Ó;€IÙô —I‘IÐEÓFˆ	ä°Ö;¨A˜Ÿ™ › Q›Ò;Ó<€IØò 8ˆð	Üœ$˜t h™Ó/Ó0ˆGô œŸ™Ÿ™¤R§W¡W§_¡_°TÓ%:¸FÓCÓD×JÑJÓLˆ	Ü�D˜8‘O¨bÔ1×7Ñ7Ó9ˆØˆI‰×ÑœcŸh™h u¨gÓ6Õ7ð8ô �‹9Ðùò <øô ò 	Ü�#ŒJÜûð	ús   ÁD5Á7D:Ä:	EÅEÅEc                  ól  ‡— t        «       Šˆfd„} t        j                  t        «      D �cg c]'  }|j	                  d«      sd|j                  «       v r|‘Œ) }}|syt        j                  j                  t        t        |«      «      } | |dz   |dz   «      } | |dz   |dz   «      } | |d	z   |d
z   «      } | |dz   «      }|�|�
	 d|z  |z  }nt        t        |dz   d¬«      «      }|dk(  ryd}	 | t        j                  j                  t        d«      t        j                  j                  t        d«      «      }
|
�|
dk(  }	n:t        |dz   d¬«      j                  «       j                  «       }|dk(  rd}	n|dv rd}	|	rt        j                  }nV|�|�	 t        |t        |«      z  dz  «      }n6|�$t        |dz  «      }|dk  r!t        j                   }nt        j                   }t#        j$                  |||	«      S c c}w # t        $ r d}Y �Œ$w xY w# t        $ r t        j                   }Y ŒIw xY w)a  Return battery information.
    Implementation note: it appears /sys/class/power_supply/BAT0/
    directory structure may vary and provide files with the same
    meaning but under different names, see:
    https://github.com/giampaolo/psutil/issues/966.
    c                  ó–   •— | D ]"  }t        |‰¬«      }|‰k7  sŒ	 t        |«      c S  y# t        $ r |j                  «       cY c S w xY w)zvAttempt to read the content of multiple files which may
        not exist. If none of them exist return None.
        r  N)r   rž   rå   rœ   )r  rc   r  Únulls      €rA   Ú
multi_bcatz#sensors_battery.<locals>.multi_bcat‚  sW   ø€ ð ò 	'ˆDÜ�t dÔ+ˆCØ�d‹{ð'Ü˜s›8’Oð		'ð øô "ò 'ØŸ9™9›;Ô&ð'ús   ›
*ªAÁAÚBATÚbatteryNz/energy_nowz/charge_nowz
/power_nowz/current_nowz/energy_fullz/charge_fullz/time_to_empty_nowg      Y@r“   z	/capacityr>  r  z
AC0/onlinez	AC/onliner   ú/statusru  ÚdischargingF>   ÚfullÚchargingTi  é<   r   )Úobjectr_   r@  ÚPOWER_SUPPLY_PATHr�   ræ   rc   r½   r    ÚZeroDivisionErrorrž   r   rœ   r   ÚPOWER_TIME_UNLIMITEDÚabsÚPOWER_TIME_UNKNOWNrÁ   Úsbattery)r#  rI   ÚbatsrË  Ú
energy_nowÚ	power_nowÚenergy_fullÚtime_to_emptyrÇ   Úpower_pluggedÚonlinerq  Úsecsleftr"  s                @rA   Úsensors_batteryr:  y  sJ  ø€ ô ‹8€Dôô —‘Ô-Ó.öàØ�<‰<˜Ô )¨q¯w©w«yÑ"8ò 	
ð€Dð ñ
 Øô �7‰7�<‰<Ô)¬3¨t«9Ó5€Dñ ˜D =Ñ0°$¸Ñ2FÓG€JÙ˜4 ,Ñ.°°~Ñ0EÓF€IÙ˜T NÑ2°D¸>Ñ4IÓJ€KÙ˜tÐ&:Ñ:Ó;€Mð Ð :Ð#9ð	Ø˜jÑ(¨;Ñ6‰Gô ”c˜$ Ñ,°rÔ:Ó;ˆØ�bŠ=Øð
 €MÙÜ
�‰�‰Ô&¨Ó5Ü
�‰�‰Ô&¨Ó4ó€Fð ÐØ !™‰ä�T˜IÑ%°Ô3×9Ñ9Ó;×AÑAÓCˆØ�]Ò"Ø!‰MØÐ+Ñ+Ø ˆMñ Ü×/Ñ/‰Ø	Ð	 IÐ$9ð	2Ü˜:¬¨I«Ñ6¸Ñ=Ó>‰Hð 
Ð	"Ü�} rÑ)Ó*ˆØ�aŠ<Ü×1Ñ1‰Hä×-Ñ-ˆä�<‰<˜ ¨=Ó9Ð9ùòCøô. !ò 	Ø‹Gð	ûôB !ò 	2Ü×1Ñ1ŠHð	2ús)   ¬,H ÃH ÆH ÈHÈHÈH3È2H3c                  ó¬   — g } t        j                  «       }|D ]8  }|\  }}}}}t        j                  ||xs d|||«      }| j	                  |«       Œ: | S )z:Return currently connected users as a list of namedtuples.N)rÎ   ÚusersrÁ   Úsuserr‹   )	rø  ÚrawlistÚitemr{   ÚttyÚhostnameÚtstamprF  Únts	            rA   r<  r<  Ø  s^   € à€GÜ�j‰j‹l€GØò ˆØ+/Ñ(ˆˆc�8˜V SÜ�Y‰Y�t˜Sš[ D¨(°F¸CÓ@ˆØ�‰�rÕðð €Nr@   c                  ó  — t        «       › d�} t        | «      5 }|D ]H  }|j                  d«      sŒt        |j	                  «       j                  «       d   «      c cddd«       S  d| › �}t        |«      ‚# 1 sw Y   yxY w)zAReturn the system boot time expressed in seconds since the epoch.rz   s   btimer   Nzline 'btime' not found in )r   r   r�   rÙ   rœ   ra   rh  )rc   r�   r©   rÈ   s       rA   Ú	boot_timerE  ã  s‰   € äÓÐ  Ð&€DÜ	�TÓ	ð  ˜aØò 	6ˆDØ�‰˜xÕ(Ü˜TŸZ™Z›\×/Ñ/Ó1°!Ñ4Ó5Ñ5÷ ñ  ð	6ð +¨4¨&Ð1ˆÜ˜3ÓÐ÷ ð  ús   ™A7±+A7Á&A7Á7B c                  óÀ   — t        «       j                  t        «      } t        j                  | «      D �cg c]  }|j                  «       sŒt        |«      ‘Œ  c}S c c}w )z7Returns a list of PIDs currently running on the system.)r   rU  r
   r_   r@  rÜ  rž   )rc   rI   s     rA   rM  rM  ó  s>   € äÓ×#Ñ#¤HÓ-€DÜŸJ™J tÓ,Ö<�q°·	±	µŒC��FÒ<Ð<ùÒ<s   µAÁAc                 ój  — t        j                  | «      sy	 t        «       › d| › d�}t        |«      5 }|D ]?  }|j	                  d«      sŒt        |j                  «       d   «      }|| k(  c cddd«       S  d|› �}t        |«      ‚# 1 sw Y   yxY w# t        t        f$ r | t        «       v cY S w xY w)zcCheck for the existence of a unix PID. Linux TIDs are not
    supported (always return False).
    Frr   r&  s   Tgid:r   Nz'Tgid' line not found in )
r   Ú
pid_existsr   r   r�   rž   ra   rå   r›   rM  )rF  rc   r�   r©   ÚtgidrÈ   s         rA   rH  rH  ù  sÊ   € ô ×Ñ˜sÔ#Øð	!ô &Ó'Ð(¨¨#¨¨gÐ6ˆDÜ˜TÓ"ð & aØò +�DØ—‘ xÕ0Ü" 4§:¡:£<°¡?Ó3˜ð  $ s™{Ñ*÷&ñ &ð+ð 2°$°Ð8�Ü  “oÐ%÷&ð &ûô œÐ$ò 	!Øœ$›&�=Ò ð	!ús:   ˜B ³BÁ"BÁ-	B Á7BÂBÂB ÂB ÂB2Â1B2c                  óx  — i } t        «       }t        «       D ]g  }	 t        |› d|› d�«      5 }|j                  «       }ddd«       j	                  d«      }||dz   d j                  «       }t        |d   «      }|| |<   Œi | S # 1 sw Y   ŒGxY w# t        t        f$ r Y Œ‰t        $ r}t        |«      |‚d}~ww xY w)zsObtain a {pid: ppid, ...} dict for all running processes in
    one shot. Used to speed up Process.children().
    rr   rz   Nó   )r:   r   )r   rM  r   ró   r‰  ra   rž   rA  rB  rO  r   )	r  rŒ   rF  r�   rå  ÚrparÚdsetÚppidr§   s	            rA   Úppid_maprO    sÑ   € ð €CÜ!Ó#€KÜ‹vò ˆð	Ü ˜}¨A¨c¨U°%Ð8Ó9ð  ¸QØ—v‘v“x�÷ ð —:‘:˜dÓ#ˆDØ˜˜q™˜
Ð#×)Ñ)Ó+ˆDÜ�t˜A‘w“<ˆDØˆC�ŠHðð €J÷ ð  ûä!Ô#5Ð6ò 	ÙÜò 	-Ü˜sÓ#¨Ð,ûð	-ús3   ›B¬B½BÂB	ÂBÂB9Â B9Â(B4Â4B9c                 óB   ‡ — t        j                  ‰ «      ˆ fd„«       }|S )z`Decorator which translates bare OSError exceptions into
    NoSuchProcess and AccessDenied.
    c                 óŽ  •— | j                   | j                  }}	  ‰| g|¢­i |¤ŽS # t        $ r}t        ||«      |‚d }~wt        $ r"}| j                  «        t        ||«      |‚d }~wt        $ rR}| j                  «        t        j                  j                  | j                  › d|› d�«      st        ||«      |‚‚ d }~ww xY w)Nrr   rz   )rF  Ú_namerO  r   rB  Ú_raise_if_zombier   rA  r_   rc   rg  r8  )r9  rš   ÚkwargsrF  rv   r§   Úfuns         €rA   Úwrapperz wrap_exceptions.<locals>.wrapper5  s¾   ø€ à—H‘H˜dŸj™jˆTˆð	Ù�tÐ-˜dÒ- fÑ-Ð-øÜò 	3Ü˜s DÓ)¨sÐ2ûÜ!ò 	4Ø×!Ñ!Ô#Ü  TÓ*°Ð3ûÜ ò 	Ø×!Ñ!Ô#ô —7‘7—>‘> T×%6Ñ%6Ð$7°q¸¸¸UÐ"CÔDÜ# C¨Ó.°CÐ7Øûð	ús+   ›' §	C°=½CÁ	A&Á&CÁ2AB?Â?C)Ú	functoolsÚwraps)rU  rV  s   ` rA   Úwrap_exceptionsrY  0  s'   ø€ ô
 ‡_�_�SÓóó ðð$ €Nr@   c                   óL  — e Zd ZdZg d¢Zd„ Zd„ Zd„ Zd„ Ze	fd„Z
eed„ «       «       Zeed	„ «       «       Zeed
„ «       «       Zd„ Zd„ Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zej0                  j3                  d ej4                  «       › d�«      red„ «       Zed„ «       Zed„ «       Zed;d„«       Zed<d„«       Zed„ «       Z e!se"rHd„ Z#e e$jJ                  d«       e$jJ                  d«       e$jJ                  d«      fd„«       Z&ed „ «       Z'ne Z'e"red!„ «       Z(ed"„ «       Z)e e$jJ                  d#«      fd$„«       Z*e e$jJ                  d%«      fd&„«       Z+ed'„ «       Z,ed(„ «       Z-ed)„ «       Z.e/r%ed*„ «       Z0 e$jJ                  d+«      fd,„Z1ed-„ «       Z2e3red.„ «       Z4ed/„ «       Z5 e6e7d0«      r	ed;d1„«       Z8ed2„ «       Z9ed3„ «       Z:ed=d4„«       Z;ed5„ «       Z<ed6„ «       Z=e e$jJ                  d7«      fd8„«       Z>e e$jJ                  d9«      fd:„«       Z?y)>ÚProcesszLinux process implementation.)Ú_cacheÚ_ctimerR  Ú_ppidr8  rF  c                 óZ   — || _         d | _        d | _        d | _        t	        «       | _        y rL  )rF  rR  r^  r]  r   r8  )r9  rF  s     rA   r:  zProcess.__init__W  s)   € ØˆŒØˆŒ
ØˆŒ
ØˆŒÜ+Ó-ˆÕr@   c                 ó®   — 	 t        | j                  › d| j                  › d�«      }|j                  d«      }||dz   |dz    }|dk(  S # t        $ r Y yw xY w)Nrr   rz   rK  r:   r;   ó   ZF)r   r8  rF  r‰  r›   )r9  rå  rL  rq  s       rA   Ú
_is_zombiezProcess._is_zombie^  sk   € ð	"Ü˜4×,Ñ,Ð-¨Q¨t¯x©x¨j¸Ð>Ó?ˆDð —:‘:˜dÓ#ˆDØ˜$ ™( T¨A¡XÐ.ˆFØ˜T‘>Ð!øô ò 	Ùð	ús   ‚%A Á	AÁAc                 óz   — | j                  «       r+t        | j                  | j                  | j                  «      ‚y rL  )rb  r   rF  rR  r^  ©r9  s    rA   rS  zProcess._raise_if_zombien  s,   € Ø�?‰?ÔÜ §¡¨$¯*©*°d·j±jÓAÐAð r@   c                 ó`   — t        j                  | j                  › d| j                  › �«       y)z+Raise NSP if the process disappeared on us.rr   N)r_   rÇ  r8  rF  rd  s    rA   Ú_raise_if_not_alivezProcess._raise_if_not_aliver  s&   € ô 	�‰�4×$Ñ$Ð% Q t§x¡x jÐ1Õ2r@   c                 óê   — 	 t        |«      S # t        t        f$ rV t        j                  j                  | j                  › d| j                  › �«      r| j                  «        |t        ur|cY S ‚ w xY wr×  )
r`   rA  rB  r_   rc   Úlexistsr8  rF  rS  ÚUNSET)r9  rc   r£   s      rA   Ú	_readlinkzProcess._readlinkx  sh   € ð	Ü˜D“>Ð!øÜ!Ô#5Ð6ò 	Ü�w‰w�‰ $×"3Ñ"3Ð!4°A°d·h±h°ZÐ@ÔAØ×%Ñ%Ô'Ø¤5Ñ(Ø#’OØð	ús   ‚
 �A!A2Á0A2c                 ó¼  — t        | j                  › d| j                  › d�«      }|j                  d«      }||j	                  d«      dz   | }||dz   d j                  «       }i }||d<   |d	   |d
<   |d   |d<   |d   |d<   |d   |d<   |d   |d<   |d   |d<   |d   |d<   |d   |d<   |d   |d<   	 |d   |d<   |S # t        $ r t        d«       d	|d<   Y |S w xY w)aY  Parse /proc/{pid}/stat file and return a dict with various
        process info.
        Using "man proc" as a reference: where "man proc" refers to
        position N always subtract 3 (e.g ppid position 4 in
        'man proc' == position 1 in here).
        The return value is cached in case oneshot() ctx manager is
        in use.
        rr   rz   rK  ó   (r   r:   Nrv   r   rq  rN  rÌ   Úttynré   Úutimeé   Ústimeé   Úchildren_utimer¸  Úchildren_stimeé   Úcreate_timeé$   Úcpu_numé'   Úblkio_ticksz&can't get blkio_ticks, set iowait to 0)r   r8  rF  r‰  rè  ra   Ú
IndexErrorr   )r9  rå  rL  rv   r�   r  s         rA   Ú_parse_stat_filezProcess._parse_stat_fileˆ  s3  € ô �t×(Ñ(Ð)¨¨4¯8©8¨*°EÐ:Ó;ˆð �z‰z˜$ÓˆØ�D—I‘I˜d“O aÑ'¨$Ð/ˆØ�d˜Q‘h�jÐ!×'Ñ'Ó)ˆàˆØˆˆF‰Ø˜q™	ˆˆH‰Ø˜Q‘iˆˆF‰Ø˜a‘yˆˆG‰Ø˜b‘zˆˆG‰Ø˜b‘zˆˆG‰Ø & r¡
ˆÐÑØ & r¡
ˆÐÑØ# B™ZˆˆMÑØ ™ˆˆI‰ð	#Ø!'¨¡ˆC�Ñð ˆ
øô ò 	#äÐ:Ô;Ø!"ˆC�Òàˆ
ð	#ús   Â4B> Â>CÃCc                 ó˜   — t        | j                  › d| j                  › d�«      5 }|j                  «       cddd«       S # 1 sw Y   yxY w)z�Read /proc/{pid}/stat file and return its content.
        The return value is cached in case oneshot() ctx manager is
        in use.
        rr   r&  N)r   r8  rF  ró   ©r9  r�   s     rA   Ú_read_status_filezProcess._read_status_file¯  sD   € ô ˜D×-Ñ-Ð.¨a°·±¨z¸ÐAÓBð 	ÀaØ—6‘6“8÷	÷ 	ò 	ús   ¦A Á A	c                 ó´   — t        | j                  › d| j                  › d�«      5 }|j                  «       j	                  «       cd d d «       S # 1 sw Y   y xY w)Nrr   r0   )r   r8  rF  ró   rœ   r~  s     rA   Ú_read_smaps_filezProcess._read_smaps_file¹  sK   € ô ˜D×-Ñ-Ð.¨a°·±¨z¸Ð@ÓAð 	$ÀQØ—6‘6“8—>‘>Ó#÷	$÷ 	$ò 	$ús   ¦AÁAc                 ó¦   — | j                   j                  | «       | j                  j                  | «       | j                  j                  | «       y rL  )r|  Úcache_activater  r�  rd  s    rA   Úoneshot_enterzProcess.oneshot_enter¿  s>   € Ø×Ñ×,Ñ,¨TÔ2Ø×Ñ×-Ñ-¨dÔ3Ø×Ñ×,Ñ,¨TÕ2r@   c                 ó¦   — | j                   j                  | «       | j                  j                  | «       | j                  j                  | «       y rL  )r|  Úcache_deactivater  r�  rd  s    rA   Úoneshot_exitzProcess.oneshot_exitÄ  s>   € Ø×Ñ×.Ñ.¨tÔ4Ø×Ñ×/Ñ/°Ô5Ø×Ñ×.Ñ.¨tÕ4r@   c                 ó:   — t        | j                  «       d   «      S )Nrv   )r   r|  rd  s    rA   rv   zProcess.nameÉ  s   € ô �d×+Ñ+Ó-¨fÑ5Ó6Ð6r@   c                 ó\   — | j                  | j                  › d| j                  › d�d¬«      S )Nrr   z/exeru  r  ©rj  r8  rF  rd  s    rA   ÚexezProcess.exeÎ  ó5   € à�~‰~Ø× Ñ Ð!  4§8¡8 *¨DÐ1¸Bð ó 
ð 	
r@   c                 óŠ  — t        | j                  › d| j                  › d�«      5 }|j                  «       }d d d «       s| j	                  «        g S |j                  d«      rdnd}|j                  |«      r|d d }|j                  |«      }|dk(  r#t        |«      dk(  rd|v r|j                  d«      }|S # 1 sw Y   ŒƒxY w)Nrr   z/cmdlinerZ   rã   r>  r   )r   r8  rF  ró   rS  rb   ra   rŠ   )r9  r�   rå  ÚsepÚcmdlines        rA   r�  zProcess.cmdlineÔ  s¼   € ä˜$×+Ñ+Ð,¨A¨d¯h©h¨Z°xÐ@ÓAð 	ÀQØ—6‘6“8ˆD÷	áà×!Ñ!Ô#ØˆIð Ÿ™ fÔ-‰f°3ˆØ�=‰=˜ÔØ˜˜�9ˆDØ—*‘*˜S“/ˆð �&Š=œS ›\¨QÒ.°3¸$±;Ø—j‘j “oˆGØˆ÷-	ð 	ús   ¦B9Â9Cc                 óÀ   — t        | j                  › d| j                  › d�«      5 }|j                  «       }d d d «       t	        |«      S # 1 sw Y   t	        «      S xY w)Nrr   z/environ)r   r8  rF  ró   r   )r9  r�   rå  s      rA   ÚenvironzProcess.environî  sU   € ä˜$×+Ñ+Ð,¨A¨d¯h©h¨Z°xÐ@ÓAð 	ÀQØ—6‘6“8ˆD÷	ä" 4Ó(Ð(÷	ä" 4Ó(Ð(ús   ¦A
Á
Ac                 óŒ   — t        | j                  «       d   «      }t        j                  «       }	 ||   S # t        $ r Y y w xY w)Nrm  )rž   r|  r   Úget_terminal_mapr™   )r9  Útty_nrr7  s      rA   ÚterminalzProcess.terminalô  sI   € ä�T×*Ñ*Ó,¨WÑ5Ó6ˆÜ×(Ñ(Ó*ˆð	Ø˜‘<ÐøÜò 	Ùð	ús   ²7 ·	AÁAr/   ú/ioc           	      óþ  — | j                   › d| j                  › d�}i }t        |«      5 }|D ]8  }|j                  «       }|sŒ	 |j	                  d«      \  }}t        |«      ||<   Œ: 	 d d d «       |s|› d�}t        |«      ‚	 t        j                  |d   |d   |d   |d   |d	   |d
   «      S # t        $ r Y ŒŽw xY w# 1 sw Y   ŒWxY w# t        $ r(}|j                  d   ›d|› d|›�}t        |«      d ‚d }~ww xY w)Nrr   r–  s   : z file was emptys   syscrs   syscws
   read_bytess   write_bytess   rchars   wcharr   z field was not found in z; found fields are )r8  rF  r   rœ   ra   rž   rå   rh  rÁ   Úpior™   rš   )	r9  Úfnamer�   r�   r©   rv   rü   rÈ   r§   s	            rA   Úio_counterszProcess.io_counters   sD  € à×(Ñ(Ð)¨¨4¯8©8¨*°CÐ8ˆEØˆFÜ˜UÓ#ð 6 qØò 
6�DàŸ:™:›<�DÚð6Ø*.¯*©*°UÓ*;™K˜D %ô
 ,/¨u«:˜F 4šLñ
6÷6ñ Ø˜˜Ð/�Ü" 3Ó'Ð'ð0Ü—w‘wØ˜8Ñ$Ø˜8Ñ$Ø˜=Ñ)Ø˜>Ñ*Ø˜8Ñ$Ø˜8Ñ$óð øô  *ò %á$ð%ú÷6ð 6ûô0 ò 0à—x‘x ‘{�oÐ%=¸e¸Wð E#Ø#) *ð.ð ô ! “o¨4Ð/ûð0úsG   ªB?ÁB0ÁB?Â+C Â0	B<Â9B?Â;B<Â<B?Â?CÃ	C<Ã#C7Ã7C<c                 ó&  — | j                  «       }t        |d   «      t        z  }t        |d   «      t        z  }t        |d   «      t        z  }t        |d   «      t        z  }t        |d   «      t        z  }t        j                  |||||«      S )Nro  rq  rs  rt  rz  )r|  rÙ   rÚ   rÁ   Ú	pcputimes)r9  rŽ   ro  rq  rs  rt  r   s          rA   rÛ   zProcess.cpu_times#  s�   € à×&Ñ&Ó(ˆÜ�f˜W‘oÓ&¬Ñ4ˆÜ�f˜W‘oÓ&¬Ñ4ˆÜ˜vÐ&6Ñ7Ó8¼;ÑFˆÜ˜vÐ&6Ñ7Ó8¼;ÑFˆÜ�v˜mÑ,Ó-´Ñ;ˆÜ�}‰}Ø�5˜.¨.¸&ó
ð 	
r@   c                 ó:   — t        | j                  «       d   «      S )zWhat CPU the process is on.rx  ©rž   r|  rd  s    rA   rx  zProcess.cpu_num/  s   € ô �4×(Ñ(Ó*¨9Ñ5Ó6Ð6r@   Nc                 óB   — t        j                  | j                  |«      S rL  )r   Úwait_pidrF  )r9  Útimeouts     rA   ÚwaitzProcess.wait4  s   € ä× Ñ  §¡¨7Ó3Ð3r@   c                 ó´   — | j                   €(t        | j                  «       d   «      t        z  | _         |r| j                   S | j                   t	        «       z   S )Nrv  )r]  rÙ   r|  rÚ   rE  )r9  Ú	monotonics     rA   rv  zProcess.create_time8  sR   € ð �;‰;Ðä�d×+Ñ+Ó-¨mÑ<Ó=ÄÑKð ŒKñ Ø—;‘;Ðð �{‰{œY›[Ñ(Ð(r@   c           	      ó  — t        | j                  › d| j                  › d�«      5 }d„ |j                  «       j	                  «       d d D «       \  }}}}}}}d d d «       t        j                  «      S # 1 sw Y   Œ$xY w)Nrr   z/statmc              3   ó@   K  — | ]  }t        |«      t        z  –— Œ y ­wrL  )rž   rŸ   )Ú.0rI   s     rA   ú	<genexpr>z&Process.memory_info.<locals>.<genexpr>W  s   è ø€ ò 8Ø&'”�A“œÕ!ñ8ùs   ‚rt  )r   r8  rF  r‰   ra   rÁ   Úpmem)	r9  r�   ÚvmsÚrssr²   ÚtextÚlibrå  Údirtys	            rA   Úmemory_infozProcess.memory_infoI  sŒ   € ô ˜D×-Ñ-Ð.¨a°·±¨z¸Ð@ÓAð 	ÀQñ8Ø+,¯:©:«<×+=Ñ+=Ó+?ÀÀÐ+Cô8Ñ4ˆC��f˜d C¨¨u÷	ô �x‰x˜˜S &¨$°°T¸5ÓAÐA÷		ð 	ús   ¦1A:Á:Bc                 óÈ  — dx}x}}t        | j                  › d| j                  › d�«      5 }|D ]˜  }|j                  d«      r#|t	        |j                  «       d   «      dz  z  }Œ7|j                  d«      r t	        |j                  «       d   «      dz  }Œh|j                  d«      sŒzt	        |j                  «       d   «      dz  }Œš 	 d d d «       |||fS # 1 sw Y   ŒxY w)	Nr   rr   r1   s   Private_r   r¯   ó   Pss:ó   Swap:)r   r8  rF  r�   rž   ra   )r9  ÚussÚpssÚswapr�   r©   s         rA   Ú_parse_smaps_rollupzProcess._parse_smaps_rollup^  sà   € ð  !Ð ˆCÐ �#˜ÜØ×$Ñ$Ð% Q t§x¡x j°Ð>óð 
;àØò ;�DØ—‘ {Ô3àœs 4§:¡:£<°¡?Ó3°dÑ:Ñ:™ØŸ™¨Ô1Ü! $§*¡*£,¨q¡/Ó2°TÑ9™ØŸ™¨Õ2Ü" 4§:¡:£<°¡?Ó3°dÑ:™ñ;÷
;ð ˜˜dÐ#Ð#÷
;ð 
;ús   ¬A<CÂ)!CÃC!s   \nPrivate.*:\s+(\d+)s   \nPss\:\s+(\d+)s   \nSwap\:\s+(\d+)c                 ó.  — | j                  «       }t        t        t        |j	                  |«      «      «      dz  }t        t        t        |j	                  |«      «      «      dz  }t        t        t        |j	                  |«      «      «      dz  }|||fS )Nr¯   )r�  rô   r‹  rž   Úfindall)r9  Ú_private_reÚ_pss_reÚ_swap_reÚ
smaps_datar³  r´  rµ  s           rA   Ú_parse_smapszProcess._parse_smapsu  s‚   € ð* ×.Ñ.Ó0ˆJô ”cœ#˜{×2Ñ2°:Ó>Ó?Ó@À4ÑGˆCÜ”cœ#˜wŸ™¨zÓ:Ó;Ó<¸tÑCˆCÜ”sœ3 × 0Ñ 0°Ó <Ó=Ó>ÀÑEˆDØ˜˜dÐ#Ð#r@   c                 ó  — t         r	 | j                  «       \  }}}n| j	                  «       \  }}}| j                  «       }t        j                  ||||fz   Ž S # t        t        f$ r | j	                  «       \  }}}Y ŒMw xY wrL  )ÚHAS_PROC_SMAPS_ROLLUPr¶  rB  rA  r½  r¯  rÁ   Úpfullmem)r9  r³  r´  rµ  Ú	basic_mems        rA   Úmemory_full_infozProcess.memory_full_info’  sˆ   € å$ð9Ø%)×%=Ñ%=Ó%?‘N�C˜™dð "&×!2Ñ!2Ó!4‘��S˜$Ø×(Ñ(Ó*ˆIÜ—<‘< ¨c°3¸Ð-=Ñ!=Ð>Ð>øô +Ô,=Ð>ò 9Ø%)×%6Ñ%6Ó%8‘N�C˜šdð9ús   ˆA Á#A?Á>A?c                 ó`  — d„ }| j                  «       }|s| j                  «        g S |j                  d«      }g }|j                  d«      }|g} |||«      D �]5  \  }}|j                  dd«      }	 |\  }	}
}}}}|sd}n<t        |«      }|j                  «       }|j                  d«      rt        |«      s|dd	 }t        |	«      t        |
«      ||j                  d
d«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      f}|j                  |«       �Œ8 |S # t        $ r |dgz   \  }	}
}}}}Y �Œ1w xY w)aÔ  Return process's mapped memory regions as a list of named
            tuples. Fields are explained in 'man proc'; here is an updated
            (Apr 2012) version: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/Documentation/filesystems/proc.txt?id=b76437579d1344b612cf1851ae610c636cec7db0.

            /proc/{PID}/smaps does not exist on kernels < 2.6.14 or if
            CONFIG_MMU kernel configuration option is not enabled.
            c              3   ó‚  K  — i }| D ]f  }|j                  d d«      }|d   j                  d«      s&|j                  «       |f–— |j                  |«       ŒO	 t	        |d   «      dz  ||d   <   Œh |j                  «       |f–— y # t
        t        f$ r( |d   j                  d«      rY Œ£d|›�}t        |«      d ‚w xY w­w)Né   r   r  r   r¯   s   VmFlags:z!don't know how to interpret line )ra   rb   Úpopr‹   rž   rå   r{  r�   )rŒ  Úcurrent_blockrå  r©   r�   rÈ   s         rA   Ú
get_blocksz'Process.memory_maps.<locals>.get_blocks­  sÕ   è ø€ Ø�Ø!ò <�DØ!ŸZ™Z¨¨aÓ0�FØ! !™9×-Ñ-¨dÔ3à,×0Ñ0Ó2°DÐ9Ò9Ø%×,Ñ,¨TÕ2ð<Ü.1°&¸±)«n¸tÑ.C˜D ¨¡šOð<ð %×(Ñ(Ó*¨DÐ1Ó1øô !+¬JÐ7ò <Ø% a™y×3Ñ3°KÔ@á (Ø$EÀdÀXÐ"N˜CÜ",¨S£/°tÐ;ð<üs*   ‚AB?ÁBÁ.B?Â#B<Â(B?Â*B<Â<B?ó   
r   NrÅ  ru  z[anon]r[   r\   s   Rss:s   Size:r±  s   Shared_Clean:s   Shared_Dirty:s   Private_Clean:s   Private_Dirty:s   Referenced:s
   Anonymous:r²  )r�  rS  ra   rÆ  rå   r   rœ   rb   r   r˜   r‹   )r9  rÈ  rå  rŒ  rõ   Ú
first_linerÇ  ÚheaderÚhfieldsr]  ÚpermsÚ_offsetÚ_devÚ_inoderc   r?  s                   rA   Úmemory_mapszProcess.memory_maps£  s¿  € ò2ð& ×(Ñ(Ó*ˆDñ Ø×%Ñ%Ô'Ø�	Ø—J‘J˜uÓ%ˆEØˆBØŸ™ 1›ˆJØ'˜LˆMÙ *¨5°-Ó @ó  ‘�˜Ø Ÿ,™, t¨QÓ/�ðNØ?FÑ<�D˜% ¨$°¸ñ Ø#‘Dä! $›<�DØŸ:™:›<�DØ—}‘} \Ô2Ô;MØô<ð  $ D S˜z˜ä˜4“LÜ˜5“MØØ—H‘H˜W aÓ(Ø—H‘H˜X qÓ)Ø—H‘H˜W aÓ(Ø—H‘HÐ-¨qÓ1Ø—H‘HÐ-¨qÓ1Ø—H‘HÐ.°Ó2Ø—H‘HÐ.°Ó2Ø—H‘H˜^¨QÓ/Ø—H‘H˜]¨AÓ.Ø—H‘H˜X qÓ)ð�ð —	‘	˜$–ð= ð> ˆIøô7 "ò NØ?FÈ"È¹~Ñ<�D˜% ¨$°»ðNús   Á2	FÆF-Æ,F-c                 ó\   — | j                  | j                  › d| j                  › d�d¬«      S )Nrr   z/cwdru  r  rŠ  rd  s    rA   ÚcwdzProcess.cwdë  rŒ  r@   s   ctxt_switches:\t(\d+)c                 óô   — | j                  «       }|j                  |«      }|s(d| j                  › d| j                  › d�}t	        |«      ‚t        j                  t        |d   «      t        |d   «      «      S )NzR'voluntary_ctxt_switches' and 'nonvoluntary_ctxt_switches'lines were not found in rr   z1/status; the kernel is probably older than 2.6.23r   r   )r  r¸  r8  rF  r  rÁ   Úpctxswrž   )r9  Ú	_ctxsw_rerå  ÚctxswrÈ   s        rA   Únum_ctx_switcheszProcess.num_ctx_switchesñ  s}   € ð ×%Ñ%Ó'ˆØ×!Ñ! $Ó'ˆÙðà×%Ñ%Ð& a¨¯© zð 2.ð.ð ô & cÓ*Ð*Ü�z‰zœ#˜e A™h›-¬¨U°1©X«Ó7Ð7r@   s   Threads:\t(\d+)c                 ó\   — | j                  «       }t        |j                  |«      d   «      S ©Nr   )r  rž   r¸  )r9  Ú_num_threads_rerå  s      rA   Únum_threadszProcess.num_threads  s-   € ð ×%Ñ%Ó'ˆÜ�?×*Ñ*¨4Ó0°Ñ3Ó4Ð4r@   c                 ó°  — t        j                  | j                  › d| j                  › d�«      }|j	                  «        g }d}|D ]×  }| j                  › d| j                  › d|› d�}	 t        |«      5 }|j                  «       j                  «       }d d d «       |j                  d«      dz   d  }|j                  d	«      }t        |d
   «      t        z  }	t        |d   «      t        z  }
t        j                  t!        |«      |	|
«      }|j#                  |«       ŒÙ |r| j%                  «        |S # 1 sw Y   Œ¢xY w# t        t        f$ r d}Y �Œw xY w)Nrr   z/taskFz/task/rz   TrK  r:   rË   rn  rp  )r_   r@  r8  rF  r  r   ró   rœ   rA  rB  rè  ra   rÙ   rÚ   rÁ   Úpthreadrž   r‹   rf  )r9  Ú
thread_idsrø  Ú
hit_enoentÚ	thread_idr™  r�   ÚstrŽ   ro  rq  rþ  s               rA   ÚthreadszProcess.threads  sI  € ä—Z‘Z 4×#4Ñ#4Ð"5°Q°t·x±x°jÀÐ FÓGˆ
Ø�‰ÔØˆØˆ
Ø#ò 	#ˆIØ×(Ñ(Ð)¨¨4¯8©8¨*°F¸9¸+ÀUÐKˆEðÜ  Ó'ð *¨1ØŸ™›Ÿ™Ó)�B÷*ð �B—G‘G˜D“M AÑ%Ð'Ð(ˆBØ—X‘X˜d“^ˆFÜ˜& ™*Ó%¬Ñ3ˆEÜ˜& ™*Ó%¬Ñ3ˆEÜ—[‘[¤ Y£°¸Ó>ˆFØ�N‰N˜6Õ"ð!	#ñ" Ø×$Ñ$Ô&Øˆ÷!*ð *ûä%Ô'9Ð:ò ð "�
Úð	ús*   Á)E Á4D4ÂE Ä4D=	Ä9E Å EÅEc                 ó@   — t        j                  | j                  «      S rL  )rÎ   Úproc_priority_getrF  rd  s    rA   Únice_getzProcess.nice_get"  s   € ô ×%Ñ% d§h¡hÓ/Ð/r@   c                 óB   — t        j                  | j                  |«      S rL  )rÎ   Úproc_priority_setrF  )r9  rü   s     rA   Únice_setzProcess.nice_set+  s   € ä×%Ñ% d§h¡h°Ó6Ð6r@   c                 ó@   — t        j                  | j                  «      S rL  )rÎ   r3   rF  rd  s    rA   Úcpu_affinity_getzProcess.cpu_affinity_get2  s   € ä×-Ñ-¨d¯h©hÓ7Ð7r@   s   Cpus_allowed_list:\t(\d+)-(\d+)c           	      óþ   — | j                  «       }|j                  |«      }|r6t        t        t	        |d   d   «      t	        |d   d   «      dz   «      «      S t        t        t        t        «       «      «      «      S )Nr   r   )r  r¸  r?  Úrangerž   rŠ   rß   )r9  Ú_rerå  ré   s       rA   Ú_get_eligible_cpuszProcess._get_eligible_cpus6  sk   € ð ×)Ñ)Ó+ˆDØ—K‘K Ó%ˆEÙÜœE¤# e¨A¡h¨q¡kÓ"2´C¸¸a¹À¹Ó4DÀqÑ4HÓIÓJÐJäœE¤#¤m£oÓ"6Ó7Ó8Ð8r@   c           	      ó¨  — 	 t        j                  | j                  |«       y # t        t        f$ rŸ}t        |t        «      s|j                  t        j                  k(  rl| j                  «       }t        t        t        t        «       «      «      «      }|D ]2  }||vrd|›d|›�}t	        |«      d ‚||vsŒ d|› d|› �}t	        |«      |‚ ‚ d }~ww xY w)Nzinvalid CPU z; choose between zCPU number z! is not eligible; choose between )rÎ   Úproc_cpu_affinity_setrF  r›   rå   r]   rC  rD  rï  Útuplerí  rŠ   rß   )r9  rÝ   r§   Úeligible_cpusÚall_cpusÚcpurÈ   s          rA   Úcpu_affinity_setzProcess.cpu_affinity_setA  sä   € ðÜ×*Ñ*¨4¯8©8°TÕ:øÜœZÐ(ò Ü˜c¤:Ô.°#·)±)¼u¿|¹|Ò2KØ$(×$;Ñ$;Ó$=�MÜ$¤U¬3¬}«Ó+?Ó%@ÓA�HØ#ò ;˜Ø hÑ.à".¨s¨gð 6$Ø$1Ð#4ð!6ð  ô #-¨S£/°tÐ;Ø mÒ3à"-¨c¨Uð 3,Ø,9¨?ð!<ð  ô #-¨S£/°sÐ:ð;ð ûð#ús   ‚ # £C²BCÂ6CÃCc                 óˆ   — t        j                  | j                  «      \  }}t        |«      }t	        j
                  ||«      S rL  )rÎ   r2   rF  r9   rÁ   Úpionice)r9  Úioclassrü   s      rA   Ú
ionice_getzProcess.ionice_get[  s5   € ä!×1Ñ1°$·(±(Ó;‰NˆG�UÜ  Ó)ˆGÜ—;‘;˜w¨Ó.Ð.r@   c                 óâ   — |€d}|r2|t         j                  t         j                  hv r|›d�}t        |«      ‚|dk  s|dkD  rd}t        |«      ‚t	        j
                  | j                  ||«      S )Nr   z ioclass accepts no valuert  zvalue not in 0-7 range)r9   r#   r    rå   rÎ   Úproc_ioprio_setrF  )r9  rù  rü   rÈ   s       rA   Ú
ionice_setzProcess.ionice_seta  s{   € àˆ}Ø�Ù˜Ü×,Ñ,Ü×,Ñ,ð%ñ ð !˜Ð#<Ð=�Ü  “oÐ%Ø�qŠy˜E AšIØ.�Ü  “oÐ%Ü×'Ñ'¨¯©°'¸5ÓAÐAr@   Úprlimitc                 ó~  — | j                   dk(  rd}t        |«      ‚	 |€ t        j                  | j                   |«      S t	        |«      dk7  rd|›�}t        |«      ‚t        j                  | j                   ||«       y # t
        $ r3}|j                  t        j                  k(  r| j                  «        ‚ d }~ww xY w)Nr   z)can't use prlimit() against PID 0 processr:   z2second argument must be a (soft, hard) tuple, got )	rF  rå   Úresourcerþ  rŠ   r›   rC  ÚENOSYSrS  )r9  Ú	resource_ÚlimitsrÈ   r§   s        rA   ÚrlimitzProcess.rlimitr  s´   € ð
 �x‰x˜1Š}ØA�Ü  “oÐ%ðØ�>ä#×+Ñ+¨D¯H©H°iÓ@Ð@ô ˜6“{ aÒ'ð*Ø*0¨ð5ð ô )¨›oÐ-Ü×$Ñ$ T§X¡X¨y¸&ÕAøÜò Ø—9‘9¤§¡Ò,ð ×)Ñ)Ô+Øûðús   ž!B  Á ?B  Â 	B<Â	.B7Â7B<c                 ót   — | j                  «       d   }|j                  «       }t        j                  |d«      S )Nrq  ú?)r|  r   ÚPROC_STATUSESr˜   )r9  Úletters     rA   rq  zProcess.statusŽ  s3   € à×&Ñ&Ó(¨Ñ2ˆØ—‘“ˆä× Ñ  ¨Ó-Ð-r@   c                 ó  — g }t        j                  | j                  › d| j                  › d�«      }d}|D �]  }| j                  › d| j                  › d|› �}	 t	        |«      }|j                  d«      sŒ@t        |«      sŒL| j                  › d| j                  › d|› �}	 t        |«      5 }t        |j                  «       j                  «       d   «      }t        |j                  «       j                  «       d   d«      }	d d d «       t        	«      }
t        j                  |t        |«      t        «      |
|	«      }|j                  |«       �Œ |r| j-                  «        |S # 1 sw Y   ŒgxY w# t        t         f$ r d}Y �ŒRw xY w# t        t         f$ r d}Y �Œjt"        $ rW}|j$                  t$        j&                  k(  rY d }~�Œ•|j$                  t$        j(                  k(  rt+        |«       Y d }~�ŒÃ‚ d }~ww xY w)	Nrr   r<  Fr=  z/fdinfo/r   r‚   T)r_   r@  r8  rF  r`   r�   r   r   rž   r‰   ra   rp   rÁ   Ú	popenfiler‹   rA  rB  r›   rC  rD  rE  r   rf  )r9  rø  rÌ  rà  rH  rk  rc   r�   Úposrm   ro   rþ  r§   s                rA   Ú
open_fileszProcess.open_files•  sÕ  € àˆÜ—
‘
˜d×/Ñ/Ð0°°$·(±(°¸3Ð?Ó@ˆØˆ
Øó &	/ˆBØ×'Ñ'Ð(¨¨$¯(©(¨°4¸°tÐ<ˆDð$/Ü “~�ð& —?‘? 3Õ'¬M¸$Õ,?à"×/Ñ/Ð0°°$·(±(°¸8ÀBÀ4ÐH�Dð/Ü(¨Ó.ð D°!Ü"% a§j¡j£l×&8Ñ&8Ó&:¸1Ñ&=Ó">˜CÜ$'¨¯
©
«×(:Ñ(:Ó(<¸QÑ(?ÀÓ$C˜E÷Dô  2°%Ó8˜Ü!$§¡Ø ¤# b£'¬3¨s«8°T¸5ó"˜ð  Ÿ™ vÖ.ðM&	/ñN Ø×$Ñ$Ô&Øˆ÷Dð Dûô .Ô/AÐBò *ð &*›
ð*ûô3 &Ô'9Ð:ò à!�
ÚÜò Ø—9‘9¤§¡Ò,åØ—9‘9¤× 2Ñ 2Ò2ä˜#”JÝØûðúsU   ÁFÂ!E4Â,AE(ÄE4Å(E1	Å-E4Å4F	ÆF	ÆG?Æ G?Æ(G:Ç(G:Ç9G:Ç:G?c                 óf   — t         j                  || j                  «      }| j                  «        |S rL  )r…  r�  rF  rf  )r9  r}  r  s      rA   r†  zProcess.net_connectionsÅ  s)   € ä×'Ñ'¨¨d¯h©hÓ7ˆØ× Ñ Ô"Øˆ
r@   c                 ór   — t        t        j                  | j                  › d| j                  › d�«      «      S )Nrr   r<  )rŠ   r_   r@  r8  rF  rd  s    rA   Únum_fdszProcess.num_fdsË  s.   € ä”2—:‘: ×!2Ñ!2Ð 3°1°T·X±X°J¸cÐBÓCÓDÐDr@   c                 ó:   — t        | j                  «       d   «      S )NrN  rž  rd  s    rA   rN  zProcess.ppidÏ  s   € ä�4×(Ñ(Ó*¨6Ñ2Ó3Ð3r@   s   Uid:\t(\d+)\t(\d+)\t(\d+)c                 ó¶   — | j                  «       }|j                  |«      d   \  }}}t        j                  t	        |«      t	        |«      t	        |«      «      S rÚ  )r  r¸  rÁ   Úpuidsrž   )r9  Ú_uids_rerå  ÚrealÚ	effectiveÚsaveds         rA   ÚuidszProcess.uidsÓ  óK   € à×%Ñ%Ó'ˆØ!)×!1Ñ!1°$Ó!7¸Ñ!:Ñˆˆi˜Ü�y‰yœ˜T›¤C¨	£N´C¸³JÓ?Ð?r@   s   Gid:\t(\d+)\t(\d+)\t(\d+)c                 ó¶   — | j                  «       }|j                  |«      d   \  }}}t        j                  t	        |«      t	        |«      t	        |«      «      S rÚ  )r  r¸  rÁ   Úpgidsrž   )r9  Ú_gids_rerå  r  r  r  s         rA   ÚgidszProcess.gidsÙ  r  r@   rL  ©F©r.  )@r<   r=   r>   r‚  ré  r:  rb  rS  rf  ri  rj  rY  r   r|  r  r�  r„  r‡  rv   r‹  r�  r‘  r•  r_   rc   rg  Úgetpidrš  rÛ   rx  r¢  rv  r¯  r¿  ÚHAS_PROC_SMAPSr¶  rç   rè   r½  rÂ  rÑ  rÓ  rØ  rÜ  rã  ræ  ré  ÚHAS_CPU_AFFINITYrë  rï  rö  ÚHAS_PROC_IO_PRIORITYrú  rý  Úhasattrr   r  rq  r  r†  r  rN  r  r  r?   r@   rA   r[  r[  K  sà  „ Ù'ò€Iò.ò"ò Bò3ð (-ó ð  Øñ#ó ó ð#ðJ Øñó ó ðð Øñ$ó ó ð$ò3ò
5ð
 ñ7ó ð7ð ñ
ó ð
ð
 ñó ðð2 ñ)ó ð)ð
 ñó ðð 
‡w�w‡~�~˜˜y˜rŸy™y›{˜m¨3Ð/Ô0à	ñ 	0ó 
ð 	0ðD ñ	
ó ð	
ð ñ7ó ð7ð ò4ó ð4ð ò)ó ð)ð  ñBó ðBñ$ ¡ò	$ð. 
ð #˜Ÿ
™
Ð#;Ó<Ø�B—J‘JÐ2Ó3Ø�R—Z‘ZÐ 4Ó5ò	$ó 
ð	$ð8 
ñ		?ó 
ñ		?ð 'Ðáà	ñE	ó 
ðE	ðN ñ
ó ð
ð
 à"˜Ÿ
™
Ð#<Ó=ò8ó ð8ð Ø*4¨"¯*©*Ð5HÓ*Iò 5ó ð5ð
 ñó ðð4 ñ0ó ð0ð ñ7ó ð7ñ à	ñ	8ó 
ð	8ð !�b—j‘jÐ!DÓEó		9ð 
ñ	ó 
ð	ñ. à	ñ	/ó 
ð	/ð
 
ñ	Bó 
ð	Bñ ˆx˜Ô#à	ò	ó 
ð	ð6 ñ.ó ð.ð ñ-ó ð-ð^ òó ðð
 ñEó ðEð ñ4ó ð4ð Ø&˜BŸJ™JÐ'DÓEò @ó ð@ð
 Ø&˜BŸJ™JÐ'DÓEò @ó ñ@r@   r[  r  r  )ˆr‚  rX  r
  ÚenumrC  rW  rñ   r_   rç   r   r1  rZ  Úsysr¾   r   r   ru  r   r   rÁ   r   r	   rÎ   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Ú__extra__all__r,  rc   rg  r  r   r¿  r#  r"  r!  rä   rÚ   ÚgetpagesizerŸ   Ú	byteorderrV  r+  ri  rÎ  ÚIntEnumrž   Ú	AF_PACKETr6   r7   r9   ÚglobalsrN  Ú__members__ÚSTATUS_RUNNINGÚSTATUS_SLEEPINGÚSTATUS_DISK_SLEEPÚSTATUS_STOPPEDÚSTATUS_TRACING_STOPÚSTATUS_ZOMBIEÚSTATUS_DEADÚSTATUS_WAKE_KILLÚSTATUS_WAKINGÚSTATUS_IDLEÚSTATUS_PARKEDr  r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   ri  r`   rp   rx   r‘   rˆ   Ú	Exceptionr§   r¬   rÉ   rÕ   rÖ   Ú	heap_trimrÛ   rß   rì   rý   r  r  r  Únet_if_addrsr"  r$  r…  r†  rŸ  r³  Ú
disk_usagerÑ  rÓ  ró  r  r  r:  r<  rE  rM  rH  rO  rY  r[  r?   r@   rA   ú<module>r<     s  ðñ
 %ã Û Û Û Û Û Û 	Û 	Û Û Û Û 
Û Ý #Ý "å Ý Ý Ý #Ý Ý $Ý $Ý 'Ý !Ý "Ý "Ý Ý Ý Ý Ý $Ý "Ý Ý +Ý  Ý Ý (Ý 'Ý "Ý "ò	€ð$ .Ð Ø—‘—‘ &¨¨¯©«¨°VÐ <Ó=€ØŸ™Ÿ™¨°	°·	±	³¨}¸MÐ'JÓKÐ Ù˜tÐ%6Ó7Ð Ù˜4Ð!8Ó9Ð ð ˆb�j‰j˜Ó&€Øˆ4×ÑÓ€Ø—‘ Ñ)€Ù‹€ð Ð à�—‘Ø�i¡ V×%5Ñ%5Ó!6Ð7ó€ð ×
Ñ
€ô�—‘ô ñ ƒ	× Ñ �×'Ñ'Ô (ð 
×	Ñ	Ø	×	 Ñ	 Ø	×	"Ñ	"Ø	×	Ñ	Ø	×	$Ñ	$Ø	×	Ñ	Ø	×	Ñ	Ø	×	Ñ	Ø	×	!Ñ	!Ø	×	Ñ	Ø	×	Ñ	Ø	×	Ñ	ñ€ð" ×
"Ñ
"Ø
×
Ñ
Ø
×
Ñ
Ø
×
 Ñ
 Ø
×
 Ñ
 Ø
×
 Ñ
 Ø
×
Ñ
Ø
×
!Ñ
!Ø
×
Ñ
Ø
×
Ñ
Ø
×
Ñ
ñ€ò(ò(
ò$ð& 	ñ+ó 	ð+ð0OÙ% gÓ.€C„Mð �M‰M€	ò<ò~~òB4<ñp ˆ4�ÔØ—‘€IØ—‘€Iò"òò&ò:'òTNò.
ð ‡7�7‡>�>Ð;Ô<ÀÇÁÇÁØ*ôAó#òNLð × Ñ €ô	˜Iô 	÷iñ iñX "Ó#Ð ó+ò
,ò^ðB × Ñ €
óf÷RHñ HóV$òXsòlò>W:ò~ò ò =ò!òBò,÷6R
@ò R
@øðO+ ò Oá	Ð*¨3¨'Ð
2Ô3Ø?‘J˜{Ð,>Ó?ÀÀSÈ#ÓN€C‡M‚MûðOús   ÌP ÐP<Ð!P7Ð7P<