o
    ê}”e%  ã                   @  sN   d dl mZ G dd„ dƒZG dd„ dƒZdd„ ZG dd	„ d	ƒZd
dlmZ dS )é    )Úannotationsc                   @  s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )ÚIfRangez½Very 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                 C  s   || _ || _d S ©N)ÚetagÚdate)Úselfr   r   © r   úf/Users/abhinavbhinder/Documents/map/venv/lib/python3.10/site-packages/werkzeug/datastructures/range.pyÚ__init__   s   
zIfRange.__init__c                 C  s0   | j durt | j ¡S | jdurt | j¡S dS )ú-Converts the object back into an HTTP header.NÚ )r   ÚhttpZ	http_dater   Z
quote_etag©r   r   r   r	   Ú	to_header   s
   

zIfRange.to_headerc                 C  ó   |   ¡ S r   ©r   r   r   r   r	   Ú__str__   ó   zIfRange.__str__c                 C  ó   dt | ƒj› dt| ƒ›d�S ©Nú<ú ú>©ÚtypeÚ__name__Ústrr   r   r   r	   Ú__repr__   ó   zIfRange.__repr__©NN)r   Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r   r   r   r	   r      s    
r   c                   @  sH   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
dS )Ú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                 C  sP   || _ || _|D ]\}}|d u s|d ur%|dk s||kr%t||f› d�ƒ‚qd S )Nr   z is not a valid range.)ÚunitsÚrangesÚ
ValueError)r   r$   r%   ÚstartÚendr   r   r	   r
   /   s    €þzRange.__init__c                 C  sn   | j dks|du st| jƒdkrdS | jd \}}|du r'|}|dk r'||7 }t |||¡r5|t||ƒfS dS )z·If 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   )r$   Úlenr%   r   Úis_byte_range_validÚmin)r   Úlengthr'   r(   r   r   r	   Úrange_for_length:   s    zRange.range_for_lengthc                 C  s.   |   |¡}|durt| j|d |d |ƒS dS )z�Creates a :class:`~werkzeug.datastructures.ContentRange` object
        from the current range and given content length.
        Nr   r*   )r/   ÚContentRanger$   )r   r.   Úrngr   r   r	   Úmake_content_rangeJ   s   
zRange.make_content_rangec                 C  sl   g }| j D ]%\}}|du r| |dkr|› d�nt|ƒ¡ q| |› d|d › �¡ q| j› dd |¡› �S )r   Nr   ú-r*   ú=ú,)r%   Úappendr   r$   Újoin)r   r%   Úbeginr(   r   r   r	   r   S   s   "zRange.to_headerc                 C  s>   |   |¡}|dur| j› d|d › d|d d › d|› �S dS )z\Converts the object into `Content-Range` HTTP header,
        based on given length
        Nr   r   r3   r*   ú/)r/   r$   )r   r.   Úranger   r   r	   Úto_content_range_header]   s   
(zRange.to_content_range_headerc                 C  r   r   r   r   r   r   r	   r   f   r   zRange.__str__c                 C  r   r   r   r   r   r   r	   r   i   r   zRange.__repr__N)r   r    r!   r"   r
   r/   r2   r   r;   r   r   r   r   r   r	   r#   "   s    	
	r#   c                   s"   ‡ fdd„}‡ fdd„}t ||ƒS )Nc                   s
   t | ˆ ƒS r   )Úgetattrr   ©Únamer   r	   Úfgetn   ó   
z _callback_property.<locals>.fgetc                   s(   t | ˆ |ƒ | jd ur|  | ¡ d S d S r   )ÚsetattrÚ	on_update)r   Úvaluer=   r   r	   Úfsetq   s   
ÿz _callback_property.<locals>.fset)Úproperty)r>   r?   rD   r   r=   r	   Ú_callback_propertym   s   
rF   c                   @  sl   e Zd ZdZddd„ZedƒZedƒZedƒZedƒZ	dd
d„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )r0   zDRepresents the content range header.

    .. versionadded:: 0.7
    Nc                 C  s0   t  |||¡sJ dƒ‚|| _|  ||||¡ d S )NúBad range provided)r   r,   rB   Úset)r   r$   r'   Ústopr.   rB   r   r   r	   r
      s   zContentRange.__init__Ú_unitsÚ_startÚ_stopÚ_lengthr)   c                 C  sJ   t  |||¡sJ dƒ‚|| _|| _|| _|| _| jdur#|  | ¡ dS dS )z#Simple method to update the ranges.rG   N)r   r,   rJ   rK   rL   rM   rB   )r   r'   rI   r.   r$   r   r   r	   rH   Ž   s   
ÿzContentRange.setc                 C  s   | j dddd� dS )zcSets the units to `None` which indicates that the header should
        no longer be used.
        N©r$   )rH   r   r   r   r	   Úunset˜   s   zContentRange.unsetc                 C  sb   | j d u rdS | jd u rd}n| j}| jd u r| j › d|› �S | j › d| j› d| jd › d|› �S )Nr   Ú*z */r   r3   r*   r9   )r$   r.   r'   rI   )r   r.   r   r   r	   r   ž   s   


$zContentRange.to_headerc                 C  s
   | j d uS r   rN   r   r   r   r	   Ú__bool__©   r@   zContentRange.__bool__c                 C  r   r   r   r   r   r   r	   r   ¬   r   zContentRange.__str__c                 C  r   r   r   r   r   r   r	   r   ¯   r   zContentRange.__repr__r   )Nr)   )r   r    r!   r"   r
   rF   r$   r'   rI   r.   rH   rO   r   rQ   r   r   r   r   r   r	   r0   y   s    


r0   é   )r   N)Ú
__future__r   r   r#   rF   r0   r   r   r   r   r   r	   Ú<module>   s    K;