
    Ng$K                        U d Z dZdZddlZddlZddlZddlZddlZddlm	Z	 ddl
m
Z
mZ ddlm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 ej        dd
         dk    rddlmZ nddlmZ ddlmZmZm Z  eee!e!e!f         ee!e!e!f         ee!e!e!f         f         Z"ee#d<   ee!e!e!e!e!e!f         Z$ee#d<   ee         Z%ee&e%f         Z'dee&         dee
         fdZ(de&de&de&fdZ)dNde%dee*         de+fdZ,de%de+fdZ-de%de.fdZ/de+de.fdZ0de%ddfdZ1de%dee+         de+fd Z2de%d!e*de+fd"Z3de%de+fd#Z4d$e"d%e"de"fd&Z5de%ddfd'Z6ed%e&de*fd(            Z7ed%e+de+fd)            Z7ed%e*de*fd*            Z7d%ee*e&e+f         dee*e+f         fd+Z7d,Z8d-9                    e8          Z:d.e:z   d/z   Z;dOd1e&d2e*ddfd3Z<d1e&ddfd4Z=d5e&d6e&d7e&ddfd8Z>d5e&d6e&d7e&ddfd9Z?d:e&d7e&ddfd;Z@d:e&d7e&ddfd<ZAd1e&d=e&ddfd>ZBd1e&d=e&ddfd?ZC	 dPdAe&dBee&ef         dCee&e&f         dDe.ddf
dEZDdFe*de&fdGZE G dH dI          ZFe	 G dJ dK                      ZGejH         G dL dM                      ZIdS )Qz"Utility functions for PDF library.zMathieu Fenniakzbiziqe@mathieu.fenniak.net    N)	dataclass)datetimetimezone)DEFAULT_BUFFER_SIZE)SEEK_CUR)	IOAnyDictListOptionalPatternTupleUnionoverload   )   
   )	TypeAlias   )STREAM_TRUNCATED_PREMATURELYDeprecationErrorPdfStreamErrorTransformationMatrixTypeCompressedTransformationMatrixtextreturnc                    | }| d S | d                                          rd| z   } |                     d          r| dz  } |                     dd                              dd                              dd	          } t          |                     d          |                     d
                    }|dk    r|t          |           dz
  k    r| dz  } dD ]`}	 t          j        | |          }|                     d          r |                    t          j	                  }|c S # t          $ r Y ]w xY wt          d|           )Nr   zD:)Zz0000r   +r   ' -   00)zD:%YzD:%Y%mzD:%Y%m%dz
D:%Y%m%d%HzD:%Y%m%d%H%MzD:%Y%m%d%H%M%SzD:%Y%m%d%H%M%S%zz+0000)tzinfozCan not convert date: )isdigitendswithreplacemaxfindlenr   strptimer   utc
ValueError)r   orgtextifds        H/var/www/html/ai-engine/env/lib/python3.11/site-packages/pypdf/_utils.pyparse_iso8824_dater6   L   s`   G|tAw d{}}Z   <<S!!))#s33;;CDDDDIIcNNDIIcNN++A1uuc$ii!m##  	!$**A }}W%% 3IIX\I22HHH  	 	 	H	 7g77
8
88s   D((
D54D5header1header2c                 6   d}g }| |v r(|                     |                    |                      ||v r(|                     |                    |                     t          |          dk    rt          d| d|d          |t	          |                   S )N)z%PDF-1.3z%PDF-1.4z%PDF-1.5z%PDF-1.6z%PDF-1.7z%PDF-2.0r   zNeither z nor z are proper headers)appendindexr-   r0   r+   )r7   r8   versionspdf_header_indicess       r5   _get_max_pdf_version_headerr>   l   s    H (!!(.."9"9:::(!!(.."9"9:::
!##RGRRGRRRSSSC*++,,    streammaxcharsc                     d}	 |                      d          }|                                s|sn||z  }t          |          |k    rnF|S )a<  
    Read non-whitespace characters and return them.

    Stops upon encountering whitespace or when maxchars is reached.

    Args:
        stream: The data stream from which was read.
        maxchars: The maximum number of bytes returned; by default unlimited.

    Returns:
        The data which was read.

    r?   Tr   )readisspacer-   )r@   rA   txttoks       r5   read_until_whitespacerG      s`     Ckk!nn;;== 	 	s
s88x Jr?   c                 ~    |                      d          }|t          v r|                      d          }|t          v |S )z
    Find and read the next non-whitespace character (ignores whitespace).

    Args:
        stream: The data stream from which was read.

    Returns:
        The data which was read.

    r   )rC   WHITESPACESr@   rF   s     r5   read_non_whitespacerK      s?     ++a..C


kk!nn 

Jr?   c                     t           d         }d}|t           v r#|                     d          }|dz  }|t           v #|dk    S )a  
    Similar to read_non_whitespace, but return a boolean if more than one
    whitespace character was read.

    Args:
        stream: The data stream from which was read.

    Returns:
        True if more than one whitespace was skipped, otherwise return False.

    r   r   )rI   rC   )r@   rF   cnts      r5   skip_over_whitespacerN      sM     a.C
C


kk!nnq 

 7Nr?   valuec                 v    t          t          |                     D ]}| ||dz            }|t          vr dS dS )z
    Check if the given value consists of whitespace characters only.

    Args:
        value: The bytes to check.

    Returns:
        True if the value only has whitespace characters, otherwise return False.

    r   FT)ranger-   rI   )rO   r;   currents      r5   check_if_whitespace_onlyrS      sP     s5zz""  	)*+%%55 &4r?   c                     |                      d          }|                     dd           |dk    r4|dvr2|                      d          }|dk    rt          d          |dv.d S d S d S )Nr      %)   
   r?   zFile ended unexpectedly.)rC   seekr   rJ   s     r5   skip_over_commentrZ      s    
++a..C
KKA
d{{''++a..Cczz$%?@@@ '''' {''r?   regexc                 N   d}	 |                      d          }|s|S |                    ||z             }|h|                     |                                t	          |          t	          |          z   z
  d           ||z   d|                                         }n||z  }|S )z
    Read until the regular expression pattern matched (ignore the match).
    Treats EOF on the underlying stream as the end of the token to be matched.

    Args:
        regex: re.Pattern

    Returns:
        The read bytes.

    r?   T   Nr   )rC   searchrY   startr-   )r@   r[   namerF   ms        r5   read_until_regexrb      s     D	kk"oo 	KLL$$=KK		SYYS%9:A>>>3J!'')),D	 Kr?   to_readc                     |                                  |k     rt          d          |                     | t                     |                     |          }|                     | t                     |S )a  
    Given a stream at position X, read a block of size to_read ending at position X.

    This changes the stream's position to the beginning of where the block was
    read.

    Args:
        stream:
        to_read:

    Returns:
        The data which was read.

    z!Could not read malformed PDF file)tellr   rY   r   rC   )r@   rc   rC   s      r5   read_block_backwardsrf      sh     {{}}w@AAA
KK(###;;wD
KK(###Kr?   c                    g }d}|                                  dk    rt          t                    	 t          t          |                                            }|dk    rnt          | |          }t          |          dz
  }|s-|dk    r||         dvr|dz  }|dk    r
||         dv|dk    rd}|rF|                    ||dz   d                    |dk    r||         dv r|dz  }|dk    r
||         dv n|                    |           |dk    r|                     |dz   t                     nd
                    |ddd                   S )	a  
    Given a byte stream with current position X, return the previous line.

    All characters between the first CR/LF byte found before X
    (or, the start of the file, if no such byte is found) and position X
    After this call, the stream will be positioned one byte after the
    first non-CRLF character found beyond the first CR/LF byte before X,
    or, if no such byte is found, at the beginning of the stream.

    Args:
        stream: StreamType:

    Returns:
        The data which was read.

    Fr   Tr   s   
Nr?   rU   )re   r   r   minr   rf   r-   r:   rY   r   join)r@   line_content
found_crlfrc   blockidxs         r5   read_previous_linern     s   " LJ{{}}9::: )6;;==99a<< %VW55%jj1n 	" ((uSz88q ((uSz88axx!
 	'
 cAgii 0111((uSzW44q ((uSzW44
 &&&!88 KKa***A D 88L2&'''r?   abc                 :    t          fd| D                       S )Nc              3   ^   K   | ]&t          fd t           D                       V  'dS )c              3   f   K   | ]+}t          d  t          |          D                       V  ,dS )c              3   Z   K   | ]&\  }}t          |          t          |          z  V  'd S N)float).0r2   js      r5   	<genexpr>z6matrix_multiply.<locals>.<genexpr>.<genexpr>.<genexpr>J  s7      @@$!Q%((U1XX%@@@@@@r?   N)sumzip)rw   colrows     r5   ry   z,matrix_multiply.<locals>.<genexpr>.<genexpr>J  sB      TTSc@@#c3--@@@@@TTTTTTr?   N)tupler{   )rw   r}   rp   s    @r5   ry   z"matrix_multiply.<locals>.<genexpr>I  sZ         	TTTTCQRGTTTTT     r?   )r~   )ro   rp   s    `r5   matrix_multiplyr   F  s=              r?   c                    d}|                      | d           t          dd          5 }|                    |                     |                     |                    d           |                    |                     |                     ddd           n# 1 swxY w Y   |                      | d           dS )z5Create text file showing current location in context.i  r   zpypdf_pdfLocation.txtwbs   HEREN)rY   openwriterC   )r@   radius	output_fhs      r5   mark_locationr   O  s     F
KK	%t	,	, -	F++,,,   F++,,,- - - - - - - - - - - - - - - KKs   A&BB #B c                     d S ru    rp   s    r5   ord_r   [      Cr?   c                     d S ru   r   r   s    r5   r   r   `  r   r?   c                     d S ru   r   r   s    r5   r   r   e  r   r?   c                 N    t          | t                    rt          |           S | S ru   )
isinstancestrordr   s    r5   r   r   j  s$    !S 1vvHr?   )    rW   rX      	    r?      [   ]r   msg
stacklevelc                 >    t          j        | t          |           d S )N)r   )warningswarnDeprecationWarning)r   r   s     r5   	deprecater   u  s     M#)jAAAAAAr?   c                      t          |           ru   )r   )r   s    r5   deprecationr   y  s    
3

r?   old_namenew_name
removed_inc                 8    t          |  d| d| dd           dS )zIRaise an exception that a feature will be removed, but has a replacement., is deprecated and will be removed in pypdf . Use 	 instead.   Nr   r   r   r   s      r5   deprecate_with_replacementr   }  s>    ffffS[fff	    r?   c                 6    t          |  d| d| d           dS )zMRaise an exception that a feature was already removed, but has a replacement.( is deprecated and was removed in pypdf r   r   Nr   r   s      r5   deprecation_with_replacementr     s:    bbZbbxbbb    r?   r`   c                 2    t          |  d| dd           dS )zFRaise an exception that a feature will be removed without replacement.r   .r   Nr   r`   r   s     r5   deprecate_no_replacementr     s*    PP:PPPRSTTTTTr?   c                 0    t          |  d| d           dS )zJRaise an exception that a feature was already removed without replacement.r   r   Nr   r   s     r5   deprecation_no_replacementr     s'    4NNNNNOOOOOr?   srcc                 T    t          j        |                              |            dS )z
    Use this instead of logger.error directly.

    That allows people to overwrite it more easily.

    See the docs on when to use which:
    https://pypdf.readthedocs.io/en/latest/user/suppress-warnings.html
    N)logging	getLoggererrorr   r   s     r5   logger_errorr     s)     c  %%%%%r?   c                 T    t          j        |                              |            dS )a  
    Use this instead of logger.warning directly.

    That allows people to overwrite it more easily.

    ## Exception, warnings.warn, logger_warning
    - Exceptions should be used if the user should write code that deals with
      an error case, e.g. the PDF being completely broken.
    - warnings.warn should be used if the user needs to fix their code, e.g.
      DeprecationWarnings
    - logger_warning should be used if the user needs to know that an issue was
      handled by pypdf, e.g. a non-compliant PDF being read in a way that
      pypdf could apply a robustness fix to still read it. This applies mainly
      to strict=False mode.
    N)r   r   warningr   s     r5   logger_warningr     s)      c""3'''''r?   F	func_namekwargsaliasesfailc                 &   |                                 D ]{\  }}||v rr|rt          | d| d          ||v rt          |  d| d| d| d| d
          |                    |          ||<   t	          j        | d| dt                     |d	S )
z
    Helper function to deprecate arguments.

    Args:
        func_name: Name of the function to be deprecated
        kwargs:
        aliases:
        fail:

    z# is deprecated as an argument. Use z insteadz received both z and z as an argument. z is deprecated. Use r   )messagecategoryN)itemsr   	TypeErrorpopr   r   r   )r   r   r   r   old_termnew_terms         r5   rename_kwargsr     s    &mmoo  (v &VVHVVV   6!!  / / / / / /$,/ /#/ / /  
  &zz(33F8MVVHVVV+	    r?   bytesc                 f    | dk     r|  dS | dk     r	| dz  ddS | dk     r	| dz  ddS | dz  ddS )	Ni  z Bytei@B z.1fz kBi ʚ;z MBz GBr   )r   s    r5   _human_readable_bytesr     sk    u}}	%-(((((	%-(((((%-(((((r?   c                   .    e Zd ZdZddZddefdZd ZdS )classpropertyz
    Decorator that converts a method with a single cls argument into a property
    that can be accessed directly from the class.
    Nc                     || _         d S ru   fgetselfmethods     r5   __init__zclassproperty.__init__
  s    			r?   r   c                 ,    |                      |          S ru   r   )r   instanceclss      r5   __get__zclassproperty.__get__  s    yy~~r?   c                     || _         | S ru   r   r   s     r5   getterzclassproperty.getter  s    	r?   ru   )__name__
__module____qualname____doc__r   r	   r   r   r   r?   r5   r   r     sa         
    S        r?   r   c                   p    e Zd ZU ddlmZ dZeed<   	 dZe	ed<   	 dZ
ee         ed<   	 d	efd
Zd	efdZdS )Filer   )IndirectObjectr#   r`   r?   dataNindirect_referencer   c           	      t    | j         j         d| j         dt          t	          | j                             dS )Nz(name=z, data: ))	__class__r   r`   r   r-   r   r   s    r5   __str__zFile.__str__&  s>    .)llllDYZ]^b^gZhZhDiDillllr?   c                 l    |                                  d d         dt          | j                   dz   S )NrU   z, hash: r   )r   hashr   r   s    r5   __repr__zFile.__repr__)  s2    ||~~crc"%BTY%B%B%BBBr?   )r   r   r   genericr   r`   r   __annotations__r   r   r   r   r   r   r   r?   r5   r   r     s         ''''''D#NNN D% 480777m m m m mC# C C C C C Cr?   r   c                       e Zd Z ej        d          ZdeddfdZdedee	e
ef                  fdZdedefdZdedefd	ZdS )
Versionz^(\d+)(.*)$version_strr   Nc                 H    || _         |                     |          | _        d S ru   )r   _parse_version
components)r   r   s     r5   r   zVersion.__init__1  s#    &--k::r?   c                 T   |                     d          }g }|D ]}t          j                            |          }|s|                    d|f           ;|                    d          }|                    d          }|d}|                    t          |          |f           |S )Nr   r   r   r   )splitr   COMPONENT_PATTERNmatchr:   groupint)r   r   r   parsed_components	componentr   integer_prefixsuffixs           r5   r   zVersion._parse_version5  s     &&s++
# 		D 		DI-33I>>E !((!Y888"[[^^N[[^^F%!"$$c.&9&96%BCCCC  r?   otherc                 P    t          |t                    sdS | j        |j        k    S )NF)r   r   r   )r   r  s     r5   __eq__zVersion.__eq__D  s)    %)) 	5%"222r?   c                    t          |t                    st          dt          |                     t	          t          | j                  t          |j                            }t          |          D ]F}| j        |         \  }}|j        |         \  }}||k     r dS ||k    r dS ||k     r dS ||k    r dS Gt          | j                  t          |j                  k     S )Nz#Version cannot be compared against TF)r   r   r0   typerh   r-   r   rQ   )r   r  min_lenr2   
self_valueself_suffixother_valueother_suffixs           r5   __lt__zVersion.__lt__I  s    %)) 	RP4;;PPQQQc$/**C0@,A,ABBw 	 	A&*oa&8#J(-(8(;%KK''ttk))uu\))tt|++uu , 4?##c%*:&;&;;;r?   )r   r   r   recompiler   r   r   r   r   r   r   objectboolr  r	   r  r   r?   r5   r   r   -  s        "
>22;C ;D ; ; ; ;!# !$uS#X2G ! ! ! !3F 3t 3 3 3 3
<C <D < < < < < <r?   r   ru   )r   )F)Jr   
__author____author_email__	functoolsr   r  sysr   dataclassesr   r   r   ior   osr   typingr   r	   r
   r   r   r   r   r   r   version_infor   typing_extensionserrorsr   r   r   rv   r   r   r   
StreamTyper   StrByteTyper6   r>   r   r   rG   rK   r  rN   rS   rZ   rb   rf   rn   r   r   r   rI   ri   WHITESPACES_AS_BYTESWHITESPACES_AS_REGEXPr   r   r   r   r   r   r   r   r   r   r   r   total_orderingr   r   r?   r5   <module>r      sb  8 ) ( (
/       				 



  ! ! ! ! ! ! ' ' ' ' ' ' ' ' " " " " " "      
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 BQB7""       ++++++          ',	%
eUE&9 :E%PUBU<VV' )    -2	5%u,- 	    W
CO$9Xc] 9x/A 9 9 9 9@- -s -s - - - -& *  QV    2
 u    "     (E d    $Aj AT A A A AZ  5    4 c e    27(z 7(e 7( 7( 7( 7(t$<   	* 	 	 	 	 	 
C C    
 
E e    
 
C C    
E#sE/" uS%Z'8     3xx,, 33d: B B3 BC B B B B B S  T           QU    3 # 3 SW    U3 UC UD U U U U
PS Pc Pd P P P P
	&c 	& 	& 	& 	& 	& 	&( (# ($ ( ( ( (( SX  cN59#s(^KO	   D) ) ) ) ) )Z       " C C C C C C C C. -< -< -< -< -< -< -< -< -< -<r?   