%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /lib/python3/dist-packages/twisted/application/__pycache__/
Upload File :
Create Path :
Current File : //lib/python3/dist-packages/twisted/application/__pycache__/app.cpython-312.pyc

�

Ϫ�fpZ����ddlZddlZddlZddlZddlZddlZddlZddlmZddl	m
Z
mZmZddl
mZmZddlmZmZddlmZddlmZddlmZdd	lmZmZmZmZmZmZdd
l m!Z!m"Z"m#Z#Gd�d�Z$Gd
�de$�Z%Gd�de$�Z&Gd�d�Z'Gd�d�Z(d�Z)d%d�Z*d�Z+d�Z,Gd�d�Z-d�Z.d�Z/Gd�d�Z0Gd�d ejbe0�Z2d!�Z3d"�Z4d#�Z5d$�Z6y)&�N)�
attrgetter)�	copyright�logger�plugin)�reactors�service)�
NoSuchReactor�installReactor)�defer)�_ISupportsExitSignalCapturing)�sob)�failure�log�logfile�runtime�usage�util)�namedAny�namedModule�qualc��eZdZdZd�Zd�Zy)�_BasicProfilerz�
    @ivar saveStats: if C{True}, save the stats information instead of the
        human readable format
    @type saveStats: C{bool}

    @ivar profileOutput: the name of the file use to print profile data.
    @type profileOutput: C{str}
    c� �||_||_y�N)�
profileOutput�	saveStats)�selfrrs   �9/usr/lib/python3/dist-packages/twisted/application/app.py�__init__z_BasicProfiler.__init__%s��*���"���c�2�d|�d|��}|dz
}t|��)z�
        Helper method to report an import error with a profile module. This
        has to be explicit because some of these modules are removed by
        distributions due to them being non-free.
        zFailed to import module �: z�
This is most likely caused by your operating system not including
the module due to it being non-free. Either do not use the option
--profile, or install the module; your operating system vendor
may provide it in a separate package.
)�
SystemExit)r�module�e�ss    r�_reportImportErrorz!_BasicProfiler._reportImportError)s1��'�v�h�b���4��	��	����m�r N)�__name__�
__module__�__qualname__�__doc__rr'�r rrrs���#�
r rc��eZdZdZd�Zy)�
ProfileRunnerz1
    Runner for the standard profile module.
    c�@�	ddl}j�}|j	|j
�|jr|j|j�ytjt|jd�c}t_
	|j�|tjct_
}|j�y#t$r}|jd|�Yd}~��d}~wwxYw#|tjct_
}|j�wxYw)z:
        Run reactor under the standard profiler.
        rN�profile�a)r0�ImportErrorr'�Profile�runcall�runr�
dump_statsr�sys�stdout�open�print_stats�close)r�reactorr0r%�p�tmps      rr5zProfileRunner.run>s���	2��
�O�O���	�	�	�'�+�+���>�>�
�L�L��+�+�,�!�j�j�$�t�/A�/A�3�*G�O�C���
��
�
��"%�s�z�z���
�C��	�	����	2��#�#�I�q�1�1��	2��#&�s�z�z���
�C��	�	��s#�C�
C/�	C,�C'�'C,�/.DN�r(r)r*r+r5r,r rr.r.9s���r r.c��eZdZdZd�Zy)�CProfileRunnerz)
    Runner for the cProfile module.
    c���	ddl}ddl}j	�}|j|j�|jr|j|j�yt|jd�5}j||��}|j�|jd�|j�ddd�y#t$r}|jd|�Yd}~��d}~wwxYw#1swYyxYw)z:
        Run reactor under the cProfile profiler.
        rN�cProfile�w)�stream���)rC�pstatsr2r'r3r4r5rr6rr9�Stats�
strip_dirs�
sort_statsr:)rr<rCrGr%r=rEr&s        rr5zCProfileRunner.runYs���	3���
�����	�	�	�'�+�+���>�>�
�L�L��+�+�,��d�(�(�#�.�
 �&��L�L��6�L�2���������R� ��
�
��	
 �
 ���	3��#�#�J��2�2��	3��
 �
 �s$�C�3AC)�	C&�
C!�!C&�)C2Nr?r,r rrArATs��� r rAc� �eZdZdZeed�Zd�Zy)�AppProfilerz�
    Class which selects a specific profile runner based on configuration
    options.

    @ivar profiler: the name of the selected profiler.
    @type profiler: C{str}
    )r0�cprofilec�X�|jdd�}|jdd�}|jdd�j�|_|j|jvr2|j|j||�}|j|_ytd|j����)N�	savestatsFr0�profilerrMzUnsupported profiler name: )�get�lowerrP�	profilersr5r#)r�optionsrrrPs     rrzAppProfiler.__init__zs����K�K��U�3�	����I�t�4�
����J�
�;�A�A�C��
��=�=�D�N�N�*�4�t�~�~�d�m�m�4�]�I�N�H��|�|�D�H��:�4�=�=�/�J�K�Kr N)r(r)r*r+r.rArSrr,r rrLrLos���*�~�F�I�Lr rLc�2�eZdZdZdZd�Zd�Zd�Zd�Zd�Z	y)�	AppLoggera]
    An L{AppLogger} attaches the configured log observer specified on the
    commandline to a L{ServerOptions} object, a custom L{logger.ILogObserver},
    or a legacy custom {log.ILogObserver}.

    @ivar _logfilename: The name of the file to which to log, if other than the
        default.
    @type _logfilename: C{str}

    @ivar _observerFactory: Callable object that will create a log observer, or
        None.

    @ivar _observer: log observer added at C{start} and removed at C{stop}.
    @type _observer: a callable that implements L{logger.ILogObserver} or
        L{log.ILogObserver}.
    Nc�f�|jdd�|_|jd�xsd|_y)zE
        Initialize an L{AppLogger} with a L{ServerOptions}.
        r�rN)rQ�_logfilename�_observerFactory�rrTs  rrzAppLogger.__init__�s-��$�K�K�	�2�6��� '���H� 5� =���r c���|j�|j�}nB|jtjd�}|� |jtjd�}|�|j�}||_tjj|j�r|jg}n�tjj|j�r!tj|j�g}n<tjdtd��tj|j�g}tjj|�|j�y)a�
        Initialize the global logging system for the given application.

        If a custom logger was specified on the command line it will be used.
        If not, and an L{logger.ILogObserver} or legacy L{log.ILogObserver}
        component has been set on C{application}, then it will be used as the
        log observer. Otherwise a log observer will be created based on the
        command line options for built-in loggers (e.g. C{--logfile}).

        @param application: The application on which to check for an
            L{logger.ILogObserver} or legacy L{log.ILogObserver}.
        @type application: L{twisted.python.components.Componentized}
        NaZPassing a logger factory which makes log observers which do not implement twisted.logger.ILogObserver or twisted.python.log.ILogObserver to twisted.application.app.AppLogger was deprecated in Twisted 16.2. Please use a factory that produces twisted.logger.ILogObserver (or the legacy twisted.python.log.ILogObserver) implementing objects instead.�)�
stacklevel)rZ�getComponentr�ILogObserverr�_getLogObserver�	_observer�
providedBy�LegacyLogObserverWrapper�warnings�warn�DeprecationWarning�globalLogBeginner�beginLoggingTo�_initialLog)r�application�observer�	observerss    r�startzAppLogger.start�s��� � �,��,�,�.�H�"�/�/��0C�0C�T�J�H���&�3�3�C�4D�4D�d�K�����+�+�-�H�!������)�)�$�.�.�9����(�I�
�
�
�
(�
(����
8��8�8����H�I�I��M�M��#��

� �8�8����H�I�I�� � �/�/�	�:����r c�.�ddlm}tj|�j	dt
jtjtj���tj|�j	dt|j���y)z1
        Print twistd start log message.
        r�r<z1twistd {version} ({exe} {pyVersion}) starting up.)�version�exe�	pyVersionzreactor class: {reactor}.N)
�twisted.internetr<r�
_loggerFor�inforrqr7�
executabler�shortPythonVersionr�	__class__)rr<s  rrjzAppLogger._initialLog�st��	-����$��$�$�?��%�%�����0�0�2�		%�	
�	���$��$�$�'��g�6G�6G�1H�	%�	
r c���|jdk(s|jstj}n)tjj|j�}t
j|�S)zr
        Create a log observer to be added to the logging system before running
        this application.
        �-)rYr7r8r�LogFile�fromFullPathr�textFileLogObserver)r�logFiles  rrazAppLogger._getLogObserver�sN��
����#�4�+<�+<��j�j�G��o�o�2�2�4�3D�3D�E�G��)�)�'�2�2r c���tj|�jd�|j�1tjj|j�d|_yy)zS
        Remove all log observers previously set up by L{AppLogger.start}.
        zServer Shut Down.N)rrurvrb�globalLogPublisher�removeObserver�rs r�stopzAppLogger.stop�sL��	���$��$�$�%8�9��>�>�%��%�%�4�4�T�^�^�D�!�D�N�&r )
r(r)r*r+rbrrnrjrar�r,r rrVrV�s(���"�I�>�0�d
� 	3�"r rVc��d�}d�}d�}|tj_|tj_|tj_y)Nc��|j�|j�ddlm}|j	d|j
�y)Nrrp�)�clear_all_breaks�set_continuertr<�	callLaterr�)r�argr<s   r�do_stopzfixPdb.<locals>.do_stop�s4����������,����!�W�\�\�*�r c��td�y)NzEstop - Continue execution, then cleanly shutdown the twisted reactor.)�printr�s r�	help_stopzfixPdb.<locals>.help_stops
��
�V�	
r c�.�tjd�y)Nr)�os�_exitr�s r�set_quitzfixPdb.<locals>.set_quits
��
����r )�pdb�Pdbr�r�r�)r�r�r�s   r�fixPdbr��s6���
�
� �C�G�G���C�G�G�O�!�C�G�G�r c��|�ddlm}	|dr|��|j|�y|dr�|t_|t_tjdk(rJtjtjd��tjtjd��t�tj|j�y|j�yy#t$rnd	}|d
r|}ntdd�}d
}	t!j"|��|j%�|r*|j'�Yy#|r|j'�wwxYwYywxYw)aN
    Start the reactor, using profiling if specified by the configuration, and
    log any error happening in the process.

    @param config: configuration of the twistd application.
    @type config: L{ServerOptions}

    @param oldstdout: initial value of C{sys.stdout}.
    @type oldstdout: C{file}

    @param oldstderr: initial value of C{sys.stderr}.
    @type oldstderr: C{file}

    @param profiler: object used to run the reactor with profiling.
    @type profiler: L{AppProfiler}

    @param reactor: The reactor to use.  If L{None}, the global reactor will
        be used.
    Nrrpr0�debug�posixc�*�tj�Sr�r��	set_trace��argss r�<lambda>z'runReactorWithLogging.<locals>.<lambda>+s��C�M�M�O�r c�*�tj�Srr�r�s rr�z'runReactorWithLogging.<locals>.<lambda>,s��3�=�=�?�r F�nodaemonzTWISTD-CRASH.logr1T��file)rtr<r5r7r8�stderrr�platformType�signal�SIGUSR2�SIGINTr�r�r4�
BaseExceptionr9�	traceback�	print_exc�flushr;)�config�	oldstdout�	oldstderrrPr<r;r�s       r�runReactorWithLoggingr�
s��(��,���)���#����W�%�
�G�_�"�C�J�"�C�J��#�#�w�.��
�
�f�n�n�.K�L��
�
�f�m�m�-J�K��H��K�K����$��K�K�M�$�������*���D��*�C�0�D��E�	����T�*��J�J�L���
�
�����
�
����u��s5�C�B!C�C�!E�9&D3�E�3E�E�
Ec�2�|rtjd�Sy)NzPassphrase: )�getpass��neededs r�
getPassphraser�@s��
����~�.�.�r c�2�|rtjd�Sy)NzEncryption passphrase: )r�getPasswordr�s r�getSavePassphraser�Gs��
���� 9�:�:�r c�<�eZdZdZeZeZd�Zd�Z	d�Z
d�Zd�Zd�Z
y)	�ApplicationRunnera
    An object which helps running an application based on a config object.

    Subclass me and implement preApplication and postApplication
    methods. postApplication generally will want to run the reactor
    after starting the application.

    @ivar config: The config object, which provides a dict-like interface.

    @ivar application: Available in postApplication, but not
       preApplication. This is the application object.

    @ivar profilerFactory: Factory for creating a profiler object, able to
        profile the application if options are set accordingly.

    @ivar profiler: Instance provided by C{profilerFactory}.

    @ivar loggerFactory: Factory for creating object responsible for logging.

    @ivar logger: Instance provided by C{loggerFactory}.
    c�j�||_|j|�|_|j|�|_yr)r��profilerFactoryrP�
loggerFactoryr)rr�s  rrzApplicationRunner.__init__hs-������,�,�V�4��
��(�(��0��r c���|j�|j�|_|jj	|j�|j�|jj
�y)z&
        Run the application.
        N)�preApplication�createOrGetApplicationrkrrn�postApplicationr�r�s rr5zApplicationRunner.runmsU��	
�����6�6�8��������$�*�*�+����������r c��|�ddlm}t|j|||j|�tj|�r|j|_yd|_y)z�
        Run the reactor with the given configuration.  Subclasses should
        probably call this from C{postApplication}.

        @see: L{runReactorWithLogging}
        Nrrp)rtr<r�r�rPrrc�_exitSignal)rr<r�r�s    r�startReactorzApplicationRunner.startReactorysI���?�0��d�k�k�9�i����PW�X�(�3�3�G�<�&�2�2�D��#�D�r c��t��)z�
        Override in subclass.

        This should set up any state necessary before loading and
        running the Application.
        ��NotImplementedErrorr�s rr�z ApplicationRunner.preApplication�s
��"�#�#r c��t��)z�
        Override in subclass.

        This will be called after the application has been loaded (so
        the C{application} attribute will be set). Generally this
        should start the application and run the reactor.
        r�r�s rr�z!ApplicationRunner.postApplication�s
��"�#�#r c��|jjr�|jj|jj}|j|jj�}tj|j�}|j|�|St|jd�}t|j|�}|S)a�
        Create or load an Application based on the parameters found in the
        given L{ServerOptions} instance.

        If a subcommand was used, the L{service.IServiceMaker} that it
        represents will be used to construct a service to be added to
        a newly-created Application.

        Otherwise, an application will be loaded based on parameters in
        the config.
        �	encrypted)r��
subCommand�
loadedPlugins�makeService�
subOptionsr�Application�tapname�setServiceParentr��getApplication)r�plg�serrk�
passphrases     rr�z(ApplicationRunner.createOrGetApplication�s����;�;�!�!��+�+�+�+�D�K�K�,B�,B�C�C��/�/�$�+�+�"8�"8�9�C�!�-�-�c�k�k�:�K�� � ��-���'�t�{�{�;�'?�@�J�(����j�A�K��r N)r(r)r*r+rLr�rVr�rr5r�r�r�r�r,r rr�r�Ns1���,"�O��M�1�

�$� $�$�r r�c�j�dD�cgc]}||s�	|||f��c}d}|dddij|d|d�}}	tjd|z�tj|||�}tjd�|Scc}w#t
$r�}d|z}t
|t�r|jdd	k(r|d
z
}tjtj��tj|�tj�tjd|zdz�Yd}~Sd}~wwxYw)
N)�python�sourcer�rr��pickler�z
Loading %s...zLoaded.zFailed to load application: %srkaN
Could not find 'application' in the file. To use 'twistd -y', your .tac
file must create a suitable object (e.g., by calling service.Application())
and store it in a variable named 'application'. twistd loads your .tac file
and scans the global variables for one of this name.

Please read the 'Using Application' HOWTO for details.
r��
)rQr�msgr�loadApplication�	Exception�
isinstance�KeyErrorr�r�r�r�deferrr7�exit)r�r��tr&�filename�stylerkr%s        rr�r��s��!=�K�A����&��)�Q��K�A�N�A���d�V�X�.�2�2�1�Q�4��1��>�e�H�"�����(�*�+��-�-�h��z�J�����	�� ���+	L���"�,�q�0���a��"�q�v�v�a�y�M�'A�
��
�A�	������-�����
��
�
��������D��!�!����"�s#�
B�	B�AB
�
	D2�BD-�-D2c��tjtj�D�cgc]}|j��c}�Scc}wr)r�CompleteListr�getReactorTypes�	shortName)�rs r�_reactorActionr��s.�����H�4L�4L�4N�O�q�q�{�{�O�P�P��Os�Ac��eZdZdZej
dei��ZejZ
eej�Zd�Zd�ZeZy)�ReactorSelectionMixinz�
    Provides options for selecting a reactor to install.

    If a reactor is installed, the short name which was used to locate it is
    saved as the value for the C{"reactor"} key.
    r<)�
optActionsc	�L�t|j�td���}d}|D]O}	t|j�|j
j
d|jd�d|j�d���Q|rQ|j
j
d�|j
j
d�|j
j
|�td	��#t$rA}|dj|j|j|jd	�z
}Yd
}~��d
}~wwxYw)zE
        Display a list of possibly available reactor names.
        r���keyrXz    z<4�	r�z    !{:<4}	{} ({})
rNz.    reactors not available on this platform:

)
�sorted�_getReactorTypesrr�
moduleName�
messageOutput�writer��descriptionr2�formatr�r#)r�rcts�notWorkingReactorsr�r%s     r�opt_help_reactorsz'ReactorSelectionMixin.opt_help_reactors�s���d�+�+�-�:�k�3J�K�����		�A�
��A�L�L�)��"�"�(�(�4����B�/?�r�!�-�-��PR�)S�T�		�����$�$�T�*����$�$�E�
�
���$�$�%7�8���m����
�"�&=�&D�&D��K�K��M�M��F�F�1�I�'��"��
�s�AC�	D#�"7D�D#c���	t|�||d<y#t$rd|�d�}tj|��t$r }d|�d�}tj|��d}~wwxYw)zX
        Which reactor to use (see --help-reactors for a list of possibilities)
        r<z'The specified reactor does not exist: 'z:'.
See the list of available reactors with --help-reactorsz9The specified reactor cannot be used, failed with error: z9.
See the list of available reactors with --help-reactorsN)r
r	r�
UsageErrorr�)rr�r�r%s    r�opt_reactorz!ReactorSelectionMixin.opt_reactor�sx��	(��9�%� (�D��O���	(�&/�1�
�
�"�"�3�'�'��	(�&'�)�
�
�"�"�3�'�'��
	(�s��,A�A�AN)r(r)r*r+r�Completionsr��compDatar7r8r��staticmethodrr�r�r�r��opt_rr,r rr�r��sK���!�u� � �Y��,G�H�H��J�J�M�#�H�$<�$<�=���2(�8
�Er r�c
��eZdZdZgd�gd�gd�gZgd�gd�gd�dd	d
ddjej�zggd
�gd�gd�gd�gZe	jdge	jd�e	jd�e	jd�e	j�d���Z
eej �Zd�Zd�ZeZd�Zdd�Zd�Zed��Zy	)�
ServerOptionszQtwistd reads a twisted.application.service.Application out of a file and runs it.)rONzBsave the Stats object rather than the text output of the profiler.)�no_save�ozdo not save state on shutdown)r�r%z(The specified tap/aos file is encrypted.)r�lNz%log to a specified file, - for stdout)rNNz�A fully-qualified name to a log observer factory to use for the initial log observer.  Takes precedence over --logfile and --syslog (when available).)r0r=Nz7Run in profile mode, dumping results to specified file.rPNrMz!Name of the profiler to use (%s).z, )r��fz
twistd.tapzread the given .tap file)r��yNz:read an application from within a Python file (implies -o))r�r&Nz2Read an application from a .tas file (AOT format).)�rundir�d�.z-Change to a supplied directory before running)r�r�r�z*.tapz
*.(tac|py)z*.tas)r�r�r�r
)�mutuallyExclusiver�c��d|d<d|vr|d|_ntj|_tjj	|�y)NFr�r8)r8r7r�Optionsr)rr1�kws   rrzServerOptions.__init__Xs:����W�
��r�>��X�,�D�K��*�*�D�K�
�
�
���t�$r c�`�tjd�tj�d|d<y)z�
        Run the application in the Python Debugger (implies nodaemon),
        sending SIGUSR2 will drop into debugger
        Tr�N)r�setDebuggingr�startDebugModer�s r�	opt_debugzServerOptions.opt_debug`s'��
	���4� ���� ���W�
r c��tjtj�	ddl}|jtj�y#t
$rYywxYw)z�
        Print an insanely verbose log of everything that happens.
        Useful when debugging freezes or locks in complex code.
        rN)r7�settracer�spewer�	threadingr2)rrs  r�opt_spewzServerOptions.opt_spewksD��
	���T�[�[�!�	��	���4�;�;�'���	��	�s�A	�		A�Ac�x�|�tjddxsdg}tjj	||�y)Nr�z--help)r7�argvrr�parseOptionsr[s  rrzServerOptions.parseOptionsws1���?��h�h�q�r�l�0�x�j�G�
�
�
�"�"�4��1r c���|js|drd|d<|d�	t|d�|d<yy#t$r-}tjdj|d|���d}~wwxYw)Nr�Trrz%Logger '{}' could not be imported: {})r�rr�rr�r�)rr%s  r�postOptionszServerOptions.postOptions|sx���?�?�d�8�n�"�D��O���>�%�
�!)�$�x�.�!9��X��&���
��&�&�;�B�B�4��>�ST�U����
�s�0�	A&�(A!�!A&c#�K�|jtj�}i|_t	|td���D]:}||j|j<|jd|fd�|jf���<y�w)Nr�r�c�"�|j�Sr)rT)�plugs rr�z+ServerOptions.subCommands.<locals>.<lambda>�s��$�,�,�.�r )�_getPluginsr�
IServiceMakerr�r�rr�r�)r�pluginsr!s   r�subCommandszServerOptions.subCommands�sx�����"�"�7�#8�#8�9������7�
�9�(=�>�
	�D�/3�D���t�|�|�,�����!�0�� � ��
�
	�s�A;A=r)r(r)r*�longdesc�optFlags�joinrLrS�
optParametersrr��
CompleteFiles�CompleteDirsrrr�
getPluginsr"rr�opt_brrr�propertyr%r,r rrrs��	!�
�	
�
	:�F��H�	H�	
�	
�
���/�$�)�)�K�<Q�<Q�2R�R�		
�	@�	
�	T�M�=�M�B!�u� � �7�8�'�E�'�'��0�)�e�)�)�,�7�)�e�)�)�'�2�(�e�(�(�*�	
��H��v�0�0�1�K�%��
�E�
(�2�
	��
��
r rc��|�}	|j�||�y#tj$rG}djtj
dd�}t
|�t
|�d|���Yd}~yd}~wwxYw)N� rr]r")rr�errorr(r7rr�)�runApprr��ue�commstrs     rr5r5�sn��
�_�F������	�v����;�;�"��(�(�3�8�8�A�a�=�)��
�f�
�
��	��B�4� �!�!��"�s�"�A<�=A7�7A<c���tj|||�}tj|�j	|�t|�}|rd}tj|�j
||��y)N)r�r�)rr�r
�IPersistable�setStyler��save)�filein�typeinr��fileout�typeout�encryptrks       r�convertStyler>�s_���)�)�&�&�*�E�K����[�!�*�*�7�3�"�7�+�J�������[�!�&�&��J�&�Or c� �ddlm}tj|�j	�|r3tj|�}|jdd|jd�|jddtj|�j�y)Nrrp�after�shutdown�before)
rtr<r�IService�startServicer
r6�addSystemEventTriggerr8�stopService)rkr8r<r=s    r�startApplicationrG�sm��(����[�!�.�.�0�����[�)���%�%�g�z�1�6�6�:�N��!�!��*�g�.�.�{�;�G�G�r c��tj|tj�tjtj�|�y)a
    Force the application to terminate with the specified signal by replacing
    the signal handler with the default and sending the signal to ourselves.

    @param sig:  Signal to use to terminate the process with C{os.kill}.
    @type sig:  C{int}
    N)r��SIG_DFLr��kill�getpid)�sigs r�_exitWithSignalrM�s*���M�M�#�v�~�~�&��G�G�B�I�I�K��r )NN)7r�r�r�r�r7r�re�operatorr�twistedrrr�twisted.applicationrr�twisted.application.reactorsr	r
rtr�twisted.internet.interfacesr�twisted.persistedr
�twisted.pythonrrrrrr�twisted.python.reflectrrrrr.rArLrVr�r�r�r�r�r�r�r�rrr5r>rGrMr,r r�<module>rVs����	�
�
�
����-�-�1�G�"�E�!�F�F�>�>���<�N��6 �^� �6L�L�,o"�o"�d"�,0�f��h�h�V�2Q�B�B�Jz�E�M�M�#8�z�z	�P�	�	r 

Zerion Mini Shell 1.0