o
    ÛähåA  ã                   @   sô   U d dl Z d dlmZ d dlmZmZmZmZmZm	Z	m
Z
 d dlmZmZmZ d dlmZ d dlmZ eeee   Zi Zeeef ed< ddd	„Zd
d„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZeded�Z eded�Z!G dd„ dee  ƒZ"dS )é    N)Úbisect_left)ÚGenericÚ
NamedTupleÚOptionalÚTypeVarÚcastÚoverloadÚLiteral)Ú	constantsÚ
exceptionsÚutil)Ú	BaseImage)Ú
PyPNGImageÚprecomputed_qr_blanksc                 K   s    t di |¤Ž}| | ¡ | ¡ S )N© )ÚQRCodeÚadd_dataÚ
make_image)ÚdataÚkwargsÚqrr   r   ú>/var/www/html/venv/lib/python3.10/site-packages/qrcode/main.pyÚmake   s   
r   c                 C   s    t | ƒdkrtd| › d�ƒ‚d S )Nr   zInvalid box size (was z, expected larger than 0)©ÚintÚ
ValueError©Úsizer   r   r   Ú_check_box_size   s   ÿr   c                 C   s   t | ƒdk rtd|  ƒ‚d S )Nr   z=Invalid border value (was %s, expected 0 or larger than that)r   r   r   r   r   Ú_check_border!   s
   ÿÿr   c                 C   sN   | d u rd S t | tƒstdt| ƒ› d�ƒ‚| dk s| dkr%td| › d�ƒ‚d S )NzInvalid mask pattern (was z, expected int)r   é   z(Mask pattern should be in range(8) (got ú))Ú
isinstancer   Ú	TypeErrorÚtyper   )Úmask_patternr   r   r   Ú_check_mask_pattern(   s   
ÿÿr&   c                 C   s   dd„ | D ƒS )Nc                 S   s   g | ]}|d d … ‘qS ©Nr   )Ú.0Úrowr   r   r   Ú
<listcomp>4   s    z!copy_2d_array.<locals>.<listcomp>r   )Úxr   r   r   Úcopy_2d_array3   s   r,   c                   @   sd   e Zd ZU eed< eed< eed< eed< eed< eed< eed< eed< eed	< d
efdd„ZdS )ÚActiveWithNeighborsÚNWÚNÚNEÚWÚmeÚEÚSWÚSÚSEÚreturnc                 C   ó   | j S r'   )r2   ©Úselfr   r   r   Ú__bool__B   s   zActiveWithNeighbors.__bool__N)Ú__name__Ú
__module__Ú__qualname__ÚboolÚ__annotations__r;   r   r   r   r   r-   7   s   
 r-   ÚGenericImage)ÚboundÚGenericImageLocalc                   @   s|  e Zd ZU eed< dZee ed< dej	ddddfdee
e  fdd„Zed	efd
d„ƒZejd;dd„ƒZedd„ ƒZejdd„ ƒZdd„ Zd<dd„Zd=dd„Zdd„ Zdd„ Zd>dd„Zdd„ Zd>d d!„Zd?d#d$„Ze	d>ded d	efd%d&„ƒZe	d>de
e d	efd'd&„ƒZd>d(d&„Zd)ed*ed	efd+d,„Zd-d.„ Z d/d0„ Z!d1d2„ Z"d3d4„ Z#d5d6„ Z$d7d8„ Z%d)ed*ed	e&fd9d:„Z'dS )@r   ÚmodulesNÚ_versioné
   é   Úimage_factoryc                 C   sb   t |ƒ t|ƒ || _t|ƒ| _t|ƒ| _t|ƒ| _|| _|| _|d ur+t	|t
ƒs+J ‚|  ¡  d S r'   )r   r   Úversionr   Úerror_correctionÚbox_sizeÚborderr%   rH   Ú
issubclassr   Úclear)r:   rI   rJ   rK   rL   rH   r%   r   r   r   Ú__init__N   s   	


zQRCode.__init__r7   c                 C   s   | j d u r	|  ¡  tt| j ƒS r'   )rE   Úbest_fitr   r   r9   r   r   r   rI   e   s   
zQRCode.versionc                 C   s$   |d urt |ƒ}t |¡ || _d S r'   )r   r   Úcheck_versionrE   )r:   Úvaluer   r   r   rI   k   s   

c                 C   r8   r'   )Ú_mask_patternr9   r   r   r   r%   r   s   zQRCode.mask_patternc                 C   s   t |ƒ || _d S r'   )r&   rS   )r:   Úpatternr   r   r   r%   v   s   
c                 C   s   g g| _ d| _d| _g | _dS )z*
        Reset the internal data.
        r   N)rD   Úmodules_countÚ
data_cacheÚ	data_listr9   r   r   r   rN   {   s   
zQRCode.clearé   c                 C   sR   t |tjƒr| j |¡ n|r| j tj||d�¡ n	| j t |¡¡ d| _dS )a  
        Add data to this QR Code.

        :param optimize: Data will be split into multiple chunks to optimize
            the QR size by finding to more compressed modes of at least this
            length. Set to ``0`` to avoid optimizing at all.
        )ÚminimumN)r"   r   ÚQRDatarW   ÚappendÚextendÚoptimal_data_chunksrV   )r:   r   Úoptimizer   r   r   r   „   s   
zQRCode.add_dataTc                 C   sL   |s| j du r| j| j d� | jdu r|  d|  ¡ ¡ dS |  d| j¡ dS )zÉ
        Compile the data into a QR Code array.

        :param fit: If ``True`` (or if a size has not been provided), find the
            best fit for the data to avoid data overflow errors.
        N©ÚstartF)rI   rP   r%   ÚmakeImplÚbest_mask_pattern)r:   Úfitr   r   r   r   ”   s
   
zQRCode.makec                    sè   ˆ j d d ˆ _ˆ j tv rttˆ j  ƒˆ _n5‡ fdd„tˆ jƒD ƒˆ _ˆ  dd¡ ˆ  ˆ jd d¡ ˆ  dˆ jd ¡ ˆ  ¡  ˆ  ¡  tˆ jƒtˆ j < ˆ  	||¡ ˆ j dkr[ˆ  
|¡ ˆ jd u rkt ˆ j ˆ jˆ j¡ˆ _ˆ  ˆ j|¡ d S )NrG   é   c                    s   g | ]}d gˆ j  ‘qS r'   )rU   )r(   Úir9   r   r   r*   ¨   s    ÿz#QRCode.makeImpl.<locals>.<listcomp>r   r    )rI   rU   r   r,   rD   ÚrangeÚsetup_position_probe_patternÚsetup_position_adjust_patternÚsetup_timing_patternÚsetup_type_infoÚsetup_type_numberrV   r   Úcreate_datarJ   rW   Úmap_data)r:   Útestr%   r   r9   r   ra   ¢   s(   

ÿ


ÿzQRCode.makeImplc                 C   sú   t ddƒD ]u}|| dks| j|| krqt ddƒD ]_}|| dks)| j|| kr*qd|  kr4dkr:n n|dv sbd|  krDdkrJn n|dv sbd|  krTdkrnn nd|  kr`dkrnn nd| j||  || < qd	| j||  || < qqd S )
Néÿÿÿÿé   r   é   >   r   rq   é   rG   TF©rf   rU   rD   )r:   r)   ÚcolÚrÚcr   r   r   rg   ¾   s     0õüz#QRCode.setup_position_probe_patternc                 C   s¶   |du rd}t  |¡ t  |¡}t  ¡ }| jD ]}| |jd¡ | t|ƒ||j ¡ | |¡ qt|ƒ}t	t j
| j ||ƒ| _| jdkrIt ¡ ‚|t  | j¡urX| j| jd� | jS )zD
        Find the minimum size required to fit in the data.
        Né   rG   é)   r_   )r   rQ   Úmode_sizes_for_versionÚ	BitBufferrW   ÚputÚmodeÚlenÚwriter   ÚBIT_LIMIT_TABLErJ   rI   r   ÚDataOverflowErrorrP   )r:   r`   Ú
mode_sizesÚbufferr   Úneeded_bitsr   r   r   rP   Ð   s$   


ÿ
zQRCode.best_fitc                 C   sJ   d}d}t dƒD ]}|  d|¡ t | j¡}|dks||kr"|}|}q|S )z7
        Find the most efficient mask pattern.
        r   rp   T)rf   ra   r   Ú
lost_pointrD   )r:   Úmin_lost_pointrT   re   r„   r   r   r   rb   î   s   €zQRCode.best_mask_patternc                 C   sÚ   |du rddl }|j}| ¡ stdƒ‚| jdu r|  ¡  | j}| dd|d d   d ¡ t|ƒD ]%}| d	¡ t|ƒD ]}| j	| | rL| d
¡ q=| d	¡ q=| d¡ q2| dd|d d   d ¡ | 
¡  dS )zz
        Output the QR Code only using TTY colors.

        If the data has not been compiled yet, make it first.
        Nr   ú	Not a ttyz[1;47mú rr   rG   z[0m
z[1;47m  [40mz  z[1;47m  [0m
)ÚsysÚstdoutÚisattyÚOSErrorrV   r   rU   r~   rf   rD   Úflush)r:   Úoutrˆ   Úmodcountru   rv   r   r   r   Ú	print_tty   s$   

zQRCode.print_ttyFc           	         s$  |du rt j}|r| ¡ stdƒ‚ˆjdu rˆ ¡  ˆj‰dd„ dD ƒ}|r(d‰ ˆ r.| ¡  dtf‡ ‡‡fdd	„}t	ˆj
 ˆˆj
 d
ƒD ]G}|r]ˆ rS|ˆˆj
 d k rX| d¡ | d¡ t	ˆj
 ˆˆj
 ƒD ]}|||ƒ||d |ƒd>  }| || ¡ qg|r†| d¡ | d¡ qD| ¡  dS )zË
        Output the QR Code using ASCII characters.

        :param tty: use fixed TTY color codes (forces invert=True)
        :param invert: invert the ASCII characters (solid <-> transparent)
        Nr†   c                 S   s   g | ]
}t |fƒ d ¡‘qS )Úcp437)ÚbytesÚdecode)r(   Úcoder   r   r   r*   /  s    z&QRCode.print_ascii.<locals>.<listcomp>)éÿ   éß   éÜ   éÛ   Tr7   c                    sV   ˆ rˆj rt| |ƒˆˆj  krdS t| |ƒdk st| |ƒˆkr!dS ttˆj|  | ƒS )Nrw   r   )rL   ÚmaxÚminr   r   rD   )r+   Úy©ÚinvertrŽ   r:   r   r   Ú
get_module5  s
   z&QRCode.print_ascii.<locals>.get_modulerr   rw   z[48;5;232mz[38;5;255mz[0mÚ
)rˆ   r‰   rŠ   r‹   rV   r   rU   Úreverser   rf   rL   r~   rŒ   )	r:   r�   Úttyrœ   Úcodesr�   ru   rv   Úposr   r›   r   Úprint_ascii  s2   



zQRCode.print_asciic                 K   ó   d S r'   r   ©r:   rH   r   r   r   r   r   I  ó   zQRCode.make_imagec                 K   r¤   r'   r   r¥   r   r   r   r   N  r¦   c                 K   s$  |  d¡s|  d¡s|  d¡s|  d¡r| jtjkrtdƒ‚t| jƒ | jdu r,|  ¡  |dur8t	|t
ƒs7J ‚n| j}|du rMddlm}m} |rK|nt}|| j| j| jfd	| ji|¤Ž}|jr‰t| jƒD ]#}t| jƒD ]}|jrz|j||| d
� ql| j| | r‡| ||¡ qlqe|jr�| ¡  |S )zu
        Make an image from the QR Code data.

        If the data has not been compiled yet, make it first.
        Úembedded_image_pathÚembedded_imageÚembeded_image_pathÚembeded_imagezOError correction level must be ERROR_CORRECT_H if an embedded image is providedNr   )ÚImageÚPilImageÚqrcode_modules)r   )ÚgetrJ   r
   ÚERROR_CORRECT_Hr   r   rK   rV   r   rM   r   rH   Úqrcode.image.pilr«   r¬   r   rL   rU   rD   Úneeds_drawrectrf   Úneeds_contextÚdrawrect_contextÚdrawrectÚneeds_processingÚprocess)r:   rH   r   r«   r¬   Úimru   rv   r   r   r   r   S  sT   ÿþýüÿ

ýüû€ür)   rt   c                 C   s0   |dko|t | jƒk o|dko|t | j| ƒk S )Nr   )r}   rD   )r:   r)   rt   r   r   r   Úis_constrained†  s   ÿþüzQRCode.is_constrainedc                 C   s„   t d| jd ƒD ]}| j| d d urq|d dk| j| d< qt d| jd ƒD ]}| jd | d ur4q(|d dk| jd |< q(d S )Nrp   rq   rr   r   rs   )r:   ru   rv   r   r   r   ri   Ž  s   ýzQRCode.setup_timing_patternc                 C   sÖ   t  | j¡}tt|ƒƒD ]\}|| }tt|ƒƒD ]O}|| }| j| | d ur(qtddƒD ]9}tddƒD ]1}|dksN|dksN|dksN|dksN|dkrZ|dkrZd| j||  || < q4d| j||  || < q4q-qqd S )Néþÿÿÿé   rr   r   TF)r   Úpattern_positionrI   rf   r}   rD   )r:   r¢   re   r)   Újrt   ru   rv   r   r   r   rh   ™  s(   öÿúýz$QRCode.setup_position_adjust_patternc                 C   s    t  | j¡}tdƒD ]}| o||? d@ dk}|| j|d  |d | j d d < q
tdƒD ]}| o:||? d@ dk}|| j|d | j d d  |d < q.d S )Né   rw   rº   rp   )r   ÚBCH_type_numberrI   rf   rD   rU   )r:   rn   Úbitsre   Úmodr   r   r   rk   ²  s   &&þzQRCode.setup_type_numberc                 C   s"  | j d> |B }t |¡}tdƒD ]3}| o||? d@ dk}|dk r)|| j| d< q|dk r7|| j|d  d< q|| j| jd |  d< qtdƒD ];}| oT||? d@ dk}|dk rf|| jd | j| d < qH|dk rx|| jd d| d d < qH|| jd d| d < qH| | j| jd  d< d S )Nrº   é   rw   rq   rp   é	   )rJ   r   ÚBCH_type_inforf   rD   rU   )r:   rn   r%   r   r¿   re   rÀ   r   r   r   rj   ½  s"   
zQRCode.setup_type_infoc                 C   s  d}| j d }d}d}t |¡}t|ƒ}t| j d ddƒD ]b}	|	dkr'|	d8 }	|	|	d f}
	 |
D ]8}| j| | d u rhd}||k rK|| |? d@ dk}|||ƒrS| }|| j| |< |d8 }|dkrh|d7 }d}q0||7 }|dk sv| j |kr~||8 }| }nq.qd S )	Nro   rw   r    r   r¹   rq   TF)rU   r   Ú	mask_funcr}   rf   rD   )r:   r   r%   Úincr)   ÚbitIndexÚ	byteIndexrÄ   Údata_lenrt   Ú	col_rangerv   Údarkr   r   r   rm   Ú  s@   


€éãzQRCode.map_datac                 C   s’   | j du r	|  ¡  | js| jS t| jƒ| jd  }dg| g| j }dg| j }| jD ]}| |ttt |ƒ | ¡ q+|dg| g| j 7 }|S )z¦
        Return the QR Code as a multidimensional array, including the border.

        To return the array without a border, set ``self.border`` to 0 first.
        Nrr   F)	rV   r   rL   rD   r}   r[   r   Úlistr?   )r:   Úwidthr“   Úx_borderÚmoduler   r   r   Ú
get_matrix  s   

zQRCode.get_matrixc                 C   s`   g }t |d |d ƒD ] }t |d |d ƒD ]}| |  ||¡o(t| j| | ƒ¡ qqt|Ž S )Nrw   rr   )rf   r[   r¸   r?   rD   r-   )r:   r)   rt   Úcontextru   rv   r   r   r   Úactive_with_neighbors  s   &ÿzQRCode.active_with_neighbors)r7   N)rX   )Tr'   )NFF)(r<   r=   r>   ÚModulesTyper@   rE   r   r   r
   ÚERROR_CORRECT_Mr$   rA   rO   ÚpropertyrI   Úsetterr%   rN   r   r   ra   rg   rP   rb   r�   r£   r   r	   r   rC   r?   r¸   ri   rh   rk   rj   rm   rÏ   r-   rÑ   r   r   r   r   r   J   sh   
 ù

ú


	



+ÿÿþÿÿþ
3)r   r'   )#rˆ   Úbisectr   Útypingr   r   r   r   r   r   r	   Úqrcoder
   r   r   Úqrcode.image.baser   Úqrcode.image.purer   rË   r?   rÒ   r   Údictr   r@   r   r   r   r&   r,   r-   rA   rC   r   r   r   r   r   Ú<module>   s"   
 $

