U
    9gE                     @   s  d dl Z d dlZzd dlmZ W n   d dlmZ Y nX ze W n ek
rZ   eZY nX G dd dZG dd deZG dd	 d	eZ	G d
d deZ
G dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd dZG dd dZG dd dZG dd dZG d d! d!Zd"d# ed$D Zd%d# ed$D Zed&D ]Zd'e> ee< qled&d$D ]:Zeed(  eed)  A eed*  A eed&  A ee< qed+D ]Zeeee < qG d,d- d-ZG d.d/ d/ZG d0d1 d1ZdS )2    N)zip_longest)izip_longestc                   @   s\   e Zd ZdZdZdZdd Zdd Zedd Z	d	d
 Z
dd Zdd Zdd Zdd ZdS )QRNr   c                 C   s   | j r|  |st|| _d S N)valid
ValueErrordataselfr    r   H/tmp/pip-unpacked-wheel-w2r18j3o/reportlab/graphics/barcode/qrencoder.py__init__*   s    zQR.__init__c                 C   s
   t | jS r   lenr   r
   r   r   r   __len__/   s    z
QR.__len__c                 C   sF   | j d krdS tt| t| j \}}|t| j  t| j d |  S Nr   )bitsdivmodr   sum)r
   qrr   r   r   	bitlength2   s    
zQR.bitlengthc                 C   sV   d|  k rdk r"n n
| j d S |dk r4| j d S |dk rF| j d S td| d S )Nr   
         )      zUnknown version: )
lengthbitsr   )r
   verr   r   r   getLengthBits9   s    


zQR.getLengthBitsc                 C   s
   t | jS r   r   r   r   r   r   	getLengthB   s    zQR.getLengthc                 C   s
   t | jS r   )reprr   r   r   r   r   __repr__E   s    zQR.__repr__c                 C   s2   | | jd | |}|r.| t| j| d S )N   putmoder    r   r   r
   bufferversionZlenbitsr   r   r   write_headerH   s    
zQR.write_headerc                 C   s   |  || tt| jg| j  D ]d}d}d}t| jD ]@}|| d k	r8|t| j9 }|| j|| 7 }|| j	| 7 }q8|
|| q"d S r   )r+   r   iterr   groupranger   charsindexr   r&   )r
   r)   r*   gr   nir   r   r   writeN   s    zQR.write)__name__
__module____qualname__r   r   r-   r   r   propertyr   r    r!   r#   r+   r4   r   r   r   r   r   %   s   
	r   c                   @   s,   e Zd ZedjZdZdZdZ	dZ
dZdS )QRNumberz[0-9]*$
0123456789)r$      r;   r;   r   )r         Nr5   r6   r7   recompilematchr   r/   r   r-   r'   r   r   r   r   r   r9   Z   s   r9   c                   @   s,   e Zd ZedjZdZdZdZ	dZ
dZdS )
QRAlphaNumz[-0-9A-Z $%*+./:]*$z-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:)      r   )	         Nr>   r   r   r   r   rB   b   s   rB   c                   @   s,   e Zd ZdZdZdZdZdd Zdd Zd	S )

QR8bitByte)   r   r$   )rI      rJ   c                 C   s"   t |tr|d| _n|| _d S )Nzutf-8)
isinstanceunicodeencoder   r	   r   r   r   r   p   s    
zQR8bitByte.__init__c                 C   s:   |  || | jD ]"}t|tr(t|}||d qd S )NrI   )r+   r   rK   strordr&   )r
   r)   r*   cr   r   r   r4   v   s
    

zQR8bitByte.writeN)	r5   r6   r7   r   r-   r'   r   r   r4   r   r   r   r   rH   j   s   rH   c                   @   s4   e Zd ZdZdZdZdZdd Zdd Zd	d
 Z	dS )QRKanjirG   r   rI   rI   r   r<   c                 C   s2   z|  || _W n tk
r,   tdY nX d S )NzNot valid kanji)unicode_to_qrkanjir   UnicodeEncodeErrorr   r	   r   r   r   r      s    zQRKanji.__init__c                 C   s`  g }t |D ]L\}}z>|d}ztt|\}}W n tk
rP   |\}}Y nX W nb tk
r } ztd|||d |jd W 5 d }~X Y n( tk
r   td|||d dY nX |d> |B }d|  krdkrn n"|d8 }|d	@ d? d
 |d@  }nRd|  krdkr<n n"|d8 }|d	@ d? d
 |d@  }ntd|||d d|| q|S )Nz	shift-jisZqrkanjir   r$   illegal multibyte sequencerI   i@  i           i@  i  i@  		enumeraterM   maprO   	TypeErrorrU   argsr   appendr
   r   codesr3   rP   der   r   r   rT      s4    
*
zQRKanji.unicode_to_qrkanjic                 C   s(   |  || | jD ]}||d qd S NrG   r+   r   r&   r
   r)   r*   rb   r   r   r   r4      s    
zQRKanji.writeN)
r5   r6   r7   r   r-   r'   r   r   rT   r4   r   r   r   r   rQ   }   s   rQ   c                   @   s<   e Zd ZdZdZdZdZdd Zdd Zd	d
 Z	dd Z
dS )QRHanzirR   r   rG   rS   c                 C   s2   z|  || _W n tk
r,   tdY nX d S )NzNot valid hanzi)unicode_to_qrhanzir   rU   r   r	   r   r   r   r      s    zQRHanzi.__init__c                 C   s`  g }t |D ]L\}}z>|d}ztt|\}}W n tk
rP   |\}}Y nX W nb tk
r } ztd|||d |jd W 5 d }~X Y n( tk
r   td|||d dY nX |d> |B }d|  krdkrn n"|d8 }|d	@ d? d
 |d@  }nRd|  krdkr<n n"|d8 }|d	@ d? d
 |d@  }ntd|||d d|| q|S )Ngb2312Zqrhanzir   r$   rV   rI   i  i  rW   `   rY   i  i  i  rZ   r`   r   r   r   rh      s4    
*
zQRHanzi.unicode_to_qrhanzic                 C   s>   | | jd | dd | |}|r:| t| j| d S )Nr$   r   r%   r(   r   r   r   r+      s
    
zQRHanzi.write_headerc                 C   s(   |  || | jD ]}||d qd S rd   re   rf   r   r   r   r4      s    
zQRHanzi.writeN)r5   r6   r7   r   r-   r'   r   r   rh   r+   r4   r   r   r   r   rg      s   rg   c                   @   s$   e Zd ZdZdZdd Zdd ZdS )QRECI   r   r   r   c                 C   s(   d|  k rdk sn t d|| _d S )Nr   i?B zECI out of range)r   r   r	   r   r   r   r      s    zQRECI.__init__c                 C   sd   |  || | jdkr&|| jd n:| jdkrD|| jdB d n| jdkr`|| jdB d d S )	N   rI   i?  i   rJ   i i      re   r
   r)   r*   r   r   r   r4      s    


zQRECI.writeNr5   r6   r7   r'   r   r   r4   r   r   r   r   rk      s   rk   c                   @   s$   e Zd ZdZdZdd Zdd ZdS )QRStructAppendr;   rm   c                 C   sR   d|  k rdksn t dd|  k r2dks<n t d|| _|| _|| _d S )Nr   rJ   zpart out of range [1,16]ztotal out of range [1,16])r   parttotalparity)r
   rs   rt   ru   r   r   r   r      s    zQRStructAppend.__init__c                 C   s:   |  || || jd || jd || jd d S )Nr$   rI   )r+   r&   rs   rt   ru   rp   r   r   r   r4      s    zQRStructAppend.writeNrq   r   r   r   r   rr      s   	rr   c                   @   s$   e Zd ZdZdZdd Zdd ZdS )QRFNC1FirstrD   rm   c                 C   s   d S r   r   r   r   r   r   r   
  s    zQRFNC1First.__init__c                 C   s   |  || d S r   )r+   rp   r   r   r   r4     s    zQRFNC1First.writeNrq   r   r   r   r   rv     s   rv   c                   @   s(   e Zd ZedjZdZdZdd Z	dS )QRFNC1Secondz^([A-Za-z]|[0-9][0-9])$rE   rm   c                 C   sD   |  || | j}t|dkr,t|d }nt|}||d d S )Nr   d   rI   )r+   r   r   rO   intr&   rf   r   r   r   r4     s    zQRFNC1Second.writeN)
r5   r6   r7   r?   r@   rA   r   r'   r   r4   r   r   r   r   rw     s   rw   c                   @   sx  e 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ddddddgdddddddgdddddddgdddddddgdddddddgdddddddgdddddddggZ
dd Zdd Zdd ZdddddgdddddgdddddgdddddgdddddggZdd Zdd Zdd Zdd ZdZd d! Zd"d# ZdZd$d% Zd&d' Zd(Zd)Zed*d+ Zed,d- ZdS ).QRCodec                 C   s(   || _ || _d | _d| _d | _g | _d S r   )r*   errorCorrectLevelmodulesmoduleCount	dataCachedataList)r
   r*   r{   r   r   r   r      s    zQRCode.__init__c              	   C   sd   t |tr|}n>ttttfD ],}z||}W  qNW q tk
rF   Y qX qt| j| d | _	d S r   )
rK   r   r9   rB   rQ   rH   r   r   r_   r~   )r
   r   ZnewDataconvr   r   r   addData(  s    

zQRCode.addDatac                 C   s   | j | | S r   )r|   )r
   rowcolr   r   r   isDark8  s    zQRCode.isDarkc                 C   s   | j S r   r}   r   r   r   r   getModuleCount;  s    zQRCode.getModuleCountc                 C   st   t ddD ]d}t|| j}tdd |D }d}| jD ]$}|d7 }|||7 }||j7 }q8||d kr
 qpq
|S )Nr   (   c                 s   s   | ]}|j V  qd S r   )	dataCount).0blockr   r   r   	<genexpr>B  s     z+QRCode.calculate_version.<locals>.<genexpr>r   r$   rI   )r.   	QRRSBlockgetRSBlocksr{   r   r   r    r   )r
   r*   rsBlockstotalDataCountlengthr   r   r   r   calculate_version>  s    
zQRCode.calculate_versionc                 C   s(   | j d kr|  | _ | d|   d S )NF)r*   r   makeImplgetBestMaskPatternr   r   r   r   makeL  s    

zQRCode.makec                    s    j d d  _ fddt jD  _ dd   jd d  d jd         ||  j dkr |  j	d krt
 j  j j _	  j	| d S )Nr$      c                    s   g | ]}d g j  qS )Fr   r   xr   r   r   
<listcomp>S  s   z#QRCode.makeImpl.<locals>.<listcomp>r   rl   )r*   r}   r.   r|   setupPositionProbePatternsetupPositionAdjustPatternsetupTimingPatternsetupTypeInfosetupTypeNumberr~   rz   
createDatar{   r   mapData)r
   testmaskPatternr   r   r   r   Q  s$    



zQRCode.makeImplTFc                 C   s   |dkr`dgd | j |d  ||d < |dkrHd| j |d  |d < qd| j |d  |d < n dgd | j |d  ||d < t| jD ]X\}}|| j ||  ||d < |dkrd| j ||  |d < qd| j ||  |d < qd S )Nr   Frl   r   rI   )r|   r[   _positionProbePattern)r
   r   r   r   r   r   r   r   r   m  s      z QRCode.setupPositionProbePatternc                 C   sH   d}d}t dD ]2}| d| t| }|dks:||kr|}|}q|S )Nr   rI   T)r.   r   QRUtilgetLostPoint)r
   ZminLostPointpatternr3   	lostPointr   r   r   r     s    
zQRCode.getBestMaskPatternc                 C   s`   t d| jd D ]}|d dk| j| d< qttddg| jd | jd d| jd < d S )NrI   r   r   rC   TFrJ   )r.   r}   r|   	itertoolsislicecycle)r
   r   r   r   r   r     s     zQRCode.setupTimingPatternc                 C   s   t | j}| jd }t||D ]l\}}|dkrF|dks"||krFq"n||krX|dkrXq"t| jD ]*\}}|| j|| d  |d |d < qbq"d S )NrI   r   r;   )	r   getPatternPositionr*   r}   r   productr[   _positionAdjustPatternr|   )r
   posmaxposr   r   r   r   r   r   r   r     s    
z!QRCode.setupPositionAdjustPatternc                 C   s   t | j}tdD ]>}| o,||? d@ dk}|| j|d  |d | j d d < qtdD ]>}| ot||? d@ dk}|| j|d | j d d  |d < q\d S )N   r   r;   rI   )r   getBCHTypeNumberr*   r.   r|   r}   )r
   r   r   r3   modr   r   r   r     s    &zQRCode.setupTypeNumberc                 C   s"  | j d> |B }t|}tdD ]f}| o8||? d@ dk}|dk rR|| j| d< q |dk rn|| j|d  d< q || j| jd |  d< q tdD ]v}| o||? d@ dk}|dk r|| jd | j| d < q|dk r|| jd d| d d < q|| jd d| d < q| | j| jd  d< d S )Nr;      r   rC   rI   rE   )r{   r   getBCHTypeInfor.   r|   r}   )r
   r   r   r   r   r3   r   r   r   r   r     s"    
zQRCode.setupTypeInfoc           
      c   s  t t| jd ddtddd}ttd| jd tt tdtd| jttd| jf}td	d
 |D }t| j}t	t j
dd
 |D }| jd }|D ]}|| }}|dkrd}n|| jd krd}nd}|| D ]}tdD ]}	||	 }	| jdkr@|dk r$|	| jd kr$qn|dk r@|| jd kr@q||kr|	|kr|dk rr|	dk s|	|ks|	dk r|dk s||ksq|	|fV  qqqd S )Nr   rC   rD   r   rE   rI   rl   c                 s   s   | ]}t t|V  qd S r   )listreversed)r   r   r   r   r   r     s     z*QRCode._dataPosIterator.<locals>.<genexpr>c                 s   s,   | ]$}|d  |d ||d |d  fV  qdS )r   r   Nr   )r   pr   r   r   r     s    rF   r   )r   chainr.   r}   r   tupler   r   r*   setfrom_iterable)
r
   colsZrowsZrrowsZpposr   r   Zrowidxr   rP   r   r   r   _dataPosIterator  sL    



  zQRCode._dataPosIteratorNc                 C   s   | j st|  | _ | j S r   )_dataPosListr   r   r   r   r   r   dataPosIterator  s    zQRCode.dataPosIteratorc                 c   s&   |D ]}dD ]}t ||@ V  qqd S )N)   @       rJ   rI   r$   r   r   )bool)r
   r   bytebitr   r   r   _dataBitIterator  s    zQRCode._dataBitIteratorc                 C   s    | j st| || _ t| j S r   )_dataBitListr   r   r,   r	   r   r   r   dataBitIterator  s    zQRCode.dataBitIteratorc                 C   sP   |  |}t|}t|  |ddD ]$\\}}}||||A | j| |< q&d S )NF	fillvalue)r   r   getMaskr   r   r|   )r
   r   r   r   maskr   r   Zdarkr   r   r   r     s    


zQRCode.mapData   r   c                 C   s   t | |}t }|D ]}|||  qd}|D ]}||j7 }q0| |d krhtd| |d f | d |d kr|dd | d dkr|d q| |d krq|t	j
d | |d krq|t	jd qt	||S )Nr   rI   zcode length overflow. (%d > %d)r$   F)r   r   QRBitBufferr4   r   getLengthInBits	Exceptionr&   putBitrz   PAD0PAD1createBytes)r*   r{   r   r   r)   r   r   r   r   r   r   r     s,    zQRCode.createDatac                    s   d}d}d}d}g }g }|D ]}||j 7 }|j}	|j |	 }
t||	}t||
}|| j|||	   ||	7 }t|
}t|d | d }|	| | d }  }| fddt
|| |D  qdd tt| t| D }|S )Nr   r   c                    s"   g | ]}|d kr  |nd qS )r   )get)r   r3   ZmodPolyr   r   r   5  s   z&QRCode.createBytes.<locals>.<listcomp>c                 S   s"   g | ]}|D ]}|d k	r|qqS r   r   )r   ddrb   r   r   r   r   8  s
      )
totalCountr   maxr_   r)   r   getErrorCorrectPolynomialQRPolynomialr!   r   r.   r   r   r   )r)   r   offsetZ
maxDcCountZ
maxEcCountZtotalCodeCountZdcdataZecdatar   ZdcCountZecCountZrsPolyZrawPolyZrLenZmLenr   r   r   r   r      s6    







 zQRCode.createBytes)r5   r6   r7   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   rz     sP   
	!
rz   c                   @   s   e Zd ZdZdZdZdZdS )QRErrorCorrectLevelr   r   r;   r   N)r5   r6   r7   LMQHr   r   r   r   r   >  s   r   c                   @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
d	S )
QRMaskPatternr   r   r   r;   r$   rD   rC   rl   N)r5   r6   r7   Z
PATTERN000Z
PATTERN001Z
PATTERN010Z
PATTERN011Z
PATTERN100Z
PATTERN101Z
PATTERN110Z
PATTERN111r   r   r   r   r   D  s   r   c                .   @   s  e Zd Zg ddgddgddgddgddgdddgddd	gddd
gdddgdddgdddgdddgddd
dgddddgddddgddddgddddgddddgddddgdddddgdddddgdddddgdddddgdddd d!gddddd"gddddd#gdddddd$gdddddd%gddd&dd'd(gddddd)d*gddd+dd,d-gddddd"d.gddddd#d/gdddddd%d0gdddd1dd2d3gdddddd4d5gdddd d!d6d7gddddd!d-d8gddddd"d.d9gg(Zd:Zd;Zd<Zed=d> Zed?d@ Z	edAdB Z
edCdD ZdEdF dGdF dHdF dIdF dJdF dKdF dLdF dMdF dNZedOdP ZedQdR ZedSdT ZedUdV ZedWdXdWdWdWdXdWdXdXdXdXgfdYdZZed[d\ Zed]d^ Zd_S )`r   rC   r            "   &   ro   *   .      2   6   r   :   >   B   0   F   J   N   8   R   V   Z   H   ^   b   f   P   j   T   n   r   v   z   ~   4   h      l      <   p               L   r                        i7  i%  iT  c                 C   sV   | d> }t |t t j dkrD|t jt |t t j > N }q| d> |B t jA S )Nr   r   )r   getBCHDigitG15G15_MASKr   rb   r   r   r   r     s    

zQRUtil.getBCHTypeInfoc                 C   sP   | d> }t |t t j dkrD|t jt |t t j > N }q| d> |B S )Nr<   r   )r   r  G18r  r   r   r   r     s    

zQRUtil.getBCHTypeNumberc                 C   s"   d}| dkr|d7 }| dL } q|S Nr   r   r   )r   digitr   r   r   r    s
    
zQRUtil.getBCHDigitc                 C   s   t j| d  S Nr   )r   PATTERN_POSITION_TABLE)r*   r   r   r   r     s    zQRUtil.getPatternPositionc                 C   s   | | d dkS Nr   r   r   r3   jr   r   r   <lambda>      zQRUtil.<lambda>c                 C   s   | d dkS r"  r   r#  r   r   r   r%    r&  c                 C   s   |d dkS Nr;   r   r   r#  r   r   r   r%    r&  c                 C   s   | | d dkS r'  r   r#  r   r   r   r%    r&  c                 C   s   | d |d  d dkS Nr   r;   r   r   r#  r   r   r   r%    r&  c                 C   s   | | d | | d  dkS r(  r   r#  r   r   r   r%    r&  c                 C   s    | | d | | d  d dkS r(  r   r#  r   r   r   r%    r&  c                 C   s    | | d | | d  d dkS )Nr;   r   r   r   r#  r   r   r   r%    r&  )r   r   r   r;   r$   rD   rC   rl   c                 C   s
   | j | S r   )r   )clsr   r   r   r   r     s    zQRUtil.getMaskc                 C   s8   t dgd}t| D ]}|t dt|gd}q|S )Nr   r   )r   r.   multiplyQRMathgexp)ZerrorCorrectLengthar3   r   r   r   r     s    z QRUtil.getErrorCorrectPolynomialc                 C   s   d}dg}d }|D ]\}|rjdd t ||D }dd t||ddD }|t|7 }dd t||ddD }|}q|tdd |D 7 }|S )Nr   c                 S   s   g | ]\}}||A qS r   r   r   r-  br   r   r   r     s     z-QRUtil.maskScoreRule1vert.<locals>.<listcomp>c                 S   s(   g | ] \}}|d kr|o"|d  d qS r$   r;   r   r.  r   r   r   r     s    r   c                 S   s    g | ]\}}|rd n|d qS )r   r   r   r.  r   r   r   r     s   c                 S   s    g | ]}|d kr|d  d qS r0  r   )r   r/  r   r   r   r     s      )zipr   r   )r)  r|   scoreZ	lastCountlastRowr   changedZscoresr   r   r   maskScoreRule1vert  s$    zQRUtil.maskScoreRule1vertc           	      C   s   d}|d }|dd  D ]r}|d |d  }}t |dd  |dd  D ]<\}}||  krn|  krn|krzn n|d7 }|| }}qH|}q|S )Nr   r   r;   )r1  )	r)  r|   r2  r3  r   ZlastCol0ZlastCol1Zcol0Zcol1r   r   r   maskScoreRule2  s    ""zQRUtil.maskScoreRule2TFc                 C   sb   t |}d}|D ]L}d}t || }||k r||||  |krR|d7 }||7 }q$|d7 }q$q|S )Nr   r   r   )r   )r)  r|   r   Z
patternlenr2  r   r$  Zmaxjr   r   r   maskScoreRule3hor  s    
zQRUtil.maskScoreRule3horc                 C   s:   t |d }tdd |D }dtd| | d d  S )Nr   c                 s   s   | ]}t |V  qd S r   )r   )r   r   r   r   r   r     s     z(QRUtil.maskScoreRule4.<locals>.<genexpr>r   rx   r   rD   )r   r   abs)r)  r|   Z	cellCountcountr   r   r   maskScoreRule4  s    zQRUtil.maskScoreRule4c                 C   sp   d}||  |j7 }||  t|j 7 }|| |j7 }|| |j7 }|| t|j 7 }|| |j7 }|S r   )r5  r|   r1  r6  r7  r:  )r)  ZqrCoder   r   r   r   r     s    zQRUtil.getLostPointN)r5   r6   r7   r!  r  r  r  r   r   r   r  r   r   classmethodr   r   r5  r6  r7  r:  r   r   r   r   r   r   N  s   






+







   
r   c                   @   s$   e Zd Zedd Zedd ZdS )r+  c                 C   s    | dk rt d|  d t|  S )Nr   zglog())r   	LOG_TABLEr2   r   r   r   glog  s    zQRMath.glogc                 C   s,   | dk r| d7 } q | dkr$| d8 } qt |  S )Nr   rY      )	EXP_TABLEr>  r   r   r   r,    s
    

zQRMath.gexpN)r5   r6   r7   r   r?  r,  r   r   r   r   r+    s   
r+  c                 C   s   g | ]}|qS r   r   r   r   r   r   r     s     r   r@  c                 C   s   g | ]}|qS r   r   r   r   r   r   r     s     rI   r   r$   rD   rC   rY   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r   c                 C   sb   t |dkr tt |d | d}|t |k rF|| dkrF|d7 }q$||d  dg|  | _d S )Nr   /r   )r   r   num)r
   rC  shiftr   r   r   r   r     s    
zQRPolynomial.__init__c                 C   s
   | j | S r   )rC  )r
   r0   r   r   r   r     s    zQRPolynomial.getc                 C   s
   t | jS r   )r   rC  r   r   r   r   r!   "  s    zQRPolynomial.getLengthc                 C   s~   dg|   |   d  }t|   D ]L}t|  D ]:}|||   tt| |t|| N  < q6q&t|dS r  )r!   r.   r+  r,  r?  r   r   )r
   rc   rC  r3   r$  r   r   r   r*  %  s    zQRPolynomial.multiplyc                    sv   |   |  k r| S t| jd t|jd    fddt| j|jD }|| j|  d  7 }t|d|S )Nr   c                    s(   g | ] \}}|t t |  A qS r   )r+  r,  r?  )r   nnenZratior   r   r   1  s   z$QRPolynomial.mod.<locals>.<listcomp>)r!   r+  r?  rC  r1  r   r   )r
   rc   rC  r   rG  r   r   -  s     
zQRPolynomial.modN)r5   r6   r7   r   r   r!   r*  r   r   r   r   r   r     s
   r   c                   @   s*  e Zd Zdddgdddgdddgdddgdddgddd	gddd
gdddgdddgdddgdddgdddgdddgdddgdddgdddgdddgdddgddddddgddddddgddd gddd!gdddgdddgdd"d#gdd$d%gddd&dddgdd'ddd(d&gdd)d*gdd+d,dd-d'gdd(d.dd/dgdd(d&dd/dgdd0d1gd2d3d4dd5d6gdd4ddd6dgdd4ddd6dgddd dd7d8gdd8ddddgd9ddddd:gd9dddddgdd;d<gddddd<d=gddd
dd=d>gd2d4dd?d6dgdd1d@ddAdBgd9d3d4dd5d6gddCd:d9dDdEgdFdGd&dddgddHdIgd?d5d6dd+d,gd?dd:ddJdEgddddddgd2dKdLdd0d1gddMd(dNdOd/gdd4ddNd6dgdd4ddNd6dgdNdPd7ddQdRgdNdOd/dNdSdGgdNdTddFddgdd4dgdNdUd"ddVdWgdFdXdJd2dYdCgdddddd:gd2dJdddCdgddZdIdNd[dgd\dYdCdd]dDgddd
dd=d>gddGd&dddgdNd^d_dd`d)gdd8ddddgddd
dd=d>gddGd&dddgd2dadbddcddgd2ddddedJgddDdEddfd
gdd'ddd(d&gd2dZdIdNd[dgd2dd/dd dGgddTddNddgdddd\ddgddgd1ddKdAgdd dGgddd
d9d=d>gddCdd9dDdgddhdidFdjdkgddYdCgdFdTddddgdd6dgdd`d)dNdldUgdd]dDd&dmdfgddTdd&ddgddJdd&dCdgd9dndAddodpgd9dXdJd&dYdCgddTddddgdqdCdddDdgd?drdsddHdIgd?d]dDddmdfgdFdTdd
ddgd
dJdddCdgd\dcddddtdLgddYdCdd]dDgd	dd
d9d=d>gddCdddDdgd?dldUddudVgd
dXdJd2dYdCgd?dvd>ddTdgddJdd	dCdgd2dndAd\dodpgd2dXdJd>dYdCgddTdd%ddgddJdd%dCdgdFd0d1dFdndAgdEdXdJdFdYdCgddvd>d6dTdgddJdddCdgdNdKdLd\d0d1gdd]dDd\dmdfgddTddddgd>dJdddCdgddKdLd2d0d1gddYdCdwd]dDgdGdTddddgd>dJdd	dCdgddKdLgd\dYdCd>d]dDgd\dTddddgddJdddCdgddKdLdd0d1gd&dYdCdEd]dDgdwdTddddgddJddCdCdgddKdLd9d0d1gd&dYdCd>d]dDgddTddFddgd5dCdddDdgdd`d)dFdldUgdd]dDddmdfgd'dTdd&ddgd
dJdd/dCdgd9d`d)d&dldUgd9d]dDddmdfgdCdTdd\ddgddJddMdCdgddldUddudVgdwdYdCd&d]dDgd$dTdd\ddgddJddCdCdgddldUd.dudVgddYdCdd]dDgdfdTdd&ddgdGdJdddCdgd:dndAddodpgd(d]dDdFdmdfgddTdd
ddgd\dJdddCdgddodpd9dxdygd.d]dDd%dmdfgddTddddgd:dJdd-dCdggZdzd{ Zed|d} Zed~d ZdS )r   r   r      rJ   rG   rE   ,   r   r   r   r   7   r   #   r   rx   r   r   r   ro   r$      r
  r	  C   +   !   r   rF   r<   r   D   r   r   r   1      r=   '   r   y   a   r  r   =   r   r   r  t   r;   r   $   ;   %   W   E   rC      e   Q   3      rI   \   u   ]   r   /      rl   r      k   -      s   r   rD   A   m   r  X   r   r   r  {   c   I   r      r  r   K   r  x         q   r  r  G   r         o      r     r        r  r   r  r         5         w   c                 C   s   || _ || _d S r   )r   r   )r
   r   r   r   r   r   r   0  s    zQRRSBlock.__init__c           
      C   s   t | |}|d kr(td|  d | t|d }g }t|D ]R}||d d  }||d d  }||d d  }t|D ]}	|t || q|q@|S )Nzbad rs block @ version:z/errorCorrectLevel:r;   r   r   r   )r   getRsBlockTabler   r   r.   r_   )
r*   r{   ZrsBlockr   r   r3   r9  r   r   r$  r   r   r   r   4  s     zQRRSBlock.getRSBlocksc                 C   s   |t jkr tj| d d d  S |t jkr@tj| d d d  S |t jkr`tj| d d d  S |t jkrtj| d d d  S d S d S )Nr   r$   r   r   r;   )r   r   r   RS_BLOCK_TABLEr   r   r   )r*   r{   r   r   r   r  D  s    



zQRRSBlock.getRsBlockTableN)r5   r6   r7   r  r   r   r   r  r   r   r   r   r   7  sP    y
r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r   c                 C   s   g | _ d| _d S r   )r)   r   r   r   r   r   r   R  s    zQRBitBuffer.__init__c                 C   s   d dd | jD S )N.c                 S   s   g | ]}t |qS r   )rN   )r   r2   r   r   r   r   W  s     z(QRBitBuffer.__repr__.<locals>.<listcomp>)joinr)   r   r   r   r   r#   V  s    zQRBitBuffer.__repr__c                 C   s&   |d }| j | d|d  ? d@ dkS )NrI   rl   r   )r)   )r
   r0   bufIndexr   r   r   r   Y  s    zQRBitBuffer.getc                 C   s0   t |D ]"}| ||| d ? d@ dk qd S r   )r.   r   )r
   rC  r   r3   r   r   r   r&   ]  s    zQRBitBuffer.putc                 C   s   | j S r   )r   r   r   r   r   r   a  s    zQRBitBuffer.getLengthInBitsc                 C   sV   | j d }t| j|kr$| jd |rD| j|  d| j d ? O  < |  j d7  _ d S )NrI   r   r   r   )r   r   r)   r_   )r
   r   r  r   r   r   r   d  s    
zQRBitBuffer.putBitN)	r5   r6   r7   r   r#   r   r&   r   r   r   r   r   r   r   Q  s   r   )r?   r   r   r   rL   	NameErrorrN   r   r9   rB   rH   rQ   rg   rk   rr   rv   rw   rz   r   r   r   r+  r.   rA  r=  r3   r   r   r   r   r   r   r   <module>   sX   
5-6  !
 0

!  