+
    j>                      ^ RI Ht ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIt^ RIt^ RIt^ RIHtHt ^ RIHt ^ RIHtHt ^ RIHt ^ RIHt ^ RIHtHtHt 0 Rmt]P>                  ! R	4      t ]P>                  ! R
4      t!]P>                  ! R4      t"Rt#Rt$]! R4      t%Rt&Rt'. ROt(]( U u/ uF+  p V PS                  R^4      ^ ,          PU                  4       V bK-  	  up t+]! RR7       ! R R4      4       t,]! RR7       ! R R4      4       t-]! RR7       ! R R4      4       t.]! RR7       ! R R4      4       t/]! RR7       ! R R4      4       t0]! RR7       ! R R4      4       t1 ! R  R!4      t2R" R# lt3R$ R% lt4R& R' lt5R( R) lt6R* R+ lt7R, R- lt8R. R/ lt9R0 R1 lt:R2 R3 lt;R4 R5 lt<R6 R7 lt=R8 R9 lt>R: R; lt?R< R= lt@RR> R? lltAR@ RA ltBRB RC ltCRD RE ltDRF RG ltERH RI ltFRJ RK ltGRL RM ltHRN RO ltIRP RQ ltJRR RS ltKRT RU ltLRV RW ltMRX RY ltNRZ R[ ltORR\ R] lltPR^ R_ ltQR` Ra ltRRb Rc ltSRd Re ltTRf Rg ltURRh Ri lltVRj Rk ltWRRl Rm lltXRn Ro ltYRp Rq ltZRr Rs lt[Rt Ru lt\Rv Rw lt]RRx Ry llt^Rz R{ lt_RR| R} llt` ! R~ R]4      ta ! R R]4      tbR R ltcR R ltdRR R llteR R ltfR R ltg]hR8X  d   ]i! ]g! 4       4      hR# u up i )    )annotationsN)	dataclassfield)
HTTPStatus)BaseHTTPRequestHandlerThreadingHTTPServer)Path)Any)parse_qs	urlencodeurlparsez+(?i)\bBJ(?:[- _][IVXLCDM]+)?[- _]?(\d{1,4})z(\d+)\s*([vV])?z(?i)\s+copy$i@  i   zD:\manuscrise bolyai ianoszMS_BJ Browserzhttps://www.transkribus.org/.T)slotsc                  ,    ] tR t^Mt$ R]R&   R]R&   RtR# )RootSpecstrlabelr	   path N__name__
__module____qualname____firstlineno____annotations____static_attributes__r       ms_bj_browser\server.pyr   r   M   s    J
Jr   r   c                      ] tR t^St$ R]R&   R]R&   R]R&   R]R&   R]R&   R]R&   R	]R
&   R]R&   R]R&   ]R R l4       t]R R l4       t]R R l4       tRt	R# )
ImageEntryr	   absolute_pathr   archive_labelrelative_path
folder_keyfolder_namefilename
int | Nonemanuscript_number
page_labeltuple[int, int, str]sort_keyc                   V ^8  d   QhRR/#    returnr   r   )formats   "r   __annotate__ImageEntry.__annotate__`   s     B B3 Br   c                	6    R \        RV P                  /4       2# )/image?r   r   resource_keyselfs   &r   	image_urlImageEntry.image_url_   s     FD,=,=#>?@AAr   c                   V ^8  d   QhRR/# r-   r   )r0   s   "r   r1   r2   d   s     J Jc Jr   c                	B    \        V P                  V P                  4      # N)build_resource_keyr"   r#   r7   s   &r   r6   ImageEntry.resource_keyc   s    !$"4"4d6H6HIIr   c                   V ^8  d   QhRR/# r-   r   )r0   s   "r   r1   r2   h   s     C CC Cr   c                	6    R \        RV P                  /4       2# )z/viewer?r   r5   r7   s   &r   
viewer_urlImageEntry.viewer_urlg   s     )VT->->$?@ABBr   r   N)
r   r   r   r   r   propertyr9   r6   rB   r   r   r   r   r    r    S   su    OM!!O""B B J J C Cr   r    c                  Z   ] tR t^lt$ R]R&   R]R&   R]R&   R]R&   R]R&   RtR]R	&   RtR]R
&   ]! ]R7      t	R]R&   ]! ]
R7      tR]R&   ]! ]R7      tR]R&   RtR]R&   RtR]R&   ]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       t]R R l4       tRtR # )!FolderRecordr   keynamer"   r	   r!   r#    section_codethematic_categorydefault_factorylist[ImageEntry]imageszdict[int, list[ImageEntry]]images_by_manuscriptunmatched_imagesdisplay_titlenotesc                   V ^8  d   QhRR/# )r.   r/   	list[int]r   )r0   s   "r   r1   FolderRecord.__annotate__|   s     1 1Y 1r   c                	,    \        V P                  4      # r=   )sortedrP   r7   s   &r   manuscriptsFolderRecord.manuscripts{   s    d//00r   c                   V ^8  d   QhRR/# r.   r/   intr   )r0   s   "r   r1   rV      s        S  r   c                	,    \        V P                  4      # r=   )lenrO   r7   s   &r   image_countFolderRecord.image_count   s    4;;r   c                   V ^8  d   QhRR/# r\   r   )r0   s   "r   r1   rV      s     * * *r   c                	,    \        V P                  4      # r=   )r_   rQ   r7   s   &r   unmatched_countFolderRecord.unmatched_count   s    4(())r   c                   V ^8  d   QhRR/# r.   r/   r'   r   )r0   s   "r   r1   rV      s     - -* -r   c                	@    V P                   pV'       d
   V^ ,          # R# )r   NrY   r8   valuess   & r   first_manuscriptFolderRecord.first_manuscript   s    !!"vay,,r   c                   V ^8  d   QhRR/# rg   r   )r0   s   "r   r1   rV      s     . . .r   c                	@    V P                   pV'       d
   VR,          # R# )   Nri   rj   s   & r   last_manuscriptFolderRecord.last_manuscript   s    !!#vbz--r   c                   V ^8  d   QhRR/# r-   r   )r0   s   "r   r1   rV      s     / / /r   c                	B    V P                   ;'       g    V P                  # r=   )rR   rH   r7   s   &r   effective_titleFolderRecord.effective_title   s    !!..TYY.r   r   N)r   r   r   r   r   rJ   rK   r   listrO   dictrP   rQ   rR   rS   rD   rY   r`   rd   rl   rr   rv   r   r   r   r   rF   rF   l   s    	H
IL#s$T:F:8=d8S5S).t)D&DM3E3O1 1     * * - - . . / /r   rF   c                      ] tR t^t$ R]R&   ]! ]R7      tR]R&   ]! ]R7      t	R]R&   Rt
R	]R
&   RtR	]R&   ]! ]R7      tR]R&   ]! ]R7      tR]R&   ]R R l4       t]R R l4       t]R R l4       tRtR# )ManuscriptRecordr]   numberrL   rN   rO   zset[str]foldersrI   r   titlerS   	list[str]manual_categoriesauto_categoriesc                   V ^8  d   QhRR/# r-   r   )r0   s   "r   r1   ManuscriptRecord.__annotate__   s     ; ; ;r   c                	H    V P                   ;'       g    R V P                   2# )Manuscris BJ-)r~   r|   r7   s   &r   rv    ManuscriptRecord.effective_title   s    zz::}T[[M::r   c                   V ^8  d   QhRR/# r.   r/   r   r   )r0   s   "r   r1   r      s     N NI Nr   c                	B    \        V P                  V P                  4      # r=   )merge_categoriesr   r   r7   s   &r   
categoriesManuscriptRecord.categories   s     4 4d6L6LMMr   c                   V ^8  d   QhRR/# r   r   )r0   s   "r   r1   r      s     , ,Y ,r   c                	,    \        V P                  4      # r=   )rx   r   r7   s   &r   editable_categories$ManuscriptRecord.editable_categories   s    D**++r   r   N)r   r   r   r   r   r   rx   rO   setr}   r~   rS   r   r   rD   rv   r   r   r   r   r   r   r{   r{      s    K$T:F:c2GX2E3OE3O#(#>y>!&t!<OY<; ; N N , ,r   r{   c                  T    ] tR t^t$ R]R&   ]! ]R7      tR]R&   ]R R l4       t	Rt
R	# )
CategoryRecordr   rH   rL   rU   rY   c                   V ^8  d   QhRR/# r\   r   )r0   s   "r   r1   CategoryRecord.__annotate__   s     % %s %r   c                	,    \        V P                  4      # r=   )r_   rY   r7   s   &r   countCategoryRecord.count   s    4##$$r   r   N)r   r   r   r   r   r   rx   rY   rD   r   r   r   r   r   r   r      s(    
I"48K8% %r   r   c                  h    ] tR t^t$ R]R&   R]R&   R]R&   R]R&   R	]R
&   R]R&   R]R&   R]R&   RtR# )IndexSnapshotr	   rootlist[RootSpec]rootszdict[str, FolderRecord]r}   zdict[int, ManuscriptRecord]rY   zdict[str, CategoryRecord]r   r]   total_imagesrQ   r   
scanned_atr   Nr   r   r   r   r   r      s0    
J$$,,))Or   r   c                      ] tR t^tR R ltR R ltR R ltR R ltR	 R
 ltR R lt	R R lt
R R ltR R ltR R ltR%R R lltR R ltR R ltR R lt]R R l4       tR R  lt]R! R" l4       tR#tR$# )&LibraryIndexc                    V ^8  d   QhRRRR/# )r.   r   r	   metadata_pathr   )r0   s   "r   r1   LibraryIndex.__annotate__   s      T $ r   c                	    VP                  4       V n        W n        \        P                  ! 4       V n        R V n        / V n        / V n        V P                  4        R # r=   )
resolver   r   	threadingRLock_lock	_snapshot_roots_by_label_images_by_resource_keyrefresh)r8   r   r   s   &&&r   __init__LibraryIndex.__init__   sC    LLN	*__&
/302>@$r   c                   V ^8  d   QhRR/# r.   r/   Noner   )r0   s   "r   r1   r      s     yB yB yBr   c                	   V P                   ;_uu_ 4        V P                  4       p/ p/ p\        VP                  R . 4      4      p^ p^ p/ p\	        V P
                  4      pV U	u/ uF  qP                  V	P                  bK  	  up	V n        V EFE  p
\        V
P                  P                  4        Uu. uF  qP                  4       '       g   K  VNK  	  upR R7       EF  p\        V
P                  VP                  4      p\        TVP                  V
P                  T\        VP!                  V
P                  4      4      \#        VP                  4      ;'       g    R\%        VP                  4      VR,          P                  V/ 4      P                  RR4      VR,          P                  V/ 4      P                  RR4      R7	      p\        VP'                  R4      R	 R7       EFe  pVP)                  4       '       g   K  VP*                  P-                  4       \.        9  d   KA  \1        WVP                  V4      pVVVP2                  &   VP4                  P7                  V4       V^,          pVP8                  f'   VP:                  P7                  V4       V^,          pK  VP<                  P?                  VP8                  . 4      pVP7                  V4       VP?                  VP8                  \A        VP8                  4      4      pVP4                  P7                  V4       VPB                  PE                  VPF                  4       EKh  	  VP4                  PI                  R R7       VP:                  PI                  R R7       VP<                  PK                  4        F  pVPI                  R R7       K  	  WVPF                  &   EK  	  EKH  	  VPM                  4        EF	  w  ppVP4                  PI                  R R7       VR,          P                  \        V4      / 4      pVP                  RR4      Vn'        VP                  RR4      Vn(        \        VP                  R . 4      4      Vn)        . p\        VPB                  4       F=  pW9   d   VP                  V4      PT                  MRpV'       g   K0  \W        VV.4      pK?  	  VVn,        \W        VVPZ                  4      pEK  	  V Uu/ uF  pV\]        V4      bK  	  ppVPK                  4        FT  pVPZ                   FA  pVP?                  V\]        V4      4      P^                  P7                  VP`                  4       KC  	  KV  	  VPK                  4        F  pVP^                  PI                  4        K  	  \c        V P
                  VV\e        \        VPM                  4       4      4      \e        \        VPM                  4       R R7      4      VVV Pg                  4       R7      V n4        Wpn5        R
R
R
4       R
# u up	i u upi u upi   + '       g   i     R
# ; i)r   c                6    V P                   P                  4       # r=   )rH   loweritems   &r   <lambda>&LibraryIndex.refresh.<locals>.<lambda>   s    TYY__%6r   rG   rI   r}   rR   rS   )	rG   rH   r"   r!   r#   rJ   rK   rR   rS   *c                4    \        V 4      P                  4       # r=   )r   r   r   s   &r   r   r      s    TARr   Nc                J    V P                   ;'       g    R.V P                  O5# 
    ʚ;)r(   r+   r   s   &r   r   r     s    $*@*@*I*IE)ZDMM)Zr   c                6    V P                   P                  4       # r=   )r&   r   r   s   &r   r   r     s    $--BUBUBWr   c                    V P                   # r=   )r+   r   s   &r   r   r     s    DMMr   c                    V P                   ;'       g    RV P                  P                  4       V P                  P                  4       V P                  3# r   )r(   r%   r   r"   r+   r   s   &r   r   r     sC    ..77%((..0**002	&r   rY   r~   c                &    \        V ^ ,          4      # )r   )category_sort_keyr   s   &r   r   r   ?  s    ):47)Cr   )r   r   r}   rY   r   r   rQ   r   )6r   _load_metadatanormalize_categoriesgetdiscover_rootsr   r   r   r   rX   iterdiris_dirbuild_folder_keyrH   rF   r   relative_toextract_folder_section_codeinfer_folder_thematic_categoryrglobis_filesuffixr   IMAGE_EXTENSIONSbuild_image_entryr6   rO   appendr(   rQ   rP   
setdefaultr{   r}   addrG   sortrk   itemsr~   rS   r   rK   r   r   r   r   rY   r|   r   ry   _format_timestampr   r   )r8   metadatar}   rY   r   r   rQ   images_by_resource_keyr   spec	root_specr   folder_pathr$   folderr   entrybucket
manuscriptr   r|   metar   folder_categorycategorycategory_recordsrecords   &                          r   r   LibraryIndex.refresh   sh   ZZZ**,H/1G79K-hll<.LMJL <>""499-EFK#LedJJ		$9e#LD "	#)&/nn&<&<&>P&>d++-TT&>P6$ $K "2)//;CSCS!TJ)&(--&/oo&1&)+*A*A)..*Q&R%@AQAQ%R%X%XVX*HIYIY*Z&.y&9&=&=j"&M&Q&Q+R' 'y155j"EII#RF  !'#))#.4R! !  $||~~$;;,,.6FF$ 1%;3C3CT! FK.u/A/AB,,U3$) 22:"33::5A,1,$!'!<!<!G!G!33R" e,%0%;%;!335EeF]F]5^&
 #))007"**..vzz:;!> MM&&Z '  ++005W0X!'!<!<!C!C!E

'A
B "F*0FJJ'u$ #z '2&7&7&9"
!!&& '   .223v;C#'88GR#8
 #'88GR#8
 /CDHH\[]D^/_
,-/"(););"<JS]Shgkk*&=&O&OnpO&*:?_L]*^ #= .=
*-j*:O:OP
' ':, DN CMx.22:    *002
 * 5 5H$// .":!k&&):):"; !6 3
 +113""'') 4 +YY (9(9(;!<=(..0C *!1113DN ,B(q Z $M Q` } ZZsD   AX;$X,/X;2X1X1O)X;7X;9X6DX;,X;;Y	c                   V ^8  d   QhRR/# )r.   r/   r   r   )r0   s   "r   r1   r   H  s     " "m "r   c                	    V P                   ;_uu_ 4        V P                  f   \        R4      hV P                  uuR R R 4       #   + '       g   i     R # ; i)NzIndexul nu a fost initializat.)r   r   RuntimeErrorr7   s   &r   get_snapshotLibraryIndex.get_snapshotH  s4    ZZZ~~%"#CDD>> ZZZs   %AA	c                    V ^8  d   QhRRRR/# )r.   rG   r   r/   zFolderRecord | Noner   )r0   s   "r   r1   r   N  s     4 4c 4&9 4r   c                	T    V P                  4       P                  P                  V4      # r=   )r   r}   r   )r8   rG   s   &&r   
get_folderLibraryIndex.get_folderN  s"      "**..s33r   c                    V ^8  d   QhRRRR/# )r.   r|   r]   r/   zManuscriptRecord | Noner   )r0   s   "r   r1   r   Q  s     ; ;S ;-D ;r   c                	T    V P                  4       P                  P                  V4      # r=   )r   rY   r   )r8   r|   s   &&r   get_manuscriptLibraryIndex.get_manuscriptQ  s"      "..226::r   c                    V ^8  d   QhRRRR/# )r.   r6   r   r/   ImageEntry | Noner   )r0   s   "r   r1   r   T  s     B Bc B.? Br   c                	    V P                   ;_uu_ 4        V P                  P                  V4      uuR R R 4       #   + '       g   i     R # ; ir=   )r   r   r   )r8   r6   s   &&r   	get_imageLibraryIndex.get_imageT  s+    ZZZ//33LA ZZZs	   ;A	c                    V ^8  d   QhRRRR/# )r.   imager    r/   z0tuple[ImageEntry | None, ImageEntry | None, str]r   )r0   s   "r   r1   r   X  s     "7 "7"7	9"7r   c                	   V P                  4       p. pR pVP                  eI   VP                  P                  VP                  4      pV'       d   VP                  pRVP                   2pV'       g   VP
                  P                  VP                  4      pV'       d`   VP                  f   VP                  pRVP                   2pM5VP                  P                  VP                  . 4      pRVP                   2pVP                  pRpRp	\        V4       FT  w  rVP                  V8w  d   K  V
^ 8  d   W:^,
          ,          pV
^,           \        V4      8  d   W:^,           ,          p	 M	  WV3# )zNavigare in folderNzNavigare in cota BJ-z+Navigare in imaginile neclare din folderul zNavigare in folderul )r   r(   rY   r   rO   r}   r$   rQ   rH   rP   r6   	enumerater_   )r8   r   snapshotsequencescope_labelr   r   r6   previous_image
next_imageindex	candidates   &&          r   get_viewer_navigation"LibraryIndex.get_viewer_navigationX  sW    $$&%'*"".!--11%2I2IJJ%,, 4U5L5L4MN%%))%*:*:;F**2%66H$OPVP[P[}"]K%::>>u?V?VXZ[H$9&++"GK)),0(,
 )( 3E%%5qy!)!)!4qy3x=(%ai0
 !4 ;66r   c                    V ^8  d   QhRRRR/# )r.   r6   r   r/   Path | Noner   )r0   s   "r   r1   r   |  s     	: 	:# 	:+ 	:r   c                	>   \        V4      w  r#V'       d   W P                  9  d   R # V P                  V,          V,          P                  4       p VP                  V P                  V,          4       TP                  4       '       d   T# R #   \         d     R # i ; ir=   )parse_resource_keyr   r   r   
ValueErrorr   )r8   r6   r"   r#   r  s   &&   r   resolve_relative_path"LibraryIndex.resolve_relative_path|  s    '9,'G$5I5I I))-8=HQQS		!!$"6"6}"EF &--//y9T9  		s   "B BBc                    V ^8  d   QhRRRR/# )r.   rH   r   r/   zlist[FolderRecord]r   )r0   s   "r   r1   r     s     
 
 
1C 
r   c                	    V P                  4       p\        VP                  P                  4        Uu. uF  q3P                  V8X  g   K  VNK  	  upR  R7      # u upi )c                j    V P                   P                  4       V P                  P                  4       3# r=   )r"   r   rH   r   s   &r   r   3LibraryIndex.find_folders_by_name.<locals>.<lambda>  s%     4 4 : : <fkk>O>O>QRr   r   )r   rX   r}   rk   rH   )r8   rH   r   r   s   &&  r   find_folders_by_name!LibraryIndex.find_folders_by_name  sQ    $$&"*"2"2"9"9";S";{{d?RVV";SR
 	
Ss   A	Ac               (    V ^8  d   QhRRRRRRRR/# )r.   rG   r   rR   rS   r/   boolr   )r0   s   "r   r1   r     s)       C  PT r   c                	   V P                   ;_uu_ 4        V P                  4       pR VP                  4       RVP                  4       /pVR ,          '       g   VR,          '       d   WTR,          V&   MVR,          P                  VR4       V P	                  V4       V P                  4         RRR4       R#   + '       g   i     R# ; i)rR   rS   r}   NT)r   r   strippop_write_metadatar   )r8   rG   rR   rS   r   payloads   &&&&  r   save_folder_metadata!LibraryIndex.save_folder_metadata  s    ZZZ**,H!4!4!6G ''77+;+;+2#C(#''T2  *LLN ZZZs   AB7&AB77C	c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r.   r|   r]   r~   r   rS   categories_rawr
   r/   r  r   )r0   s   "r   r1   r     s<        	
  
r   c                	N   V P                   ;_uu_ 4        V P                  4       p\        V4      pR VP                  4       RVP                  4       RV/pVR ,          '       g   VR,          '       g   VR,          '       d   WuR,          \	        V4      &   M"VR,          P                  \	        V4      R4       \        VP                  R. 4      V P                  V4      4      VR&   V P                  V4       V P                  4         RRR4       R#   + '       g   i     R# ; i)r~   rS   r   rY   NT)r   r   r   r  r   r  r   r   _categories_used_in_metadatar  r   )r8   r|   r~   rS   r!  r   r   r  s   &&&&&   r   save_manuscript_metadata%LibraryIndex.save_manuscript_metadata  s     ZZZ**,H-n=JjG
 w77#3#3w|7L7L7>'F4'++CK>%5\2.11(;&H\"   *LLN% ZZZs   AD3DBDD$	c                    V ^8  d   QhRRRR/# )r.   r!  r
   r/   r  r   )r0   s   "r   r1   r     s     	 	c 	d 	r   c                	   V P                   ;_uu_ 4        V P                  4       p\        \        V4      V P	                  V4      4      VR &   V P                  V4       V P                  4         RRR4       R#   + '       g   i     R# ; i)r   NT)r   r   r   r   r#  r  r   )r8   r!  r   s   && r   save_categoriesLibraryIndex.save_categories  sf    ZZZ**,H%5$^411(;&H\"   *LLN ZZZs   AA99B
	c                    V ^8  d   QhRRRR/# )r.   category_rawr
   r/   r  r   )r0   s   "r   r1   r     s        r   c           	     	T   \        V4      pV'       g   R # V P                  ;_uu_ 4        V P                  4       p\        VP	                  R. 4      VV P                  V4      4      VR&   V P                  V4       V P                  4         RRR4       R#   + '       g   i     R# ; i)Fr   NT)r   r   r   r   r   r#  r  r   )r8   r+  r   r   s   &&  r   add_categoryLibraryIndex.add_category  s    ),7
ZZZ**,H%5\2.11(;&H\"
   *LLN ZZZs   A"BB'	c                   V ^8  d   QhRR/# )r.   r/   dict[str, Any]r   )r0   s   "r   r1   r     s     
 
 
r   c                	   V P                   P                  4       '       g	   R / R/ R. /#  \        P                  ! V P                   P	                  RR7      4      p\        T\        4      '       g	   R / R/ R. /# R \        TP                  R / 4      4      R\        TP                  R/ 4      4      R\        TP                  R. 4      4      /#   \        P
                   d    R / R/ R. /u # i ; i)r}   rY   r   utf-8encoding)
r   existsjsonloads	read_textJSONDecodeError
isinstancery   r   r   )r8   datas   & r   r   LibraryIndex._load_metadata  s    !!((**r="lBGG	H::d00::G:LMD $%%r="lBGGtDHHY344 ;<.txxb/IJ
 	
	 ## 	Hr="lBGG	Hs   0C C+*C+c                    V ^8  d   QhRRRR/# )r.   r   r0  r/   r   r   )r0   s   "r   r1   r     s      ~ ) r   c                	    . pV P                  R / 4      p\        V\        4      '       g   V# VP                  4        F6  p\        V\        4      '       g   K  \	        WP                  R. 4      4      pK8  	  V# )rY   r   )r   r:  ry   rk   r   )r   r   rY   r   s   &   r   r#  )LibraryIndex._categories_used_in_metadata  sh     "
ll="5+t,,&&(D$%%-j((<QS:TU
 ) r   c                    V ^8  d   QhRRRR/# )r.   r  r0  r/   r   r   )r0   s   "r   r1   r     s     
 
~ 
$ 
r   c                	    V P                   P                  P                  R R R7       V P                   P                  \        P
                  ! VR^R7      RR7       R# )T)parentsexist_okF)ensure_asciiindentr2  r3  N)r   parentmkdir
write_textr6  dumps)r8   r  s   &&r   r  LibraryIndex._write_metadata  sM    !!''t'D%%JJwU1= 	& 	
r   c                   V ^8  d   QhRR/# r-   r   )r0   s   "r   r1   r     s     < <s <r   c                 	L    ^ RI H p  V P                  4       P                  R4      # )r   datetimez%Y-%m-%d %H:%M:%S)rN  nowstrftimerM  s    r   r   LibraryIndex._format_timestamp  s    %||~&&':;;r   )r   r   r   r   r   r   NrI   )r   r   r   r   r   r   r   r   r   r   r  r  r  r  r$  r(  r-  r   staticmethodr#  r  r   r   r   r   r   r   r      sz    yBv"4;B"7H	:
6	
  
 < <r   r   c                    V ^8  d   QhRRRR/# )r.   r&   r   r/   r   )r0   s   "r   r1   r1     s     0 0c 0c 0r   c                t    \        V 4      P                  p\        P                  R V4      P	                  4       # rR  )r	   stemCOPY_SUFFIX_REsubr  )r&   bases   & r   clean_base_namerZ    s-    >Db$'--//r   c                    V ^8  d   QhRRRR/# )r.   r   r   r/   r   )r0   s   "r   r1   r1     s     > >s >s >r   c                p    V P                  R 4      p\        V4      ^8  d   R P                  VRR 4      # T # )-N)splitr_   join)r   partss   & r   archive_short_labelrb    s4    KKE#&u:?388E"#J==r   c               $    V ^8  d   QhRRRRRR/# )r.   r"   r   r%   r/   r   )r0   s   "r   r1   r1     s!     - -C -c -c -r   c                    V  R V 2# )::r   )r"   r%   s   &&r   r   r     s    _B{m,,r   c               $    V ^8  d   QhRRRRRR/# )r.   r"   r   r#   r/   r   )r0   s   "r   r1   r1     s!     , ,c ,# ,# ,r   c                4    VP                  R R4      pV  RV 2# )\/re  )replace)r"   r#   
normalizeds   && r   r>   r>     s%    &&tS1J_Bzl++r   c                    V ^8  d   QhRRRR/# )r.   r6   r   r/   ztuple[str | None, str]r   )r0   s   "r   r1   r1     s     = =S =-C =r   c                    R V 9  d   RV 3# V P                  R ^4      w  rWP                  R\        P                  4      3# )re  Nri  )r_  rj  ossep)r6   r"   r#   s   &  r   r  r    sD    <\!!#/#5#5dA#> M//RVV<<<r   c                    V ^8  d   QhRRRR/# )r.   valuer   r/   r   )r0   s   "r   r1   r1     s     ! !c !c !r   c                    \         P                  ! R R\        T ;'       g    R4      4      P                  R4      pT;'       g    R# )z[^A-Za-z0-9._-]+_rI   z._downloadrerX  r   r  )rq  cleaneds   & r   safe_download_namerx    s9    ff(#s5;;B/?@FFtLG  j r   c                   V ^8  d   QhRR/# )r.   r/   r	   r   )r0   s   "r   r1   r1     s     F Ft Fr   c                 l    \        \        4      P                  4       P                  R ,          R,          # )r;  zmetadata.json)r	   __file__r   rF  r   r   r   default_metadata_pathr|    s%    >!!#**V3oEEr   c                    V ^8  d   QhRRRR/# )r.   portr]   r/   r   )r0   s   "r   r1   r1     s     	 	 	 	r   c                     \        V 4      p^Tu;8:  d   R8:  g   M \        R 4      hT#   \        \        3 d   p\        R 4      ThRp?ii ; i)z2Port invalid. Foloseste un numar intre 1 si 65535.Ni  )r]   	TypeErrorr  )r~  rq  excs   &  r   validate_portr    sZ    D	
 MNNL z" @
	s   + AAAc               $    V ^8  d   QhRRRRRR/# )r.   certfiler
  keyfiler/   ztuple[Path | None, Path | None]r   )r0   s   "r   r1   r1   )  s&     / /// %/r   c                   V f   Vf   R# V f   \        R4      h\        V 4      P                  4       P                  4       pVP	                  4       '       d   VP                  4       '       g   \        RV 24      hR pVeb   \        V4      P                  4       P                  4       pVP	                  4       '       d   VP                  4       '       g   \        RV 24      hW#3# )NzBPentru HTTPS trebuie specificat cel putin fisierul certificatului.zFisier certificat invalid: zFisier cheie privata invalid: NN)r  r	   
expanduserr   r5  r   )r  r  resolved_certfileresolved_keyfiles   &&  r   validate_tls_filesr  )  s     GOP
 	
 X113;;=##%%->-F-F-H-H67H6IJKK$(=335==?&&((0@0H0H0J0J=>N=OPQQ..r   c               $    V ^8  d   QhRRRRRR/# )r.   schemer   r~  r]   r/   r   )r0   s   "r   r1   r1   @  s!     * *C *s *s *r   c                    V  R V 2# )z://127.0.0.1:r   )r  r~  s   &&r   build_local_urlr  @  s    X]4&))r   c               (    V ^8  d   QhRRRRRRRR/# )r.   r  r   hostr~  r]   r/   r   )r0   s   "r   r1   r1   D  s(     ' 'C 's '# '# 'r   c                    V  R V RV 2# )z://:r   )r  r  r~  s   &&&r   build_bound_urlr  D  s    XSav&&r   c               $    V ^8  d   QhRRRRRR/# )r.   r  r   enabledr  r/   r   )r0   s   "r   r1   r1   H  s&     I IC I$ I4 Ir   c                X    V'       g   R # V P                  4       P                  4       R9  # )F>   	localhost::1	127.0.0.1)r  r   )r  r  s   &&r   should_configure_firewallr  H  s#    ::<'HHHr   c                    V ^8  d   QhRRRR/# )r.   r~  r]   r/   r   r   )r0   s   "r   r1   r1   N  s     ? ?S ?S ?r   c                ,    \          R \        V 4       R2# ) z/TCP)FIREWALL_RULE_PREFIXr  )r~  s   &r   firewall_rule_namer  N  s    "#1]4%8$9>>r   c                   V ^8  d   QhRR/# )r.   r/   r  r   )r0   s   "r   r1   r1   R  s      $ r   c                     \         P                  R 8w  d   R#  ^ RIp \        V P                  P
                  P                  4       4      #   \         d     R# i ; i)ntFN)rn  rH   ctypesr  windllshell32IsUserAnAdmin	Exception)r  s    r   is_windows_adminr  R  sH    	ww$FMM))779:: s   0A
 
AAc               $    V ^8  d   QhRRRRRR/# )r.   r~  r]   	rule_name
str | Noner/   ztuple[bool, str]r   )r0   s   "r   r1   r1   ]  s+     B B
BB Br   c           
     
   \        V 4      p\        P                  R 8w  d   R# \        4       '       g   R# T;'       g    \	        V4      pRRV 2.p\
        P                  ! RRRRR	R
V 2.VORRRRRR7       \
        P                  ! RRRRR	R
V 2RR.VORNRNRRRRRR7      pVP                  ^ 8X  d	   RRV R23# VP                  ;'       g    VP                  P                  4       pV'       d   RV 2MRpRRV RV 23# )r  TFzprotocol=TCPz
localport=netshadvfirewallfirewalldeleterulezname=r2  rj  )capture_outputtextr4  errorscheckr   zdir=inzaction=allowzprofile=anyz
enable=yesz$Firewall Windows configurat: portul z%/TCP este permis pentru acces extern.z
 Detalii: rI   zCFirewall-ul Windows nu a putut fi configurat automat pentru portul z/TCP.)TzGConfigurarea automata a firewall-ului este disponibila doar pe Windows.)FzFirewall-ul Windows nu a putut fi configurat automat. Porneste scriptul ca Administrator pentru a deschide portul in Windows Firewall.)r  rn  rH   r  r  
subprocessrun
returncodestderrstdoutr  )r~  r  validated_portresolved_rule_namecommon_argsresultdetailsr   s   &&      r   ensure_windows_firewall_ruler  ]  s    #4(N	ww$^^
 	
 #HH&8&H
^$%K NN&'(	
 	
   ^^&'(	
 	
 	
 	
 %F( A2>2BBgh
 	

 }}--446G'.z'#BF
MnM]]bcibjk r   c                    V ^8  d   QhRRRR/# )r.   	base_pathr	   r/   r   r   )r0   s   "r   r1   r1     s      d ~ r   c                l   V P                  4       p . p\        V P                  R 4      4       FI  pVR,          pVP                  4       '       g   K$  VP	                  \        VP                  V4      4       KK  	  V'       d   V# V P                  R8X  d8   V P                  4       '       d"   \        V P                  P                  V 4      .# V R,          P                  4       '       d   \        V P                  V R,          4      .# V P                  4       '       d   \        V P                  V 4      .# . # )zMS_BJ-20260520T083533Z-*MS_BJ)r   rX   globr   r   r   rH   rF  )r  matchesr  r   s   &   r   r   r     s    !!#IGINN+EFG	7";;==NN8INND9: H ~~ Y%5%5%7%7))..	:;;G##%%W)<=>>344Ir   c                    V ^8  d   QhRRRR/# )r.   r   r	   r/   r   )r0   s   "r   r1   r1     s        r   c                   \        V 4      P                  4       P                  4       pVP                  4       '       d   VP	                  4       '       g   \        R V 24      h\        V4      '       g   \        RV 24      hV# )zDirector invalid: z-Nu am gasit directoare sursa indexabile sub: )r	   r  r   r5  r   r  r   )r   r  s   & r   validate_rootr    sw    T
%%'//1IY%5%5%7%7-i[9::)$$;I;G
 	
 r   c                    V ^8  d   QhRRRR/# )r.   r&   r   r/   z'tuple[int | None, re.Match[str] | None]r   )r0   s   "r   r1   r1     s     & & &0W &r   c                    \         P                  \        V 4      4      pV'       g   R# \        VP	                  ^4      4      V3# )Nr  )MANUSCRIPT_REsearchrZ  r]   group)r&   matchs   & r   extract_manuscript_numberr    s8      !:;Eu{{1~%%r   c               (    V ^8  d   QhRRRRRRRR/# )r.   r&   r   r(   r'   r  zre.Match[str] | Noner/   r   )r0   s   "r   r1   r1     s*        L` eh r   c                >   \        V 4      pVe   Vf   R# W2P                  4       R  p\        P                  ! RV R2RV4      p. p\        P                  V4       F/  w  rg\        V4       V'       d   RMR 2pVP                  V4       K1  	  RP                  V4      # )NrI   z(?i)\bz[_-]v, )	rZ  endrv  rX  PAGE_REfindallr]   r   r`  )	r&   r(   r  rY  tailtokenspage_numberversotokens	   &&&      r   extract_page_labelr    s    8$D EM		D66V-.d3R>DF%ood3{#$ESr$:;e 4 99Vr   c               $    V ^8  d   QhRRRRRR/# )r.   r&   r   r)   r/   r*   r   )r0   s   "r   r1   r1     s"     7 7C 7S 75I 7r   c                    \         P                  V4      pV'       g   R^ V P                  4       3# \        VP	                  ^4      4      pVP	                  ^4      '       d   ^M^ pW4V P                  4       3# r   )r  r  r   r]   r  )r&   r)   r  r  
verso_ranks   &&   r   page_sort_keyr    s^    NN:&Eq(..*++ekk!n%Kkk!nn!JX^^%566r   c          
     ,    V ^8  d   QhRRRRRRRRRR	/# )
r.   r   r   r$   r   r%   r   r	   r/   r    r   )r0   s   "r   r1   r1     s:        	
 r   c                   \        VP                  4      w  rE\        VP                  WE4      p\        VV P                  \        VP                  V P                  4      4      VVVP                  VV\        VP                  V4      R 7	      # ))	r!   r"   r#   r$   r%   r&   r(   r)   r+   )	r  rH   r  r    r   r   r   r   r  )r   r$   r%   r   r(   r  r   s   &&&&   r   r   r     sv      9Ctyy*;CEoo$**9>>:;+tyy%0
 
r   c                    V ^8  d   QhRRRR/# )r.   numbersrU   r/   r   r   )r0   s   "r   r1   r1     s     N Ni NC Nr   c                    V '       g   R # \        V 4      ^8:  d   RP                  R V  4       4      # RV ^ ,           RV R,           R\        V 4       R2# )zfara manuscrise detectater  c              3  ,   "   T F
  pR V 2x  K  	  R# 5i)BJ-Nr   .0r|   s   & r   	<genexpr>+compact_manuscript_label.<locals>.<genexpr>  s     >gF3vhgs   r  z ... BJ- (z detectate)rq   )r_   r`  )r  s   &r   compact_manuscript_labelr    sP    *
7|qyy>g>>>HWR[MCL>MMr   c                    V ^8  d   QhRRRR/# r.   rq  r
   r/   r   r   )r0   s   "r   r1   r1     s     D D3 D3 Dr   c                v    \         P                  ! R R\        T ;'       g    R4      4      P                  R4      # )z\s+r  rI   z 	
,;ru  rq  s   &r   normalize_category_namer    s+    66&#s5;;B/066{CCr   c                    V ^8  d   QhRRRR/# )r.   rq  r   r/   r'   r   )r0   s   "r   r1   r1     s      s z r   c                   V '       d,   \         P                  ! R V P                  4       4      '       g   R# R^R^R^
R^2R^dRRR	R
/p^ p^ p\        V P                  4       4       F%  pW,          pWS8  d   W%,          pK  W%,          pTpK'  	  V# )z
[IVXLCDM]+NIVXLCDi  Mi  )rv  	fullmatchupperreversed)rq  roman_valuestotalprevious	charactercurrents   &     r   parse_roman_numeralr    s    ]EKKMBB 	QQRRSSTL EHekkm,	)EEH - Lr   c                    V ^8  d   QhRRRR/# )r.   r   r   r/   r*   r   )r0   s   "r   r1   r1     s     - - -(< -r   c                    \        V 4      p\        P                  ! R V\        P                  4      pV'       d1   \	        VP                  ^4      4      pVe   ^ W1P                  4       3# ^RVP                  4       3# )z^([IVXLCDM]+)\.\s+r   )r  rv  r  
IGNORECASEr  r  casefold)r   rk  r  numeral_values   &   r   r   r     sh    (2JHH*JFE+EKKN;$}&9&9&;<<uj))+,,r   c                    V ^8  d   QhRRRR/# )r.   r%   r   r/   r  r   )r0   s   "r   r1   r1   !  s     " "S "Z "r   c                    \         P                  ! R \        V 4      4      pV'       g   R# VP                  ^4      P	                  4       # )z(?i)^BJ\s+([IVXLCDM]+)\bN)rv  r  r  r  r  )r%   r  s   & r   r   r   !  s6    HH02I+2VWE;;q>!!r   c                    V ^8  d   QhRRRR/# )r.   r%   r   r/   r   )r0   s   "r   r1   r1   (  s     6 6 6 6r   c                X    \        V 4      pV'       g   R # \        P                  VR 4      # rR  )r   SECTION_CATEGORY_MAPr   )r%   rJ   s   & r   r   r   (  s%    .{;L##L"55r   c                    V ^8  d   QhRRRR/# )r.   rawr
   r/   r   r   )r0   s   "r   r1   r1   /  s      c i r   c                \   . p\        V \        4      '       d   \        P                  ! R V 4      pM\        V \        \
        \        34      '       dc   V  F[  p\        V\        4      '       d)   VP                  \        P                  ! R V4      4       KA  VP                  \        V4      4       K]  	  MV '       d   \        V 4      .p. p\        4       pV FR  p\        V4      pV'       g   K  VP                  4       pWd9   d   K0  VP                  V4       VP                  V4       KT  	  V# )z[\n,;]+)r:  r   rv  r_  rx   tupler   extendr   r  r
  r   )r  r   r   r  seenrk  rG   s   &      r   r   r   /  s    E#sS)	C$s+	,	,D$$$RXXj$78SY'	 
 
S
FUD,T2
!!#;j!  Mr   c                    V ^8  d   QhRRRR/# )r.   groupsr
   r/   r   r   )r0   s   "r   r1   r1   J  s     
 
c 
i 
r   c                     . p\        4       pV  FO  p\        V4       F=  pVP                  4       pWR9   d   K  VP                  V4       VP	                  V4       K?  	  KQ  	  V# r=   )r   r   r
  r   r   )r  mergedr  r  r   rG   s   *     r   r   r   J  sX    FUD(/D--/C{HHSMMM$ 0  Mr   c               $    V ^8  d   QhRRRRRR/# )r.   r   r   linkedr  r/   r   r   )r0   s   "r   r1   r1   W  s!      y $ # r   c           	         V '       g   R # . pV  FW  pV'       d/   VP                  R\        RV/4       R\        V4       R24       K9  VP                  R\        V4       R24       KY  	  RP                  V4      # )z)<span class='muted'>fara categorie</span>z<a class='badge-link' href='/?r   '></a>z<span class='badge-chip'>z</span>rI   )r   r   escaper`  )r   r  badgesr   s   &&  r   render_category_badgesr"  W  s{    :FMM0J;Q1R0SSUV\]eVfUggkl MM5fX6F5GwOP  776?r   c               $    V ^8  d   QhRRRRRR/# )r.   datalist_idr   r   r   r/   r   )r0   s   "r   r1   r1   e  s&     H H# H9 H Hr   c                j    V'       g   R # R P                  R V 4       4      pR\        V 4       RV R2# )rI   c              3  @   "   T F  pR \        V4       R2x  K  	  R# 5i)<option value='z'></option>N)r   )r  r   s   & r   r  +render_category_datalist.<locals>.<genexpr>h  s"      HRH/&*+;7
s   z<datalist id='r  z</datalist>)r`  r   )r$  r   optionss   && r   render_category_datalistr*  e  s@    gg HR G F;/07);GGr   c                    V ^8  d   QhRRRR/# r  r   )r0   s   "r   r1   r1   n  s     H H# H# Hr   c                \    \         P                  ! V f	   RRR7      # \        V 4      RR7      # )NrI   T)quote)htmlr   r   r  s   &r   r   r   n  s%    ;;U]r$GGE
$GGr   c                    V ^8  d   QhRRRR/# )r.   r  r   r/   r   )r0   s   "r   r1   r1   r  s      s s r   c                   V P                  4       '       g   R # . pV P                  4       P                  4        F;  pVP                  4       pV'       g   K  VP                  R\        V4       R24       K=  	  RP	                  V4      # )z.<p class='muted'>Nu exista notite salvate.</p>z<p></p>rI   )r  
splitlinesr   r   r`  )r  
paragraphsblocks   &  r   paragraphizer5  r  sj    ::<<?J((*5F5M?$78 + 77:r   c                    V ^8  d   QhRRRR/# )r.   statusr   r/   r   )r0   s   "r   r1   r1   }  s     9 9 9 9r   c                    R RRRRRRRRR	R
RRRRRRRRR/
pVP                  V 4      pV'       g   R# R\        V4       R2# )	refreshedzIndexul a fost reimprospatat.folder-savedz(Modificarile folderului au fost salvate.manuscript-savedz+Modificarile manuscrisului au fost salvate.categories-savedz"Lista de categorii a fost salvata.category-addedzCategoria noua a fost adaugata.folder-openedz&Folderul a fost trimis catre Explorer.invalid-folderzFolderul cerut nu exista.invalid-categoryz,Introdu o categorie noua inainte de salvare.invalid-manuscriptzManuscrisul cerut nu exista.zinvalid-image!Imaginea ceruta nu a fost gasita.rI   z<div class='flash'>z</div>)r   r   )r7  mappingmessages   &  r   build_status_messagerE  }  so    4BI@;A5J<<G kk&!G  188r   c                    V ^8  d   QhRRRR/# )r.   activer   r/   r   )r0   s   "r   r1   r1     s        r   c                    . ROp. pV F4  w  r4pW08X  d   RMRpVP                  RV RV R\        V4       R24       K6  	  RP                  V4      # )	rY   znav-link activeznav-linkz
<a class='z' href='r  r  rI   ))rY   ri  
Manuscrise)r}   /foldersFoldere)r   /categories	Categorii)	unmatched
/unmatchedNeclare)r   r   r`  )rG  r   linksrG   hrefr   
class_names   &      r   navrT    s`    E E!5*--&Z
z*XdV2fUm_DQR " 775>r   c          
     ,    V ^8  d   QhRRRRRRRRRR/# )r.   r~   r   rG  content
extra_headr/   bytesr   )r0   s   "r   r1   r1     s/     *$ *$# *$s *$S *$c *$5 *$r   c           	     f    R \        V 4       RV R\        V4       RV R2	pVP                  R4      # )z<!doctype html>
<html lang="ro">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>z></title>
  <link rel="stylesheet" href="/static/style.css">
  a9  
</head>
<body>
  <div class="page-shell">
    <header class="topbar">
      <div class="brand">
        <div class="brand-mark">BJ</div>
        <div>
          <h1>Arhiva manuscriselor</h1>
          <p>Index local, ordonat dupa numarul manuscrisului</p>
        </div>
      </div>
      <nav class="main-nav">z</nav>
    </header>
    <main>a  </main>
  </div>
  <script>
    document.querySelectorAll('[data-filter-input]').forEach((input) => {
      const targetId = input.getAttribute('data-filter-input');
      const target = document.getElementById(targetId);
      if (!target) return;
      const items = [...target.querySelectorAll('[data-search]')];
      input.addEventListener('input', () => {
        const query = input.value.trim().toLowerCase();
        items.forEach((item) => {
          const haystack = item.getAttribute('data-search') || '';
          item.style.display = !query || haystack.includes(query) ? '' : 'none';
        });
      });
    });
  </script>
</body>
</html>
r2  )r   rT  encode)r~   rG  rV  rW  documents   &&&& r   layoutr\    sT    

 - ,  ![M *) +(HR ??7##r   c                    V ^8  d   QhRRRR/# )r.   r   r   r/   r   r   )r0   s   "r   r1   r1     s      ] s r   c                   \        V P                  4      p\        V P                  4      p\        V P                  4      pR \	        V P
                  P                  4       R\	        \        V P
                  4      4       R\	        V P                  4       R\        V P                  4       RV RV RV RV P                   RV P                   R	2# )
zc
<section class="hero">
  <div class="hero-copy">
    <p class="eyebrow">Baza de lucru</p>
    <h2>!</h2>
    <p class="detail-path">z</p>
    <p>Scanare facuta la z. Interfata combina toate pachetele detectate si afiseaza manuscrisele in ordine, folderele sursa si fisierele neclare separat.</p>
  </div>
  <div class="hero-stats">
    <div class="stat"><span>z@</span><small>pachete</small></div>
    <div class="stat"><span>zC</span><small>manuscrise</small></div>
    <div class="stat"><span>zB</span><small>categorii</small></div>
    <div class="stat"><span>z@</span><small>foldere</small></div>
    <div class="stat"><span>z@</span><small>imagini</small></div>
    <div class="stat"><span>z8</span><small>neclare</small></div>
  </div>
</section>
)r_   r}   rY   r   r   r   rH   r   r   r   r   rQ   )r   folder_countmanuscript_countcategory_counts   &   r   render_summaryrc    s    x''(L8//0,,-N	 
""	#$ %"3x}}#567 8 !4!456 7 !01 2-. /+, -)N +%223 4%667 8 r   c               (    V ^8  d   QhRRRRRRRR/# )r.   r   r   r7  r   selected_categoryr/   rX  r   )r0   s   "r   r1   r1     s8     iB iBiB%(iB=@iB
iBr   c                   V'       d   W P                   9  d   R p. pV P                  P                  4        Uu. uF  pV'       d   W$P                   9   g   K  VNK!  	  ppR.pV P                    F:  pWr8X  d   RMR pVP                  R\	        V4       RV R\	        V4       R24       K<  	  V'       d   R\	        V4       R2MR	p	V EF$  p. p
. p\        VP                  4       F  pV P                  V,          pVP                   R
\        VP                  4       2pVP                  V4       V
P                  R\        RVP                  /4       R\	        V4       R24       K  	  \	        VP                  R,          \        VP                  4      ^Z8  d   RMR ,           4      p\        VP                   4      pRP                  \!        VP"                  4      VP$                  VP                  RP                  V4      RP                  VP                   4      .4      P'                  4       pTP                  R\	        V4       R\        RVP"                  /4       RVP"                   R\	        VP$                  ;'       g    R4       RT R\        VP(                  4       R\        VP                  4       RRP                  V
4      ;'       g    R RT;'       g    R R24       EK'  	  R\+        V4       R\-        V 4       RT	 RR P                  V4       RR P                  V4      ;'       g    R R 2p\/        R!R"V4      # u upi )#rI   z+<option value=''>Toate categoriile</option>z	 selectedr'  '>z	</option>z'<p class='muted'>Filtru activ: <strong>z</strong></p>zN<p class='muted'>Poti combina cautarea libera cu filtrarea dupa categorii.</p> | z#<a class='mini-link' href='/folder?rG   r  r  NZ   N...r  
<tr data-search="z2">
  <td><a class="strong-link" href="/manuscript?r|   ">BJ-</a></td>
  <td>z
fara titlu</td>
  <td><span class="muted">-</span></td>
</tr>

z
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Navigare principala</p>
      <h3>Lista manuscriselor</h3>
      a  
    </div>
    <form method="post" action="/refresh">
      <input type="hidden" name="next" value="/">
      <button class="button button-secondary" type="submit">Refresh index</button>
    </form>
  </div>
  <div class="toolbar">
    <input class="search-input" data-filter-input="manuscripts-table" type="search" placeholder="Cauta dupa numar, folder, titlu sau notite">
    <form class="toolbar-form" method="get" action="/">
      <select class="select-input" name="category">
        a  
      </select>
      <button class="button button-secondary" type="submit">Filtreaza</button>
    </form>
    <a class="button button-link" href="/folders">Vezi folderele</a>
    <a class="button button-link" href="/categories">Gestioneaza categoriile</a>
    <a class="button button-link" href="/unmatched">Vezi cazurile neclare</a>
  </div>
  <div class="table-wrap">
    <table id="manuscripts-table" class="data-table">
      <thead>
        <tr>
          <th>Manuscris</th>
          <th>Titlu</th>
          <th>Categorii</th>
          <th>Imagini</th>
          <th>Foldere</th>
          <th>Sursa</th>
          <th>Notite</th>
        </tr>
      </thead>
      <tbody>
        zQ<tr><td colspan="7">Nu au fost gasite manuscrise pentru filtrul curent.</td></tr>1
      </tbody>
    </table>
  </div>
</section>
zArhiva manuscriselorrY   )r   rY   rk   r   r   rX   r}   rH   rb  r"   r   rG   rS   r_   r"  r`  r   r|   r~   r   rO   rE  rc  r\  )r   r7  re  rowsr   rY   category_optionsr   selectedselected_hintfolder_linksfolder_search_bitsrG   r   r   rS   category_badgessearch_blobrV  s   &&&                r   render_manuscripts_pager}    s    .6I6IID #..5577J $59N9N$N 	
7  
 FF''"*"?;RfX./q
!F8<L;MYW	
 (  2&9J2K1LMZ] 
 "
*,,-C%%c*F{{m3':6;O;O'P&QRE%%e,5i

@S6T5UUWX^_dXeWffjk	 . z'',Z=M=M9NQS9SY[\]01F1FGhhJ%%&    +,../
 %' 	 	%& '0098ZEVEV:W0X/YY^_i_p_p^q rj..,/0 1 
: 
:  
xx??!?@ A.../ 0
	
+ "Ff     o 	 
!	"# $	, 
	m	mmn oS.G^ (-AAEs   M
M
M
c               $    V ^8  d   QhRRRRRR/# r.   r   r   r7  r   r/   rX  r   )r0   s   "r   r1   r1   O  s&     M< M<- M< M< M<r   c                   \        V P                  P                  4       R  R7      p. pV EF  pVP                  '       d   RVP                   R2MRp\	        \        VP                  4      4      p\	        VP                  R,          \        VP                  4      ^Z8  d   RMR,           4      pVP                  '       d   \        VP                  .4      MRpTP                  R	\	        VP                   R
VP                   R
VP                   R
VP                   R
VP                   R
R
P                  R VP                   4       4       2P!                  4       4       R\#        RVP$                  /4       R\	        VP                  4       R\	        \'        VP                  4      4       R\	        VP                  ;'       g    R4       RT RT RVP(                   RT RT;'       g    R R24       EK  	  R\+        V4       R\-        V 4       RRP                  V4      ;'       g    R R2p	\/        RRV	4      # )c                    V P                   e   ^ M^V P                   ;'       g    RV P                  P                  4       3# )Nr   )rl   rH   r   r  s   &r   r   %render_folders_page.<locals>.<lambda>R  s8    ((4A!##,,uKK
r   r   z<span class='warning-chip'>z neclare</span>z"<span class='ok-chip'>curat</span>rj  rl  rI   z<span class='muted'>-</span>rm  r  c              3  8   "   T F  p\        V4      x  K  	  R # 5ir=   r   )r  ns   & r   r  &render_folders_page.<locals>.<genexpr>h  s=       Ko  \n  WX  LO  PQ  LR  LR  \n   z.">
  <td><a class="strong-link" href="/folder?rG   ">ro  rp  r]  rq  rr  rs  a  
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Structura de foldere</p>
      <h3>Foldere sursa</h3>
    </div>
    <form method="post" action="/refresh">
      <input type="hidden" name="next" value="/folders">
      <button class="button button-secondary" type="submit">Refresh index</button>
    </form>
  </div>
  <div class="toolbar">
    <input class="search-input" data-filter-input="folders-table" type="search" placeholder="Cauta dupa nume, titlu, numere sau notite">
    <a class="button button-link" href="/">Inapoi la manuscrise</a>
  </div>
  <div class="table-wrap">
    <table id="folders-table" class="data-table">
      <thead>
        <tr>
          <th>Folder</th>
          <th>Arhiva</th>
          <th>Titlu afisat</th>
          <th>Categorie tematica</th>
          <th>Manuscrise detectate</th>
          <th>Imagini</th>
          <th>Status</th>
          <th>Notite</th>
        </tr>
      </thead>
      <tbody>
        z0<tr><td colspan="8">Nu exista foldere.</td></tr>rt  zFoldere manuscriser}   )rX   r}   rk   rd   r   r  rY   rS   r_   rK   r"  r   rH   r"   rR   r`  r   r   rG   rb  r`   rE  rc  r\  )
r   r7  ordered_foldersru  r   issuespreviewrS   rK   rV  s
   &&        r   render_folders_pager  O  s   !
O D! %%% *&*@*@)AQ5 	
 1&2D2DEFv||C(S5F5KEQSTU ''' #F$<$<#=>/ 	
 	FKK=&*>*>)?qAUAU@VVWX^XpXpWqqrsyss  sA  AB  CF  CK  CK  Ko  \b  \n  \n  Ko  Co  Bp  q  w  w  y  z  { {,,5ufjj6I,J+K2fU[U`U`NaMb c!&"6"6789 :f""))c*+ , i  h .../ 0	
 "8f    	> 
	L	LLM NC&GN &	7;;r   c               (    V ^8  d   QhRRRRRRRR/# )	r.   r   rF   r   r   r7  r   r/   rX  r   )r0   s   "r   r1   r1     s/     a? a?| a?} a?c a?V[ a?r   c                2   R P                  R V P                   4       4      ;'       g    RpV P                  '       d   \        V P                  .4      MRp. pV P                   F^  pV P                  V,          pVP                  R\        RV/4       RV R\        V4       RR P                  R	 V 4       4       R
2	4       K`  	  R pV P                  '       d4   RV P                   RR P                  R V P                   4       4       R
2pR P                  . RN\        V4       NRN\        V P                  4       NRN\        V P                  4       NRN\        \        V P                  4      4       NRN\        \        V P                   4      4       NRNV NRNV NRN\        V P"                  4       NRN\        RV P"                  /4       NRNV P$                   NRN\        V P                  4       NRN\        V P"                  4       NRN\        RV P"                  /4       NRN\        V P&                  4       NRN\        V P(                  4       NRNR P                  V4       NRNV NRN4      p	\+        RV P,                   2R V	4      # )!rI   c              3  J   "   T F  pR \        RV/4       RV R2x  K  	  R# 5iz(<a class='badge-link' href='/manuscript?r|   z'>BJ-r  Nr   r  s   & r   r  %render_folder_page.<locals>.<genexpr>  s5       (F 39h=O3P2QQVW]V^^bc(   !#z;<span class='muted'>Nu au fost detectate manuscrise.</span>zB<span class='muted'>Fara categorie tematica dedusa automat.</span>z
<section class="panel manuscript-group">
  <div class="panel-head compact">
    <div>
      <p class="eyebrow">Manuscris din folder</p>
      <h3><a class="strong-link" href="/manuscript?r|   rn  2</a></h3>
    </div>
    <span class="count-chip">8 imagini</span>
  </div>
  <div class="image-grid">
    c              3  <   "   T F  p\        VR R7      x  K  	  R# 5iF)show_folderNrender_image_cardr  r   s   & r   r  r         MfUu%88f   
  </div>
</section>
z
<section class="panel">
  <div class="panel-head compact">
    <div>
      <p class="eyebrow">Necesita verificare</p>
      <h3>Imagini neclare</h3>
    </div>
    <span class="warning-chip">z8 fisiere</span>
  </div>
  <div class="image-grid">
    c              3  <   "   T F  p\        VR R7      x  K  	  R# 5ir  r  r  s   & r   r  r         ^F]Uu%88F]r  rs  zn
<section class="hero detail-hero">
  <div class="hero-copy">
    <p class="eyebrow">Folder sursa</p>
    <h2>z)</h2>
    <p class="detail-path">Arhiva: r  z!)</p>
    <p class="detail-path"> </p>
    <div class="badge-row">z"</div>
    <div class="badge-row">a  </div>
  </div>
  <div class="hero-actions">
    <a class="button button-link" href="/folders">Inapoi la foldere</a>
    <a class="button button-link" href="/">Inapoi la manuscrise</a>
    <form method="post" action="/folder/open">
      <input type="hidden" name="key" value="z9">
      <input type="hidden" name="next" value="/folder?rG   aM  ">
      <button class="button button-secondary" type="submit">Deschide in Explorer</button>
    </form>
  </div>
</section>
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Editare locala</p>
      <h3>Descriere folder</h3>
    </div>
    <div class="panel-meta">
      <span class="count-chip">/ imagini</span>
      <span class="count-chip">z manuscrise</span>
    </div>
  </div>
  <form class="edit-form" method="post" action="/folder/edit">
    <input type="hidden" name="key" value="z7">
    <input type="hidden" name="next" value="/folder?zd">
    <label>
      <span>Titlu afisat</span>
      <input type="text" name="display_title" value="z" placeholder="Ex: Studii geometrice, caiet mixt">
    </label>
    <label>
      <span>Notite</span>
      <textarea name="notes" rows="4" placeholder="Noteaza aici ce contine folderul, exceptii sau observatii.">zi</textarea>
    </label>
    <button class="button" type="submit">Salveaza</button>
  </form>
</section>
zFolder r}   )r`  rY   rK   r"  rP   r   r   r_   rQ   rd   rE  r   rv   r"   rb  r   r!   rG   r`   rR   rS   r\  rH   )
r   r   r7  manuscript_badgesthematic_badgesr  r|   rO   rN  rV  s
   &&&       r   render_folder_pager    s     ((   G G 
G  ### 	 8 89:Q  F$$,,V44
 5>x>P4Q3RRWX^W_ `!&k] + WWMfMMN O	
 %& I  !' 6 67 8 WW^fF]F]^^_ `	0 0  0f 0	0
 
&&	'(0
)$0 %+6+?+?$@#A0 BD0 EKK^_e_s_sKtDuCv0w0 #3v';';#<=>0?0 ,,0-0 ..0/.0 /5VZZ.@-A0B70  8A%AT7U6V!0 W !08 !' 2 239084 90: !$F$6$6 78;0:9,;0B -36::,>+?C0B@5C0D 6?vzz?R5S4TE0DU6E0J 7=V=Q=Q6R5SK0JTpK0R qww}  xD  xD  qE  pFS0RFS0\  ]0\]0^ _0^_0Gb GFKK=)9g>>r   c               (    V ^8  d   QhRRRRRRRR/# )	r.   r   r{   r   r   r7  r   r/   rX  r   )r0   s   "r   r1   r1     s7     ZO ZO'7 ZO= ZOZ] ZObg ZOr   c                :  a / pV P                    F.  pVP                  VP                  . 4      P                  V4       K0  	  \	        R \        SP                  4      4      p. p\        V4       F  pSP                  V,          pW7,          p	VP                   R\        VP                  4       2p
VP                  R\        RVP                  /4       R\        V
4       R\        V	4       RRP!                  R V	 4       4       R	2	4       K  	  RP!                  . R
N\#        V4       NRNV P$                   NRN\        V P&                  ;'       g    R4       NRN\)        V P                  4       NRNRP!                  V3R l\        V P                  4       4       4       NRN\        RV P$                  /4       NRN\*         NRN\        V P                   4       NRN\        V P                  4       NRNV P$                   NRN\        RV P$                  /4       NRN\        V P&                  4       NRN\        RP!                  V P,                  4      4       NRNV P.                  '       d   R\)        V P.                  RR7       R2MR NR N\)        \        SP                  4      RR7       NR!NV NR"N\        V P0                  4       NR#N\3        V P0                  4       NR$NRP!                  V4       NR
N4      p\5        R%V P$                   2R&V4      # )'zmanuscript-categories-listri  z
<section class="panel manuscript-group">
  <div class="panel-head compact">
    <div>
      <p class="eyebrow">Sursa</p>
      <h3><a class="strong-link" href="/folder?rG   r  r  r  rI   c              3  <   "   T F  p\        VR R7      x  K  	  R# 5ir  r  r  s   & r   r  )render_manuscript_page.<locals>.<genexpr>  r  r  r  rs  zn
<section class="hero detail-hero">
  <div class="hero-copy">
    <p class="eyebrow">Manuscris</p>
    <h2>BJ-z</h2>
    <p>zFara titlu salvat inca.r  z)</div>
    <div class="badge-row">
      c              3     <"   T Fo  pR \        RV/4       R\        SP                  V,          P                  R,           \	        SP                  V,          P
                  4      ,           4       R2x  Kq  	  R# 5i)z$<a class='badge-link' href='/folder?rG   r  ri  r  N)r   r   r}   rH   rb  r"   )r  rG   r   s   & r   r  r  *  s       d  Ic  BE5i6M5NbQWX`XhXhilXmXrXruzXz  ~Q  RZ  Rb  Rb  cf  Rg  Ru  Ru  ~v  Yv  Rw  Qx  x|  }  Ics   A7A:a;  
    </div>
  </div>
  <div class="hero-actions">
    <a class="button button-link" href="/">Inapoi la manuscrise</a>
    <a class="button button-link" href="/categories">Categorii</a>
    <a class="button button-link" href="/folders">Vezi folderele</a>
    <a class="button button-link" href="/manuscript/download?r|   zL">Descarca toate paginile cotei</a>
    <a class="button button-link" href="a)  " target="_blank" rel="noreferrer">Transcriere cu Transkribus</a>
  </div>
</section>
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Editare locala</p>
      <h3>Descriere manuscris</h3>
    </div>
    <div class="panel-meta">
      <span class="count-chip">r  z foldere</span>
    </div>
  </div>
  <form class="edit-form" method="post" action="/manuscript/edit">
    <input type="hidden" name="number" value="z;">
    <input type="hidden" name="next" value="/manuscript?zU">
    <label>
      <span>Titlu</span>
      <input type="text" name="title" value="z" placeholder="Ex: Caiet despre analiza, note de lucru, schite">
    </label>
    <label>
      <span>Categorii</span>
      <input type="text" name="categories" list="manuscript-categories-list" value="r  a  " placeholder="Ex: filosofie, matematica, fragmente">
    </label>
    <label>
      <span>Adauga categorie noua</span>
      <input type="text" name="new_category" list="manuscript-categories-list" placeholder="Ex: geometrie, algebra, corespondenta">
    </label>
    <p class="form-hint">Poti scrie aici una sau mai multe categorii noi. La salvare, ele se adauga automat si in lista globala.</p>
    z;<p class='form-hint'>Categorie tematica dedusa din folder: F)r  r1  z1
    <p class="form-hint">Categorii disponibile: 	</p>
    z
    <label>
      <span>Notite</span>
      <textarea name="notes" rows="4" placeholder="Completeaza aici identificarea manuscrisului.">zy</textarea>
    </label>
    <button class="button" type="submit">Salveaza</button>
  </form>
  <div class="notes-block">z</div>
</section>
r   rY   )rO   r   r$   r   r*  rx   r   rX   r}   rH   rb  r"   r   rG   r   r_   r`  rE  r|   r~   r"  TRANSKRIBUS_URLr   r   rS   r5  r\  )r   r   r7  groupedr   categories_datalistfolder_sectionsr$   r   rO   r   rV  s   &f&         r   render_manuscript_pager    s   +-G""5++R077> # 3$d8+>+>&? OWo
!!*-$;;-s#6v7K7K#L"MN0
 1:5&**:M0N/OrRXY^R_Q` a!&k] + WWMfMMN O	
	 &*; ;  ;f ;;
 ;
; 	z<<#<=>;?; 3:3H3HIJ;K; 
ww  d  IO  PZ  Pb  Pb  Ic  d  d  e;e>;  ?HS]SdSdHe>f=g!; h)!;" *9(9#;"
: #;6 !$J$5$5 677;68 7;8 !$J$6$6 789;89/9;@ 0:/@/@.AA;@B9A;B :CHjN_N_C`9a8bC;Bc.C;H /5Z5E5E.F-GI;HHUI;P V\\`\e\efp  gE  gE  ]F  VG  UHQ;PHQ;^ NX  Nh  Nh  NhBCYZdZtZt  ~C  DD  CE  EI  J  np  q_;^q1_;` 2HXM`M`Hajo1p0qa;`ra;b c;bcc;h djjtjzjzc{b|i;h}i;p ))9)9:;q;p<q;t  u;tu;Gx M*"3"3!45}gNNr   c               $    V ^8  d   QhRRRRRR/# r  r   )r0   s   "r   r1   r1   `  s+     KA KA] KAC KAE KAr   c                   . pV P                   P                  4        F  pR P                  R VP                  R,           4       4      ;'       g    RpVP	                  R\        VP                   R R P                  R VP                   4       4       2P                  4       4       R\        RVP                  /4       R\        VP                  4       R	VP                   R
V R24       K  	  RP                  V P                   4      p\        R\        V P                   4      4      pR\        V4       R\        V 4       R\        V4       RT RRP                  V4      ;'       g    R R2p\        RRV4      # )r  c              3  J   "   T F  pR \        RV/4       RV R2x  K  	  R# 5ir  r  r  s   & r   r  )render_categories_page.<locals>.<genexpr>c  s5      
3 7y(FAS7T6UUZ[aZbbfg3r  :N   Nz*<span class='muted'>nefolosita inca</span>rm  c              3  8   "   T F  p\        V4      x  K  	  R # 5ir=   r  r  s   & r   r  r  i  s     4dOcVS[[Ocr  z(">
  <td><a class="strong-link" href="/?r   r  ro  rp  rr  rs  zglobal-categories-listaw  
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Administrare</p>
      <h3>Lista de categorii</h3>
    </div>
    <a class="button button-link" href="/">Inapoi la manuscrise</a>
  </div>
  <form class="toolbar-form" method="post" action="/categories/add">
    <input type="hidden" name="next" value="/categories">
    <input class="search-input" type="text" name="category" list="global-categories-list" placeholder="Adauga rapid o categorie noua, ex: geometrie">
    <button class="button" type="submit">Adauga categorie</button>
  </form>
  <p class="muted">Pentru o categorie noua poti folosi formularul rapid de mai sus, iar pentru reorganizare larga poti edita lista completa de mai jos.</p>
  <p class="muted">Pune cate o categorie pe linie separata. Categoriile deja folosite de manuscrise raman pastrate automat.</p>
  <form class="edit-form" method="post" action="/categories/save">
    <input type="hidden" name="next" value="/categories">
    <label>
      <span>Categorii disponibile</span>
      <textarea name="categories" rows="10" placeholder="Ex: filosofie&#10;matematica&#10;fragmente">zl</textarea>
    </label>
    <button class="button" type="submit">Salveaza categoriile</button>
  </form>
  aG  
</section>
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Triere</p>
      <h3>Categorii existente</h3>
    </div>
  </div>
  <div class="toolbar">
    <input class="search-input" data-filter-input="categories-table" type="search" placeholder="Cauta dupa categorie sau numar de manuscris">
  </div>
  <div class="table-wrap">
    <table id="categories-table" class="data-table">
      <thead>
        <tr>
          <th>Categorie</th>
          <th>Manuscrise</th>
          <th>Exemple</th>
        </tr>
      </thead>
      <tbody>
        rI   z?<tr><td colspan="3">Nu exista categorii salvate inca.</td></tr>rt  zCategorii manuscriser   )r   rk   r`  rY   r   r   rH   r   r   r   r*  rx   rE  rc  r\  )r   r7  ru  r   r  textarea_valuer  rV  s   &&      r   render_categories_pager  `  s   D''..0(( 
"..s3
 
 : : : 	 	HMM?!CHH4dxOcOc4d,d+efllnop q&&/X]]0K&L%MRPVW_WdWdPeOf g~~ i 		
 1 YYx223N2 $x':':";f    f( gmm{f|e} ~  	, 
	[	[[\ ]a5Gl (,@@r   c                    V ^8  d   QhRRRR/# )r.   r   r{   r/   ztuple[bytes, str]r   )r0   s   "r   r1   r1     s     + +)9 +>O +r   c                   R V P                    R2p\        P                  ! 4       p\        P                  ! VR\        P
                  R7      ;_uu_ 4       pV P                   Fz  pRP                  R V P                    2\        VP                  4      VP                  P                  RR4      .4      pVP                  WTP                  P                  4       4       K|  	  RRR4       VP                  4       V3#   + '       g   i     L"; i)r  z.zipw)compressionri  rh  N)r|   ioBytesIOzipfileZipFileZIP_DEFLATEDrO   r`  rx  r"   r#   rj  writestrr!   
read_bytesgetvalue)r   archive_namebufferarchiver   internal_paths   &     r   build_manuscript_archiver    s    **+40LZZ\F	'2F2F	G	G7&&EHH*++,-&u':':;''//c:M ],?,?,J,J,LM ' 
H ??l** 
H	Gs   BC::D
	c               0    V ^8  d   QhRRRRRRRRRRR	R
/# )r.   r   r    r  r   r  navigation_scoper   r7  r/   rX  r   )r0   s   "r   r1   r1     sT     K KK%K "K 	K
 K Kr   c           	     l   V P                   e   RV P                    2MRpV P                   e   R\        RV P                   /4       2MRpV P                   e   RMRpR\        R	V P                  R
R/4       2pV'       d   VP                  MRp	V'       d   VP                  MRp
V'       d   R\	        V	4       R2MRpV'       d   R\	        V
4       R2MRpV'       g	   V'       d   V R2MRpRP                  . RN\        V4       NRN\	        V P                  4       NRN\	        \        V P                  4      4       NRN\	        V4       NRN\	        V4       NRN\        RV P                  /4       NRN\	        V P                  R,           \        V P                  4      ,           4       NRN\	        V P                  ;'       g    R4       NRNV NR NV P                   NR!N\        RV P                  /4       NR"N\	        V4       NRN\	        V4       NR#NV NR$NV P                   NR%N\	        V P                  4       NR&NV NR'N\	        V4       NR(N\          NR)N\"        P$                  ! V	4       NR*N\"        P$                  ! V
4       NR+N4      p\'        R,V P                   2R-V4      # ).Nr  Neidentificatz/manuscript?r|   rO  zInapoi la cotazInapoi la imagini neclarer4   r   rt  1rI   z0<a class="viewer-arrow viewer-arrow-left" href="z-" aria-label="Imaginea precedenta">&larr;</a>zY<span class="viewer-arrow viewer-arrow-left is-disabled" aria-hidden="true">&larr;</span>z1<a class="viewer-arrow viewer-arrow-right" href="z," aria-label="Imaginea urmatoare">&rarr;</a>zZ<span class="viewer-arrow viewer-arrow-right is-disabled" aria-hidden="true">&rarr;</span>z9. Folositi sagetile din ecran sau tastele stanga/dreapta.z+Nu exista alta imagine in aceasta selectie.rs  zu
<section class="hero detail-hero">
  <div class="hero-copy">
    <p class="eyebrow">Vizualizare imagine</p>
    <h2>r_  zC</p>
    <div class="badge-row">
      <a class="badge-link" href="r  z/</a>
      <a class="badge-link" href="/folder?rG   ri  z$</a>
      <span class="badge-chip">pagina neidentificataza</span>
    </div>
  </div>
  <div class="hero-actions">
    <a class="button button-link" href="z@">Descarca imaginea</a>
    <a class="button button-link" href="zk" target="_blank" rel="noreferrer">Deschide originalul</a>
    <a class="button button-link" href="/folder?z?">Inapoi la folder</a>
    <a class="button button-link" href="u  </a>
  </div>
</section>
<section class="panel viewer-panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Corectie rapida</p>
      <h3>Rotire la 90 de grade</h3>
    </div>
    <div class="viewer-toolbar">
      <button class="button button-secondary" type="button" id="rotate-left">Roteste stanga 90°</button>
      <button class="button button-secondary" type="button" id="rotate-right">Roteste dreapta 90°</button>
      <button class="button button-secondary" type="button" id="toggle-loupe" aria-pressed="false">Lupa text</button>
      <span class="count-chip" id="rotation-state">0°</span>
    </div>
  </div>
  <div class="viewer-canvas">
    <div id="viewer-stage" class="viewer-stage">
      z8
      <img id="viewer-image" class="viewer-image" src="" alt="z	">
      a  
      <div id="viewer-loupe" class="viewer-loupe is-hidden" aria-hidden="true">
        <canvas id="viewer-loupe-canvas" class="viewer-loupe-canvas" width="220" height="220"></canvas>
      </div>
    </div>
  </div>
  <p class="muted">Rotirea este pentru vizualizare in browser si nu modifica fisierul original.</p>
  <p class="muted">Activati lupa si miscati cursorul pe imagine atunci cand aveti nevoie de text marit.</p>
  <p class="muted">z</p>
</section>
<section class="panel">
  <div class="panel-head compact">
    <div>
      <p class="eyebrow">Transcriere electronica</p>
      <h3>Transkribus</h3>
    </div>
    <a class="button button-link" href="a  " target="_blank" rel="noreferrer">Deschide Transkribus</a>
  </div>
  <p class="muted">Pentru cine doreste sa transcrie o foaie de manuscris, pagina poate fi incarcata in Transkribus.</p>
  <p class="muted">Incarcarea unei pagini de manuscris acolo permite reproducerea si transcrierea ei electronica.</p>
</section>
<script>
  (() => {
    const image = document.getElementById('viewer-image');
    const stage = document.getElementById('viewer-stage');
    const state = document.getElementById('rotation-state');
    const leftButton = document.getElementById('rotate-left');
    const rightButton = document.getElementById('rotate-right');
    const loupeButton = document.getElementById('toggle-loupe');
    const loupe = document.getElementById('viewer-loupe');
    const loupeCanvas = document.getElementById('viewer-loupe-canvas');
    const loupeContext = loupeCanvas.getContext('2d');
    const previousUrl = z;
    const nextUrl = u  ;
    const loupeSize = loupeCanvas.width;
    const loupeRadius = loupeSize / 2;
    const loupeZoom = 2.6;
    let angle = 0;
    let loupeEnabled = false;
    const clamp = (value, minimum, maximum) => Math.min(Math.max(value, minimum), maximum);
    const normalizedAngle = () => ((angle % 360) + 360) % 360;
    const syncStageSize = () => {
      const rect = image.getBoundingClientRect();
      if (!rect.width || !rect.height) {
        return;
      }
      stage.style.width = `${Math.ceil(rect.width)}px`;
      stage.style.height = `${Math.ceil(rect.height)}px`;
    };
    const render = () => {
      image.style.transform = `rotate(${angle}deg)`;
      state.textContent = `${normalizedAngle()}°`;
      window.requestAnimationFrame(syncStageSize);
      if (loupeEnabled) {
        loupe.classList.add('is-hidden');
      }
    };
    const getImagePoint = (clientX, clientY) => {
      const rect = image.getBoundingClientRect();
      const displayWidth = image.clientWidth;
      const displayHeight = image.clientHeight;
      if (
        !rect.width ||
        !rect.height ||
        !displayWidth ||
        !displayHeight ||
        !image.naturalWidth ||
        !image.naturalHeight
      ) {
        return null;
      }
      if (
        clientX < rect.left ||
        clientX > rect.right ||
        clientY < rect.top ||
        clientY > rect.bottom
      ) {
        return null;
      }
      const boxX = clientX - rect.left;
      const boxY = clientY - rect.top;
      let imageX = boxX;
      let imageY = boxY;
      switch (normalizedAngle()) {
        case 90:
          imageX = boxY;
          imageY = displayHeight - boxX;
          break;
        case 180:
          imageX = displayWidth - boxX;
          imageY = displayHeight - boxY;
          break;
        case 270:
          imageX = displayWidth - boxY;
          imageY = boxX;
          break;
        default:
          break;
      }
      imageX = clamp(imageX, 0, displayWidth);
      imageY = clamp(imageY, 0, displayHeight);
      return {
        sourceX: imageX * (image.naturalWidth / displayWidth),
        sourceY: imageY * (image.naturalHeight / displayHeight),
      };
    };
    const drawLoupe = (sourceX, sourceY) => {
      if (!loupeContext) {
        return;
      }
      const displayWidth = image.clientWidth;
      const displayHeight = image.clientHeight;
      if (!displayWidth || !displayHeight) {
        return;
      }
      const scaleX = displayWidth / image.naturalWidth;
      const scaleY = displayHeight / image.naturalHeight;
      const sampleWidth = loupeSize / (loupeZoom * scaleX);
      const sampleHeight = loupeSize / (loupeZoom * scaleY);
      const sampleX = clamp(
        sourceX - sampleWidth / 2,
        0,
        Math.max(image.naturalWidth - sampleWidth, 0)
      );
      const sampleY = clamp(
        sourceY - sampleHeight / 2,
        0,
        Math.max(image.naturalHeight - sampleHeight, 0)
      );
      loupeContext.clearRect(0, 0, loupeSize, loupeSize);
      loupeContext.save();
      loupeContext.beginPath();
      loupeContext.arc(loupeRadius, loupeRadius, loupeRadius - 2, 0, Math.PI * 2);
      loupeContext.clip();
      loupeContext.fillStyle = '#fffaf2';
      loupeContext.fillRect(0, 0, loupeSize, loupeSize);
      loupeContext.translate(loupeRadius, loupeRadius);
      loupeContext.rotate((normalizedAngle() * Math.PI) / 180);
      loupeContext.drawImage(
        image,
        sampleX,
        sampleY,
        sampleWidth,
        sampleHeight,
        -loupeRadius,
        -loupeRadius,
        loupeSize,
        loupeSize
      );
      loupeContext.restore();
      loupeContext.save();
      loupeContext.strokeStyle = 'rgba(104, 58, 20, 0.35)';
      loupeContext.lineWidth = 1;
      loupeContext.beginPath();
      loupeContext.moveTo(loupeRadius, 14);
      loupeContext.lineTo(loupeRadius, loupeSize - 14);
      loupeContext.moveTo(14, loupeRadius);
      loupeContext.lineTo(loupeSize - 14, loupeRadius);
      loupeContext.stroke();
      loupeContext.restore();
    };
    const positionLoupe = (clientX, clientY) => {
      const rect = stage.getBoundingClientRect();
      const stageX = clientX - rect.left;
      const stageY = clientY - rect.top;
      const horizontalRadius = Math.min(loupeRadius, rect.width / 2);
      const verticalRadius = Math.min(loupeRadius, rect.height / 2);
      const left = clamp(
        stageX + 34,
        horizontalRadius,
        Math.max(horizontalRadius, rect.width - horizontalRadius)
      );
      const top = clamp(
        stageY - 34,
        verticalRadius,
        Math.max(verticalRadius, rect.height - verticalRadius)
      );
      loupe.style.left = `${left}px`;
      loupe.style.top = `${top}px`;
    };
    const hideLoupe = () => {
      loupe.classList.add('is-hidden');
    };
    const updateLoupe = (event) => {
      if (!loupeEnabled || event.pointerType === 'touch') {
        hideLoupe();
        return;
      }
      const point = getImagePoint(event.clientX, event.clientY);
      if (!point) {
        hideLoupe();
        return;
      }
      positionLoupe(event.clientX, event.clientY);
      drawLoupe(point.sourceX, point.sourceY);
      loupe.classList.remove('is-hidden');
    };
    leftButton.addEventListener('click', () => {
      angle -= 90;
      render();
    });
    rightButton.addEventListener('click', () => {
      angle += 90;
      render();
    });
    loupeButton.addEventListener('click', () => {
      loupeEnabled = !loupeEnabled;
      stage.classList.toggle('is-loupe-active', loupeEnabled);
      loupeButton.setAttribute('aria-pressed', loupeEnabled ? 'true' : 'false');
      loupeButton.textContent = loupeEnabled ? 'Lupa activa' : 'Lupa text';
      if (!loupeEnabled) {
        hideLoupe();
      }
    });
    stage.addEventListener('pointermove', updateLoupe);
    stage.addEventListener('pointerleave', hideLoupe);
    image.addEventListener('load', syncStageSize);
    window.addEventListener('resize', syncStageSize);
    document.addEventListener('keydown', (event) => {
      if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
        return;
      }
      const activeTag = document.activeElement ? document.activeElement.tagName : '';
      if (['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA'].includes(activeTag)) {
        return;
      }
      if (event.key === 'ArrowLeft' && previousUrl) {
        window.location.href = previousUrl;
      }
      if (event.key === 'ArrowRight' && nextUrl) {
        window.location.href = nextUrl;
      }
    });
    render();
    if (image.complete) {
      syncStageSize();
    }
  })();
</script>
zVizualizare rY   )r(   r   r6   rB   r   r`  rE  r&   r   r!   r$   r%   rb  r"   r)   r9   r  r6  rI  r\  )r   r  r  r  r7  manuscript_labelmanuscript_link
back_labeldownload_urlprevious_urlnext_urlprevious_arrow
next_arrownavigation_textrV  s   &&&&&          r   render_image_viewer_pager    sr    "". e%%&'  "". y(E,C,C!DEFG  "33?E`  Y0B0BJPS'TUVWL0>>,,BL(2z$$H  ;6,;O:P Q6 	6+	   <F8<L;M N5 	5+	  Z 
UV: 
T T  Tf T	T
 
	 T
!T #3u':':#;<=T>#T $*/#:";T <>T ?EEU>V=WTX+T ,5eU=M=M5N+O*PT QST TZZ_ZkZknsZs  wJ  KP  K^  K^  w_  [_  T`  SaTa T !'u'7'7'R'R;R STTU)T *6T7)T */(9T:1T  2;E5CSCS;T1U0V!T W)!T" *0)@(A#T" BD#T" EK:DVCW#T"X#TF GTF8GTH 9>7HITH IPITH QWW\WeWePfOgITHhITJ lKTJKTZ ?+,[TZ-)[Tj *9(9kTj:kTJ L12KTJ3KTL ZZ)*MTLN+MTGj L 01='JJr   c               $    V ^8  d   QhRRRRRR/# r  r   )r0   s   "r   r1   r1      s!     4; 4;M 4;3 4;5 4;r   c                8   . pV P                   P                  4        F  pVP                  '       g   K  VP                  R \	        RVP
                  /4       R\        VP                  R,           \        VP                  4      ,           4       RVP                   RRP                  R VP                   4       4       R2	4       K  	  V'       g   VP                  R	4       R
\        V4       R
\        V 4       RRP                  V4       R
2p\        RRV4      # )z
<section class="panel">
  <div class="panel-head compact">
    <div>
      <p class="eyebrow">Folder cu ambiguitati</p>
      <h3><a class="strong-link" href="/folder?rG   r  ri  z4</a></h3>
    </div>
    <span class="warning-chip">z8 neclare</span>
  </div>
  <div class="image-grid">
    rI   c              3  <   "   T F  p\        VR R7      x  K  	  R# 5ir  r  r  s   & r   r  (render_unmatched_page.<locals>.<genexpr>  r  r  r  a  
<section class="panel">
  <div class="panel-head compact">
    <div>
      <p class="eyebrow">Curatare</p>
      <h3>Nu exista imagini neclare</h3>
    </div>
  </div>
  <p class="muted">Toate imaginile au fost asociate unui manuscris pe baza numelui fisierului.</p>
</section>
rs  a  
<section class="panel">
  <div class="panel-head">
    <div>
      <p class="eyebrow">Verificare manuala</p>
      <h3>Imagini care nu au putut fi identificate automat</h3>
    </div>
    <a class="button button-link" href="/folders">Vezi folderele</a>
  </div>
  <p class="muted">Aici apar fisiere precum imagini `DSC...` sau alte nume care nu includ explicit numarul manuscrisului.</p>
</section>
zImagini neclarerN  )r}   rk   rQ   r   r   rG   r   rH   rb  r"   rd   r`  rE  rc  r\  )r   r7  sectionsr   rV  s   &&   r   render_unmatched_pager     sK   H""))+&&&0
 1:5&**:M0N/OrRXY_YdYdglYl  pC  DJ  DX  DX  pY  ZY  SZ  R[ [  & 6 67 8 WW^fF]F]^^_ `	
 ,( 
	
f       G #['::r   c               $    V ^8  d   QhRRRRRR/# )r.   r   r    r  r  r/   r   r   )r0   s   "r   r1   r1   7  s!      Z d c r   c                   V'       dS   R \        RV P                  /4       R\        V P                  R,           \	        V P
                  4      ,           4       R2MRpV P                  ;'       g    RpV P                  e   RV P                   2MRpR	V P                   R
V P                   R\        V P                  4       R\        V P                  4       R\        V4       R\        V4       RV R2# )z'<p class='image-meta'><a href='/folder?rG   r  ri  z</a></p>rI   r  r  neclarz<
<article class="image-card">
  <a class="image-link" href="z ">
    <img loading="lazy" src="r  z@">
  </a>
  <div class="image-copy">
    <p class="image-title">z</p>
    <p class="image-meta">r  z
  </div>
</article>
)r   r$   r   r%   rb  r"   r)   r(   rB   r9   r&   )r   r  folder_metar   r   s   &&   r   r  r  7  s8     2)UEDTDT<U2V1WWYZ`afararuzaz  ~Q  RW  Re  Re  ~f  bf  [g  Zh  hp  	q 
 77 7E+0+B+B+N#e%%&'T\ $//0 1#oo.gfU^^6L5M N #5>>23 4!*-.c&- AM  r   c                      ] tR tRtRt]R R l4       tR R ltR R ltR	 R
 lt	R R lt
]P                  3R R lltR R ltRR R lltRR R lltR R ltRtR# )ManuscriptRequestHandleriO  zMSBJBrowser/1.0c                   V ^8  d   QhRR/# )r.   r/   z'ManuscriptBrowserServer'r   )r0   s   "r   r1   %ManuscriptRequestHandler.__annotate__S  s      . r   c                	    V P                   # r=   )serverr7   s   &r   appManuscriptRequestHandler.appR  s    {{r   c                   V ^8  d   QhRR/# r   r   )r0   s   "r   r1   r  V  s     ZC ZC ZCr   c           
     	   \        V P                  4      p\        VP                  4      pVP	                  R R.4      ^ ,          p\        VP	                  RR.4      ^ ,          4      pVP                  R8X  d@   V P                  \        V P                  P                  P                  4       W44      4       R# VP                  R8X  d@   V P                  \        V P                  P                  P                  4       V4      4       R# VP                  R8X  d@   V P                  \        V P                  P                  P                  4       V4      4       R# VP                  R8X  Ed$   VP	                  RR.4      ^ ,          pV'       d&   V P                  P                  P                  V4      MRpV'       gy   VP	                  R	R.4      ^ ,          '       dY   V P                  P                  P                  VP	                  R	R.4      ^ ,          4      p\        V4      ^8X  d
   V^ ,          MRpV'       g   V P!                  R
4       R# V P                  \#        W`P                  P                  P                  4       V4      4       R# VP                  R8X  d   VP	                  RR.4      ^ ,          pVP%                  4       '       g   V P!                  R4       R# V P                  P                  P'                  \)        V4      4      p	V	'       g   V P!                  R4       R# V P                  \+        WP                  P                  P                  4       V4      4       R# VP                  R8X  d@   V P                  \-        V P                  P                  P                  4       V4      4       R# VP                  R8X  d   VP	                  RR.4      ^ ,          p
V
'       d&   V P                  P                  P/                  V
4      MRpV'       g   V P!                  R4       R# V P                  P                  P1                  V4      w  rpV P                  \3        VVVVVR7      4       R# VP                  R8X  d   VP	                  RR.4      ^ ,          pVP%                  4       '       g   V P!                  R4       R# V P                  P                  P'                  \)        V4      4      p	V	'       g   V P!                  R4       R# \5        V	4      w  ppV P7                  VRV4       R# VP                  R8X  d   VP	                  RR.4      ^ ,          pV P                  P                  P9                  V4      pV'       g#   V P;                  \<        P>                  R4       R# VP	                  RR.4      ^ ,          R8X  d   VP@                  MRpV PC                  VVR7       R# VP                  R8X  d)   V PE                  V P                  PF                  R4       R# V P;                  \<        P>                  R4       R# )r7  rI   r   ri  NrJ  rL  z/folderrG   rH   z/folders?status=invalid-folderz/manuscriptr|   z/?status=invalid-manuscriptrO  z/viewerr   z/unmatched?status=invalid-image)r  r  r  r7  z/manuscript/downloadzapplication/zipz/imagerB  rt  r  )download_namez/static/style.cssztext/css; charset=utf-8zRuta necunoscuta.)$r   r   r   queryr   r  
_send_htmlr}  r  r  r   r  r  r   r  r_   	_redirectr  isdigitr   r]   r  r  r   r  r  r  _send_bytesr  
send_errorr   	NOT_FOUNDrH   
_send_file_send_static
style_path)r8   parsedparamsr7  re  rG   r   r  
raw_numberr   r6   r   r  r  r  r  r&   r#   r   r  s   &                   r   do_GETManuscriptRequestHandler.do_GETV  s   $))$&,,'Hrd+A.3FJJzB44PQR4ST;;#OO'HHNN//16
 ;;*$OO/0K0K0MvVW;;-'OO2488>>3N3N3PRXYZ;;)#**URD)!,C7:TXX^^..s3Ffjj"6q99((..==fjjRTQU>VWX>YZ'*7|q'8d?@OO.vxx~~7R7R7TV\]^;;-'Hrd3A6J%%''<=66s:GJ<=OO&z88>>3N3N3PRXY ;;,&OO1$((..2M2M2OQWXY;;)#!::frd3A6L>JDHHNN,,\:PTE@A;?88>>;_;_<8N(8 OO(#1)%5! ;;00Hrd3A6J%%''<=66s:GJ<= 8 DGXW&7B;;(""JJvt4Q7M88>>77FD
 4 46YZ)/J)Ea)HC)ODIIUYMOODO>;;--dhh113LM
,,.ABr   c                   V ^8  d   QhRR/# r   r   )r0   s   "r   r1   r    s     AF AF AFr   c                		   \        V P                  4      pV P                  4       p\        VP	                  R R.4      ^ ,          4      pVP                  R8X  dB   V P
                  P                  P                  4        V P                  \        VR4      4       R# VP                  R8X  d   VP	                  RR.4      ^ ,          pV P
                  P                  P                  V4      pV'       g   V P                  \        RR	4      4       R# V P
                  P                  P                  VVP	                  R
R.4      ^ ,          VP	                  RR.4      ^ ,          4       V P                  \        VR4      4       R# VP                  R8X  Ed<   VP	                  RR.4      ^ ,          pVP                  4       '       d5   V P
                  P                  P                  \        V4      4      '       g   V P                  \        RR4      4       R# \        VP	                  RR.4      ^ ,          VP	                  RR.4      ^ ,          4      pV P
                  P                  P!                  \        V4      VP	                  RR.4      ^ ,          VP	                  RR.4      ^ ,          V4       V P                  \        VR4      4       R# VP                  R8X  d   V P
                  P                  P#                  VP	                  RR.4      ^ ,          4      '       d(   T P                  \        T;'       g    RR4      4       R# T P                  \        T;'       g    RR4      4       R# VP                  R8X  de   V P
                  P                  P%                  VP	                  RR.4      ^ ,          4       T P                  \        T;'       g    RR4      4       R# VP                  R8X  d   VP	                  RR.4      ^ ,          pV P
                  P                  P                  V4      pV'       g   V P                  \        RR	4      4       R# \'        \(        R4      '       d*   \(        P*                  ! \-        VP.                  4      4       V P                  \        VR4      4       R# V P1                  \2        P4                  R4       R# )nextri  z/refreshr9  Nz/folder/editrG   rI   rJ  r?  rR   rS   r:  z/manuscript/editr|   rA  r   new_categoryr~   r;  z/categories/addr   rL  r=  r@  z/categories/saver<  z/folder/open	startfiler>  zActiune necunoscuta.)r   r   
_read_formnormalize_next_urlr   r  r  r   r  
add_statusr   r  r  r   r]   r   r$  r-  r(  hasattrrn  r  r   r!   r  r   r  )r8   r  formr  rG   r   r  r   s   &       r   do_POST ManuscriptRequestHandler.do_POST  s   $))$ %dhhvu&=a&@A;;*$HHNN""$NN:h<=;;.(((52$'*CXX^^..s3Fz*6FGHHHNN//2$/22$'*
 NN:h?@;;,,(RD1!4J%%''txx~~/L/LSQ[_/]/]z#/CDE)t,Q/".q1J HHNN33J2$'*2$'*	 NN:h0BCD;;++xx~~**488J+Ea+HIIz(*C*CmEUVW  z(*C*CmEWXY;;,,HHNN**488L2$+G+JKNN:h&?&?-ASTU;;.(((52$'*CXX^^..s3Fz*6FGHr;''S!5!567NN:h@A
,,.DEr   c               $    V ^8  d   QhRRRRRR/# )r.   r0   r   argsr
   r/   r   r   )r0   s   "r   r1   r    s!     
 
# 
c 
d 
r   c                	    \         P                  P                  V P                  4       : R V P	                  4       : RW,          : R24       R# )z - - [z] rs  N)sysr  writeaddress_stringlog_date_time_string)r8   r0   r  s   &&*r   log_message$ManuscriptRequestHandler.log_message  s7    

""$d&?&?&A6==R	
r   c                   V ^8  d   QhRR/# )r.   r/   zdict[str, list[str]]r   )r0   s   "r   r1   r    s     5 50 5r   c                	    \        V P                  P                  R R4      4      pV P                  P	                  V4      P                  RRR7      p\        VRR7      # )Content-Length0r2  rj  )r  T)keep_blank_values)r]   headersr   rfilereaddecoder   )r8   content_lengthr  s   &  r   r  #ManuscriptRequestHandler._read_form  sM    T\\--.>DEjjoon-44WY4Ot44r   c               $    V ^8  d   QhRRRRRR/# )r.   r  rX  r7  r   r/   r   r   )r0   s   "r   r1   r     s"     " "% " "PT "r   c                	    V P                  V4       V P                  R R4       V P                  R\        \        V4      4      4       V P	                  4        V P
                  P                  V4       R# )Content-Typeztext/html; charset=utf-8r  N)send_responsesend_headerr   r_   end_headerswfiler  )r8   r  r7  s   &&&r   r  #ManuscriptRequestHandler._send_html   sY    6")CD)3s7|+<=

!r   c               $    V ^8  d   QhRRRRRR/# )r.   r   r	   content_typer   r/   r   r   )r0   s   "r   r1   r    s!     " " "S "T "r   c                	&   VP                  4       pV P                  \        P                  4       V P	                  R V4       V P	                  R\        \        V4      4      4       V P                  4        V P                  P                  V4       R# )r!  r  N)
r  r"  r   OKr#  r   r_   r$  r%  r  )r8   r   r(  r  s   &&& r   r  %ManuscriptRequestHandler._send_static  sh    //#:==)6)3s7|+<=

!r   Nc               (    V ^8  d   QhRRRRRRRR/# )	r.   r  rX  r(  r   r  r  r/   r   r   )r0   s   "r   r1   r    s2     " "" " "	"
 
"r   c                	T   V P                  \        P                  4       V P                  R V4       V P                  R\	        \        V4      4      4       V'       d    V P                  RR\        V4       R24       V P                  4        V P                  P                  V4       R# )r!  r  Content-Dispositionattachment; filename=""N)
r"  r   r*  r#  r   r_   rx  r$  r%  r  )r8   r  r(  r  s   &&&&r   r  $ManuscriptRequestHandler._send_bytes  s     	:==)6)3s7|+<=%();M)J(K1M 	

!r   c               $    V ^8  d   QhRRRRRR/# )r.   r   r	   r  r  r/   r   r   )r0   s   "r   r1   r     s!     ( (t (J ($ (r   c                	p   \         P                  ! VP                  4      w  r4V P                  \        P
                  4       T P                  R T;'       g    R4       V P                  R\        VP                  4       P                  4      4       V'       d    V P                  RR\        V4       R24       V P                  4        VP                  R4      ;_uu_ 4       p VP                  R4      pV'       g   MV P                  P                  V4       K8  RRR4       R#   + '       g   i     R# ; i)	r!  zapplication/octet-streamr  r.  r/  r0  rbNi   )	mimetypes
guess_typerH   r"  r   r*  r#  r   statst_sizerx  r$  openr  r%  r  )r8   r   r  r(  rs  sourcechunks   &&&    r   r  #ManuscriptRequestHandler._send_file   s    #..tyy9:==))S)S9ST)3tyy{/B/B+CD%();M)J(K1M 	YYt__I.

  ' ___s   !9D$$D5	c                    V ^8  d   QhRRRR/# )r.   targetr   r/   r   r   )r0   s   "r   r1   r  2  s        r   c                	    V P                  \        P                  4       V P                  R V4       V P	                  4        R# )LocationN)r"  r   	SEE_OTHERr#  r$  )r8   r>  s   &&r   r  "ManuscriptRequestHandler._redirect2  s2    ://0V,r   r   r=   )r   r   r   r   server_versionrD   r  r  r	  r  r  r   r*  r  r  r  r  r  r   r   r   r   r  r  O  s[    &N ZCxAFF
5
 ?Imm """"($ r   r  c                  2   a  ] tR tRtRtR V 3R lltRtV ;t# )ManuscriptBrowserServeri8  Tc               $    V ^8  d   QhRRRRRR/# )r.   server_addressztuple[str, int]r  r   r  r	   r   )r0   s   "r   r1   $ManuscriptBrowserServer.__annotate__;  s-     C C'C C 	Cr   c                	r   < W n         W0n        R V n        RV n        RV n        \
        SV `  V\        4       R# )httpN)r  r  
url_schemer  r  superr   r  )r8   rG  r  r  	__class__s   &&&&r   r    ManuscriptBrowserServer.__init__;  s4     
$ %)$()ABr   )r  r  r  r  rK  )r   r   r   r   allow_reuse_addressr   r   __classcell__)rM  s   @r   rE  rE  8  s    C Cr   rE  c               $    V ^8  d   QhRRRRRR/# )r.   urlr   r7  r/   r   )r0   s   "r   r1   r1   I  s!     3 3C 3 3 3r   c                    \        V 4      p\        VP                  4      pV.VR &   \        VRR7      pVP	                  VR7      P                  4       # )r7  T)doseq)r  )r   r   r  r   _replacegeturl)rR  r7  r  r  encodeds   &&   r   r  r  I  sJ    c]FV\\"EhE(OT*G???)0022r   c                    V ^8  d   QhRRRR/# )r.   r  r   r/   r   )r0   s   "r   r1   r1   Q  s        r   c                8    V P                  R 4      '       g   R # V # )ri  )
startswith)r  s   &r   r  r  Q  s    s##Or   c               4    V ^8  d   QhRRRRRRRRR	RR
RRR/# )r.   r  r   r~  r]   r   r	   r   r
  r  r  r/   rE  r   )r0   s   "r   r1   r1   W  sN     % %
%
% % 	%
 % % %r   c                   \        V4      p\        V4      p\        WE4      w  r\        \        4      P                  4       P                  R ,          R,          p
Ve   VP                  4       P                  4       M	\        4       p\        Wk4      p\        W3W4      pVe    \        P                  ! \        P                  4      pTP                  \        V4      V	'       d   \        V	4      MRR7       VP!                  VP"                  RR7      Vn        RTn        Yn        Yn        V#   \        P$                   d%   pTP'                  4        \)        RT 24      ThRp?ii ; i)staticz	style.cssN)r  r  T)server_sidezConfiguratie HTTPS invalida: https)r  r  r  r	   r{  r   rF  r  r|  r   rE  ssl
SSLContextPROTOCOL_TLS_SERVERload_cert_chainr   wrap_socketsocketSSLErrorserver_closer  rK  r  r  )r  r~  r   r   r  r  resolved_rootresolved_portr  r  r  resolved_metadata_pathr  http_servercontextr  s   &&&&&&          r   build_serverrm  W  sR    "$'M!$'M*<X*O'h'')008;kIJ $ 	  "**,"$ 
 ?E)4*?SK$	nnS%<%<=G##./1A,-t $  ")!4!4"" "5 "K ")0. || 	$$&/u5	s   "A5D, ,E%E  E%c                   V ^8  d   QhRR/# )r.   r/   zargparse.Namespacer   )r0   s   "r   r1   r1     s     # #& #r   c                    \         P                  ! R R7      p V P                  RRRR7       V P                  R\        \        RR7       V P                  R	\
        \        R
R7       V P                  R\
        RRR7       V P                  R\
        RRR7       V P                  R\
        RRR7       V P                  RRRR7       V P                  4       # )z0Server local pentru arhiva manuscriselor Bolyai.)descriptionz--hostz0.0.0.0zAdresa de ascultare.)defaulthelpz--portzPortul HTTP.)typerq  rr  z--rootzJDirectorul de baza. Daca contine pachete MS_BJ-..., le indexeaza pe toate.z
--metadataNz7Fisierul JSON in care se salveaza metadatele editabile.z
--certfilez/Fisier certificat PEM/CRT pentru pornire HTTPS.z	--keyfilezGFisier cheie privata PEM daca nu este inclus in certificatul principal.z--no-firewall
store_truez:Nu incearca sa adauge regula automata in Windows Firewall.)actionrr  )argparseArgumentParseradd_argumentr]   DEFAULT_PORTr	   DEFAULT_ROOT
parse_args)parsers    r   r{  r{    s    $$FF ):PQ
sL~V
Y	   F	   >	   V	   I  
 r   c                   V ^8  d   QhRR/# r\   r   )r0   s   "r   r1   r1     s     % %c %r   c                 f   \        4       p  \        V P                  V P                  V P                  V P
                  V P                  V P                  4      pTP                  w  r4TP                  p\        R\!        YST4       24       \        R\#        YT4       24       \        RTP$                  P                   24       \        RTP$                  P&                   24       TP                  e?   \        RTP                   24       TP                  e   \        RTP                   24       \)        T P                  T P*                  '       * 4      '       dA   \-        T4      w  rg\        TT'       d   \        P.                  M\        P                  R 7        TP1                  4        TP5                  4        ^ #   \        \        3 d0   p\        \        T4      \        P                  R 7        Rp?^# Rp?ii ; i  \2         d    \        R4        Lmi ; i  TP5                  4        i ; i)	)fileNzServer pornit pe zDeschidere locala: zIndexare din: zMetadate salvate in: zHTTPS activ cu certificat: zCheie privata folosita: z
Server oprit.)r{  rm  r  r~  r   r   r  r  r  OSErrorprintr   r  r  rG  rK  r  r  r  r   r  no_firewallr  r  serve_foreverKeyboardInterruptrg  )r  r  r  r  r~  r  firewall_okfirewall_messages           r   mainr    s   <DIIIIIIMMMMLL
 &&JDF	ofDAB
CD	 =>
?@	N6<<,,-
./	!&,,"<"<!=
>?"+FOO+<=>>>%,V^^,<=> 0@0@,@AA(DT(J%*

	
 	5   c#hSZZ(,  ! ! 	s<   AF? H ?G?$G::G?HH HH H0__main__>   .bmp.gif.jpg.png.tif.jpeg.tiff.webp)zI. documentez"II. scrisori si ciorne de scrisoriz)III. autobiografie si scrieri despre tatazIV. proiecte de pagini de titluz
V. prefetezVI. despre doctrinazVII. doctrina conducatoarez!VIII. despre publicarea doctrineiz:IX. impartirea Pamantului in 12 parti si academie mondialaz%X. despre mantuire bine frumos adevarzXI. istoria stiinteizXII. demografie si populatiezXIII. filozofiez%XIV. societatea trecut prezent viitorzXV. etica si dreptzXVI. psihologiez(XVII. teoria monedei si case de economiizXVIII. lingvisticazXIX. industrie si mestesugurizXX. cultura si educatiez!XXI. teoria lampilor si a sobelorzXXII. medicina si terapeuticazXXIII. despre artezXXIV. muzicazXXV. matematicazXXVI. manuscrise diverser=   )TrR  )NNrI   rI   )NNN)j
__future__r   rv  r.  r  r6  r5  rn  rv  r`  r  r  r   r  dataclassesr   r   rJ  r   http.serverr   r   pathlibr	   typingr
   urllib.parser   r   r   r   compiler  r  rW  ry  DEFAULT_HTTPS_PORTrz  r  r  OFFICIAL_THEMATIC_CATEGORIESr_  r  r  r   r    rF   r{   r   r   r   rZ  rb  r   r>   r  rx  r|  r  r  r  r  r  r  r  r  r   r  r  r  r  r   r  r  r  r   r   r   r   r   r"  r*  r   r5  rE  rT  r\  rc  r}  r  r  r  r  r  r  r  r  r  rE  r  r  rm  r{  r  r   
SystemExit)r   s   0r   <module>r     s   "   	   	 	 
  
   (  C   6 6	  

IJ
**'
(O, ! ' 0  < 10 NN31##%x/0    
 C C C0 &/ &/ &/R , , ,, % % %   t< t<n	0
>
-,
=!
F	/.*'I?BJ$&7*ND2-"66
HH9&*$Z0iBXM<`a?HZOzKA\+ KD
4;n0f5 fRC1 C"3%P#L%P z
TV
 MDs   51K#