Ë
    “ŸðiÅI  ã                   óÌ  — d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZmZmZmZmZmZ d dlmZ d dlZd dlZ ee«      Ze j0                  j3                  dd«      e_        dej6                  d<   e j8                  j;                  e j8                  j=                  e«      «      Z e j8                  jC                  e d	«      Z"e j8                  jC                  e d
«      Z#e j8                  jC                  e d«      Z$e"e#e$fD ]  Z% e jL                  e%d¬«       Œ ddhZ'dZ(i Z)d„ Z*d„ Z+d„ Z,d„ Z-d„ Z.d„ Z/d„ Z0d„ Z1 ejd                  d«      Z3 ejd                  d«      Z4g d¢Z5g d¢Z6h d£Z7 e8e5e9d¬«      Z:d„ Z;d „ Z<d!„ Z=d"„ Z>d#„ Z?d$„ Z@d%„ ZAd&„ ZBej‡                  d'«      d(„ «       ZDej‡                  d)d*g¬+«      d,„ «       ZEej‡                  d-«      d.„ «       ZFej‡                  d/«      d0„ «       ZGej‡                  d1«      d2„ «       ZHej‡                  d3d*g¬+«      d4„ «       ZIej‡                  d5«      d6„ «       ZJd7„ ZKd8„ ZL eL«        ed9k(  rej›                  dd:¬;«       yy)<é    N)ÚStringIO)ÚFlaskÚrequestÚjsonifyÚ	send_fileÚrender_templateÚsessionÚResponse)Úsecure_filenameÚRESUMESORT_SECRETz*resumesort-local-secret-key-change-in-prodi  @ÚMAX_CONTENT_LENGTHÚuploadsÚ	processedÚtempT©Úexist_okÚpdfÚdocxi   c            	      óð   — t        j                   «       } t        j                  «       D ��cg c]$  \  }}| |j                  dd«      z
  t        kD  sŒ#|‘Œ& }}}|D ]  }t        |«       t        |= Œ y c c}}w )NÚlast_activer   )ÚtimeÚsessionsÚitemsÚgetÚSESSION_TTLÚ_cleanup_session_files)ÚnowÚsidÚsÚstales       ú/var/www/html/Extract/app.pyÚ_evict_old_sessionsr"   %   sg   € Ü
�)‰)‹+€CÜ'Ÿ~™~Ó/×_‘V�S˜!°3¸¿¹¸}ÈaÓ9PÑ3PÔS^Ó3^ŠSÐ_€EÑ_Øò ˆÜ˜sÔ#Ü�S‰Mñùó `s   ¬$A2ÁA2c                 ór  — t         j                  j                  t        | «      }t         j                  j	                  |«      rt        j                  |d¬«       t         j                  j                  t        d| › d�«      }t         j                  j	                  |«      rt        j                  |«       y y )NT)Úignore_errorsÚresumes_ú.zip)	ÚosÚpathÚjoinÚPROCESSED_FOLDERÚexistsÚshutilÚrmtreeÚTEMP_FOLDERÚremove)r   Úsession_dirÚzip_paths      r!   r   r   ,   ss   € Ü—'‘'—,‘,Ô/°Ó5€KÜ	‡w�w‡~�~�kÔ"Ü�‰�k°Õ6Ü�w‰w�|‰|œK¨8°C°5¸Ð)=Ó>€HÜ	‡w�w‡~�~�hÔÜ
�	‰	�(Õð  ó    c                  ó@   — g i i dddddœt        j                   «       dœS )Nr   )ÚtotalÚ
duplicatesÚerrorsr   )ÚrecordsÚseen_emailsÚseen_name_roleÚstatsr   )r   © r2   r!   Ú_fresh_sessionr<   4   s(   € à b¸BØ¨A¸ÈÑKÜ—y‘y“{ñð r2   c                  ól   — dt         vr$t        t        j                  «       «      t         d<   t         d   S )Nr   )r	   ÚstrÚuuidÚuuid4r;   r2   r!   Úget_session_idrA   ;   s(   € Ø”GÑÜœTŸZ™Z›\Ó*Œ�‰Ü�5‰>Ðr2   c                 ó|   — t         j                  j                  t        | «      }t        j                  |d¬«       |S )NTr   )r'   r(   r)   r*   Úmakedirs)r   Úds     r!   Úget_session_dirrE   @   s*   € Ü
�‰�‰Ô% sÓ+€AÜ‡K�K�˜DÕ!Ø€Hr2   c                 ó‚  — 	 d}t        | d«      5 }t        j                  |«      }|j                  r|j	                  d«       |j
                  D ]  }||j                  «       xs ddz   z  }Œ 	 d d d «       |j                  «       d fS #  Y d d d «       yxY w# 1 sw Y   Œ*xY w# t        $ r}d d|› �fcY d }~S d }~ww xY w)NÚ Úrb)Nu   Encrypted PDF â€” cannot readú
zPDF parse error: )	ÚopenÚPyPDF2Ú	PdfReaderÚis_encryptedÚdecryptÚpagesÚextract_textÚstripÚ	Exception)ÚfilepathÚtextÚfÚreaderÚpageÚes         r!   Úextract_text_pdfrY   G   sÎ   € ð-ØˆÜ�(˜DÓ!ð 	; QÜ×%Ñ% aÓ(ˆFØ×"Ò"Ø—^‘^ BÔ'àŸ™ò ;�Ø˜×*Ñ*Ó,Ò2°°dÑ:Ñ:‘ñ;÷	;ð �z‰z‹|˜TÐ!Ð!øð EÐD÷		;ð 	;ú÷ 	;ð 	;ûô ò -ØÐ(¨¨Ð,Ð,Õ,ûð-úsW   ‚B$ �"B²B	Á+BÁ/B$ Â	BÂBÂB$ ÂBÂB!ÂB$ Â$	B>Â-B9Â3B>Â9B>c                 ó–  — 	 t        j                  | «      }|j                  D �cg c]  }|j                  ‘Œ }}|j                  D ]?  }|j
                  D ].  }|j                  D ]  }|j                  |j                  «       Œ Œ0 ŒA dj                  |«      j                  «       d fS c c}w # t        $ r}d d|› �fcY d }~S d }~ww xY w)NrI   zDOCX parse error: )r   ÚDocumentÚ
paragraphsrT   ÚtablesÚrowsÚcellsÚappendr)   rQ   rR   )rS   ÚdocÚpÚpartsÚtableÚrowÚcellrX   s           r!   Úextract_text_docxrg   U   sÂ   € ð
.Ü�m‰m˜HÓ%ˆØ!$§¡Ö0˜A�—“Ð0ˆÐ0à—Z‘Zò 	,ˆEØ—z‘zò ,�ØŸI™Iò ,�DØ—L‘L §¡Õ+ñ,ñ,ð	,ð �y‰y˜Ó×%Ñ%Ó'¨Ð-Ð-ùò 1øô ò .ØÐ)¨!¨Ð-Ð-Õ-ûð.ús.   ‚#B. ¥B)¸A0B. Â)B. Â.	CÂ7CÂ=CÃCc                 óD   — |dk(  rt        | «      S |dk(  rt        | «      S y)Nr   r   )NzUnsupported format)rY   rg   )rS   Úexts     r!   rP   rP   b   s)   € Ø
ˆe‚|Ô-¨hÓ7Ð7Ø
ˆf‚}Ô.¨xÓ8Ð8Ø%r2   z0[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}zh(?:\+?91[\s\-]?[6-9]\d{9}|0[6-9]\d{9}|\+?[1-9]\d{0,2}[\s\-]\d{3,5}[\s\-]\d{4,7}|(?<!\d)[6-9]\d{9}(?!\d)))Xzsoftware engineerzsenior software engineerzjunior software engineerzlead software engineerzprincipal engineerzstaff engineerzfull stack developerzfrontend developerzbackend developerzweb developerzmobile developerzios developerzandroid developerzdata scientistzdata analystzdata engineerzmachine learning engineerzai engineerzml engineerznlp engineerzdevops engineerzcloud engineerzsite reliability engineerÚsrezsystems engineerzembedded engineerzfirmware engineerzelectrical engineerzmechanical engineerzcivil engineerzchemical engineerzbiomedical engineerzaerospace engineerznetwork engineerzsecurity engineerzcybersecurity analystzdatabase administratorÚdbazsystem administratorzit administratorzproject managerzproduct managerzprogram managerzscrum masterzbusiness analystzfinancial analystz
hr managerzhr executivezmarketing managerzsales managerzaccount managerzgraphic designerzui designerzux designerzui/ux designerzcontent writerztechnical writerÚ
copywriterzqa engineerztest engineerzquality assuranceÚsdetzresearch engineerzresearch scientistÚ	professorÚlecturerÚ
accountantzchartered accountantzfinance managerzoperations managerzsupply chain managerzlogistics managerÚ
consultantÚanalystÚ	architectÚ	developerÚengineerÚdesignerÚmanagerÚdirectorÚ	executiveÚofficerÚcoordinatorÚ
specialistÚinternÚfresherÚtraineeÚ	associate)zposition appliedzapplying forÚroleÚdesignationzcurrent rolezcurrent designationz	job titleÚposition>   úwork experienceúcareer objectiveúacademic backgroundúprofessional experienceÚskillsÚcontactÚhobbiesÚprofileÚsummaryÚprojectsÚ	educationÚ	interestsÚ	objectiveÚ
experienceÚ
referencesÚachievementsÚcertifications)ÚkeyÚreversec                 ó‚   — t         j                  | «      }|D ]%  }|j                  d«      rŒ|j                  «       c S  y )N)z.pngz.jpgz.gifz.svgz.ico)ÚEMAIL_REÚfindallÚendswithÚlower)rT   ÚmÚ	candidates      r!   Úextract_emailrž       sB   € Ü×Ñ˜Ó€Aàò %ˆ	Ø×!Ñ!Ð"JÕKØ—?‘?Ó$Ò$ð%ð r2   c                 óÜ  — t        j                  dd| «      }t        j                  |«      }|sy |d   }t        j                  dd|«      }t	        |«      dk(  r|j                  d«      rd|d	d
 › d|d
d  › �S t	        |«      dk(  r|j                  d«      rd|dd › d|dd  › �S t	        |«      dk(  r|d   dv rd|d d › d|dd  › �S t        j                  dd|«      j                  «       S )Nz5(?i)(mobile|phone|cell|contact|tel|mob|ph)[:\s\-\.#]*ú r   z[^\d]rG   é   Ú91z+91 é   é   é   Ú091é   é   é
   Ú6789é   z
[^\d+\s\-])ÚreÚsubÚPHONE_REr™   ÚlenÚ
startswithrQ   )rT   ÚcleanedÚmatchesÚrawÚdigitss        r!   Úextract_phonerµ   ¨   s	  € Ü�f‰fÐMÈsÐTXÓY€GÜ×Ñ˜wÓ'€GÙØØ�Q‰Z€CÜ�V‰V�H˜b #Ó&€Fä
ˆ6ƒ{�bÒ˜V×.Ñ.¨tÔ4Ø�f˜Q˜q�k�] ! F¨1¨2 J <Ð0Ð0Ü
ˆ6ƒ{�bÒ˜V×.Ñ.¨uÔ5Ø�f˜Q˜q�k�] ! F¨1¨2 J <Ð0Ð0Ü
ˆ6ƒ{�bÒ˜V A™Y¨&Ñ0Ø�f˜R˜a�j�\  6¨!¨" : ,Ð/Ð/ä�6‰6�-  SÓ)×/Ñ/Ó1Ð1r2   c                 ó   — | j                  «       }| j                  d«      }|d d D ]�  }|j                  «       j                  «       }t        D ]f  }|j	                  |«      sŒt        j                  dd|t
        j                  ¬«      j                  «       }dt        |«      cxk  rdk  sŒ_n Œb|c c S  Œ‘ |d d D ]�  }|j                  «       j                  «       }|t        v st        |«      dk  rŒ8t        D ]]  }||v sŒt        j                  d	d|«      j                  «       }|sŒ0|j                  «       t        vsŒGt        |«      dk  sŒV|d d
 c c S  ŒŸ t        D ]  }||v sŒ|j                  «       c S  y)NrI   é   u   ^[^:]+[:\-â€“]\s*rG   )Úflagsr§   éP   é(   z[^a-zA-Z\s/\-]é<   ÚProfessional)r›   ÚsplitrQ   ÚTITLE_LABELSr°   r¬   r­   Ú
IGNORECASEr¯   ÚSECTION_HEADERSÚ_SORTED_KEYWORDSÚtitle)	rT   Ú
text_lowerÚlinesÚlineÚllÚlabelr�   ÚkwÚcleans	            r!   Úextract_job_titlerÊ   ¹   s^  € Ø—‘“€JØ�J‰J�tÓ€Eð �c�r�
ò %ˆØ�Z‰Z‹\×ÑÓ!ˆÜ!ò 	%ˆEØ�}‰}˜UÕ#ÜŸF™FÐ#7¸¸TÌÏÉÔW×]Ñ]Ó_�	Ø”s˜9“~Ô*¨Ö*Ø$Ô$ñ		%ð%ð �c�r�
ò &ˆØ�Z‰Z‹\×ÑÓ!ˆØ”Ñ ¤C¨£G¨a¢KØÜ"ò 	&ˆBØ�RŠxÜŸ™Ð0°"°dÓ;×AÑAÓC�Ú˜UŸ[™[›]´/ÒAÄcÈ%ÃjÐTVÓFVØ   "˜:Ô%ñ		&ð	&ô ò ˆØ�ÒØ—8‘8“:Òðð r2   c                 ól  ‡— | j                  d«      D �cg c]#  }|j                  «       sŒ|j                  «       ‘Œ% }}|syg d¢}|d d D ]\  Št        ˆfd„|D «       «      r7d‰v r2‰j                  dd«      d   j                  «       }t        |«      r|c S ŒNt        ‰«      sŒZ‰c S  |d d D ]s  Št	        j
                  d	‰t        j                  «      }|sŒ+t        |j                  d«      j                  «       «      sŒT|j                  d«      j                  «       c S  |r|d
   d d S dS c c}w )NrI   ÚUnknown)Úresumezcurriculum vitaeÚcvr‹   zname:r‰   Úaddressé   c              3   ó\   •K  — | ]#  }‰j                  «       j                  |«      –— Œ% y ­w©N)r›   r°   )Ú.0ÚbrÅ   s     €r!   ú	<genexpr>zextract_name.<locals>.<genexpr>Þ   s"   øè ø€ Ò>¨aˆt�z‰z‹|×&Ñ& q×)Ñ>ùs   ƒ),ú:é   é   u!   (?:name|candidate)[:\-â€“]\s*(.+)r   rº   )r½   rQ   ÚanyÚlooks_like_namer¬   Úmatchr¿   Úgroup)rT   ÚlrÄ   Ú
bad_startsÚpartrœ   rÅ   s         @r!   Úextract_namerà   Ø   s  ø€ Ø $§
¡
¨4Ó 0Ö>˜1°A·G±GµIˆQ�W‰W�YÐ>€EÐ>ÙØÚY€JØ�b�q�	ò ˆÜÓ>°:Ô>Ô>Ø�d‰{Ø—z‘z # qÓ)¨!Ñ,×2Ñ2Ó4�Ü" 4Ô(Ø’KØÜ˜4Õ ØŠKðð �c�r�
ò &ˆÜ�H‰HÐ9¸4ÄÇÁÓOˆÚ” §¡¨£×!1Ñ!1Ó!3Õ4Ø—7‘7˜1“:×#Ñ#Ó%Ò%ð&ñ "ˆ5�‰8�C�Rˆ=Ð0 yÐ0ùò% ?s
   •D1«D1c                 óN  ‡ — ‰ j                  «       Š ‰ rt        ‰ «      dk  st        ‰ «      dkD  ry‰ j                  «       }dt        |«      cxk  rdk  sy yt        d„ ‰ D «       «      ryt	        d„ ‰ D «       «      t        ‰ «      z  dk  ryg d	¢}t        ˆ fd
„|D «       «      ryy)Nr§   é2   Fr£   r«   c              3   ó<   K  — | ]  }|j                  «       –— Œ y ­wrÒ   )Úisdigit©rÓ   Úcs     r!   rÕ   z"looks_like_name.<locals>.<genexpr>ô   s   è ø€ Ò
%˜1ˆ1�9‰9�;Ñ
%ùs   ‚c              3   ó`   K  — | ]&  }|j                  «       xs |j                  «       –— Œ( y ­wrÒ   )ÚisalphaÚisspacerå   s     r!   rÕ   z"looks_like_name.<locals>.<genexpr>ö   s$   è ø€ Ò
4¨!ˆ1�9‰9‹;Ò%˜!Ÿ)™)›+Ó%Ñ
4ùs   ‚,.g333333ë?)ru   rt   rw   rr   r�   rŒ   r‘   rŽ   rˆ   r‰   rÏ   ÚphoneÚemailÚmobileÚlinkedinÚgithubÚ	portfolioÚwebsitec              3   óB   •K  — | ]  }|‰j                  «       v –— Œ y ­wrÒ   )r›   )rÓ   ÚjrT   s     €r!   rÕ   z"looks_like_name.<locals>.<genexpr>û   s   øè ø€ Ò
+ ˆ1�—
‘
“ÔÑ
+ùs   ƒT)rQ   r¯   r½   rÙ   Úsum)rT   ÚwordsÚjunks   `  r!   rÚ   rÚ   í   s�   ø€ Ø�:‰:‹<€DÙ”3�t“9˜q’=¤C¨£I°¢NØØ�J‰J‹L€EØ”�U“Ô ˜qÒ Øð !ØÜ
Ñ
% Ô
%Ô%ØÜ
Ñ
4¨tÔ
4Ó4´s¸4³yÑ@À4ÒGØòH€Dô Ó
+ dÔ
+Ô+ØØr2   c                 óè   — t        j                  d| «      } | j                  dd«      j                  d«      } t	        j
                  dd| «      } t	        j
                  dd| j                  «       «      S )NÚNFKDÚasciiÚignorez[^a-zA-Z0-9\s\-]rG   z[\s\-]+Ú_)ÚunicodedataÚ	normalizeÚencodeÚdecoder¬   r­   rQ   )r   s    r!   Únormalize_stringrÿ     s[   € Ü×Ñ˜f aÓ(€AØ	�‰�˜(Ó#×*Ñ*¨7Ó3€AÜ
�‰Ð" B¨Ó*€AÜ�6‰6�*˜c 1§7¡7£9Ó-Ð-r2   c                 ó€   — t        | «      xs d}t        |«      xs d}|› d|› �}t        |«      dkD  r|d d }|› d|› �S )NrÌ   r¼   rú   éd   ú.)rÿ   r¯   )ÚnameÚ	job_titleri   Únrò   Úcombineds         r!   Úmake_filenamer    sW   € Ü˜ÓÒ- I€AÜ˜Ó#Ò5 ~€Aà��A�a�Sˆz€HÜ
ˆ8ƒ}�sÒØ˜D˜S�>ˆØˆZ�q˜˜ÐÐr2   c                 óv  — t         j                  j                  | |«      }t         j                  j                  |«      s||fS t         j                  j	                  |«      \  }}d}	 |› d|› |› �}t         j                  j                  | |«      }t         j                  j                  |«      s||fS |dz  }ŒR)z)Return a collision-free destination path.r×   rú   )r'   r(   r)   r+   Úsplitext)r0   ÚfilenameÚdestÚbaseÚdot_extÚcounterÚnew_names          r!   Úunique_destr    s    € ä�7‰7�<‰<˜ XÓ.€DÜ�7‰7�>‰>˜$ÔØ�Xˆ~ÐÜ—G‘G×$Ñ$ XÓ.�M€Dˆ'Ø€GØ
Ø�V˜1˜W˜I g YÐ/ˆÜ�w‰w�|‰|˜K¨Ó2ˆÜ�w‰w�~‰~˜dÔ#Ø˜�>Ð!Ø�1‰ˆð r2   ú/c                  ó   — t        d«      S )Nz
index.html)r   r;   r2   r!   Úindexr     s   € ä˜<Ó(Ð(r2   z/api/uploadÚPOST)Úmethodsc                  ó‚  — t        «        t        «       } t        | «      }| t        vrt	        «       t        | <   nt        j
                  «       t        |    d<   t        |    }g }t        j                  j                  d«      D �]¼  }|r|j                  sŒt        |j                  «      }|sŒ+d|v r#|j                  dd«      d   j                  «       nd}|t        vr&|j                  |ddd	œ«       |d
   dxx   dz  cc<   Œ‚|d
   dxx   dz  cc<   t        j                   j#                  t$        t'        j(                  «       › d|› �«      }|j+                  |«       	 t-        ||«      \  }}	|	s|rt3        |j5                  «       «      dk  r8t7        |«       |	xs d}|j                  |d|d	œ«       |d
   dxx   dz  cc<   �ŒFt9        |«      }t;        |«      }t=        |«      }t?        |«      }|r|j                  «       nd }tA        |«      j                  «       › dtA        |«      j                  «       › �}d\  }}|r||d   v rdd|d   |   › �}}n||d   v rdd|d   |   › �}}|r>t7        |«       |j                  |d||||xs d|xs ddœ«       |d
   dxx   dz  cc<   �Œ+|r||d   |<   ||d   |<   tC        |||«      }tE        ||«      \  }}	 tG        jH                  ||«       |||||xs d|xs dddœ}|d   j                  |«       |d
   dxx   dz  cc<   |j                  i |¥d|i¥«       �Œ¿ tK        ||d
   dœ«      S # t.        $ r}
t1        |
«      }	d }Y d }
~
�Œÿd }
~
ww xY w# t.        $ r>}
t7        |«       |j                  |dd|
› �d	œ«       |d
   dxx   dz  cc<   Y d }
~
�Œ7d }
~
ww xY w)Nr   Úresumesr  r×   éÿÿÿÿrG   Úerrorz"Unsupported format (PDF/DOCX only))ÚfileÚstatusÚreasonr:   r6   r4   rØ   zEmpty or unreadable filerú   )FrG   r8   TzSame email as r9   zSame name+role as Ú	duplicate)r  r  r  r  r  rë   rê   r5   zFile save error: r   ©ÚoriginalÚrenamedr  r  rë   rê   r  r7   r  )Úresultsr:   )&r"   rA   rE   r   r<   r   r   ÚfilesÚgetlistr
  r   Úrsplitr›   ÚALLOWED_EXTENSIONSr`   r'   r(   r)   r.   r?   r@   ÚsaverP   rR   r>   r¯   rQ   Ú_safe_removerž   rµ   rà   rÊ   rÿ   r  r  r,   Úmover   )r   r0   Úsessr!  r  r
  ri   Útmp_pathrT   ÚerrrX   r  rë   rê   r  r  Ú	dup_emailÚdup_namejobÚis_dupÚ
dup_reasonÚnew_filenameÚ	dest_pathÚrecords                          r!   Úupload_filesr3  $  sø  € äÔÜ
Ó
€CÜ! #Ó&€Kà
”(ÑÜ&Ó(Œ�Šä'+§y¡y£{Œ�‰�mÑ$ä�C‰=€DØ€Gä—‘×%Ñ% iÓ0ó R5ˆÙ˜4Ÿ=š=Øä" 4§=¡=Ó1ˆÙØà58¸H±_ˆh�o‰o˜c 1Ó% bÑ)×/Ñ/Ô1È"ˆàÔ(Ñ(Ø�N‰N H¸ÐKoÑpÔqØ�‰M˜(Ó# qÑ(Ó#ØàˆW‰�gÓ !Ñ#ÓÜ—7‘7—<‘<¤´·
±
³¨~¸Q¸s¸eÐ-DÓEˆØ�	‰	�(Ôð	Ü$ X¨sÓ3‰IˆD�#ñ
 ‘dœc $§*¡*£,Ó/°"Ò4Ü˜Ô"ØÒ6Ð6ˆFØ�N‰N H¸È6ÑRÔSØ�‰M˜(Ó# qÑ(Ó#Ùä! $Ó'ˆÜ! $Ó'ˆÜ  Ó&ˆÜ% dÓ+ˆ	ñ (-�e—k‘k”m°$ˆ	Ü)¨$Ó/×5Ñ5Ó7Ð8¸Ô:JÈ9Ó:U×:[Ñ:[Ó:]Ð9^Ð_ˆà&Ñˆ�
Ù˜ d¨=Ñ&9Ñ9Ø!%¨¸¸]Ñ8KÈIÑ8VÐ7WÐ'X�J‰FØ˜DÐ!1Ñ2Ñ2Ø!%Ð);¸DÐAQÑ<RÐS^Ñ<_Ð;`Ð'a�JˆFáÜ˜Ô"Ø�N‰N H¸ÈzØ$(°yÈ5Ê;ÐTVÐafÒalÐjlñnô oà�‰M˜,Ó'¨1Ñ,Ó'Ùñ Ø-5ˆD�Ñ 	Ñ*Ø.6ˆÐÑ˜{Ñ+ô % T¨9°cÓ:ˆÜ"-¨k¸<Ó"HÑˆ	�<ð	Ü�K‰K˜ )Ô,ð "Ø%ØØ"Øš bØš bØ$ñ
ˆð 	ˆY‰×Ñ˜vÔ&ØˆW‰�kÓ" aÑ'Ó"Ø�‰Ð3˜&Ð3 &¨(Ñ3Ö4ðeR5ôh ˜w°°g±Ñ?Ó@Ð@øô ò 	Ü�a“&ˆCØŽDûð	ûôX ò 	Ü˜Ô"Ø�N‰N H¸ÐM^Ð_`Ð^aÐKbÑcÔdØ�‰M˜(Ó# qÑ(Ó#Ýûð		ús0   Å!MËM7Í	M4ÍM/Í/M4Í7	N>Î 3N9Î9N>z
/api/statsc                  óz   — t        «       } t        j                  | t        «       «      }t	        |d   |d   dœ«      S )Nr:   r7   )r:   r7   )rA   r   r   r<   r   )r   r)  s     r!   Ú	get_statsr5  ˆ  s5   € ä
Ó
€CÜ�<‰<˜œ^Ó-Ó.€DÜ˜T '™]°t¸I±ÑGÓHÐHr2   z/api/download/zipc                  óÈ  — t        «       } t        | «      }t        j                  |«      }|st	        ddi«      dfS t        j
                  j                  t        d| › d�«      }t        j                  |dt        j                  «      5 }|D ]2  }|j                  t        j
                  j                  ||«      |«       Œ4 	 d d d «       t        |dd¬	«      S # 1 sw Y   ŒxY w)
Nr  zNo processed files availablei”  r%   r&   ÚwTzprocessed_resumes.zip)Úas_attachmentÚdownload_name)rA   rE   r'   Úlistdirr   r(   r)   r.   ÚzipfileÚZipFileÚZIP_DEFLATEDÚwriter   )r   r0   r"  r1   ÚzfÚfnames         r!   Údownload_ziprA  Ž  sÃ   € ä
Ó
€CÜ! #Ó&€KÜ�J‰J�{Ó#€EÙÜ˜Ð!?Ð@ÓAÀ3ÐFÐFä�w‰w�|‰|œK¨8°C°5¸Ð)=Ó>€HÜ	�‰˜ 3¬×(<Ñ(<Ó	=ð >ÀØò 	>ˆEØ�H‰H”R—W‘W—\‘\ +¨uÓ5°uÕ=ñ	>÷>ô �X¨TÐAXÔYÐY÷>ð >ús   Â	8CÃC!z/api/download/csvc                  ó  — t        «       } t        j                  | t        «       «      }t	        «       }t        j                  |g d¢¬«      }|j                  «        |j                  |d   «       t        |j                  «       dddi¬«      S )Nr  )Ú
fieldnamesr7   ztext/csvzContent-Dispositionz'attachment; filename=extracted_data.csv)ÚmimetypeÚheaders)rA   r   r   r<   r   ÚcsvÚ
DictWriterÚwriteheaderÚ	writerowsr
   Úgetvalue)r   r)  ÚoutputÚwriters       r!   Údownload_csvrM  œ  sy   € ä
Ó
€CÜ�<‰<˜œ^Ó-Ó.€DÜ‹Z€FÜ�^‰^˜FÚUôW€Fà
×ÑÔà
×Ñ�T˜)‘_Ô%Ü�F—O‘OÓ%°
Ø&Ð(QÐRôTð Tr2   z
/api/resetc                  óÖ   — t        «       } t        | «       t        j                  t        j                  j                  t        | «      d¬«       | t        v rt        | = t        ddi«      S )NTr   r  Úok)	rA   r   r'   rC   r(   r)   r*   r   r   )r   s    r!   Úreset_sessionrP  ©  sN   € ä
Ó
€CÜ˜3ÔÜ‡K�K”—‘—‘Ô-¨sÓ3¸dÕCØ
Œh�Ü�SˆMÜ�H˜dÐ#Ó$Ð$r2   z/api/searchc                  ó  ‡‡— t        «       } t        j                  | t        «       «      }t        j
                  j                  dd«      j                  «       j                  «       Št        j
                  j                  dd«      Št        j
                  j                  dd«      }|d   }|dk7  r|D �cg c]  }|d   |k(  sŒ|‘Œ }}‰rˆˆfd„}|D �cg c]  } ||«      sŒ|‘Œ }}t        |t        |«      dœ«      S c c}w c c}w )	NÚqrG   ÚfieldÚallr  r7   c                 ó  •‡ — ‰dk(  r"‰‰ j                  dd«      j                  «       v S ‰dk(  r"‰‰ j                  dd«      j                  «       v S ‰dk(  r"‰‰ j                  dd«      j                  «       v S t        ˆˆ fd„dD «       «      S )Nr  rG   r  rê   c              3   ób   •K  — | ]&  }‰‰j                  |d «      j                  «       v –— Œ( y­w)rG   N)r   r›   )rÓ   ÚkrR  Úrs     €€r!   rÕ   z0search_records.<locals>.match.<locals>.<genexpr>Ä  s)   øè ø€ Ò^°A�q˜AŸE™E ! B›K×-Ñ-Ó/Ô/Ñ^ùs   ƒ,/)r  r  rë   rê   )r   r›   rÙ   )rX  rS  rR  s   `€€r!   rÛ   zsearch_records.<locals>.matchÀ  s†   ù€ Ø˜Š¨A°·±°v¸bÓ1A×1GÑ1GÓ1IÐ,IÐ%IØ˜Ò#¨A°·±°{À2Ó1F×1LÑ1LÓ1NÐ,NÐ%NØ˜Ò¨A°·±°w¸rÓ1B×1HÑ1HÓ1JÐ,JÐ%JÜÔ^Ð9]Ô^Ó^Ð^r2   )r7   Úcount)
rA   r   r   r<   r   Úargsr›   rQ   r   r¯   )r   r)  Ústatus_filterr7   rX  rÛ   rS  rR  s         @@r!   Úsearch_recordsr\  ²  sä   ù€ ä
Ó
€CÜ�<‰<˜œ^Ó-Ó.€DÜ�L‰L×Ñ˜S "Ó%×+Ñ+Ó-×3Ñ3Ó5€AÜ�L‰L×Ñ˜W eÓ,€EÜ—L‘L×$Ñ$ X¨uÓ5€Mà�9‰o€Gà˜ÒØ%ÖF˜¨¨8©¸Ó)E’1ÐFˆÐFáõ	_ð
 &Ö2˜©¨q­’1Ð2ˆÐ2ä˜w´°W³Ñ>Ó?Ð?ùò Gùò 3s   Â5D ÃD ÃDÃ#Dc                 ó”   — 	 | r6t         j                  j                  | «      rt        j                  | «       y y y # t        $ r Y y w xY wrÒ   )r'   r(   r+   r/   rR   )r(   s    r!   r'  r'  Ë  s=   € ðÙ”B—G‘G—N‘N 4Ô(Ü�I‰I�d�Oð )ˆ4øäò Ùðús   ‚6; »	AÁAc                  óL  — t        j                  t        «      D ]y  } t         j                  j	                  t        | «      }	 t        j
                  «       t         j                  j                  |«      z
  }|t        kD  rt        j                  |«       Œ{ y # t        $ r Y Œˆw xY wrÒ   )
r'   r:  r.   r(   r)   r   Úgetmtimer   r/   rR   )r@  ÚfpathÚages      r!   Ú_startup_cleanuprb  Ô  s{   € Ü—‘œKÓ(ò ˆÜ—‘—‘œ[¨%Ó0ˆð	Ü—)‘)“+¤§¡× 0Ñ 0°Ó 7Ñ7ˆCØ”[Ò Ü—	‘	˜%Ô øñøô ò 	Ùð	ús   ÁABÂ	B#Â"B#Ú__main__iˆ  )ÚdebugÚport)Nr'   r¬   rF  r?   r   r,   r;  rû   Úior   Úflaskr   r   r   r   r   r	   r
   Úwerkzeug.utilsr   rK   r   Ú__name__ÚappÚenvironr   Ú
secret_keyÚconfigr(   ÚdirnameÚabspathÚ__file__ÚBASE_DIRr)   ÚUPLOAD_FOLDERr*   r.   rD   rC   r%  r   r   r"   r   r<   rA   rE   rY   rg   rP   Úcompiler˜   r®   ÚJOB_KEYWORDSr¾   rÀ   Úsortedr¯   rÁ   rž   rµ   rÊ   rà   rÚ   rÿ   r  r  Úrouter  r3  r5  rA  rM  rP  r\  r'  rb  Úrunr;   r2   r!   ú<module>rx     s±  ðÛ 	Û 	Û 
Û Û Û Û Û Ý ß X× XÑ XÝ *Û Û áˆHƒo€ð —‘—‘Ð 3Ð5aÓb€„Ø#4€‡
�
ÐÑ  à—7‘7—?‘? 2§7¡7§?¡?°8Ó#<Ó=€Ø—7‘7—<‘< ¨)Ó4€Ø—7‘7—<‘< ¨+Ó6Ð Ø—7‘7—<‘< ¨&Ó1€à
Ð)¨;Ð	7ò "€AØ€B‡K�K�˜DÖ!ð"ð ˜V�_Ð ð €Ø€òòòòò
ò-ò.ò&ð ˆ2�:‰:ÐIÓJ€àˆ2�:‰:ð	ó€ò€ò6€ò
€ñ ˜,¨C¸Ô>Ð òò2ò"ò>1ò*ò(.òòð  ‡�ˆ3ƒñ)ó ð)ð ‡�ˆ= 6 (€Ó+ñaAó ,ðaAðF ‡�ˆ<ÓñIó ðIð
 ‡�ÐÓñZó  ðZð ‡�ÐÓñ
Tó  ð
Tð ‡�ˆ< & €Ó*ñ%ó +ð%ð ‡�ˆ=Óñ@ó ð@ò0òñ Ô àˆzÒØ‡7�7�˜D€7Õ!ð r2   