
    nhZ                         d Z ddlZddlZddlmZ ddl dZdZdZd	Z	d
Z
dZ G d de      Z G d d      Zd Z G d d      ZddZej$                  fdZy)z
Implements the minimal functionality required
to extract a "Workbook" or "Book" stream (as one big string)
from an OLE2 Compound Document file.
    N)unpack   )*s   ࡱc                       e Zd Zy)CompDocErrorN)__name__
__module____qualname__     u/var/www/html/SchoolMeal/SchoolMeal/pds_admin_SchoolMeal/Backend/venv/lib/python3.12/site-packages/excelrd/compdoc.pyr   r      s    r   r   c                   4    e Zd Zdej                  fdZddZy)DirNoder   c                 j   || _         || _        t        d|dd       \  }| _        | _        | _        | _        | _        t        d|dd       \  | _        | _	        |dk(  rd| _
        nt        |d|d	z
   d
      | _
        g | _        d| _        t        d|dd       | _        |r| j                  |       y y )Nz<HBBiii@   P   z<iit   |   r       	utf_16_ler   z<IIIId   )DIDlogfiler   etypecolourleft_DID	right_DIDroot_DID	first_SIDtot_sizenamestrchildrenparenttsinfodump)selfr   dentDEBUGr   cbufsizes         r   __init__zDirNode.__init__#   s    \btBr{]
Y4:t{DM4>4= +1S*F'q=DIDX\2K@DIWd3sm4IIe r   c                 \   t        | j                  d| j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  | j                  | j                         |dk(  r#t        d| j                  | j                         y y )NzbDID=%d name=%r etype=%d DIDs(left=%d right=%d root=%d parent=%d kids=%r) first_SID=%d tot_size=%d
r   ztimestamp infofile)fprintfr   r   r'   r    r"   r#   r$   r*   r)   r%   r&   printr+   )r-   r/   s     r   r,   zDirNode.dump5   s}    LLqHHIIJJMMNNMMKKMMNNMM	
 A:"DKKdllC r   N)r   )r   r   r   sysstdoutr1   r,   r   r   r   r   r   "   s    ()3:: $Dr   r   c                 "   |dk  ry t        | || |   j                         | |   j                  j                  |       || |   _        t        | || |   j
                         | |   j                  dk(  rt        | || |   j                         y y )Nr   r   )_build_family_treer"   r)   appendr*   r#   r    r$   )dirlist
parent_DID	child_DIDs      r   r:   r:   I   s    1}w
GI,>,G,GHJ  ''	2 *GIw
GI,>,H,HIy1$7Iwy/A/J/JK %r   c                   T    e Zd ZdZej
                  ddfdZddZddZd Z	d	 Z
d
 Zy)CompDocz
    Compound document handler.

    :param mem:
      The raw contents of the file, as a string, or as an :class:`mmap.mmap`
      object. The only operation it needs to support is slicing.
    r   Fc                    || _         || _        || _        |dd t        k7  rt	        d      |dd dk7  rt	        d|dd z        t        d|d	d       \  }}|rt        d
|dd|d|       || _        t        d|dd       \  }}|dkD  rt        d|z  |       d}||kD  rt        d|z  |       d}d|z  x| _        }	d|z  | _	        | j                  dk7  s| j                  dk7  r&t        d| j                  | j                  fz  |       t        d|dd       \  }
| _
        }| _        }}}}t        |      dz
  }t        ||	      \  }}|r |dz  }t        dt        |      |	fz  |       || _        || _        t!        j                   ddg      |z  x}| _        |rxt        d|||	| j                  |       t        d||fz  |       t        d|
| j                  | j                  fz  |       t        d ||fz  |       t        d!||fz  |       |	d"z  }d#|z  }d}t%        t        d$|dd             }||z   dz
  |z  }t'        d|d%z
  |z   d&z
  |dz
  z        }d}|dk(  r|t(        t*        dfv rn|}|t(        t*        t,        fvr|dkD  rt        d'||fz  |       ||k\  r%d(||fz  }|dkD  rt        ||       nt	        |      |dk  rt	        d)|z        ||   rt	        d*|||   fz        d||<   |dz  }|r||kD  rt        d+||||||       d|	|z  z   }|j/                  t        |||||	z                 |j1                         }|t(        t*        t,        fvr|r||k7  rt        d,||||||       |r$t        d-t        |      |       t3        |d.|       g | _        d}d}t7        t        |            D ]  } ||    }!|!t*        t(        fv r|!|k\  r/|s!t        d/|       t        d0|!|fz  |       d}t8        || <   d}K|!d1k  rt	        d2|!z        ||!   rt	        d3|!||!   fz        d&||!<   |dz  }|r||kD  rt        d4|||||||!|	       d|	|!z  z   }| j4                  j/                  t        |||||	z                  |rDt        d5t        | j4                        |       t3        | j4                  d.|       t        |       |r|rt        d-t        |      |       t3        |d.|       t7        |t        | j4                              D ]  }"t8        | j4                  |"<    t        d5t        | j4                        |       t3        | j4                  d.|       | j;                  | j                  d| j4                  | j                  | j                  d6d78      }#g }$d9}%t7        dt        |#      d:      D ]*  }&|%dz  }%|$j=                  t?        |%|#|&|&d:z    d|             , |$| _         tC        |$d|$d   jD                         |r|$D ]  }'|'jG                  |        | j@                  d   }(|(jH                  d;k(  sJ |(jJ                  dk  s|(jL                  dk(  rd<| _'        nF| j;                  | j                  d| j4                  |	|(jJ                  |(jL                  d=d"8      | _'        g | _(        |dkD  r|(jL                  dk(  rt        d>|       |(jL                  dkD  r|}|})|dk\  r|)dkD  rz||   rt	        d?|||   fz        d;||<   |)dz  })d||	z  z   }*t%        t        |||*|*|	z                }+| jP                  j/                  |+       | j4                  |   }|dk\  r|)dkD  rz|rt        d@||)fz  |       |)dk(  r	|t(        k(  sJ |r$t        dA|       t3        | jP                  d.|       |rt        dB|       t3        |d|       y y )CNr      zNot an OLE2 compound document      s   z)Expected "little-endian" marker, found %rz<HH   z
CompDoc format: version=0x04xz revision=0xr3   "      zMWARNING: sector size (2**%d) is preposterous; assuming 512 and continuing ...	   zYWARNING: short stream sector size (2**%d) is preposterous; assuming 64 and continuing ...   r      r   z"@@@@ sec_size=%d short_sec_size=%dz	<iiiiiiii,   L   zAWARNING *** file size (%d) not 512 + multiple of sector size (%d)Bz	sec sizesz mem data: %d bytes == %d sectorsz=SAT_tot_secs=%d, dir_first_sec_sid=%d, min_size_std_stream=%dz'SSAT_first_sec_sid=%d, SSAT_tot_secs=%dz)MSATX_first_sec_sid=%d, MSATX_tot_secs=%d   z<%diz<109im   r   zMSATX: sid=%d (0x%08X)z7MSAT extension: accessing sector %d but only %d in filez%MSAT extension: invalid sector id: %dzMSAT corruption: seen[%d] == %dz	[1]===>>>z	[2]===>>>zMSAT: len =
   z8WARNING *** File is truncated, or OLE2 MSAT is corrupt!!z6INFO: Trying to access sector %d but only %d availabler   zMSAT: invalid sector id: %dz)MSAT extension corruption: seen[%d] == %dz	[3]===>>>z
SAT: len =	directory   r'   seen_idr         r   SSCSzHWARNING *** OLE2 inconsistency: SSCS size is 0 but SSAT size is non-zerozSSAT corruption: seen[%d] == %dz&SSAT last sid %d; remaining sectors %dSSATseen))r   ignore_workbook_corruptionr/   	SIGNATUREr   r   r6   memsec_sizeshort_sec_sizedir_first_sec_sidmin_size_std_streamlendivmodmem_data_secsmem_data_lenarrayrZ   listmaxEOCSIDFREESIDMSATSIDextendpop	dump_listSATrangeEVILSID_get_streamr;   r   r<   r:   r$   r,   r    r%   r&   rX   rY   ),r-   r]   r   r/   r[   revisionversionsszssszr^   SAT_tot_secs_unusedSSAT_first_sec_sidSSAT_tot_secsMSATX_first_sec_sidMSATX_tot_secsre   rd   	left_overrZ   nentfmttrunc_warnedMSATSAT_sectors_reqdexpected_MSATX_sectorsactual_MSATX_sectorssidmsgoffsetactual_SAT_sectors
dump_againmsidxmsidsatxdbytesr<   didposdsscs_dirnsecs	start_posnewss,                                               r   r1   zCompDoc.__init__]   sE	   *D'
q8y >??r":$JSQSTVZWXX"5#b*5'.wsm<QT~V 5#b*-	T8_
 C#:k
 D#$8+4i==C4#6#6"#<4tGZGZ7[[ ;Br
+		
"$3x#~#),#A yQMSs8X&'
 +( ;;sQC0=@@ty+sD(D4G4GgV4m7TT[bcO **,,  9&!
  ;'"
  1}tm F7C3K01)D014=!$Q)9C)?$)F)JPTWXPX(Y!Z Q#667A:N#N %Cfgw77 192c3Z?gN-'S%W C qyc0&s++1W&'NQT'TUU9&'HCQUVYQZK['[\\S	$)$14JJ#%(.,$ x#~-F3FVh5F(GHIhhjC fgw77F )-CC &$ -T9dB( 
3t9% %	JE;D(( }$#T[bcP/0$
 $%L%U
"#@4#GHHDz"#NRVX\]aXbQc#cddDJ!#+.>>!$*(& 
 8d?*FHHOOF3FVh5F(GHIK%	JN ,DHHG<dhhG,
 wZ-T9dB(mS]; )!(),DHHG<dhhG, !!HHHHMM"" " 
 CK- 	NC1HCNN73sS3Y(?GLM	N 7Awqz':':; u
 <<?~~"""!X%6%6!%; DI((""!! ) 	DI 	1!2!2a!7Z q $C!E(uqy9&'HCQUVYQZK['[\\S	
#.0	F3I	H8L(MNO		  &hhsm (uqy >#uMT[\A:#-//&w'diiW-&w'dB( r   Nc	                    g }	|}
|y|
dk\  ri|<| j                   |
   rt        d||
| j                   |
   fz        || j                   |
<   ||
|z  z   }|	j                  ||||z           	 ||
   }
|
dk\  ri|
t        k(  sJ |}|
dk\  rw|<| j                   |
   rt        d||
| j                   |
   fz        || j                   |
<   ||
|z  z   }|}||kD  r|}||z  }|	j                  ||||z           	 ||
   }
|
dk\  rw|
t        k(  sJ |dk7  rt        | j                  d||||z
         dj                  |	      S # t        $ r t        d||
fz        w xY w# t        $ r t        d||
fz        w xY w)Nr   %s corruption: seen[%d] == %dz:OLE2 stream %r: sector allocation table invalid entry (%d)z=WARNING *** OLE2 stream %r: expected size %d, actual size %d
r   )rZ   r   r;   
IndexErrorri   r5   r   join)r-   r]   basesatr^   	start_sidsizer'   rU   sectorssr   todograbs                 r   rr   zCompDoc._get_stream  s   <q&&yy|*;tQ		RS>UU  $+DIIaL 1x</	s9y8/CDEAA q& ;;Dq&&yy|*;tQ		RS>UU  $+DIIaL 1x</	$;Ds9y4/?@AAA q&& ;;qyLLT4K xx  I " &TX\^_W`` , " &TX\^_W`` s   *D; 3E ;EE2c                 t   |d   }|dd  }| j                   }||   j                  D ]  }||   j                  j                         |j                         k(  s2||   j                  }|dk(  r||   c S |dk(  r!|st        d      | j                  ||      c S ||   j                  d       t        d       y )Nr   r   r   z"Requested component is a 'storage'z'Requested stream is not a 'user stream')r<   r)   r'   lowerr    r   _dir_searchr,   )r-   pathstorage_DIDheadtaildlchildets           r   r   zCompDoc._dir_search  s    AwABx\\_-- 
	NE%y~~##%5Y__7e9$7*+OPP++D%885	q!"#LMM
	N r   c                    | j                  |j                  d            }|y|j                  | j                  k\  rX| j	                  | j
                  d| j                  | j                  |j                  |j                  ||j                  dz         S | j	                  | j                  d| j                  | j                  |j                  |j                  |dz   d      S )a  
        Interrogate the compound document's directory; return the stream as a
        string if found, otherwise return ``None``.

        :param qname:
          Name of the desired stream e.g. ``'Workbook'``.
          Should be in Unicode or convertible thereto.
        /NrK   rJ   rT   r    (from SSCS))r   splitr&   ra   rr   r]   ro   r^   r%   r   rX   rY   r_   )r-   qnamer   s      r   get_named_streamzCompDoc.get_named_stream  s     U[[-.9::111##

	 $ 	 	 ##				##

^+ $ 	 	r   c                    | j                  |j                  d            }|y|j                  | j                  kD  r%t	        d||j                  | j                  fz        |j                  | j
                  k\  r| j                  | j                  d| j                  | j                  |j                  |j                  ||j                  dz         }| j                  r8t        d| j                         t        | j                   d	| j                         |S | j#                  | j$                  d
| j&                  | j(                  |j                  |j                  |dz   d      d
|j                  fS )aq  
        Interrogate the compound document's directory.

        If the named stream is not found, ``(None, 0, 0)`` will be returned.

        If the named stream is found and is contiguous within the original
        byte sequence (``mem``) used when the document was opened,
        then ``(mem, offset_to_start_of_stream, length_of_stream)`` is returned.

        Otherwise a new string is built from the fragments and
        ``(new_string, 0, length_of_stream)`` is returned.

        :param qname:
          Name of the desired stream e.g. ``'Workbook'``.
          Should be in Unicode or convertible thereto.
        r   N)Nr   r   z7%r stream length (%d bytes) > file data size (%d bytes)rK   rJ   z
seenr3   rH   r   r   )r   r   r&   re   r   ra   _locate_streamr]   ro   r^   r%   r   r/   r6   r   rn   rZ   rr   rX   rY   r_   )r-   r   r   results       r   locate_named_streamzCompDoc.locate_named_stream  s@   " U[[-.9::)))I!**d&7&789  ::111((#txxQZZQVXYX]X]`aXaF zzhT\\2$))R6M   IIII''KKJJN*	 

 r   c	                    |}	|	dk  rt        d|z        d}
d}d}g }d}||z   dz
  |z  }|	dk\  r| j                  |	   re| j                  sYt        d|z  | j                         t        | j                  d	| j                         t        d
||	| j                  |	   fz        || j                  |	<   |dz  }||kD  rt        d|||z  fz        |	|
dz   k(  r||z  }n%|
dk\  r|j                  ||f       ||	|z  z   }||z   }|	}
||	   }	|	dk\  r|	t        k(  sJ ||k(  sJ |s||fS |j                  ||f       dj                  fd|D              d|fS )Nr   z%_locate_stream: start_sid (%d) is -veiiiHr   z_locate_stream(%s): seenr3   rH   r   z,%s: size exceeds expected %d bytes; corrupt?r   c              3   .   K   | ]  \  }}||   y w)Nr   ).0r   end_posr]   s      r   	<genexpr>z)CompDoc._locate_stream.<locals>.<genexpr>L  s     M0B	7S7+Ms   )	r   rZ   r[   r6   r   rn   r;   ri   r   )r-   r]   r   r   r^   r   expected_stream_sizer   rU   r   pr   r   slices	tot_foundfound_limits    `              r   r   zCompDoc._locate_stream  s    q5FRSS		+h6:xG1fyy|664u<4<<PdiiT\\:&'F%QRTXT]T]^_T`Ia'abb"DIIaLNI;&"Be[[cMcEdd  AEz8# 6MM9g"67 1x</	#h.AAA1 1f2 F{{K'''$899y'*+ HHMfMM 
 	
r   )Nr   Nr   )r   r   r   __doc__r7   r8   r1   rr   r   r   r   r   r   r   r   r@   r@   T   s8     %(JJaTY a)F	5!n$!F/b2
r   r@   c                     t        d|d|   fz  d|       | |||z    D ]  }t        t        |      d|        t        |       y Nz%5d%sz = )endr4   r3   r6   r(   )aliststridefdposequalvalues         r   x_dump_liner   S  sM    	'T4;'
'Sq9tdVm, +c%jc*+	qMr   c                      d fd	}d }d }t        dt                     D ]@  }| ||       |} ||z     ||z    k7  s"||z
  kD  r ||z
  d        ||       |}B ||||k7  r ||d       y y y y )Nr   c                     t        d| d|   fz  d       | | z    D ]  }t        t        |      d        t               y r   r   )r   r   r   r   r   r   s      r   
_dump_linezdump_list.<locals>._dump_line[  sN    gtE{++1=4$-0 	/E#e*#A.	/1r   r   )r   r   )rp   rb   )r   r   r   r   r   oldposs   ```   r   rn   rn   Z  s     CFQE
F+ >sOF3v&%&*IIV|f$3<q1sOF co#-3a  3@or   r   )r   rf   r7   structr   timemachiner\   ri   rj   SATSIDrk   rq   	Exceptionr   r   r:   r@   r   r8   rn   r   r   r   <module>r      sw     
   0		
	

	9 	$D $DNL{
 {
~  #zz !r   