
    fchTO                        S r SSKrSSKrSSKrSSKrSSKJrJrJrJrJ	r	  \R                  r
S r\R                  " S5      rS rS\" SS9S	4S\" S
S9S4S\" SS9S4S\" SS9S4S\" SS9S4S\" SS9S4S\" SS9S4/r\ V s/ s H  o S   U S   -  U S   U S   4PM     sn r\ V s/ s H  o S   PM	     sn rSr\R                  " S\-  5      r\" \SS 5       VVs0 s H  u    pUS   US-   _M     snnrS r\rS rSAS jrSBS jrS rSCS  jr\" S5      r\" SS!9r " S" S#\5      r\" S$5      r\R@                  " S\5      r! " S% S&\5      r"\"" 5       r#S' r$\" SS(S)S5      r%\" SS*SS5      r&\" SS+SS5      r'\" SS,S-S5      r(\" SS+S.S5      r)\(r* " S/ S0\5      r+\+" S1S2S3S45      r,\+" S5S6S7S85      r-\+" S9S:S;S<5      r.\+" S=S>S?S@5      r/gs  sn f s  sn f s  snnf )Da  Python's :mod:`datetime` module provides some of the most complex
and powerful primitives in the Python standard library. Time is
nontrivial, but thankfully its support is first-class in
Python. ``dateutils`` provides some additional tools for working with
time.

Additionally, timeutils provides a few basic utilities for working
with timezones in Python. The Python :mod:`datetime` module's
documentation describes how to create a
:class:`~datetime.datetime`-compatible :class:`~datetime.tzinfo`
subtype. It even provides a few examples.

The following module defines usable forms of the timezones in those
docs, as well as a couple other useful ones, :data:`UTC` (aka GMT) and
:data:`LocalTZ` (representing the local timezone as configured in the
operating system). For timezones beyond these, as well as a higher
degree of accuracy in corner cases, check out `pytz`_ and `dateutil`_.

.. _pytz: https://pypi.python.org/pypi/pytz
.. _dateutil: https://dateutil.readthedocs.io/en/stable/index.html
    N)tzinfo	timedeltadatedatetimetimezonec                     U R                   (       a
  U [        -
  nO$U R                  [        R                  S9[        -
  n[
        R                  " U5      $ )ue  Converts from a :class:`~datetime.datetime` object to an integer
timestamp, suitable interoperation with :func:`time.time` and
other `Epoch-based timestamps`.

.. _Epoch-based timestamps: https://en.wikipedia.org/wiki/Unix_time

>>> timestamp = int(time.time())
>>> utc_dt = datetime.fromtimestamp(timestamp, timezone.utc)
>>> timestamp - dt_to_timestamp(utc_dt)
0.0

``dt_to_timestamp`` supports both timezone-aware and naïve
:class:`~datetime.datetime` objects. Note that it assumes naïve
datetime objects are implied UTC, such as those generated with
:meth:`datetime.datetime.utcnow`. If your datetime objects are
local time, such as those generated with
:meth:`datetime.datetime.now`, first convert it using the
:meth:`datetime.datetime.replace` method with ``tzinfo=``
:class:`LocalTZ` object in this module, then pass the result of
that to ``dt_to_timestamp``.
r   )r   EPOCH_AWAREreplacer   utcr   total_seconds)dttds     1lib/python3.13/site-packages/boltons/timeutils.pydt_to_timestampr   A   s?    , 
yy+ZZx||Z,{:""2&&    z\Dc                 x    [         R                  U 5       Vs/ s H  n[        U5      PM     nn[        U6 $ s  snf )a  Parses the limited subset of `ISO8601-formatted time`_ strings as
returned by :meth:`datetime.datetime.isoformat`.

>>> epoch_dt = datetime.fromtimestamp(0, timezone.utc).replace(tzinfo=None)
>>> iso_str = epoch_dt.isoformat()
>>> print(iso_str)
1970-01-01T00:00:00
>>> isoparse(iso_str)
datetime.datetime(1970, 1, 1, 0, 0)

>>> utcnow = datetime.now(timezone.utc).replace(tzinfo=None)
>>> utcnow == isoparse(utcnow.isoformat())
True

For further datetime parsing, see the `iso8601`_ package for strict
ISO parsing and `dateutil`_ package for loose parsing and more.

.. _ISO8601-formatted time: https://en.wikipedia.org/wiki/ISO_8601
.. _iso8601: https://pypi.python.org/pypi/iso8601
.. _dateutil: https://pypi.python.org/pypi/python-dateutil

)_NONDIGIT_REsplitintr   )iso_strpdt_argss      r   isoparser   a   s9    .  ,11':;:!s1v:G;W <s   7   secondssecond<   minute  hourdaysday   week      monthim  yearz*[+-]?\ *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?z!((?P<value>%s)\s*(?P<unit>\w)\w*)sc           	      r   0 n[         R                  U 5       H>  nUR                  S5      UR                  S5      pC [        U   n [        U5      nX1U'   M@     [        S0 UD6$ ! [         a&    [        SU< S[        R                  5       < 35      ef = f! [
         a    [        SU< SU< 35      ef = f)a>  Robustly parses a short text description of a time period into a
:class:`datetime.timedelta`. Supports weeks, days, hours, minutes,
and seconds, with or without decimal points:

Args:
    text (str): Text to parse.
Returns:
    datetime.timedelta
Raises:
    ValueError: on parse failure.

>>> parse_td('1d 2h 3.5m 0s') == timedelta(days=1, seconds=7410)
True

Also supports full words and whitespace.

>>> parse_td('2 weeks 1 day') == timedelta(days=15)
True

Negative times are supported, too:

>>> parse_td('-1.5 weeks 3m 20s') == timedelta(days=-11, seconds=43400)
True
valueunitzinvalid time unit z, expected one of zinvalid time value for unit z:  )	_PARSE_TD_REfinditergroup_PARSE_TD_KW_MAPKeyError
ValueErrorkeysfloatr   )text	td_kwargsmatchr/   r0   unit_keys         r   parse_timedeltar>      s    2 I&&t,kk'*EKK,?t	@'-H	.%LE $( - !y!!  	@ $&6&;&;&=? @ @	@
  	. $e- . .	.s   	A%B%0BB6c                     US:X  a  U $ U S-   $ )Nr   r-   r1   )r0   r/   s     r   _cardinalize_time_unitr@      s     z#:r   c                    Uc1  [         R                  " [        R                  5      R	                  SS9nX-
  n[
        R                  " U5      n[        U5      n[        R                  " [        U5      S-
  n[        U   u  pn
U[
        R                  " U	5      -  n[        X5      nU(       a  U[        U
[        U5      5      4$ X4$ )a  Get a tuple representing the relative time difference between two
:class:`~datetime.datetime` objects or one
:class:`~datetime.datetime` and now.

Args:
    d (datetime): The first datetime object.
    other (datetime): An optional second datetime object. If
        unset, defaults to the current time as determined
        :meth:`datetime.utcnow`.
    ndigits (int): The number of decimal digits to round to,
        defaults to ``0``.
    cardinalize (bool): Whether to pluralize the time unit if
        appropriate, defaults to ``True``.
Returns:
    (float, str): A tuple of the :class:`float` difference and
       respective unit of time, pluralized if appropriate and
       *cardinalize* is set to ``True``.

Unlike :func:`relative_time`, this method's return is amenable to
localization into other languages and custom phrasing and
formatting.

>>> now = datetime.now(timezone.utc).replace(tzinfo=None)
>>> decimal_relative_time(now - timedelta(days=1, seconds=3600), now)
(1.0, 'day')
>>> decimal_relative_time(now - timedelta(seconds=0.002), now, ndigits=5)
(0.002, 'seconds')
>>> decimal_relative_time(now, now - timedelta(days=900), ndigits=1)
(-2.5, 'years')

Nr	   r   )r   nowr   r   r   r   r   absbisect_BOUND_DELTAS_BOUNDSroundr@   )dotherndigitscardinalizediffdiff_secondsabs_diffb_idxbboundbunitbnamef_diffrounded_diffs                r   decimal_relative_timerU      s    @ }X\\*22$2?9D**40L4yHMM-2Q6E"5>F5I33E::F)L3E3|;LMMMr   c                 X    [        XUSS9u  p4SnUS:  a  Sn[        U5      S SU SU 3$ )a  Get a string representation of the difference between two
:class:`~datetime.datetime` objects or one
:class:`~datetime.datetime` and the current time. Handles past and
future times.

Args:
    d (datetime): The first datetime object.
    other (datetime): An optional second datetime object. If
        unset, defaults to the current time as determined
        :meth:`datetime.utcnow`.
    ndigits (int): The number of decimal digits to round to,
        defaults to ``0``.
Returns:
    A short English-language string.

>>> now = datetime.now(timezone.utc).replace(tzinfo=None)
>>> relative_time(now, ndigits=1)
'0 seconds ago'
>>> relative_time(now - timedelta(days=1, seconds=36000), ndigits=1)
'1.4 days ago'
>>> relative_time(now + timedelta(days=7), now, ndigits=1)
'1 week from now'

T)rK   agor   zfrom nowg )rU   rC   )rH   rI   rJ   drtr0   phrases         r   relative_timer\      sB    2 &aTJICF
Qw#hq\4&&**r   c                 N    [         R                  " X5      nUR                  5       $ )a)  Parse the date string according to the format in `format`.  Returns a
:class:`date` object.  Internally, :meth:`datetime.strptime` is used to
parse the string and thus conversion specifiers for time fields (e.g. `%H`)
may be provided;  these will be parsed but ignored.

Args:
    string (str): The date string to be parsed.
    format (str): The `strptime`_-style date format string.
Returns:
    datetime.date

.. _`strptime`: https://docs.python.org/2/library/datetime.html#strftime-strptime-behavior

>>> strpdate('2016-02-14', '%Y-%m-%d')
datetime.date(2016, 2, 14)
>>> strpdate('26/12 (2015)', '%d/%m (%Y)')
datetime.date(2015, 12, 26)
>>> strpdate('20151231 23:59:59', '%Y%m%d %H:%M:%S')
datetime.date(2015, 12, 31)
>>> strpdate('20160101 00:00:00.001', '%Y%m%d %H:%M:%S.%f')
datetime.date(2016, 1, 1)
)r   strptimer   )stringformatwhences      r   strpdaterb     s     . v.F;;=r   c              #   .  #    [        U [        5      (       d  [        S5      eU(       a   [        U[        5      (       d  [        S5      e Uu  pEn[        U5      [        U5      pT[        U[        5      (       a  [	        [        U5      S9nO$[        U[        5      (       a  O[        SU-  5      eXTS-  -  nUc  S nOTX::  a(  U(       a  [        R                  O[        R                  nO'U(       a  [        R                  O[        R                  nU nU" X5      (       d\  Uv   U(       a>  [        UR                  S	-
  U-   S5      u  pUR                  UR                  U	-   U
S	-   S
9nX-   nU" X5      (       d  M\  g! [         a	    SSUpen GN,f = f7f)aT  In the spirit of :func:`range` and :func:`xrange`, the `daterange`
generator that yields a sequence of :class:`~datetime.date`
objects, starting at *start*, incrementing by *step*, until *stop*
is reached.

When *inclusive* is True, the final date may be *stop*, **if**
*step* falls evenly on it. By default, *step* is one day. See
details below for many more details.

Args:
    start (datetime.date): The starting date The first value in
        the sequence.
    stop (datetime.date): The stopping date. By default not
        included in return. Can be `None` to yield an infinite
        sequence.
    step (int): The value to increment *start* by to reach
        *stop*. Can be an :class:`int` number of days, a
        :class:`datetime.timedelta`, or a :class:`tuple` of integers,
        `(year, month, day)`. Positive and negative *step* values
        are supported.
    inclusive (bool): Whether or not the *stop* date can be
        returned. *stop* is only returned when a *step* falls evenly
        on it.

>>> christmas = date(year=2015, month=12, day=25)
>>> boxing_day = date(year=2015, month=12, day=26)
>>> new_year = date(year=2016, month=1,  day=1)
>>> for day in daterange(christmas, new_year):
...     print(repr(day))
datetime.date(2015, 12, 25)
datetime.date(2015, 12, 26)
datetime.date(2015, 12, 27)
datetime.date(2015, 12, 28)
datetime.date(2015, 12, 29)
datetime.date(2015, 12, 30)
datetime.date(2015, 12, 31)
>>> for day in daterange(christmas, boxing_day):
...     print(repr(day))
datetime.date(2015, 12, 25)
>>> for day in daterange(date(2017, 5, 1), date(2017, 8, 1),
...                      step=(0, 1, 0), inclusive=True):
...     print(repr(day))
datetime.date(2017, 5, 1)
datetime.date(2017, 6, 1)
datetime.date(2017, 7, 1)
datetime.date(2017, 8, 1)

*Be careful when using stop=None, as this will yield an infinite
sequence of dates.*
z%start expected datetime.date instancez,stop expected datetime.date instance or Noner   r#   zBstep expected int, timedelta, or tuple (year, month, day), not: %r   Nc                     g)NFr1   )rB   stops     r   <lambda>daterange.<locals>.<lambda>r  s    Ur   r   )r+   r*   )
isinstancer   	TypeErrorr   r   r7   operatorgtgeltledivmodr*   r   r+   )startrf   step	inclusivey_stepm_stepd_stepfinishedrB   m_y_step	cur_months              r   	daterangerz   *  sq    f eT""?@@JtT**FGG2!% Vc&k&#F,	FI	&	& 8:>? @ 	@ rkF|*	"+8;;"+8;;
Cs!!	"(#))a-6)A2"FH++388h#6%.]  5Cl s!! ;  ,!"At,s1   AFE? D,F>F?FFFFhoursc                   N    \ rS rSrSrS\4S jr\S 5       rS r	S r
S rS	 rS
rg)ConstantTZInfoi  z
A :class:`~datetime.tzinfo` subtype whose *offset* remains constant
(no daylight savings).

Args:
    name (str): Name of the timezone.
    offset (datetime.timedelta): Offset of the timezone.

ConstantTZc                     Xl         X l        g Nnameoffset)selfr   r   s      r   __init__ConstantTZInfo.__init__  s    	r   c                 H    [         R                  " U R                  5      S-  $ )Nr!   )r   r   r   r   s    r   utcoffset_hoursConstantTZInfo.utcoffset_hours  s    &&t{{3w??r   c                     U R                   $ r   )r   r   r   s     r   	utcoffsetConstantTZInfo.utcoffset  s    {{r   c                     U R                   $ r   )r   r   s     r   tznameConstantTZInfo.tzname  s    yyr   c                     [         $ r   )ZEROr   s     r   dstConstantTZInfo.dst  s    r   c                 p    U R                   R                  nU SU R                  < SU R                  < S3$ )Nz(name=z	, offset=))	__class____name__r   r   )r   cns     r   __repr__ConstantTZInfo.__repr__  s2    ^^$$VDII=	$++BBr   r   N)r   
__module____qualname____firstlineno____doc__r   r   propertyr   r   r   r   r   __static_attributes__r1   r   r   r~   r~     s>     )  @ @Cr   r~   UTCc                       \ rS rSrSr\" \R                  * S9r\r	\R                  (       a  \" \R                  * S9r	S rS rS rS rS rS	rg
)LocalTZInfoi  a#  The ``LocalTZInfo`` type takes data available in the time module
about the local timezone and makes a practical
:class:`datetime.tzinfo` to represent the timezone settings of the
operating system.

For a more in-depth integration with the operating system, check
out `tzlocal`_. It builds on `pytz`_ and implements heuristics for
many versions of major operating systems to provide the official
``pytz`` tzinfo, instead of the LocalTZ generalization.

.. _tzlocal: https://pypi.python.org/pypi/tzlocal
.. _pytz: https://pypi.python.org/pypi/pytz

r   c           	         UR                   UR                  UR                  UR                  UR                  UR
                  UR                  5       SS4	n[        R                  " [        R                  " U5      5      nUR                  S:  $ )Nr   )r+   r*   r%   r"   r    r   weekdaytime	localtimemktimetm_isdst)r   r   dt_tlocal_ts       r   is_dstLocalTZInfo.is_dst  sc    266277BII		2::<B0..T!23!##r   c                 ^    U R                  U5      (       a  U R                  $ U R                  $ r   )r   _dst_offset_std_offsetr   s     r   r   LocalTZInfo.utcoffset  s'    ;;r??###r   c                 l    U R                  U5      (       a  U R                  U R                  -
  $ [        $ r   )r   r   r   r   r   s     r   r   LocalTZInfo.dst  s+    ;;r??##d&6&666r   c                 F    [         R                  U R                  U5         $ r   )r   r   r   r   s     r   r   LocalTZInfo.tzname  s    {{4;;r?++r   c                 4    SU R                   R                  -  $ )Nz%s())r   r   r   s    r   r   LocalTZInfo.__repr__  s    ////r   r1   N)r   r   r   r   r   r   r   r   r   r   daylightaltzoner   r   r   r   r   r   r1   r   r   r   r     sN     T]]N3KK}}6$ 

,0r   r   c                 V    SU R                  5       -
  nU(       a  U [        U5      -  n U $ )N   )r   r   )r   
days_to_gos     r   _first_sunday_on_or_afterr     s)    RZZ\!J
i
##Ir               
         c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)

USTimeZonei  zCopied directly from the Python docs, the ``USTimeZone`` is a
:class:`datetime.tzinfo` subtype used to create the
:data:`Eastern`, :data:`Central`, :data:`Mountain`, and
:data:`Pacific` tzinfo types.
c                 D    [        US9U l        X l        X0l        X@l        g )Nr{   )r   	stdoffsetreprnamestdnamedstname)r   r|   r   r   r   s        r   r   USTimeZone.__init__  s    "/ r   c                     U R                   $ r   )r   r   s    r   r   USTimeZone.__repr__  s    }}r   c                 ^    U R                  U5      (       a  U R                  $ U R                  $ r   )r   r   r   r   s     r   r   USTimeZone.tzname  s#    88B<<<<<<r   c                 >    U R                   U R                  U5      -   $ r   )r   r   r   s     r   r   USTimeZone.utcoffset  s    ~~,,r   c                    Ub  UR                   c  [        $ UR                   U L d   eSUR                  :  a  [        [        p2OWSUR                  s=:  a  S:  a  O  O[
        [        p2O1SUR                  s=:  a  S:  a  O  [        $ [        [        p2O[        $ [        UR                  UR                  S95      n[        UR                  UR                  S95      nXAR                  S S9s=::  a  U:  a   [        $   [        $ [        $ )Ni  i  i  i  i  )r+   r	   )r   r   r+   DSTSTART_2007DSTEND_2007DSTSTART_1987_2006DSTEND_1987_2006DSTSTART_1967_1986DSTEND_1967_1986r   r   HOUR)r   r   dststartdstendrq   ends         r   r   USTimeZone.dst  s    :*
 KyyD    "''>,kfBGG"d"13CfBGG"d" K  23CfK)(*:*:*:*HI'BGG(DE JJdJ+1c1K 2 K4Kr   )r   r   r   r   N)r   r   r   r   r   r   r   r   r   r   r   r1   r   r   r   r     s     
 -r   r   EasternESTEDTiCentralCSTCDTiMountainMSTMDTiPacificPSTPDT)Nr   T)Nr   )r   F)0r   rer   rD   rk   r   r   r   r   r   r   r   compiler   r   rF   rE   _FLOAT_PATTERNr2   reversedr5   r>   parse_tdr@   rU   r\   rb   rz   r   r   r~   r   fromtimestampr
   r   LocalTZr   r   r   r   r   r   r   r   r   r   r   r   )b_r0   s   000r   <module>r      s  >, 
    @ @
 ''': zz% 6 y#X.y$h/y&/ya %(ya &)yb!7+yc"F+- /6
6gaD1Q4K1qt$g
6&'w!1w'>zz>OP+3GCRL+AC+AZQ GTCZ'+AC '"T +\+@6Vx |qCV C> U$$Q,(0& (0V -" Aq!$q"a# aAq) Ar2q) 
 aB* # 4 4n RUE
2
RUE
2b*eU3
RUE
2g 7'Cs   G'GG