Ë
    £ehºM  ã                   ó¾  — d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlZd dlm	Z	 ej                  ZddddœZ G d„ d	ej                  «      Zd
„ Zdd„Z G d„ de«      Z G d„ dej&                  «      Z G d„ dej*                  «      Z G d„ de«      Zefd„Zefd„Zedk(  r<d dlZ e j:                   ej<                  ej>                  ¬«      j@                  «       yy)é    N©Úwraps)ÚMappingÚCallable)ÚPercentStylez%(levelname)s: %(message)sz%(message)s)Ú*ÚINFOÚDEBUGc                   ó.   ‡ — e Zd ZdZdˆ fd„	Zˆ fd„Zˆ xZS )ÚLevelFormatteraí  Log formatter with level-specific formatting.

    Formatter class which optionally takes a dict of logging levels to
    format strings, allowing to customise the log records appearance for
    specific levels.


    Attributes:
            fmt: A dictionary mapping logging levels to format strings.
                    The ``*`` key identifies the default format string.
            datefmt: As per py:class:`logging.Formatter`
            style: As per py:class:`logging.Formatter`

    >>> import sys
    >>> handler = logging.StreamHandler(sys.stdout)
    >>> formatter = LevelFormatter(
    ...     fmt={
    ...         '*':     '[%(levelname)s] %(message)s',
    ...         'DEBUG': '%(name)s [%(levelname)s] %(message)s',
    ...         'INFO':  '%(message)s',
    ...     })
    >>> handler.setFormatter(formatter)
    >>> log = logging.getLogger('test')
    >>> log.setLevel(logging.DEBUG)
    >>> log.addHandler(handler)
    >>> log.debug('this uses a custom format string')
    test [DEBUG] this uses a custom format string
    >>> log.info('this also uses a custom format string')
    this also uses a custom format string
    >>> log.warning("this one uses the default format string")
    [WARNING] this one uses the default format string
    c                 ó¨  •— |dk7  rt        d«      ‚|€t        }t        |t        «      r|}i }n<t        |t        «      rt        |«      }|j                  dd «      }nt        d|z  «      ‚t        t        | �+  ||«       | j                  | _        i | _        |j                  «       D ])  \  }}t        j                   |«      }|| j                  |<   Œ+ y )Nú%z:only '%' percent style is supported in both python 2 and 3r   z&fmt must be a str or a dict of str: %r)Ú
ValueErrorÚDEFAULT_FORMATSÚ
isinstanceÚstrr   ÚdictÚpopÚ	TypeErrorÚsuperr   Ú__init__Ú_fmtÚdefault_formatÚcustom_formatsÚitemsÚloggingÚ_checkLevel)ÚselfÚfmtÚdatefmtÚstyler   r   ÚlevelÚ	__class__s          €úY/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/fontTools/misc/loggingTools.pyr   zLevelFormatter.__init__8   sÑ   ø€ Ø�CŠ<ÜØLóð ð ˆ;Ü!ˆCÜ�cœ3ÔØ ˆNØ‰NÜ˜œWÔ%Ü! #›YˆNØ+×/Ñ/°°TÓ:‰NäÐDÀsÑJÓKÐKÜŒn˜dÑ,¨^¸WÔEØ"Ÿi™iˆÔØ ˆÔØ(×.Ñ.Ó0ò 	-‰JˆE�3Ü×'Ñ'¨Ó.ˆEØ),ˆD×Ñ Ò&ñ	-ó    c                 óú   •— | j                   r\| j                   j                  |j                  | j                  «      }| j                  |k7  r|| _        t
        rt        |«      | _        t        t        | �'  |«      S ©N)
r   ÚgetÚlevelnor   r   r   Ú_styler   r   Úformat)r   Úrecordr   r#   s      €r$   r+   zLevelFormatter.formatN   sb   ø€ Ø×ÒØ×%Ñ%×)Ñ)¨&¯.©.¸$×:MÑ:MÓNˆCØ�y‰y˜CÒØ�”	åÜ".¨sÓ"3�D”KÜ”^ TÑ1°&Ó9Ð9r%   )NNr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r+   Ú__classcell__©r#   s   @r$   r   r      s   ø„ ñõB-÷,:ð :r%   r   c                  ó8  — | j                  dd«      }|€d| v r"d| v rt        d«      ‚d| v sd| v rt        d«      ‚|€g| j                  dd«      }| j                  dd«      }|rt        j                  ||«      }n'| j                  dd«      }t        j                  |«      }|g}| j                  d	d
«      }|rt        |t        «      rt        j                  |«      }t        |j                  ¬«       | j                  dd«      }| j                  dd«      }| j                  dd«      }	t        |||	«      }
| j                  dg «      }|D ]T  }|j                  €|j                  |
«       |j                  s|D ]  }|j                  |«       Œ |j                  |«       ŒV |j                  dk7  r| j                  dd«      |_        | j                  dd«      }|�|j#                  |«       | r-dj%                  | j'                  «       «      }t        d|z  «      ‚y)a–
  A more sophisticated logging system configuation manager.

    This is more or less the same as :py:func:`logging.basicConfig`,
    with some additional options and defaults.

    The default behaviour is to create a ``StreamHandler`` which writes to
    sys.stderr, set a formatter using the ``DEFAULT_FORMATS`` strings, and add
    the handler to the top-level library logger ("fontTools").

    A number of optional keyword arguments may be specified, which can alter
    the default behaviour.

    Args:

            logger: Specifies the logger name or a Logger instance to be
                    configured. (Defaults to "fontTools" logger). Unlike ``basicConfig``,
                    this function can be called multiple times to reconfigure a logger.
                    If the logger or any of its children already exists before the call is
                    made, they will be reset before the new configuration is applied.
            filename: Specifies that a ``FileHandler`` be created, using the
                    specified filename, rather than a ``StreamHandler``.
            filemode: Specifies the mode to open the file, if filename is
                    specified. (If filemode is unspecified, it defaults to ``a``).
            format: Use the specified format string for the handler. This
                    argument also accepts a dictionary of format strings keyed by
                    level name, to allow customising the records appearance for
                    specific levels. The special ``'*'`` key is for 'any other' level.
            datefmt: Use the specified date/time format.
            level: Set the logger level to the specified level.
            stream: Use the specified stream to initialize the StreamHandler. Note
                    that this argument is incompatible with ``filename`` - if both
                    are present, ``stream`` is ignored.
            handlers: If specified, this should be an iterable of already created
                    handlers, which will be added to the logger. Any handler in the
                    list which does not have a formatter assigned will be assigned the
                    formatter created in this function.
            filters: If specified, this should be an iterable of already created
                    filters. If the ``handlers`` do not already have filters assigned,
                    these filters will be added to them.
            propagate: All loggers have a ``propagate`` attribute which determines
                    whether to continue searching for handlers up the logging hierarchy.
                    If not provided, the "propagate" attribute will be set to ``False``.
    ÚhandlersNÚstreamÚfilenamez8'stream' and 'filename' should not be specified togetherzG'stream' or 'filename' should not be specified together with 'handlers'ÚfilemodeÚaÚloggerÚ	fontTools)Úparentr+   r    r!   r   ÚfiltersÚrootÚ	propagateFr"   z, zUnrecognised argument(s): %s)r   r   r   ÚFileHandlerÚStreamHandlerr   r   Ú	getLoggerÚ_resetExistingLoggersÚnamer   Ú	formatterÚsetFormatterr<   Ú	addFilterÚ
addHandlerr>   ÚsetLevelÚjoinÚkeys)Úkwargsr4   r6   ÚmodeÚhr5   r9   ÚfsÚdfsr!   r   r<   Úfr"   rJ   s                  r$   ÚconfigLoggerrQ   Y   s  € ðZ �z‰z˜* dÓ+€HØÐØ�vÑ *°Ñ"6ÜØMóð ð �vÑ ¨vÑ!5Üð5óð ð ÐØ—:‘:˜j¨$Ó/ˆØ�z‰z˜* cÓ*ˆÙÜ×#Ñ# H¨dÓ3‰Aà—Z‘Z ¨$Ó/ˆFÜ×%Ñ% fÓ-ˆAØ�3ˆà�Z‰Z˜ +Ó.€FÙ”Z ¬Ô,ä×"Ñ" 6Ó*ˆä §¡Õ-à	�‰�H˜dÓ	#€BØ
�*‰*�Y Ó
%€Cà�J‰J�w Ó$€EÜ
˜˜S %Ó
(€CØ�j‰j˜ BÓ'€GØò ˆØ�;‰;ÐØ�N‰N˜3ÔØ�yŠyØò �Ø—‘˜A•ðà×Ñ˜!Õðð ‡{�{�fÒà!Ÿ:™: k°5Ó9ˆÔà�J‰J�w Ó%€EØÐØ�‰˜ÔÙØ�y‰y˜Ÿ™›Ó'ˆÜÐ7¸$Ñ>Ó?Ð?ð r%   c                 óø  — t         j                  }t        |j                  j                  j                  «       «      }| dk(  r| g|z   }nj| |vry| |v ra| g}|j                  | «      dz   }| dz   }t        |«      }t        |«      }||k  r*||   d| |k(  r|j                  ||   «       |dz  }||k  rŒ*D ]Â  }|dk(  rq|j                  t         j                  «       |j                  dd D ]  }	|j                  |	«       Œ |j                  dd D ]  }
|j                  |
«       Œ d|_        Œy|j                  j                  |   }t         j                   |_        g |_        g |_        d|_        d|_        ŒÄ y)z‰Reset the logger named 'parent' and all its children to their initial
    state, if they already exist in the current configuration.
    r=   Né   ú.FT)r   r=   ÚsortedÚmanagerÚ
loggerDictrJ   ÚindexÚlenÚappendrH   ÚWARNINGr4   ÚremoveHandlerr<   ÚremoveFiltersÚdisabledÚNOTSETr"   r>   )r;   r=   ÚexistingÚloggers_to_resetÚiÚprefixedÚpflenÚnum_existingrC   rM   rP   r9   s               r$   rB   rB   ¼   s~  € ô �<‰<€Dä�d—l‘l×-Ñ-×2Ñ2Ó4Ó5€HØ�Òà"˜8 hÑ.ÑØ	�xÑ	àØ	�8Ñ	Ø"˜8Ðà�N‰N˜6Ó" QÑ&ˆØ˜C‘<ˆÜ�H“ˆÜ˜8“}ˆØ�,ÒØ˜‰{˜6˜EÐ" hÒ.Ø ×'Ñ'¨°©Ô4Ø�‰FˆAð �,Óð !ò $ˆØ�6Š>Ø�M‰Mœ'Ÿ/™/Ô*Ø—]‘]¡1Ð%ò &�Ø×"Ñ" 1Õ%ð&à—\‘\¡!�_ò &�Ø×"Ñ" 1Õ%ð&à!ˆD�Mà—\‘\×,Ñ,¨TÑ2ˆFÜ"Ÿ>™>ˆFŒLØ ˆFŒOØˆFŒNØ#ˆFÔØ#ˆF�Oñ$r%   c                   óx   — e Zd ZdZej
                  ZdZdZdd„Z	dd„Z
d„ Zd„ Zd	„ Zd
„ Zd„ Zdd„Zd„ Zd„ Zd„ Zy)ÚTimeraY  Keeps track of overall time and split/lap times.

    >>> import time
    >>> timer = Timer()
    >>> time.sleep(0.01)
    >>> print("First lap:", timer.split())
    First lap: ...
    >>> time.sleep(0.02)
    >>> print("Second lap:", timer.split())
    Second lap: ...
    >>> print("Overall time:", timer.time())
    Overall time: ...

    Can be used as a context manager inside with-statements.

    >>> with Timer() as t:
    ...     time.sleep(0.01)
    >>> print("%0.3f seconds" % t.elapsed)
    0... seconds

    If initialised with a logger, it can log the elapsed time automatically
    upon exiting the with-statement.

    >>> import logging
    >>> log = logging.getLogger("my-fancy-timer-logger")
    >>> configLogger(logger=log, level="DEBUG", format="%(message)s", stream=sys.stdout)
    >>> with Timer(log, 'do something'):
    ...     time.sleep(0.01)
    Took ... to do something

    The same Timer instance, holding a reference to a logger, can be reused
    in multiple with-statements, optionally with different messages or levels.

    >>> timer = Timer(log)
    >>> with timer():
    ...     time.sleep(0.01)
    elapsed time: ...s
    >>> with timer('redo it', level=logging.INFO):
    ...     time.sleep(0.02)
    Took ... to redo it

    It can also be used as a function decorator to log the time elapsed to run
    the decorated function.

    >>> @timer()
    ... def test1():
    ...    time.sleep(0.01)
    >>> @timer('run test 2', level=logging.INFO)
    ... def test2():
    ...    time.sleep(0.02)
    >>> test1()
    Took ... to run 'test1'
    >>> test2()
    Took ... to run test 2
    zelapsed time: %(time).3fszTook %(time).3fs to %(msg)sNc                 óÀ   — | j                  |«       |€.dD ])  }t        «       j                  |«      €Œt        d|z  «      ‚ || _        |�|nt
        | _        || _        y )N)Úmsgr"   z*'%s' can't be specified without a 'logger')ÚresetÚlocalsr(   r   r9   Ú
TIME_LEVELr"   ri   )r   r9   ri   r"   ÚstartÚargs         r$   r   zTimer.__init__#  se   € Ø�
‰
�5ÔØˆ>Ø'ò Y�Ü“8—<‘< Ó$Ñ0Ü$Ð%QÐTWÑ%WÓXÐXðYð ˆŒØ#Ð/‘U´ZˆŒ
Øˆ�r%   c                 ór   — |€| j                  «       | _        n|| _        | j                  | _        d| _        y)z0Reset timer to 'start_time' or the current time.Nç        )Ú_timerm   ÚlastÚelapsed)r   rm   s     r$   rj   zTimer.reset-  s-   € àˆ=ØŸ™›ˆD�JàˆDŒJØ—J‘JˆŒ	Øˆ�r%   c                 ó<   — | j                  «       | j                  z
  S )z=Return the overall time (in seconds) since the timer started.)rq   rm   ©r   s    r$   Útimez
Timer.time6  s   € à�z‰z‹|˜dŸj™jÑ(Ð(r%   c                 óp   — | j                  «       }|| j                  z
  | _        || _        | j                  S )z=Split and return the lap time (in seconds) in between splits.©rq   rr   rs   )r   Úcurrents     r$   ÚsplitzTimer.split:  s.   € à—*‘*“,ˆØ §¡Ñ*ˆŒØˆŒ	Ø�|‰|Ðr%   c                 ó®   — |s| j                   }|j                  d«      dk  r| j                  ||dœz  }|S 	 |d|iz  }|S # t        t        f$ r Y |S w xY w)zÿFormat 'time' value in 'msg' and return formatted string.
        If 'msg' contains a '%(time)' format string, try to use that.
        Otherwise, use the predefined 'default_format'.
        If 'msg' is empty or None, fall back to 'default_msg'.
        z%(time)r   ©ri   rv   rv   )Údefault_msgÚfindr   ÚKeyErrorr   )r   ri   rv   s      r$   Ú
formatTimezTimer.formatTimeA  sw   € ñ Ø×"Ñ"ˆCØ�8‰8�IÓ Ò"Ø×%Ñ%°¸TÑ(BÑBˆCð ˆ
ð	Ø˜V T˜NÑ*�ð ˆ
øô œjÐ)ò ØØˆ
ðús   ¸A ÁAÁAc                 ó>   — | j                  «       | _        d| _        | S )zStart a new laprp   rx   ru   s    r$   Ú	__enter__zTimer.__enter__R  s   € à—J‘J“LˆŒ	ØˆŒØˆr%   c                 óæ   — | j                  «       }| j                  �|ry| j                  | j                  |«      }| j                  |dœ}| j                  j	                  | j
                  ||«       y)zŒEnd the current lap. If timer has a logger, log the time elapsed,
        using the format string in self.msg (or the default one).
        Nr|   )rz   r9   r€   ri   Úlogr"   )r   Úexc_typeÚ	exc_valueÚ	tracebackrv   ÚmessageÚ	msg_partss          r$   Ú__exit__zTimer.__exit__X  s\   € ð �z‰z‹|ˆØ�;‰;Ð¡(ð Ø—/‘/ $§(¡(¨DÓ1ˆð !ŸH™H¨dÑ3ˆ	Ø�‰�‰˜Ÿ
™
 G¨YÕ7r%   c                 ó2  ‡ ‡— t        |t        «      r8|Š‰ j                  sd‰j                  z  ‰ _        t	        ‰«      ˆˆ fd„«       }|S |xs |j                  d«      }|j                  d‰ j                  «      }‰ j                  ‰ j                  ||«      S )aV  If the first argument is a function, return a decorator which runs
        the wrapped function inside Timer's context manager.
        Otherwise, treat the first argument as a 'msg' string and return an updated
        Timer instance, referencing the same logger.
        A 'level' keyword can also be passed to override self.level.
        zrun '%s'c                  óD   •— ‰5   ‰| i |¤Žcd d d «       S # 1 sw Y   y xY wr'   © )ÚargsÚkwdsÚfuncr   s     €€r$   ÚwrapperzTimer.__call__.<locals>.wrappert  s(   ø€ àñ /Ù Ð.¨Ñ.÷/÷ /ò /ús   „–ri   r"   )	r   r   ri   r-   r   r(   r"   r#   r9   )r   Úfunc_or_msgrK   r‘   ri   r"   r�   s   `     @r$   Ú__call__zTimer.__call__g  s†   ù€ ô �k¤8Ô,ØˆDà—8’8Ø%¨¯©Ñ5�”ä�4‹[ô/ó ð/ð ˆNàÒ2 §¡¨EÓ!2ˆCØ—J‘J˜w¨¯
©
Ó3ˆEØ—>‘> $§+¡+¨s°EÓ:Ð:r%   c                 ó   — | j                   S r'   ©rs   ru   s    r$   Ú	__float__zTimer.__float__  s   € Ø�|‰|Ðr%   c                 ó,   — t        | j                  «      S r'   )Úintrs   ru   s    r$   Ú__int__zTimer.__int__‚  s   € Ü�4—<‘<Ó Ð r%   c                 ó    — d| j                   z  S )Nz%.3fr•   ru   s    r$   Ú__str__zTimer.__str__…  s   € Ø˜Ÿ™Ñ$Ð$r%   )NNNNr'   )r-   r.   r/   r0   ÚtimeitÚdefault_timerrq   r}   r   r   rj   rv   rz   r€   r‚   rŠ   r“   r–   r™   r›   r�   r%   r$   rg   rg   å   sV   „ ñ6ðr × Ñ €EØ-€KØ2€Nóóò)òòò"ò8ó;ò0ò!ó%r%   rg   c                   ó   — e Zd ZdZd„ Zd„ Zy)ÚChannelsFilteraQ  Provides a hierarchical filter for log entries based on channel names.

    Filters out records emitted from a list of enabled channel names,
    including their children. It works the same as the ``logging.Filter``
    class, but allows the user to specify multiple channel names.

    >>> import sys
    >>> handler = logging.StreamHandler(sys.stdout)
    >>> handler.setFormatter(logging.Formatter("%(message)s"))
    >>> filter = ChannelsFilter("A.B", "C.D")
    >>> handler.addFilter(filter)
    >>> root = logging.getLogger()
    >>> root.addHandler(handler)
    >>> root.setLevel(level=logging.DEBUG)
    >>> logging.getLogger('A.B').debug('this record passes through')
    this record passes through
    >>> logging.getLogger('A.B.C').debug('records from children also pass')
    records from children also pass
    >>> logging.getLogger('C.D').debug('this one as well')
    this one as well
    >>> logging.getLogger('A.B.').debug('also this one')
    also this one
    >>> logging.getLogger('A.F').debug('but this one does not!')
    >>> logging.getLogger('C.DE').debug('neither this one!')
    c                 óz   — || _         t        |«      | _        |D �ci c]  }|t        |«      “Œ c}| _        y c c}w r'   )ÚnamesrY   ÚnumÚlengths)r   r¡   Úns      r$   r   zChannelsFilter.__init__¤  s1   € ØˆŒ
Ü�u“:ˆŒØ+0Ö1 a˜œ3˜q›6™	Ò1ˆ�ùÒ1s   œ8c                 óð   — | j                   dk(  ry| j                  D ]W  }| j                  |   }||j                  k(  r y|j                  j	                  |d|«      dk(  sŒD|j                  |   dk(  sŒW y y)Nr   TrT   F)r¢   r¡   r£   rC   r~   )r   r,   rC   Únlens       r$   ÚfilterzChannelsFilter.filter©  ss   € Ø�8‰8�qŠ=ØØ—J‘Jò 	ˆDØ—<‘< Ñ%ˆDØ�v—{‘{Ò"ÙØ—‘×!Ñ! $¨¨4Ó0°AÓ5¸&¿+¹+ÀdÑ:KÈsÓ:RÙð	ð r%   N)r-   r.   r/   r0   r   r§   r�   r%   r$   rŸ   rŸ   ‰  s   „ ñò42ó
	r%   rŸ   c                   ó8   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zd„ Zdd„Zˆ xZS )ÚCapturingLogHandlerc                 ó    •— t         t        | �  |¬«       g | _        t	        |t
        «      rt        j                  |«      | _        y || _        y )N)r"   )	r   r©   r   Úrecordsr   r   r   rA   r9   )r   r9   r"   r#   s      €r$   r   zCapturingLogHandler.__init__¶  s@   ø€ ÜÔ! 4Ñ1¸Ð1Ô>ØˆŒÜ�fœcÔ"Ü!×+Ñ+¨FÓ3ˆD�Kà ˆD�Kr%   c                 ól  — | j                   j                  | _        | j                   j                  | _        | j                   j
                  | _        | j                   j                  | «       | j                   j                  | j                  «       d| j                   _        d| j                   _        | S )NF)	r9   r^   Úoriginal_disabledr"   Úoriginal_levelr>   Úoriginal_propagaterG   rH   ru   s    r$   r‚   zCapturingLogHandler.__enter__¾  s}   € Ø!%§¡×!5Ñ!5ˆÔØ"Ÿk™k×/Ñ/ˆÔØ"&§+¡+×"7Ñ"7ˆÔà�‰×Ñ˜tÔ$Ø�‰×Ñ˜TŸZ™ZÔ(Ø$ˆ�‰ÔØ %ˆ�‰Ôàˆr%   c                 óò   — | j                   j                  | «       | j                   j                  | j                  «       | j                  | j                   _        | j                  | j                   _        | S r'   )r9   r\   rH   r®   r­   r^   r¯   r>   )r   ÚtypeÚvaluer‡   s       r$   rŠ   zCapturingLogHandler.__exit__Ê  sU   € Ø�‰×!Ñ! $Ô'Ø�‰×Ñ˜T×0Ñ0Ô1Ø#×5Ñ5ˆ�‰ÔØ $× 7Ñ 7ˆ�‰Ôàˆr%   c                 ó:   — | j                   j                  |«       y r'   )r«   rZ   )r   r,   s     r$   ÚemitzCapturingLogHandler.emitÒ  s   € Ø�‰×Ñ˜FÕ#r%   c                 ó¬   — dd l }|j                  |«      }| j                  D ]#  }|j                  |j	                  «       «      sŒ# y |€d|z  }J |«       ‚)Nr   Tz(Pattern '%s' not found in logger records)ÚreÚcompiler«   ÚsearchÚ
getMessage)r   Úregexpri   r¶   ÚpatternÚrs         r$   ÚassertRegexzCapturingLogHandler.assertRegexÕ  sU   € Ûà—*‘*˜VÓ$ˆØ—‘ò 	ˆAØ�~‰~˜aŸl™l›nÕ-Ùð	ð ˆ;Ø<¸vÑEˆCØ�#‹ˆqr%   r'   )	r-   r.   r/   r   r‚   rŠ   r´   r½   r1   r2   s   @r$   r©   r©   µ  s   ø„ ô!ò
òò$÷	r%   r©   c                   ó    — e Zd ZdZed„ «       Zy)ÚLogMixina2  Mixin class that adds logging functionality to another class.

    You can define a new class that subclasses from ``LogMixin`` as well as
    other base classes through multiple inheritance.
    All instances of that class will have a ``log`` property that returns
    a ``logging.Logger`` named after their respective ``<module>.<class>``.

    For example:

    >>> class BaseClass(object):
    ...     pass
    >>> class MyClass(LogMixin, BaseClass):
    ...     pass
    >>> a = MyClass()
    >>> isinstance(a.log, logging.Logger)
    True
    >>> print(a.log.name)
    fontTools.misc.loggingTools.MyClass
    >>> class AnotherClass(MyClass):
    ...     pass
    >>> b = AnotherClass()
    >>> isinstance(b.log, logging.Logger)
    True
    >>> print(b.log.name)
    fontTools.misc.loggingTools.AnotherClass
    c                 óÜ   — t        | d«      sUdj                  | j                  j                  | j                  j                  f«      }t        j                  |«      | _        | j                  S )NÚ_logrT   )ÚhasattrrI   r#   r.   r-   r   rA   rÁ   )r   rC   s     r$   r„   zLogMixin.logý  sO   € ä�t˜VÔ$Ø—8‘8˜TŸ^™^×6Ñ6¸¿¹×8OÑ8OÐPÓQˆDÜ×)Ñ)¨$Ó/ˆDŒIØ�y‰yÐr%   N)r-   r.   r/   r0   Úpropertyr„   r�   r%   r$   r¿   r¿   á  s   „ ñð6 ñó ñr%   r¿   c                 ó>   — t        j                  | ›d|›�|d¬«       y)z:Raise a warning about deprecated function argument 'name'.ú is deprecated; é   ©ÚcategoryÚ
stacklevelN)ÚwarningsÚwarn)rC   ri   rÈ   s      r$   ÚdeprecateArgumentrÌ     s   € ä‡M�MªD±#Ð6ÀÐVWÖXr%   c                 ó   ‡ ‡— ˆˆ fd„}|S )zBDecorator to raise a warning when a deprecated function is called.c                 ó4   •‡ — t        ‰ «      ˆˆ ˆfd„«       }|S )Nc                  ób   •— t        j                  ‰j                  ›d‰›�‰d¬«        ‰| i |¤ŽS )NrÅ   é   rÇ   )rÊ   rË   r-   )rŽ   rK   rÈ   r�   ri   s     €€€r$   r‘   z5deprecateFunction.<locals>.decorator.<locals>.wrapper  s3   ø€ ä�M‰MØ*.¯-«-¹Ð=Ø!Øõñ
 ˜Ð( Ñ(Ð(r%   r   )r�   r‘   rÈ   ri   s   ` €€r$   Ú	decoratorz$deprecateFunction.<locals>.decorator  s    ù€ Ü	ˆt‹õ	)ó 
ð	)ð ˆr%   r�   )ri   rÈ   rÑ   s   `` r$   ÚdeprecateFunctionrÒ   
  s   ù€ õ
ð Ðr%   Ú__main__)Úoptionflags)r=   )!Úsysr   rœ   Ú	functoolsr   Úcollections.abcr   r   rÊ   r   r
   rl   r   Ú	Formatterr   rQ   rB   Úobjectrg   ÚFilterrŸ   ÚHandlerr©   r¿   ÚUserWarningrÌ   rÒ   r-   ÚdoctestÚexitÚtestmodÚELLIPSISÚfailedr�   r%   r$   ú<module>râ      sä   ðÛ 
Û Û Ý ß -Û Ý  ð �]‰]€
ð
 
&ØØñ€ô@:�W×&Ñ&ô @:òF`@óF&$ôRa%ˆFô a%ôH)�W—^‘^ô )ôX)˜'Ÿ/™/ô )ôX!ˆvô !ðH +6ó Yð
 %0ó ð$ ˆzÒÛà€C‡H�Hˆ_ˆW�_‰_¨×)9Ñ)9Ô:×AÑAÕBð r%   