Viewing File: /opt/hc_python/lib/python3.12/site-packages/psutil/__pycache__/_pssunos.cpython-312.pyc

�

`�*j~]����dZddlZddlZddlZddlZddlZddlZddlmZddlm	Z	ddl
mZddl
mZ
ddl
mZdd	l
mZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZgd�Zej<�Zej@Z ejBdkDZ"dZ#dZ$ejJejLejNejPejRejTejVejXejZej\ej^ejPej`ejbiZ2ejfejhejjejlejnejpejrejtejvejxejzej|ej~ej�ej�ej�ej�ej�ej�ej�ej�ej�ej�ej�ej�e#ej�e$iZMeNddddddddd d!d"d#�$�ZOd%�ZPd&�ZQd'�ZRd(�ZSd)�ZTd*�ZUd+�ZVej�ZWej�ZXd6d,�ZYej�ZZej�Z[d7d-�Z\d.�Z]d/�Z^d0�Z_d1�Z`d2�Zad3�ZbGd4�d5�Zcy)8z'Sun OS Solaris platform implementation.�N)�
namedtuple)�AF_INET�)�_common)�_ntuples)�_psposix)�
_psutil_sunos)�AF_INET6)�ENCODING)�AccessDenied)�
NoSuchProcess)�
ZombieProcess)�debug)�get_procfs_path)�
isfile_strict)�memoize_when_activated)�sockfam_to_enum)�socktype_to_enum)�
usage_percent)�	CONN_IDLE�
CONN_BOUND�PROCFS_PATHl�IDLE�BOUND��������	�
�)�ppid�rss�vms�create_time�nice�num_threads�status�ttynr�uid�euid�gid�egidc���tjd�tz}tjd�tzx}}||z
}t||d��}t	j
|||||�S)zReport virtual memory metrics.�
SC_PHYS_PAGES�SC_AVPHYS_PAGESr��round_)�os�sysconf�	PAGE_SIZEr�ntp�svmem)�total�free�avail�used�percents     �@/opt/hc_python/lib64/python3.12/site-packages/psutil/_pssunos.py�virtual_memoryrA`s^��
�J�J��'�)�3�E��:�:�/�0�9�<�<�D�5��4�<�D��D�%��2�G��9�9�U�E�7�D�$�7�7�c	��tj�\}}tjddtj
d��ddgtj��}|j�\}}|jtjj�}|jdk7rd|j�d	�}t|��|j�jd
�dd}|s
d
}t|��dx}}|D]N}	|	j�}	|	dd\}
}|t!t!|
�dz�z
}|t!t!|�dz�z
}�P||z
}t#||d��}
t%j&||||
|t(z|t(z�S)zReport swap memory metrics.z/usr/bin/envzPATH=/usr/sbin:/sbin:�PATH�swapz-l)�stdoutrz'swap -l' failed (retcode=�)�
rNzno swap device(s) configuredrrir4)�cext�swap_mem�
subprocess�Popenr6�environ�PIPE�communicate�decode�sysrF�encoding�
returncode�RuntimeError�strip�split�intrr9�sswapr8)�sin�sout�prF�_�msg�linesr;r<�line�t�fr>r?s              r@�swap_memoryrbksl���
�
��I�C��	����#�B�J�J�v�$6�#7�8���		
����	�A��
�
��I�F�A�
�]�]�3�:�:�.�.�
/�F��|�|�q��*�1�<�<�.��:���3����L�L�N� � ��&�q�r�*�E��,���3�����E�D����z�z�|���A�a�y���1�
��S��V�c�\�"�"����C��F�S�L�!�!��	�
�4�<�D��D�%��2�G��9�9�
�t�T�7�C�)�O�T�I�5E��rBc��tj�}tjt	|�D�cgc]
}t|���c}�Scc}w)z.Return system-wide CPU times as a named tuple.)rI�
per_cpu_timesr9�	scputimes�zip�sum��ret�xs  r@�	cpu_timesrk�s9��
�
�
�
�C��=�=�3��9�5�9�a�3�q�6�9�5�6�6��5s�Ac�t�tj�}|D�cgc]}tj|���c}Scc}w)z6Return system per-CPU times as a list of named tuples.)rIrdr9rerhs  r@rdrd�s1��
�
�
�
�C�'*�+�s�!�C�M�M�1��s�+�+��+s�5c�L�	tjd�S#t$rYywxYw)z0Return the number of logical CPUs in the system.�SC_NPROCESSORS_ONLNN)r6r7�
ValueError�rBr@�cpu_count_logicalrq�s)����z�z�/�0�0������s��	#�#c�*�tj�S)z-Return the number of CPU cores in the system.)rI�cpu_count_coresrprBr@rsrs�s�����!�!rBc�h�tj�\}}}}d}tj||||�S)z*Return various CPU stats as a named tuple.r)rI�	cpu_statsr9�	scpustats)�ctx_switches�
interrupts�syscalls�_traps�soft_interruptss     r@ruru�s1��15���1A�.�L�*�h���O��=�=��z�?�H�M�MrBc�0�g}tj�}|D]S}|\}}}}|dk(rd}|s	t|�js�*	t
j||||�}	|j|	��U|S#t$r}td|�d|���Yd}~�wd}~wwxYw)zReturn system disk partitions.�none�z	skipping z: N)	rI�disk_partitions�
disk_usager;�OSErrorrr9�	sdiskpart�append)
�all�retlist�
partitions�	partition�device�
mountpoint�fstype�opts�err�ntuples
          r@rr�s����G��%�%�'�J��	�+4�(��
�F�D��V���F��
�!�*�-�3�3��4����v�z�6�4�@�����v��! �"�N��
�
��	�*��r�#��7�8���
�s�A1�1	B�:B�Bc
��tj|\}}tj|�}t	�}|D]�}|\}}}	}
}}}
||vr�|	|vr�|t
thvr(|
rtj|
�}
|rtj|�}t|}t|�}t|	�}	|dk(rtj|||	|
|||
�}ntj|||	|
||�}|j|���t|�S)z�Return socket connections.  If pid == -1 return system-wide
    connections (as opposed to connections opened by one process only).
    Only INET sockets are returned (UNIX are not).
    ���)r�	conn_tmaprI�net_connections�setrr
r9�addr�TCP_STATUSESrr�sconn�pconn�add�list)�kind�_pid�families�types�rawlistri�item�fd�fam�type_�laddr�raddrr+�pid�nts               r@r�r��s��
�'�'��-�O�H�e��"�"�4�(�G�

�%�C���48�1��C���u�f�c��h��������7�H�%�%�����%�(������%�(���f�%���c�"�� ��'���2�:����2�s�E�5�%���E�B����2�s�E�5�%��@�B������'�(��9�rBc���tj�}|j�D]M\}}|\}}}}ttd�rt	j
|�}t
j||||d�||<�O|S)z)Get NIC stats (isup, duplex, speed, mtu).�	NicDuplexr~)rI�net_if_stats�items�hasattrrr�r9�	snicstats)ri�namer��isup�duplex�speed�mtus       r@r�r�sm��
�
�
�
�C��y�y�{���e�#(� ��f�e�S��7�K�(��&�&�v�.�F��M�M�$���s�B�?��D�	�	#�
�JrBc�*�tj�S)z:The system boot time expressed in seconds since the epoch.)rI�	boot_timerprBr@r�r�s���>�>��rBc��g}tj�}d}|D]>}|\}}}}}}	|s�||vrd}tj|||||	�}
|j	|
��@|S)z:Return currently connected users as a list of namedtuples.)z:0.0z:0�	localhost)rI�usersr9�suserr�)r�r�r�r��user�tty�hostname�tstamp�user_processr�r�s           r@r�r�sq���G��j�j�l�G��I���9=�6��c�8�V�\�3����y� �"�H�
�Y�Y�t�S�(�F�C�
8�����r����NrBc��t�jt�}tj|�D�cgc]}|j�s�t
|��� c}Scc}w)z7Returns a list of PIDs currently running on the system.)r�encoderr6�listdir�isdigitrW)�pathrjs  r@�pidsr�2sD����#�#�H�-�D��J�J�t�,�<�,�q��	�	��C��F�,�<�<��<s�A�
Ac�,�tj|�S)z&Check for the existence of a unix pid.)r�
pid_exists)r�s r@r�r�8s�����s�#�#rBc�B��tj���fd��}|S)z�Call callable into a try/except clause and translate ENOENT,
    EACCES and EPERM in NoSuchProcess or AccessDenied exceptions.
    c�j��|j|j|j}}}	�|g|��i|��S#ttf$r+}t|�s
t
||�|�t|||�|�d}~wt$r}t||�|�d}~wt$r%}|dk(rdt�vr
t||�|���d}~wwxYw�Nr)r��_ppid�_name�FileNotFoundError�ProcessLookupErrorr�r
r�PermissionErrorrr�r�)�self�args�kwargsr�r%r�r��funs       �r@�wrapperz wrap_exceptions.<locals>.wrapperBs�����(�(�D�J�J��
�
�4�T��	��t�-�d�-�f�-�-��!�#5�6�	:��c�?�#�C��.�C�7���T�4�0�c�9���	3��s�D�)�s�2���	��a�x����;�&�s�D�1�s�:����	�s-�3�B2�&A(�(B2�4
B�B2�
 B-�-B2)�	functools�wraps)r�r�s` r@�wrap_exceptionsr�=s'���
�_�_�S�����(�NrBc�0�eZdZdZgd�Zd�Zd�Zd�Zd�Ze	e
d���Ze	e
d���Ze	e
d	���Z
e	d
��Ze	d��Ze	d��Ze	d
��Ze	d��Ze	d��Ze	d��Ze	d��Ze	d��Ze	d��Ze	d��Ze	d��Ze	d��Ze	d��Ze	d��Ze	d��ZeZe	d��Ze	d��Z e	d��Z!d�Z"e	d'd��Z#e$dd �Z%e$dd!�Z&e	d"��Z'e	d#��Z(e	d$��Z)e	d(d&��Z*y%))�Processz1Wrapper class around underlying C implementation.)�_cacher�r��_procfs_pathr�c�L�||_d|_d|_t�|_y�N)r�r�r�rr�)r�r�s  r@�__init__zProcess.__init___s"�������
���
�+�-��rBc�`�tj|j�d|j���y)z+Raise NSP if the process disappeared on us.�/N)r6�statr�r��r�s r@�
_assert_alivezProcess._assert_alivees&��	���4�$�$�%�Q�t�x�x�j�1�2rBc��|jj|�|jj|�|jj|�yr�)�_proc_name_and_args�cache_activate�_proc_basic_info�
_proc_credr�s r@�
oneshot_enterzProcess.oneshot_enterks<��� � �/�/��5����,�,�T�2����&�&�t�,rBc��|jj|�|jj|�|jj|�yr�)r��cache_deactivater�r�r�s r@�oneshot_exitzProcess.oneshot_exitps<��� � �1�1�$�7����.�.�t�4����(�(��.rBc�V�tj|j|j�Sr�)rI�proc_name_and_argsr�r�r�s r@r�zProcess._proc_name_and_argsus!���&�&�t�x�x��1B�1B�C�CrBc�N�|jdk(rNtjj|j�d|j�d��st|j��t
j|j|j�}t|�tt�k(sJ�|S)Nrr�z/psinfo)
r�r6r��existsr�rrI�proc_basic_info�len�
proc_info_map)r�ris  r@r�zProcess._proc_basic_infozs����8�8�q�=������� � �!��4�8�8�*�G�4�"
��t�x�x�(�(��"�"�4�8�8�T�->�->�?���3�x�3�}�-�-�-�-��
rBc�V�tj|j|j�Sr�)rI�	proc_credr�r�r�s r@r�zProcess._proc_cred�s���~�~�d�h�h��(9�(9�:�:rBc�(�|j�dSr��r�r�s r@r�zProcess.name�s���'�'�)�!�,�,rBc��	tj|j�d|j�d��S#t$rYnwxYw|j�y)Nr�z/path/a.outr~)r6�readlinkr�r�r��cmdliner�s r@�exezProcess.exe�sN��	��;�;�$�"3�"3�!4�A�d�h�h�Z�{�K�L�L���	��	��
	
����s�.1�	=�=c�(�|j�dS)Nrr�r�s r@r�zProcess.cmdline�s���'�'�)�!�,�,rBc�V�tj|j|j�Sr�)rI�proc_environr�r�r�s r@rMzProcess.environ����� � ����4�+<�+<�=�=rBc�6�|j�tdS)Nr(�r�r�r�s r@r(zProcess.create_time�����$�$�&�}�]�'C�D�DrBc�6�|j�tdS)Nr*r�r�s r@r*zProcess.num_threads�r�rBc�6�|j�tdS)Nr)r�r�s r@�nice_getzProcess.nice_get�s��
�$�$�&�}�V�'<�=�=rBc��|jdvr t|j|j��tj|j|�S)N>rr)r�rr�rI�proc_priority_set)r��values  r@�nice_setzProcess.nice_set�s<���8�8�v��
�t�x�x����4�4��%�%�d�h�h��6�6rBc�X�|j�td|_|jS)Nr%)r�r�r�r�s r@r%zProcess.ppid�s&���*�*�,�]�6�-B�C��
��z�z�rBc���	|j�\}}}}}}t	j
|||�S#t$r9|j�td}|j�td}d}Y�XwxYw)Nr-r.�r�rr�r�r9�puids)r��real�	effective�savedr\s     r@�uidszProcess.uids�s{��	�.2�o�o�.?�+�D�)�U�A�q�!�
�y�y��y�%�0�0��	�	��(�(�*�=��+?�@�D��-�-�/�
�f�0E�F�I��E�	���0�?A2�1A2c���	|j�\}}}}}}t	j
|||�S#t$r9|j�td}|j�td}d}Y�XwxYw)Nr/r0r)r�r\r
rrs     r@�gidszProcess.gids�s{��	�.2�o�o�.?�+�A�q�!�T�9�e�
�y�y��y�%�0�0��	�	��(�(�*�=��+?�@�D��-�-�/�
�f�0E�F�I��E�	�rc��	tj|j|j�}tj|�S#t$r1}|j
t
jk(r	tsd}n�Yd}~�Gd}~wwxYw)N)�rrr)
rI�proc_cpu_timesr�r�r��errno�	EOVERFLOW�	IS_64_BITr9�	pcputimes)r��timesr�s   r@rkzProcess.cpu_times�sg��
	��'�'����$�2C�2C�D�E��}�}�e�$�$���	��y�y�E�O�O�+�I�-�����	�s�*>�	A8�'A3�3A8c�V�tj|j|j�Sr�)rI�proc_cpu_numr�r�r�s r@�cpu_numzProcess.cpu_num�r�rBc�4�|j}d}t|j�td�}|tj
k7r0dD]+}	t
j|�d|j�d|���cS|r|j�yy#t$rd}Y�OwxYw)NFr,)rrr�r��/path/T)r�r�r�r�rI�PRNODEVr6r�r�r�r�)r��procfs_path�
hit_enoentr�rjs     r@�terminalzProcess.terminal�s����'�'���
��d�3�3�5�m�G�6L�M�N���$�,�,��#����;�;�+��a����z���s�'K�L�L�$����� ���)��!%�J���s�&B	�	B�Bc���|j}	tj|�d|j�d��S#t$r'tj
|�d|j���YywxYw)Nr�z	/path/cwdr~)r�r6r�r�r�r�)r�r s  r@�cwdzProcess.cwd�sa���'�'��	��;�;�+��a����z��C�D�D�� �	��G�G�{�m�1�T�X�X�J�/�0��	�s�$3�-A#�"A#c��|j�}|tddz}|tddz}tj||�S)Nr&ir')r�r�r9�pmem)r�rir&r's    r@�memory_infozProcess.memory_infosI���#�#�%���-��&�'�$�.���-��&�'�$�.���x�x��S�!�!rBc�b�|j�td}tj|d�S)Nr+�?)r�r��
PROC_STATUSES�get)r��codes  r@r+zProcess.statuss-���$�$�&�}�X�'>�?��� � ��s�+�+rBc��|j}g}tj|�d|j�d��}d}|D]Z}t	|�}	tj|j||�\}}tj|||�}|j|��\|r|j�|S#t$rR}	|	jtjk(rtsYd}	~	��|	jtjk(rd}Yd}	~	�Ƃd}	~	wwxYw)Nr�z/lwpFT)r�r6r�r�rWrI�query_process_threadr9�pthreadr�r�rrr�ENOENTr�)
r�r ri�tidsr!�tid�utime�stimer�r�s
          r@�threadszProcess.threadss����'�'�����z�z�[�M��4�8�8�*�D�9�:���
��C��c�(�C�
�#�8�8��H�H�c�;� ���u�&�[�[��e�U�3���
�
�2��/�0���� ��
��)�
��9�9����/�	���9�9����,�!%�J����
�s$�$B)�)	D�2#C?�C?�>C?�?Dc	��g}d}|j}|�d|j�d�}tj|�d|j�d��D]�}tjj||�}tjj
|�s�C	tj|�}t|�s�e|jtj|t|�����|r|j�|S#t$rd}Y��wxYw)NFr�z/path�/fdT)r�r�r6r�r��join�islinkr�rr�r9�	popenfilerWr�r�)r�r�r!r �pathdirr�r��files        r@�
open_fileszProcess.open_files8s������
��'�'�� �M��4�8�8�*�E�2���*�*��}�A�d�h�h�Z�s�;�<�B��7�7�<�<���,�D��w�w�~�~�d�#�E��;�;�t�,�D�
%�T�*����s�}�}�T�3�r�7�'C�D�=����� ����)��!%�J���s�C1�1C?�>C?c#�jK�dt|�g}tj|tjtj��}|j	�\}}d�||fD�\}}|j
dk7rvd|j
�vr t|j|j��d|j
�vr t|j|j��|�d|��}t|��|jd�d	d
}t|�D]�\}}	|	j�}	|	jd�s�(|	jdd	�d	}
||d	z
j!�}|d
k(rt"j$}n|dk(rt"j&}nd}dt"j(||
dt*j,f����y
�w)z<Get UNIX sockets used by process by parsing 'pfiles' output.�pfiles)rF�stderrc3�nK�|]-}|jtjj����/y�wr�)rPrQrFrR)�.0rjs  r@�	<genexpr>z,Process._get_unix_sockets.<locals>.<genexpr>Vs(����
�3C�a�A�H�H�S�Z�Z�(�(�)�3C�s�35rzpermission deniedzno such processz command error
rHrNzsockname: AF_UNIX� �SOCK_STREAM�
SOCK_DGRAMr�r~)�strrKrLrNrOrS�lowerrr�r�r
rTrV�	enumerate�lstrip�
startswithrU�socketrErF�AF_UNIXr�	CONN_NONE)r�r��cmdr[rFr@r]r^�ir_r��types            r@�_get_unix_socketszProcess._get_unix_socketsMs�������S��"������
���
���
���������
�4:�F�3C�
����
�<�<�1��"�f�l�l�n�4�"�4�8�8�T�Z�Z�8�8� �F�L�L�N�2�#�D�H�H�d�j�j�9�9��G�+�F�8�4�C��s�#�#����T�"�1�2�&�� ��'�G�A�t��;�;�=�D����2�3��z�z�#�q�)�!�,���Q��U�|�)�)�+���=�(�!�-�-�D��\�)�!�,�,�D��D��6�>�>�4��r�7�;L�;L�M�M�(�s
�D.F3�1BF3c�6�t||j��}|s.tj|j�d|j���|dvrH|j|j
|j�D�cgc]}tj|���c}�|Scc}w)N)r�r�>r��unix)	r�r�r6r�r��extendrRr9r�)r�r�ri�conns    r@r�zProcess.net_connectionsos����d����2����G�G�t�(�(�)��4�8�8�*�5�6��?�"��J�J�.2�.D�.D�T�X�X�.N�O�.N�d����D�!�.N�O�
��
��Ps�4B�mmapzpath rss anon lockedzaddr perms path rss anon lockedc	�t�d�}|j}g}	tj|j|�}d}|D]e}|\}}	}
}}}
}|||	�}|jd�s(	tj|�d|j�d|���}|j||
|||
|f��g|r|j�|S#t$r0}|j
t
jk(r
tsgcYd}~S�d}~wwxYw#t$r?}|j
t
jk(r|�d|j�d|��}d}n�Yd}~��d}~wwxYw)Nc��djt|�ddjd�t|�ddjd��S)Nz{}-{}r�L)�format�hexrU)�start�ends  r@�toaddrz#Process.memory_maps.<locals>.toaddr�sB���>�>��E�
�1�2��$�$�S�)�3�s�8�A�B�<�+=�+=�c�+B��
rBF�[r�rT)r�rI�proc_memory_mapsr�r�rrrrKr6r�r0r�r�)r�r_r r�r�r�r!r�r��addrsize�permr�r&�anon�lockeds               r@�memory_mapszProcess.memory_maps�sC��	�
�'�'����
	��+�+�D�H�H�k�B�G��
��D�<@�9�D�(�D�$��T�6��$��)�D��?�?�3�'�
��;�;�+��a����z���v�'N�O�D�
�N�N�D�$��c�4��@�A�%�&���� ����E�	��y�y�E�O�O�+�I��	���	��&���y�y�E�L�L�0�#.��a����z���v�F��%)�
��#���s;� B3�'C/�3	C,�<$C'� C,�&C'�'C,�/	D7�85D2�2D7c�r�ttj|j�d|j�d���S)Nr�r7)r�r6r�r�r�r�s r@�num_fdszProcess.num_fds�s.���2�:�:��!2�!2� 3�1�T�X�X�J�c�B�C�D�DrBc�v�tjtj|j|j
��Sr�)r9�pctxswrI�proc_num_ctx_switchesr�r�r�s r@�num_ctx_switcheszProcess.num_ctx_switches�s-���z�z�
�
'�
'����$�2C�2C�
D�
�	
rBNc�B�tj|j|�Sr�)r�wait_pidr�)r��timeouts  r@�waitzProcess.wait�s��� � ����7�3�3rB)�inetr�)+�__name__�
__module__�__qualname__�__doc__�	__slots__r�r�r�r�r�rr�r�r�r�r�r�rMr(r*rrr%r
rrkrr"r$r'�memory_full_infor+r5r=rRr�r�nt_mmap_grouped�nt_mmap_extrfrhrlrprprBr@r�r�Zs���;�C�I�.�3�-�
/�
��D���D���������;���;��-��-��	��	��-��-��>��>��E��E��E��E��>��>��7��7������1��1��1��1��%��%�"�>��>��!��!��
��
��"��"�#���,��,�
����B����( N�D����$!��)?�@�O��V�%F�G�K��,��,�\�E��E��
��
�
�4��4rBr�)F)r�)drurr�r6rLrKrQ�collectionsrrr~rrr9rr	rIr
rrr
rrrrrrrr�__extra__all__�getpagesizer8�AF_LINK�maxsizerrr�SSLEEP�STATUS_SLEEPING�SRUN�STATUS_RUNNING�SZOMB�
STATUS_ZOMBIE�SSTOP�STATUS_STOPPED�SIDL�STATUS_IDLE�SONPROC�SWAIT�STATUS_WAITINGr*�TCPS_ESTABLISHED�CONN_ESTABLISHED�
TCPS_SYN_SENT�
CONN_SYN_SENT�
TCPS_SYN_RCVD�
CONN_SYN_RECV�TCPS_FIN_WAIT_1�CONN_FIN_WAIT1�TCPS_FIN_WAIT_2�CONN_FIN_WAIT2�TCPS_TIME_WAIT�CONN_TIME_WAIT�TCPS_CLOSED�
CONN_CLOSE�TCPS_CLOSE_WAIT�CONN_CLOSE_WAIT�
TCPS_LAST_ACK�
CONN_LAST_ACK�TCPS_LISTEN�CONN_LISTEN�TCPS_CLOSING�CONN_CLOSING�PSUTIL_CONN_NONErN�	TCPS_IDLE�
TCPS_BOUNDr��dictr�rArbrkrdrqrsru�disk_io_countersr�r�net_io_counters�net_if_addrsr�r�r�r�r�r�r�r�rprBr@�<module>r�s���
.���	�
��
�"�����#���!�"�"��$�"�+�$�%�"�;��
�D����	�
�,�,���K�K�%��	��	�
�
�	�K�K��(�(��I�I�w�%�%��J�J��%�%��J�J��&�&��I�I�w�"�"��L�L�'�(�(��J�J��&�&��
�	���7�3�3�����-�-�����-�-����'�0�0����'�0�0�����/�/����g�(�(����'�1�1�����-�-����g�)�)����w�+�+����7�,�,��N�N�I��O�O�Z���"�	
�	�	��	
���
�	�	
�
�	�
�
�*8�&�\7�,��"�
N��(�(��
�
 �
 �
��>�&�&��� � ���>� �
�0=�$�
�:f4�f4rB
Back to Directory File Manager