
    'gl                        d dl mZ d dlmZ d dlZd dlmZ ej                  rd dl	Z
 ej                  d      Z G d d      Z G d d      Z G d	 d
ej                  e         Z G d d      ZddlmZ y)    )annotationsN)datetimeTc                  2    e Zd ZdZdddZd	dZd	dZd	dZy)
IfRangezVery simple object that represents the `If-Range` header in parsed
    form.  It will either have neither a etag or date or one of either but
    never both.

    .. versionadded:: 0.7
    Nc                     || _         || _        y N)etagdate)selfr
   r   s      U/var/www/html/knws/venv/lib/python3.12/site-packages/werkzeug/datastructures/range.py__init__zIfRange.__init__   s     		    c                    | j                   t        j                  | j                         S | j                  t        j                  | j                        S y)-Converts the object back into an HTTP header. )r   http	http_dater
   
quote_etagr   s    r   	to_headerzIfRange.to_header   s?    99 >>$)),,99 ??499--r   c                "    | j                         S r	   r   r   s    r   __str__zIfRange.__str__$       ~~r   c                L    dt        |       j                   dt        |       dS N< >type__name__strr   s    r   __repr__zIfRange.__repr__'   &    4:&&'qTQ77r   NN)r
   
str | Noner   zdatetime | Nonereturnr$   )r#   
__module____qualname____doc__r   r   r   r%    r   r   r   r      s     8r   r   c                  T    e Zd ZdZ	 	 	 	 	 	 d
dZddZddZddZddZddZ	ddZ
y	)RangeaX  Represents a ``Range`` header. All methods only support only
    bytes as the unit. Stores a list of ranges if given, but the methods
    only work if only one range is provided.

    :raise ValueError: If the ranges provided are invalid.

    .. versionchanged:: 0.15
        The ranges passed in are validated.

    .. versionadded:: 0.7
    c                r    || _         || _        |D ]$  \  }}|||dk  s||k\  st        ||f d       y )Nr   z is not a valid range.)unitsranges
ValueError)r   r2   r3   startends        r   r   zRange.__init__8   sU     
   	JJE3}eai5C< UCL>1G!HII	Jr   c                    | j                   dk7  s|t        | j                        dk7  ry| j                  d   \  }}||}|dk  r||z  }t        j                  |||      r|t        ||      fS y)zIf the range is for bytes, the length is not None and there is
        exactly one range and it is satisfiable it returns a ``(start, stop)``
        tuple, otherwise `None`.
        bytesN   r   )r2   lenr3   r   is_byte_range_validmin)r   lengthr5   r6   s       r   range_for_lengthzRange.range_for_lengthE   sy    
 :: FNc$++6F!6K[[^
s;Cqy##E37#c6***r   c                f    | j                  |      }|t        | j                  |d   |d   |      S y)zCreates a :class:`~werkzeug.datastructures.ContentRange` object
        from the current range and given content length.
        Nr   r9   )r>   ContentRanger2   )r   r=   rngs      r   make_content_rangezRange.make_content_rangeU   s9     ##F+?

CFCFFCCr   c                    g }| j                   D ]E  \  }}|%|j                  |dk\  r| dn
t        |             -|j                  | d|dz
          G | j                   ddj	                  |       S )r   r   -r9   =,)r3   appendr$   r2   join)r   r3   beginr6   s       r   r   zRange.to_header^   s}    ++ 	4JE3{UaZqkSZHqq	23		4
 **Qsxx/011r   c                j    | j                  |      }| | j                   d|d    d|d   dz
   d| S y)z\Converts the object into `Content-Range` HTTP header,
        based on given length
        Nr   r   rD   r9   /)r>   r2   )r   r=   ranges      r   to_content_range_headerzRange.to_content_range_headerh   sJ     %%f-jj\58*AeAhl^1VHEEr   c                "    | j                         S r	   r   r   s    r   r   zRange.__str__q   r   r   c                L    dt        |       j                   dt        |       dS r   r!   r   s    r   r%   zRange.__repr__t   r&   r   N)r2   r$   r3   z%cabc.Sequence[tuple[int, int | None]]r*   None)r=   
int | Noner*   ztuple[int, int] | None)r=   rQ   r*   ContentRange | Noner)   )r=   rQ   r*   r(   )r#   r+   r,   r-   r   r>   rB   r   rM   r   r%   r.   r   r   r0   r0   +   sF    
JJ"GJ	J 2 8r   r0   c                  |    e Zd ZddZej
                  dd       Zej
                  d	d       Z	 	 	 	 	 	 d
dZddZy)_CallbackPropertyc                    d| | _         y )N_)attr)r   ownernames      r   __set_name__z_CallbackProperty.__set_name__y   s    vJ	r   c                     y r	   r.   r   instancerX   s      r   __get__z_CallbackProperty.__get__|   s    ?Br   c                     y r	   r.   r\   s      r   r^   z_CallbackProperty.__get__~   s    ORr   c                <    || S |j                   | j                     S r	   )__dict__rW   r\   s      r   r^   z_CallbackProperty.__get__   s$     K  ++r   c                r    ||j                   | j                  <   |j                  |j                  |       y y r	   )ra   rW   	on_update)r   r]   values      r   __set__z_CallbackProperty.__set__   s5    ',$))$)x( *r   N)rX   type[ContentRange]rY   r$   r*   rP   )r]   rP   rX   rP   r*   zte.Self)r]   r@   rX   rf   r*   r   )r]   rR   rX   ztype[ContentRange] | Noner*   zte.Self | T)r]   r@   rd   r   r*   rP   )r#   r+   r,   rZ   toverloadr^   re   r.   r   r   rT   rT   x   sO     ZZB BZZR R,+,4M,	,)r   rT   c                      e Zd ZU dZ	 	 d	 	 	 	 	 	 	 	 	 	 	 dd	Z e       Zded<    e       Zded<    e       Z	ded<    e       Z
ded<   	 	 d	 	 	 	 	 	 	 	 	 dd
ZddZddZddZddZddZy)r@   zDRepresents the content range header.

    .. versionadded:: 0.7
    Nr2   r(   r5   rQ   stopr=   c                :    || _         | j                  ||||       y r	   )rc   set)r   r2   r5   rj   r=   rc   s         r   r   zContentRange.__init__   s     #fe,r   c                    t        j                  |||      sJ d       || _        || _        || _        || _        | j                  | j                  |        yy)z#Simple method to update the ranges.zBad range providedN)r   r;   _units_start_stop_lengthrc   )r   r5   rj   r=   r2   s        r   rl   zContentRange.set   sY     ''tV<R>RR<"'"'!%
#)>>%NN4  &r   c                ,    | j                  ddd       y)zcSets the units to `None` which indicates that the header should
        no longer be used.
        N)r2   )rl   r   s    r   unsetzContentRange.unset   s     	t4(r   c                    | j                   y| j                  d}n| j                  }| j                  | j                    d| S | j                    d| j                   d| j                  dz
   d| S )Nr   *z */r   rD   r9   rK   )rn   rq   ro   rp   )r   r=   s     r   r   zContentRange.to_header   st    ;;<< #F\\F;;kk]#fX..++a}Adjj1n-=QvhGGr   c                    | j                   d uS r	   )rn   r   s    r   __bool__zContentRange.__bool__   s    {{$&&r   c                "    | j                         S r	   r   r   s    r   r   zContentRange.__str__   r   r   c                L    dt        |       j                   dt        |       dS r   r!   r   s    r   r%   zContentRange.__repr__   r&   r   r'   )r2   r(   r5   rQ   rj   rQ   r=   rQ   rc   z*cabc.Callable[[ContentRange], None] | Noner*   rP   )Nr8   )
r5   rQ   rj   rQ   r=   rQ   r2   r(   r*   rP   )r*   rP   r)   )r*   bool)r#   r+   r,   r-   r   rT   r2   __annotations__r5   rj   r=   rl   rs   r   rw   r   r%   r.   r   r   r@   r@      s     "@D	-	- 	- 		-
 	- >	- 
	- *+E:+)+E:+ )*D***,FJ, "#!! ! 	!
 ! 
! )	H' 8r   r@      )r   )
__future__r   collections.abcabccabctypingrg   r   TYPE_CHECKINGtyping_extensionsteTypeVarr   r   r0   GenericrT   r@   r   r   r.   r   r   <module>r      sg    "   ??"AIIcN8 8<J8 J8Z)		! ).C8 C8N r   