o
    ÓèFhN@  ã                   @   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
mZmZ d dl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)	ÚDictÚGenericÚListÚ
NamedTupleÚOptionalÚTypeÚ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   úD/var/www/html/loop/nvenv/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>8   s    z!copy_2d_array.<locals>.<listcomp>r   )Úxr   r   r   Úcopy_2d_array7   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*   )r5   ©Úselfr   r   r   Ú__bool__F   s   zActiveWithNeighbors.__bool__N)Ú__name__Ú
__module__Ú__qualname__ÚboolÚ__annotations__r>   r   r   r   r   r0   ;   s   
 r0   ÚGenericImage)ÚboundÚGenericImageLocalc                   @   sz  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(   rK   Ú
issubclassr   Úclear)r=   rL   rM   rN   rO   rK   r(   r   r   r   Ú__init__R   s   	


zQRCode.__init__r:   c                 C   s   | j d u r	|  ¡  tt| j ƒS r*   )rH   Úbest_fitr
   r   r<   r   r   r   rL   i   s   
zQRCode.versionc                 C   s$   |d urt |ƒ}t |¡ || _d S r*   )r   r   Úcheck_versionrH   )r=   Úvaluer   r   r   rL   o   s   

c                 C   r;   r*   )Ú_mask_patternr<   r   r   r   r(   v   s   zQRCode.mask_patternc                 C   s   t |ƒ || _d S r*   )r)   rV   )r=   Úpatternr   r   r   r(   z   s   
c                 C   s   g g| _ d| _d| _g | _dS )z*
        Reset the internal data.
        r   N)rG   Úmodules_countÚ
data_cacheÚ	data_listr<   r   r   r   rQ      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   ÚQRDatarZ   ÚappendÚextendÚoptimal_data_chunksrY   )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)rL   rS   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 )NrJ   é   c                    s   g | ]}d gˆ j  ‘qS r*   )rX   )r+   Úir<   r   r   r-   ¬   s    ÿz#QRCode.makeImpl.<locals>.<listcomp>r   r#   )rL   rX   r   r/   rG   ÚrangeÚsetup_position_probe_patternÚsetup_position_adjust_patternÚsetup_timing_patternÚsetup_type_infoÚsetup_type_numberrY   r   Úcreate_datarM   rZ   Úmap_data)r=   Útestr(   r   r<   r   rd   ¦   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   rt   é   rJ   TF©ri   rX   rG   )r=   r,   ÚcolÚrÚcr   r   r   rj   Â   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é   rJ   é)   rb   )r   rT   Úmode_sizes_for_versionÚ	BitBufferrZ   ÚputÚmodeÚlenÚwriter   ÚBIT_LIMIT_TABLErM   rL   r   ÚDataOverflowErrorrS   )r=   rc   Ú
mode_sizesÚbufferr   Úneeded_bitsr   r   r   rS   Ö   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   rs   T)ri   rd   r   Ú
lost_pointrG   )r=   Úmin_lost_pointrW   rh   r‡   r   r   r   re   ô   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ú ru   rJ   z[0m
z[1;47m  [40mz  z[1;47m  [0m
)ÚsysÚstdoutÚisattyÚOSErrorrY   r   rX   r�   ri   rG   Úflush)r=   Úoutr‹   Úmodcountrx   ry   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-   5  s    z&QRCode.print_ascii.<locals>.<listcomp>)éÿ   éß   éÜ   éÛ   Tr:   c                    sV   ˆ rˆj rt| |ƒˆˆj  krdS t| |ƒdk st| |ƒˆkr!dS ttˆj|  | ƒS )Nrz   r   )rO   ÚmaxÚminr
   r   rG   )r.   Úy©Úinvertr‘   r=   r   r   Ú
get_module;  s
   z&QRCode.print_ascii.<locals>.get_moduleru   rz   z[48;5;232mz[38;5;255mz[0mÚ
)r‹   rŒ   r�   rŽ   rY   r   rX   Úreverser   ri   rO   r�   r�   )	r=   r�   ÚttyrŸ   Úcodesr    rx   ry   Úposr   rž   r   Úprint_ascii$  s2   



zQRCode.print_asciic                 K   ó   d S r*   r   ©r=   rK   r   r   r   r   r   O  s   zQRCode.make_imagec                 K   r§   r*   r   r¨   r   r   r   r   S  s   c                 K   sè   t | jƒ | jdu r|  ¡  |durt|tƒsJ ‚n| j}|du r/ddlm}m	} |r-|nt
}|| j| j| jfd| ji|¤Ž}|jrkt| jƒD ]#}t| jƒD ]}|jr\|j||| d� qN| j| | ri| ||¡ qNqG|jrr| ¡  |S )zu
        Make an image from the QR Code data.

        If the data has not been compiled yet, make it first.
        Nr   )ÚImageÚPilImageÚqrcode_modules)r   )r!   rN   rY   r   rP   r   rK   Úqrcode.image.pilr©   rª   r   rO   rX   rG   Úneeds_drawrectri   Úneeds_contextÚdrawrect_contextÚdrawrectÚneeds_processingÚprocess)r=   rK   r   r©   rª   Úimrx   ry   r   r   r   r   Y  s<   

ýüû€ür,   rw   c                 C   s0   |dko|t | jƒk o|dko|t | j| ƒk S )Nr   )r€   rG   )r=   r,   rw   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 )Nrs   rt   ru   r   rv   )r=   rx   ry   r   r   r   rl   Š  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éþÿÿÿé   ru   r   TF)r   Úpattern_positionrL   ri   r€   rG   )r=   r¥   rh   r,   Újrw   rx   ry   r   r   r   rk   •  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é   rz   r¶   rs   )r   ÚBCH_type_numberrL   ri   rG   rX   )r=   rq   Úbitsrh   Úmodr   r   r   rn   ²  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¶   é   rz   rt   rs   é	   )rM   r   ÚBCH_type_infori   rG   rX   )r=   rq   r(   r   r»   rh   r¼   r   r   r   rm   ½  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 )	Nrr   rz   r#   r   rµ   rt   TF)rX   r   Ú	mask_funcr€   ri   rG   )r=   r   r(   Úincr,   ÚbitIndexÚ	byteIndexrÀ   Údata_lenrw   Ú	col_rangery   Údarkr   r   r   rp   Ü  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.
        Nru   F)	rY   r   rO   rG   r€   r^   r
   r   rB   )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 )Nrz   ru   )ri   r^   r´   rB   rG   r0   )r=   r,   rw   Úcontextrx   ry   r   r   r   Úactive_with_neighbors  s   &ÿzQRCode.active_with_neighbors)r:   N)r[   )Tr*   )NFF)(r?   r@   rA   ÚModulesTyperC   rH   r   r   r   ÚERROR_CORRECT_Mr   rD   rR   ÚpropertyrL   Úsetterr(   rQ   r   r   rd   rj   rS   re   r’   r¦   r   r   r   rF   rB   r´   rl   rk   rn   rm   rp   rÊ   r0   rÌ   r   r   r   r   r   N   s^   
 ù

ú


	



+ÿÿþ
)-r   r*   )%r‹   Úbisectr   Útypingr   r   r   r   r   r   r	   r
   r   Útyping_extensionsr   Úqrcoder   r   r   Úqrcode.image.baser   Úqrcode.image.purer   rB   rÍ   r   r   rC   r   r!   r"   r)   r/   r0   rD   rF   r   r   r   r   r   Ú<module>   s$   
 ,
