Ë
    Ã?ÆiÜ  ã                  ób   — d Z ddlmZ ddl­ ddlmZmZ dZ ed«      Z	dd„Z
dd„Zdd	„Zdd
„Zy)a¹  UPN (English Unique Pupil Number).

The Unique Pupil Number (UPN) is a 13-character code that identifies pupils
in English state schools and is designed to aid tracking pupil progress
through the school system.

The number consists of a check letter, a 3-digit LA (Local Authority) number
for the issuing school, a 4-digit DfE number (School Establishment Number),
2 digits for the issue year and 3 digits for a serial number. Temporary
numbers have a 2-digit serial and a letter.

More information:

* https://www.gov.uk/government/publications/unique-pupil-numbers

>>> validate('B801200005001')
'B801200005001'
>>> validate('A801200005001')
Traceback (most recent call last):
    ...
InvalidChecksum: ...
>>> validate('X80120000A001')  # middle part must be numeric
Traceback (most recent call last):
    ...
InvalidFormat: ...
>>> validate('E000200005001')  # LA number must be known
Traceback (most recent call last):
    ...
InvalidComponent: ...
é    )Úannotations)Ú*)ÚcleanÚisdigitsÚ!ABCDEFGHJKLMNPQRTUVWXYZ0123456789)˜éÉ   éÊ   éË   éÌ   éÍ   éÎ   éÏ   éÐ   éÑ   éÒ   éÓ   éÔ   éÕ   i-  i.  i/  i0  i1  i2  i3  i4  i5  i6  i7  i8  i9  i:  i;  i<  i=  i>  i?  i@  iJ  iK  iL  iM  iN  iO  iP  iT  iU  iV  iW  iX  i^  i_  i`  ia  ib  ic  id  ie  if  ig  ir  is  it  iu  i|  i}  i~  i  i€  i†  i‡  iˆ  i‰  iŠ  i¤  i   i!  i"  i#  i%  i&  i'  i(  i*  i+  i,  i-  i/  i0  i5  i6  i7  i9  i:  i>  i?  iC  iD  iE  iH  iI  iM  iN  iR  iS  iT  iW  iX  iY  i\  i]  ia  ib  ic  id  ie  if  ig  ih  ii  ij  il  im  in  io  ip  iq  ir  is  it  iu  iv  iw  ix  iy  iz  i{  i|  i}  i~  i  i€  iŒ  i�  i”  i—  i™  i�  iž  i   i¡  i£  i¥  i§  i¨  i©  iª  c                óR   — t        | d«      j                  «       j                  «       S )zˆConvert the number to the minimal representation. This strips the
    number of any valid separators and removes surrounding whitespace.ú )r   ÚupperÚstrip©Únumbers    úT/var/www/html/myprovider/mon_projet_qr/lib/python3.12/site-packages/stdnum/gb/upn.pyÚcompactr   M   s#   € ô �˜Ó×#Ñ#Ó%×+Ñ+Ó-Ð-ó    c                óX   — t        d„ t        | dd d«      D «       «      dz  }t        |   S )z)Calculate the check digit for the number.c              3  óR   K  — | ]  \  }}|t         j                  |«      z  –— Œ! y ­w)N)Ú	_alphabetÚindex)Ú.0ÚiÚns      r   ú	<genexpr>z#calc_check_digit.<locals>.<genexpr>U   s*   è ø€ ò 8Ù�A�qð ”I—O‘O AÓ&Õ&ñ 8ùs   ‚%'iôÿÿÿNé   é   )ÚsumÚ	enumerater    )r   Úchecks     r   Úcalc_check_digitr+   S   s9   € äñ 8Ü% f¨S¨T l°AÓ6ô8ó 8Ø:<ñ=€Eä�UÑÐr   c                ó
  — t        | «      } t        | «      dk7  r
t        «       ‚t        | dd «      r| d   t        vr
t        «       ‚t        | dd «      t        vr
t        «       ‚t        | dd «      | d   k7  r
t        «       ‚| S )zXCheck if the number is a valid UPN. This checks length, formatting and
    check digits.é   é   éÿÿÿÿé   Nr   )r   ÚlenÚInvalidLengthr   r    ÚInvalidFormatÚintÚ_la_numbersÚInvalidComponentr+   ÚInvalidChecksumr   s    r   Úvalidater8   Z   sƒ   € ô �V‹_€FÜ
ˆ6ƒ{�bÒÜ‹oÐÜ�F˜1˜R�LÔ! V¨B¡Z´yÑ%@Ü‹oÐÜ
ˆ6�!�Aˆ;Óœ{Ñ*ÜÓ Ð Ü˜˜q˜r˜
Ó# v¨a¡yÒ0ÜÓÐØ€Mr   c                óJ   — 	 t        t        | «      «      S # t        $ r Y yw xY w)z#Check if the number is a valid UPN.F)Úboolr8   ÚValidationErrorr   s    r   Úis_validr<   i   s)   € ðÜ”H˜VÓ$Ó%Ð%øÜò Ùðús   ‚ –	"¡"N)r   ÚstrÚreturnr=   )r   r=   r>   r:   )Ú__doc__Ú
__future__r   Ústdnum.exceptionsÚstdnum.utilr   r   r    Úsetr5   r   r+   r8   r<   © r   r   ú<module>rE      sC   ðñ(õ> #ä ß 'ð 0€	ñ
 ð @ó A€ó.óóôr   