ó
    ûÞ jØ‰  ã                  óÞ  • % S SK Jr  S SKrS SKrS SKJrJrJrJrJ	r	  S SK
Jr  SSKJr   " S S\	5      r\" S	S
S9rS*S jrS+S jrSS/4S,S jjrS-S.S jjrSS/4S,S jjrS*S jrS*S jrS*S jrS*S jrS*S jrS*S jrS/S jrSS/4     S0S jjrS*S jrS1S jrS2S jr         S3S jr!S4S jr"S5S  jr#S6S! jr$S7S" jr%S8S# jr&S9S:S$ jjr'S%r(S&\)S''   S;S( jr*              S<S) jr+g)=é    )ÚannotationsN)ÚAnyÚTypeVarÚCallableÚOptionalÚ
NamedTuple)Ú	TypeAliasé   )Úpandasc                  ót   • \ rS rSr% S\S'   SrS\S'   SrS\S'   SrS\S	'   SrS\S
'   Sr	S\S'   Sr
S\S'   Srg)ÚRemediationé   ÚstrÚnameNzOptional[str]Úimmediate_msgÚnecessary_msgzOptional[Callable[[Any], Any]]Únecessary_fnÚoptional_msgÚoptional_fnÚ	error_msg© )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__r   r   r   r   r   r   Ú__static_attributes__r   ó    ÚP/var/www/html/gaurav/venv/lib/python3.13/site-packages/openai/lib/_validators.pyr   r      sE   ‡ Ø
ƒIØ#'€M�=Ó'Ø#'€M�=Ó'Ø37€LÐ0Ó7Ø"&€L�-Ó&Ø26€KÐ/Ó6Ø#€Iˆ}Ö#r   r   ÚOptionalDataFrameTzOptional[pd.DataFrame])Úboundc                ób   • Sn[        U 5      U:¼  a  SOSnS[        U 5       SU 3n[        SUS9$ )zŠ
This validator will only print out the number of examples and recommend to the user to increase the number of examples if less than 100.
éd   Ú z§. In general, we recommend having at least a few hundred examples. We've found that performance tends to linearly increase for every doubling of the number of examplesz
- Your file contains z prompt-completion pairsÚnum_examples©r   r   )Úlenr   )ÚdfÚMIN_EXAMPLESÚoptional_suggestionr   s       r   Únum_examples_validatorr+      sO   € ð €Lô ˆr‹7�lÓ"ñ 	ð wð ð
 .¬c°"«g¨YÐ6NÐObÐNcÐd€MÜ˜N¸-ÑHÐHr   c                ó  ^^• SS jmSnSnSnSnTU R                   ;  aU  TU R                    Vs/ sH  n[        U5      R                  5       PM     sn;   a  SUU4S jjnUnST S3nST S3nOST S3n[        S	UUUUS
9$ s  snf )zS
This validator will ensure that the necessary column is present in the dataframe.
c                óÊ   • U R                    Vs/ sH$  n[        U5      R                  5       U:X  d  M"  UPM&     nnU R                  US   UR                  5       0SS9  U $ s  snf )Nr   T)ÚcolumnsÚinplace)r.   r   ÚlowerÚrename)r(   ÚcolumnÚcÚcolss       r   Úlower_case_columnÚ5necessary_column_validator.<locals>.lower_case_column,   sU   € ØŸ:š:ÓB™:�a¬¨Q«¯©«¸6Ñ)A—™:ˆÐBØ
�	‰	˜4 ™7 F§L¡L£NÐ3¸Tˆ	ÑBØˆ	ùò Cs
   � A ³A Nc                ó   >• T" U T5      $ ©Nr   )r(   r5   Únecessary_columns    €€r   Úlower_case_column_creatorÚ=necessary_column_validator.<locals>.lower_case_column_creator9   s   ø€ Ù(¨Ð-=Ó>Ð>r   z
- The `z ` column/key should be lowercasezLower case column name to `Ú`z^` column/key is missing. Please make sure you name your columns/keys appropriately, then retryr9   )r   r   r   r   r   )r(   úpd.DataFramer2   r   Úreturnr=   )r(   r=   r>   r=   )r.   r   r0   r   )	r(   r9   r   r   r   r   r3   r:   r5   s	    `      @r   Únecessary_column_validatorr?   '   sº   ù€ ô
ð
 €MØ€LØ€MØ€Ià˜rŸz™zÓ)Ø¸¿
º
ÓC¹
°1¤ A£§¡¦¹
ÑCÓC÷?ð ?ð 5ˆLØ'Ð(8Ð'9Ð9YÐZˆMØ9Ð:JÐ9KÈ1ÐM‰MàÐ,Ð-ð  .Lð  MˆIäØØ#Ø#Ø!Øñð ùò  Ds   ¯"BÚpromptÚ
completionc                ó^  ^• / nSnSnSn[        U R                  5      S:”  av  U R                   Vs/ sH  ofT;  d  M
  UPM     nnSnU H8  nU Vs/ sH  ohU;   d  M
  UPM     n	n[        U	5      S:”  d  M,  USU SU S3-  nM:     SU U 3nS	U 3nSU4S
 jjn[        SUUUS9$ s  snf s  snf )zC
This validator will remove additional columns from the dataframe.
Nr
   r$   r   z9
  WARNING: Some of the additional columns/keys contain `z<` in their name. These will be ignored, and the column/key `z`` will be used instead. This could also result from a duplicate column/key in the provided file.zh
- The input file should contain exactly two columns/keys per row. Additional columns/keys present are: z Remove additional columns/keys: c                ó   >• U T   $ r8   r   ©ÚxÚfieldss    €r   r   Ú1additional_column_validator.<locals>.necessary_fn^   s   ø€ Ø�V‘9Ðr   Úadditional_column©r   r   r   r   ©rE   r   r>   r   )r'   r.   r   )
r(   rF   Úadditional_columnsr   r   r   r3   Úwarn_messageÚacÚdupss
    `        r   Úadditional_column_validatorrO   K   s  ø€ ð ÐØ€MØ€MØ€Lä
ˆ2�:‰:ƒ˜ÓØ)+¯ªÓG© AÀ±Ÿa©ÐÐGØˆÛ$ˆBÙ1Ó=Ñ1˜!¸1±W—AÑ1ˆDÐ=Ü�4‹y˜1�}ØÐ"\Ð]_Ð\`ð  a]ð  ^`ð  ]að  aAð  !Bñ  B’ñ %ð Dð  EWð  DXð  Yeð  Xfð  gˆØ:Ð;MÐ:NÐOˆ÷	ô Ø Ø#Ø#Ø!ñ	ð ùò Hùò >s   ±B%½B%ÁB*ÁB*c                óœ  ^• SnSnSnU T   R                  S 5      R                  5       (       d&  U T   R                  5       R                  5       (       ai  U T   S:H  U T   R                  5       -  nU R                  5       R                  U   R                  5       nST SU 3nSU4S jjnS[        U5       ST S	3n[        S
T 3UUUS9$ )z9
This validator will ensure that no completion is empty.
Nc                ó   • U S:H  $ )Nr$   r   ©rE   s    r   Ú<lambda>Ú+non_empty_field_validator.<locals>.<lambda>q   s   €   b¢r   r$   z
- `z?` column/key should not contain empty strings. These are rows: c                ó4   >• X T   S:g     R                  T/S9$ )Nr$   ©Úsubset)Údropna)rE   Úfields    €r   r   Ú/non_empty_field_validator.<locals>.necessary_fnv   s$   ø€ Ø�u‘X ‘^Ñ$×+Ñ+°E°7Ð+Ð;Ð;r   úRemove z rows with empty ÚsÚempty_rI   rJ   )ÚapplyÚanyÚisnullÚreset_indexÚindexÚtolistr'   r   )r(   rY   r   r   r   Ú
empty_rowsÚempty_indexess    `     r   Únon_empty_field_validatorrf   i   sâ   ø€ ð €MØ€LØ€Mà	ˆ%�y‡�Ñ(Ó)×-Ñ-×/Ñ/°2°e±9×3CÑ3CÓ3E×3IÑ3I×3KÑ3KØ˜‘i 2‘o¨"¨U©)×*:Ñ*:Ó*<Ñ=ˆ
ØŸ™Ó(×.Ñ.¨zÑ:×AÑAÓCˆØ ˜wÐ&eÐfsÐetÐuˆ÷	<ð "¤# mÓ"4Ð!5Ð5FÀuÀgÈQÐOˆäØ�e�WÐØ#Ø#Ø!ñ	ð r   c                ó.  ^• U R                  TS9nU R                  5       R                  U   R                  5       nSnSnSn[	        U5      S:”  a:  S[	        U5       SSR                  T5       SU 3nS[	        U5       S	3nSU4S
 jjn[        SUUUS9$ )zQ
This validator will suggest to the user to remove duplicate rows if they exist.
rV   Nr   ú
- There are z duplicated Ú-z sets. These are rows: r[   z duplicate rowsc                ó"   >• U R                  TS9$ )NrV   )Údrop_duplicatesrD   s    €r   r   Ú.duplicated_rows_validator.<locals>.optional_fn‘   s   ø€ Ø×$Ñ$¨FÐ$Ð3Ð3r   Úduplicated_rows©r   r   r   r   rJ   )Ú
duplicatedra   rb   rc   r'   Újoinr   )r(   rF   rm   Úduplicated_indexesr   r   r   s    `     r   Úduplicated_rows_validatorrr   ƒ   sÀ   ø€ ð —m‘m¨6�mÐ2€OØŸ™Ó)×/Ñ/°Ñ@×GÑGÓIÐØ€MØ€LØ€Kä
ÐÓ Ó"Ø(¬Ð-?Ó)@Ð(AÀÈcÏhÉhÐW]ÓN^ÐM_Ð_vð  xJð  wKð  LˆØ ¤Ð%7Ó!8Ð 9¸ÐIˆ÷	4ô ØØ#Ø!Øñ	ð r   c                óØ   ^^• SnSnSn[        U 5      nUS:w  aF  SS jmT" U 5      m[        T5      S:”  a*  S[        T5       ST S3nS[        T5       S	3nSUU4S
 jjn[        SUUUS9$ )zO
This validator will suggest to the user to remove examples that are too long.
Núopen-ended generationc                óz   • U R                  S SS9nU R                  5       R                  U   R                  5       $ )Nc                ó^   • [        U R                  5      [        U R                  5      -   S:„  $ )Ni'  )r'   r@   rA   rR   s    r   rS   ÚClong_examples_validator.<locals>.get_long_indexes.<locals>.<lambda>¨   s    € ¬c°!·(±(«m¼cÀ!Ç,Á,Ó>OÑ.OÐRWÒ.Wr   é   )Úaxis)r^   ra   rb   rc   )ÚdÚlong_exampless     r   Úget_long_indexesÚ1long_examples_validator.<locals>.get_long_indexes§   s6   € ØŸG™GÑ$WÐ^_˜GÐ`ˆMØ—=‘=“?×(Ñ(¨Ñ7×>Ñ>Ó@Ð@r   r   rh   z. examples that are very long. These are rows: zf
For conditional generation, and for classification the examples shouldn't be longer than 2048 tokens.r[   z long examplesc                ó    >• T" U 5      nTU:w  a/  [         R                  R                  S[        U5       SU S35        U R	                  U5      $ )NzeThe indices of the long examples has changed as a result of a previously applied recommendation.
The z? long examples to be dropped are now at the following indices: Ú
)ÚsysÚstdoutÚwriter'   Údrop)rE   Úlong_indexes_to_dropr|   Úlong_indexess     €€r   r   Ú,long_examples_validator.<locals>.optional_fn±   s   ø€ Ù'7¸Ó':Ð$ØÐ#7Ó7Ü—J‘J×$Ñ$ð Aô  BEð  FZó  B[ð  A\ð  \[ð  \pð  [qð  qsð  tôð —v‘vÐ2Ó3Ð3r   r{   rn   )rz   r=   r>   r   rJ   )Úinfer_task_typer'   r   )r(   r   r   r   Úft_typer|   r…   s        @@r   Úlong_examples_validatorr‰   œ   s¤   ù€ ð €MØ€LØ€Kä˜bÓ!€GØÐ)Ó)ô	Añ (¨Ó+ˆäˆ|Ó˜qÓ Ø,¬S°Ó->Ð,?Ð?mÐnzÐm{ð  |cð  dˆMØ$¤S¨Ó%6Ð$7°~ÐFˆL÷4ð 4ô ØØ#Ø!Øñ	ð r   c                ó|  ^^• SnSnSnSnSm/ SQnU H~  nUS:X  a:  U R                   R                  R                  S5      R                  5       (       a  MC  U R                   R                  R                  USS9R                  5       (       a  M|  Um  O   TR	                  SS5      n[        U 5      nUS	:X  a	  [        S
S9$ SS jm[        U R                   SS9n	U R                   U	:H  R                  5       (       a  SU	 S3n[        S
US9$ U	S:w  aˆ  U	R	                  SS5      n
SU
 S3n[        U	5      S:”  a	  USU S3-  nU R                   R                  S[        U	5      *  R                  R                  U	SS9R                  5       (       a	  USU	 S3-  nOSnU	S:X  a  SU S3nS UU4S jjn[        SUUUUS9$ )!z”
This validator will suggest to add a common suffix to the prompt if one doesn't already exist in case of classification or conditional generation.
Nz


### =>

)ú ->z

###

z

===

z

---

z

===>

z

--->

r‹   r   F©Úregexú\nrt   Úcommon_suffix©r   Úsuffixc                ó    • U S==   U-  ss'   U $ ©Nr@   r   ©rE   r‘   s     r   Ú
add_suffixÚ2common_prompt_suffix_validator.<locals>.add_suffixâ   s   € Ø	ˆ(‹�vÑ‹Øˆr   ©ÚxfixzAll prompts are identical: `zt`
Consider leaving the prompts blank if you want to do open-ended generation, otherwise ensure prompts are different©r   r   r$   z 
- All prompts end with suffix `r<   é
   úR. This suffix seems very long. Consider replacing with a shorter suffix, such as `z5
  WARNING: Some of your prompts contain the suffix `zZ` more than once. We strongly suggest that you review your prompts and add a unique suffixa”  
- Your data does not contain a common separator at the end of your prompts. Having a separator string appended to the end of the prompt makes it clearer to the fine-tuned model where the completion should begin. See https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset for more detail and examples. If you intend to do open-ended generation, then you should leave the prompts emptyzAdd a suffix separator `z` to all promptsc                ó   >• T" U T5      $ r8   r   ©rE   r•   Úsuggested_suffixs    €€r   r   Ú3common_prompt_suffix_validator.<locals>.optional_fnù   ó   ø€ Ù˜aÐ!1Ó2Ð2r   Úcommon_completion_suffix©r   r   r   r   r   ©rE   r   r‘   r   r>   r   rJ   )
r@   r   Úcontainsr_   Úreplacer‡   r   Úget_common_xfixÚallr'   )r(   r   r   r   r   Úsuffix_optionsÚsuffix_optionÚdisplay_suggested_suffixrˆ   r�   Úcommon_suffix_new_line_handledr•   rž   s              @@r   Úcommon_prompt_suffix_validatorr¬   Á   s$  ù€ ð €IØ€MØ€LØ€Kð (Ðò€Nó (ˆØ˜EÓ!Ø�y‰y�}‰}×%Ñ% dÓ+×/Ñ/×1Ñ1ÙØ�9‰9�=‰=×!Ñ! -°uÐ!Ð=×AÑA×CÑCÙØ(ÐÙñ (ð  0×7Ñ7¸¸eÓDÐä˜bÓ!€GØÐ)Ó)Ü Ñ0Ð0ôô $ B§I¡I°HÑ=€MØ
�	‰	�]Ñ"×'Ñ'×)Ñ)Ø2°=°/ð  Bwð  xˆ	Ü ¸9ÑEÐEà˜ÓØ)6×)>Ñ)>¸tÀUÓ)KÐ&Ø;Ð<ZÐ;[Ð[\Ð]ˆÜˆ}Ó Ó"ØÐqð  sKð  rLð  LMð  Nñ  NˆMØ�9‰9�=‰=Ð.œC Ó.Ð.Ð/×3Ñ3×<Ñ<¸]ÐRWÐ<ÐX×\Ñ\×^Ñ^ØÐUÐVcÐUdð  eð  @ñ  @ˆMøð pˆà˜ÓØ1Ð2JÐ1KÐK[Ð\ˆ÷	3ð 	3ô Ø'Ø#Ø!ØØñð r   c                ó2  ^^• SnSnSnSn[        U R                  SS9mTS:X  a	  [        SS9$ SS jmU R                  T:H  R                  5       (       a	  [        SS9$ TS:w  a)  S	T S
3nU[	        T5      :  a  US-  nST S3nSUU4S jjn[        SUUUS9$ )z\
This validator will suggest to remove a common prefix from the prompt if a long one exist.
r   NÚprefixr—   r$   Úcommon_prefixr�   c                óB   • U S   R                   [        U5      S  U S'   U $ r“   ©r   r'   )rE   r®   s     r   Úremove_common_prefixÚ<common_prompt_prefix_validator.<locals>.remove_common_prefix  s#   € Ø˜‘k—o‘o¤c¨&£k mÐ4ˆˆ(‰Øˆr   z"
- All prompts start with prefix `r<   zÒ. Fine-tuning doesn't require the instruction specifying the task, or a few-shot example scenario. Most of the time you should only add the input data into the prompt, and the desired output into the completionúRemove prefix `z` from all promptsc                ó   >• T" U T5      $ r8   r   )rE   r¯   r²   s    €€r   r   Ú3common_prompt_prefix_validator.<locals>.optional_fn!  s   ø€ Ù+¨A¨}Ó=Ð=r   Úcommon_prompt_prefixrn   )rE   r   r®   r   r>   r   rJ   )r¦   r@   r   r§   r'   )r(   ÚMAX_PREFIX_LENr   r   r   r¯   r²   s        @@r   Úcommon_prompt_prefix_validatorr¹     sÎ   ù€ ð €Nà€MØ€LØ€Kä# B§I¡I°HÑ=€MØ˜ÓÜ Ñ0Ð0ôð 	�	‰	�]Ñ"×'Ñ'×)Ñ)ä Ñ0Ð0à˜ÓØ=¸m¸_ÈAÐNˆØœC Ó.Ó.Øð  rñ  rˆMØ,¨]¨OÐ;MÐNˆL÷>ð >ô Ø#Ø#Ø!Øñ	ð r   c                óB  ^^^• Sn[        U R                  SS9m[        T5      S:„  =(       a    TS   S:H  m[        T5      U:  a	  [        SS9$ SS jmU R                  T:H  R	                  5       (       a	  [        SS9$ S	T S
3nST S3nSUUU4S jjn[        SUUUS9$ )z`
This validator will suggest to remove a common prefix from the completion if a long one exist.
é   r®   r—   r   Ú r¯   r�   c                óf   • U S   R                   [        U5      S  U S'   U(       a  SU S    3U S'   U $ )NrA   r¼   r±   )rE   r®   Ú	ws_prefixs      r   r²   Ú@common_completion_prefix_validator.<locals>.remove_common_prefix7  s=   € Ø˜L™/×-Ñ-¬c°&«k¨mÐ<ˆˆ,‰Þà ! ! L¡/Ð!2Ð3ˆAˆl‰OØˆr   z&
- All completions start with prefix `z_`. Most of the time you should only add the output data into the completion, without any prefixr´   z` from all completionsc                ó   >• T" U TT5      $ r8   r   )rE   r¯   r²   r¾   s    €€€r   r   Ú7common_completion_prefix_validator.<locals>.optional_fnE  s   ø€ Ù# A }°iÓ@Ð@r   Úcommon_completion_prefixrn   )rE   r   r®   r   r¾   r   r>   r   rJ   )r¦   rA   r'   r   r§   )r(   r¸   r   r   r   r¯   r²   r¾   s        @@@r   Ú"common_completion_prefix_validatorrÃ   ,  sÆ   ú€ ð €Nä# B§M¡M¸ÑA€MÜ�MÓ" QÑ&×B¨=¸Ñ+;¸sÑ+B€IÜ
ˆ=Ó˜NÓ*Ü Ñ0Ð0ôð 	�‰˜Ñ&×+Ñ+×-Ñ-ä Ñ0Ð0à=¸m¸_ð  Mlð  m€MØ$ ] OÐ3IÐJ€L÷Añ Aô Ø'Ø#Ø!Øñ	ð r   c                ó  ^^• SnSnSnSn[        U 5      nUS:X  d  US:X  a	  [        SS9$ [        U R                  SS9nU R                  U:H  R	                  5       (       a  SU S	U S
3n[        SUS9$ Sm/ SQnU H>  nU R                  R
                  R                  USS9R                  5       (       a  M<  Um  O   TR                  SS5      n	SS jmUS:w  aˆ  UR                  SS5      n
SU
 S
3n[        U5      S:”  a	  USU	 S
3-  nU R                  R
                  S[        U5      *  R
                  R                  USS9R                  5       (       a	  USU S3-  nOSnUS:X  a  SU	 S3nS UU4S jjn[        SUUUUS9$ )!z˜
This validator will suggest to add a common suffix to the completion if one doesn't already exist in case of classification or conditional generation.
Nrt   Úclassificationr�   r�   r‘   r—   z All completions are identical: `zJ`
Ensure completions are different, otherwise the model will just repeat `r<   r™   z [END])	r   Ú.z ENDz***z+++z&&&z$$$z@@@z%%%FrŒ   r   rŽ   c                ó    • U S==   U-  ss'   U $ ©NrA   r   r”   s     r   r•   Ú6common_completion_suffix_validator.<locals>.add_suffixv  s   € Ø	ˆ,‹˜6Ñ!‹Øˆr   r$   z$
- All completions end with suffix `rš   r›   z9
  WARNING: Some of your completions contain the suffix `zU` more than once. We suggest that you review your completions and add a unique endingaH  
- Your data does not contain a common ending at the end of your completions. Having a common ending string appended to the end of the completion makes it clearer to the fine-tuned model where the completion should end. See https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset for more detail and examples.zAdd a suffix ending `z` to all completionsc                ó   >• T" U T5      $ r8   r   r�   s    €€r   r   Ú7common_completion_suffix_validator.<locals>.optional_fnˆ  r    r   r¡   r¢   r£   rJ   )
r‡   r   r¦   rA   r§   r   r¤   r_   r¥   r'   )r(   r   r   r   r   rˆ   r�   r¨   r©   rª   r«   r•   rž   s              @@r   Ú"common_completion_suffix_validatorrÌ   P  s  ù€ ð €IØ€MØ€LØ€Kä˜bÓ!€GØÐ)Ó)¨WÐ8HÓ-HÜ Ñ0Ð0ä# B§M¡M¸ÑA€MØ
�‰˜Ñ&×+Ñ+×-Ñ-Ø6°}°oð  FQð  R_ð  Q`ð  `að  bˆ	Ü ¸9ÑEÐEð  Ðò
€Nó (ˆØ�=‰=×Ñ×%Ñ% m¸5Ð%ÐA×EÑE×GÑGÙØ(ÐÙñ	 (ð
  0×7Ñ7¸¸eÓDÐôð ˜ÓØ)6×)>Ñ)>¸tÀUÓ)KÐ&Ø?Ð@^Ð?_Ð_`ÐaˆÜˆ}Ó Ó"ØÐqð  sKð  rLð  LMð  Nñ  NˆMØ�=‰=×ÑÐ2¤ MÓ 2Ð2Ð3×7Ñ7×@Ñ@ÀÐV[Ð@Ð\×`Ñ`×bÑbØÐYÐZgÐYhð  i~ð  ñ  ˆMøð dˆà˜ÓØ.Ð/GÐ.HÐH\Ð]ˆ÷	3ð 	3ô Ø'Ø#Ø!ØØñð r   c                óÒ   • S
S jnSnSnSnU R                   R                  SS R                  5       S:w  d   U R                   R                  S   S   S:w  a  SnSnUn[	        SUUUS	9$ )z†
This validator will suggest to add a space at the start of the completion if it doesn't already exist. This helps with tokenization.
c                ó6   • U S   R                  S 5      U S'   U $ )NrA   c                óB   • U R                  S5      (       a  SU -   $ SU -   $ )Nr¼   r$   )Ú
startswith)r\   s    r   rS   ÚLcompletions_space_start_validator.<locals>.add_space_start.<locals>.<lambda>š  s!   € ÀÇÁÈc×ARÑAR¸2Ð_`Ò:`ÐX[Ð_`Ò:`r   )r^   rR   s    r   Úadd_space_startÚ:completions_space_start_validator.<locals>.add_space_start™  s    € Ø˜L™/×/Ñ/Ñ0`Óaˆˆ,‰Øˆr   Nrx   r   r¼   zæ
- The completion should start with a whitespace character (` `). This tends to produce better results due to the tokenization we use. See https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset for more detailsz=Add a whitespace character to the beginning of the completionÚcompletion_space_startrn   rJ   )rA   r   ÚnuniqueÚvaluesr   )r(   rÒ   r   r   r   s        r   Ú!completions_space_start_validatorr×   ”  s€   € ô
ð €LØ€KØ€Mà	‡}�}×Ñ˜˜!Ð×$Ñ$Ó&¨!Ó+¨r¯}©}×/CÑ/CÀAÑ/FÀqÑ/IÈSÓ/Pð BˆØVˆØ%ˆÜØ%Ø#Ø!Øñ	ð r   c                óâ   ^• SU4S jjnU T   R                  S 5      R                  5       nU T   R                  S 5      R                  5       nUS-  U:”  a  [        SST ST S3S	T S
3US9$ g)zl
This validator will suggest to lowercase the column values, if more than a third of letters are uppercase.
c                óH   >• U T   R                   R                  5       U T'   U $ r8   )r   r0   )rE   r2   s    €r   Ú
lower_caseÚ(lower_case_validator.<locals>.lower_case²  s"   ø€ Ø�f‘I—M‘M×'Ñ'Ó)ˆˆ&‰	Øˆr   c                ó&   • [        S U  5       5      $ )Nc              3  ó~   #   • U H4  oR                  5       (       d  M  UR                  5       (       d  M0  S v •  M6     g7f©rx   N)ÚisalphaÚisupper©Ú.0r3   s     r   Ú	<genexpr>Ú9lower_case_validator.<locals>.<lambda>.<locals>.<genexpr>¶  ó&   é € Ð0]¹A°qÇÁÇ³ÐQR×QZÑQZ×Q\·±ºAùó   ‚=�=´	=©ÚsumrR   s    r   rS   Ú&lower_case_validator.<locals>.<lambda>¶  ó   € ¬SÑ0]¹AÓ0]Ô-]r   c                ó&   • [        S U  5       5      $ )Nc              3  ó~   #   • U H4  oR                  5       (       d  M  UR                  5       (       d  M0  S v •  M6     g7frÞ   )rß   Úislowerrá   s     r   rã   rä   ·  rå   ræ   rç   rR   s    r   rS   ré   ·  rê   r   r
   rÚ   z
- More than a third of your `z%` column/key is uppercase. Uppercase z÷s tends to perform worse than a mixture of case encountered in normal language. We recommend to lower case the data if that makes sense in your domain. See https://platform.openai.com/docs/guides/fine-tuning/preparing-your-dataset for more detailsz'Lowercase all your data in column/key `r<   rn   NrJ   )r^   rè   r   )r(   r2   rÚ   Úcount_upperÚcount_lowers    `   r   Úlower_case_validatorrð   ­  s“   ø€ ÷
ð �V‘*×"Ñ"Ñ#]Ó^×bÑbÓd€KØ�V‘*×"Ñ"Ñ#]Ó^×bÑbÓd€Kà�Q�˜Ó$ÜØØ;¸F¸8ÐChÐioÐhpð  qhð  iØBÀ6À(È!ÐLØ"ñ	
ð 	
ð r   c                óÎ  • SnSnSnSnSn[         R                  R                  U 5      (       Ga   U R                  5       R	                  S5      (       d$  U R                  5       R	                  S5      (       a`  U R                  5       R	                  S5      (       a  SOSu  pxSU S3nSU S	3n[
        R                  " X[        S
9R                  S5      nGOmU R                  5       R	                  S5      (       ad  SnSn[
        R                  " U 5      n	U	R                  n
[        U
5      S:”  a  US-  n[
        R                  " U [        S9R                  S5      nGOåU R                  5       R	                  S5      (       au  SnSn[        U S5       nUR                  5       n[
        R                  " UR!                  S5       Vs/ sH  nSU/PM	     snU[        S9R                  S5      nSSS5        GOLU R                  5       R	                  S5      (       af  [
        R"                  " U S[        S9R                  S5      n[        U5      S:X  a-  SnSn[
        R"                  " U [        S9R                  S5      nOÃOÂU R                  5       R	                  S5      (       ag   [
        R"                  " U S[        S9R                  S5      n[        U5      S:X  a)  [
        R"                  " U [        S9R                  S5      nO<SnSnO7SnS U ;   a  US!U  S"U R!                  S 5      S#    S$3-  nOUS!U  S%3-  nOS*U  S+3n[+        S,UUUS-9nXb4$ s  snf ! , (       d  f       N"= f! [$         a+    [
        R"                  " U [        S9R                  S5      n NYf = f! [$        [&        4 a1    U R!                  S 5      S#   R)                  5       nS&U  S'U S(U S)3n N�f = f).zÅ
This function will read a file saved in .csv, .json, .txt, .xlsx or .tsv format using pandas.
 - for .xlsx it will read the first sheet
 - for .txt it will assume completions and split on newline
Nz.csvz.tsv)ÚCSVÚ,)ÚTSVÚ	z=
- Based on your file extension, your file is formatted as a z filezYour format `z` will be converted to `JSONL`)ÚsepÚdtyper$   z.xlsxzH
- Based on your file extension, your file is formatted as an Excel filez/Your format `XLSX` will be converted to `JSONL`rx   z¥
- Your Excel file contains more than one sheet. Please either save as csv or ensure all data is present in the first sheet. WARNING: Reading only the first sheet...)r÷   z.txtz9
- Based on your file extension, you provided a text filez.Your format `TXT` will be converted to `JSONL`Úrr   )r.   r÷   ú.jsonlT)Úlinesr÷   z^
- Your JSONL file appears to be in a JSON format. Your file will be converted to JSONL formatz/Your format `JSON` will be converted to `JSONL`z.jsonz^
- Your JSON file appears to be in a JSONL format. Your file will be converted to JSONL formatz]Your file must have one of the following extensions: .CSV, .TSV, .XLSX, .TXT, .JSON or .JSONLrÆ   z Your file `z` ends with the extension `.éÿÿÿÿz` which is not supported.z` is missing a file extension.zYour file `z!` does not appear to be in valid z9 format. Please ensure your file is formatted as a valid z file.zFile z does not exist.Úread_any_format)r   r   r   r   )ÚosÚpathÚisfiler0   ÚendswithÚpdÚread_csvr   ÚfillnaÚ	ExcelFileÚsheet_namesr'   Ú
read_excelÚopenÚreadÚ	DataFrameÚsplitÚ	read_jsonÚ
ValueErrorÚ	TypeErrorÚupperr   )ÚfnamerF   Úremediationr   r   r   r(   Úfile_extension_strÚ	separatorÚxlsÚsheetsÚfÚcontentÚlines                 r   rü   rü   Ã  sÊ  € ð €KØ€MØ€MØ€IØ	€Bä	‡w�w‡~�~�e×Òð<	vØ�{‰{‹}×%Ñ% f×-Ñ-°·±³×1GÑ1GÈ×1OÑ1OØ@EÇÁÃ×@VÑ@VÐW]×@^Ñ@^±ÐdqÑ-Ð"àTÐUgÐThÐhmÐnð ð #0Ð0BÐ/CÐCaÐ b�Ü—[’[ ¼SÑA×HÑHÈÓL’Ø—‘“×'Ñ'¨×0Ñ0Ø k�Ø Q�Ü—l’l 5Ó)�ØŸ™�Ü�v“; “?Ø!ð  &Nñ  N�MÜ—]’] 5´Ñ4×;Ñ;¸BÓ?’Ø—‘“×'Ñ'¨×/Ñ/Ø \�Ø P�Ü˜% Ô%¨ØŸf™f›h�GÜŸšØ07·±¸dÔ0CÓDÑ0C¨˜"˜d›Ñ0CÑDØ &Ü!ñ÷ ‘f˜R“jð	 ÷ &Ñ%ð —‘“×'Ñ'¨×1Ñ1Ü—\’\ %¨t¼3Ñ?×FÑFÀrÓJ�Ü�r“7˜a“<ð %F�MØ$U�MÜŸš e´3Ñ7×>Ñ>¸rÓB‘BàØ—‘“×'Ñ'¨×0Ñ0ðCäŸš e°4¼sÑC×JÑJÈ2ÓN�BÜ˜2“w !“|äŸ\š\¨%´sÑ;×BÑBÀ2ÓF™ð )J˜Ø(Y™ð tð ð ˜%“<Ø <°¨wÐ6RÐSX×S^ÑS^Ð_bÓScÐdfÑSgÐRhð  iBð  "Cñ  C‘Ià <°¨wÐ6TÐ!UÑU‘Ið ˜E˜7Ð"2Ð3ˆ	äØØ#Ø#Øñ	€Kð ˆ?Ðùòc E÷ &Õ%ûô6 "ó CäŸš e´3Ñ7×>Ñ>¸rÓB’BðCûô œIÐ&ó 	vØ!&§¡¨SÓ!1°"Ñ!5×!;Ñ!;Ó!=ÐØ% e WÐ,MÐN`ÐMað  b[ð  \nð  [oð  ouð  vŠIð	vús�   ±B&N# ÃBN# Å!4N# Æ4MÇ	M
ÇMÇ0N# Ç:BN# Ê$N# Ê)A M+ Ì
M+ Ì&N# Ì6	N# ÍMÍ
M(Í$N# Í(N# Í+2N ÎN# ÎN Î N# Î#>O$Ï#O$c                óH   • [        U 5      nSnUS:X  a  SU S3n[        SUS9$ )zÇ
This validator will infer the likely fine-tuning format of the data, and display it to the user if it is classification.
It will also suggest to use ada and explain train/validation split benefits.
NrÅ   zK
- Based on your data it seems like you're trying to fine-tune a model for zã
- For classification, we recommend you try one of the faster and cheaper models, such as `ada`
- For classification, you can estimate the expected model performance by keeping a held out dataset, which is not used for trainingr%   r&   )r‡   r   )r(   rˆ   r   s      r   Úformat_inferrer_validatorr    sA   € ô
 ˜bÓ!€GØ€MØÐ"Ó"ØfÐgnÐfoð  pUð  VˆÜ˜N¸-ÑHÐHr   c                óh  • UR                   bP  [        R                  R                  SUR                   SUR                    S35        [        R
                  " S5        UR                  b)  [        R                  R                  UR                  5        UR                  b  UR                  U 5      n U $ )zk
This function will apply a necessary remediation to a dataframe, or print an error message if one exists.
z

ERROR in z validator: z

Aborting...rx   )	r   r€   Ústderrr‚   r   Úexitr   r�   r   )r(   r  s     r   Úapply_necessary_remediationr  (  s�   € ð ×ÑÑ(Ü�
‰
×Ñ˜=¨×)9Ñ)9Ð(:¸,À{×G\ÑG\ÐF]Ð]lÐmÔnÜ�Š�ŒØ× Ñ Ñ,Ü�
‰
×Ñ˜×2Ñ2Ô3Ø×ÑÑ+Ø×%Ñ% bÓ)ˆØ€Ir   c                óÄ   • [         R                  R                  U 5        U(       a   [         R                  R                  S5        g[        5       R	                  5       S:g  $ )NzY
TÚn)r€   r�   r‚   Úinputr0   )Ú
input_textÚauto_accepts     r   Úaccept_suggestionr#  6  s?   € Ü‡J�J×Ñ�ZÔ ÞÜ�
‰
×Ñ˜ÔØÜ‹7�=‰=‹?˜cÑ!Ð!r   c                ó  • SnSUR                    S3nUR                   b2  [        XB5      (       a"  UR                  c   eUR                  U 5      n SnUR                  b-  [        R
                  R                  SUR                   S35        X4$ )z[
This function will apply an optional remediation to a dataframe, based on the user input.
Fz- [Recommended] z [Y/n]: Tz- [Necessary] r   )r   r#  r   r   r€   r�   r‚   )r(   r  r"  Úoptional_appliedr!  s        r   Úapply_optional_remediationr&  >  s•   € ð ÐØ# K×$<Ñ$<Ð#=¸XÐF€JØ×ÑÑ+Ü˜Z×5Ñ5Ø×*Ñ*Ñ6Ð6Ð6Ø×(Ñ(¨Ó,ˆBØ#ÐØ× Ñ Ñ,Ü�
‰
×Ñ˜>¨+×*CÑ*CÐ)DÀBÐGÔHØÐÐr   c                óö   • [        U 5      nSnUS:X  a  [        U 5      nUS-  nO"U R                  SS9R                  5       nUS-  nSS jnU" US-   5      n[        R
                  R                  S	U S
35        g)z7
Estimate the time it'll take to fine-tune the dataset
g      ð?rÅ   g
×£p=
÷?T)rb   g‘í|?5^ª?c                ó°   • U S:  a  [        U S5       S3$ U S:  a  [        U S-  S5       S3$ U S:  a  [        U S-  S5       S3$ [        U S-  S5       S3$ )	Né<   r
   z secondsi  z minutesi€Q z hoursz days)Úround)Útimes    r   Úformat_timeÚ.estimate_fine_tuning_time.<locals>.format_time]  sv   € Ø�"‹9Ü˜D !“nÐ% XÐ.Ð.Ø�D‹[Ü˜D 2™I qÓ)Ð*¨(Ð3Ð3Ø�E‹\Ü˜D 4™K¨Ó+Ð,¨FÐ3Ð3ä˜D 5™L¨!Ó,Ð-¨UÐ3Ð3r   éŒ   z:Once your model starts training, it'll approximately take z~ to train a `curie` model, and less for `ada` and `babbage`. Queue will approximately take half an hour per job ahead of you.
N)r+  Úfloatr>   r   )r‡   r'   Úmemory_usagerè   r€   r�   r‚   )r(   Ú	ft_formatÚexpected_timer%   Úsizer,  Útime_strings          r   Úestimate_fine_tuning_timer5  P  s�   € ô   Ó#€IØ€MØÐ$Ó$Ü˜2“wˆØ$ tÑ+‰à�‰ TˆÐ*×.Ñ.Ó0ˆØ˜v™ˆô4ñ ˜m¨cÑ1Ó2€KÜ‡J�J×ÑØ
DÀ[ÀMð  RQð  	Rõr   c                óü   • U(       a  SS/OS/nSn US:”  a  SU S3OSnU Vs/ sH-  n[         R                  R                  U 5      S    SU U S3PM/     nn[        S	 U 5       5      (       d  U$ US
-  nMg  s  snf )NÚ_trainÚ_validr$   r   z (Ú)Ú	_preparedrù   c              3  ó^   #   • U H$  n[         R                  R                  U5      v •  M&     g 7fr8   )rý   rþ   rÿ   )râ   r  s     r   rã   Ú get_outfnames.<locals>.<genexpr>s  s"   é € Ð?Ñ.>¨”2—7‘7—>‘> !×$Ð$Ò.>ùs   ‚+-rx   )rý   rþ   Úsplitextr_   )r  r
  ÚsuffixesÚiÚindex_suffixr‘   Úcandidate_fnamess          r   Úget_outfnamesrB  m  s—   € Þ',�˜(Ñ#°2°$€HØ	€AØ
Ø$%¨£E˜˜A˜3˜a‘y¨rˆÙowÓxÑowÐekœrŸw™w×/Ñ/°Ó6°qÑ9Ð:¸)ÀFÀ8ÈLÈ>ÐY_Ó`ÑowÐÐxÜÑ?Ñ.>Ó?×?Ñ?Ø#Ð#Ø	ˆQ‰ˆñ ùâxs   ¤3A9c                óš   • U R                   R                  5       nS nUS:X  a'  U R                   R                  5       R                  S   nX4$ )Nr
   r   )rA   rÕ   Úvalue_countsrb   )r(   Ú	n_classesÚ	pos_classs      r   Úget_classification_hyperparamsrG  x  sF   € Ø—‘×%Ñ%Ó'€IØ€IØ�Aƒ~Ø—M‘M×.Ñ.Ó0×6Ñ6°qÑ9ˆ	ØÐÐr   c                óV  • [        U 5      n[        U R                  SS9n[        U R                  SS9nSnSnUS:X  a  [	        Xƒ5      (       a  SnSn	UR                  SS	5      n
UR                  SS	5      n[        U5      S
:”  a  SU S3OSnSnU(       d?  U(       d8  [        R                  R                  SU SU	 SU
 SU S3	5        [        U 5        g[	        Xƒ5      (       Ga¥  [        X5      nU(       aß  [        U5      S:X  a  SUS
   ;   a	  SUS   ;   d   eSn[        [        U 5      U-
  [        [        U 5      S-  5      5      nU R                  USS9nU R                  UR                   5      nUSS/   R#                  US
   SSSSS9  USS/   R#                  US   SSSSS9  [%        U 5      u  nnU	S-  n	US:X  a
  U	S U S3-  n	O5U	S!U 3-  n	O,[        U5      S:X  d   eU SS/   R#                  US
   SSSSS9  U(       a  S"OSS#-   S$R'                  U5      -   nU(       a	  S%US    S3OSn[        U
5      S
:X  a  SOS&U
 S3n[        R                  R                  S'U S(US
    SU U	 S)U U S35        [        U 5        g[        R                  R                  S*5        g)+aE  
This function will write out a dataframe to a file, if the user would like to proceed, and also offer a fine-tuning command with the newly created file.
For classification it will optionally ask the user if they would like to split the data into train/valid files, and modify the suggested command to include the valid set.
r‘   r—   FzQ- [Recommended] Would you like to split into training and validation set? [Y/n]: rÅ   Tr$   r   rŽ   r   z Make sure to include `stop=["z;"]` so that the generated texts ends at the expected place.z@

Your data will be written to a new JSONL file. Proceed [Y/n]: zK
You can use your file for fine-tuning:
> openai api fine_tunes.create -t "Ú"ue   

After youâ€™ve fine-tuned a model, remember that your prompt has to end with the indicator string `zX` for the model to start generating completions, rather than continuing with the prompt.r
   ÚtrainÚvalidrx   iè  gš™™™™™é?é*   )r  Úrandom_stater@   rA   ÚrecordsN)rú   ÚorientÚforce_asciiÚindentz! --compute_classification_metricsz" --classification_positive_class "z --classification_n_classes r\   z to `z` and `z -v "uc   After youâ€™ve fine-tuned a model, remember that your prompt has to end with the indicator string `z
Wrote modified filezd`
Feel free to take a look!

Now use that file when fine-tuning:
> openai api fine_tunes.create -t "z

z#Aborting... did not write the file
)r‡   r¦   r@   rA   r#  r¥   r'   r€   r�   r‚   r5  rB  ÚmaxÚintÚsamplerƒ   rb   Úto_jsonrG  rp   )r(   r  Úany_remediationsr"  r1  Úcommon_prompt_suffixr¡   r
  r!  Úadditional_paramsÚ%common_prompt_suffix_new_line_handledÚ)common_completion_suffix_new_line_handledÚoptional_ending_stringÚfnamesÚMAX_VALID_EXAMPLESÚn_trainÚdf_trainÚdf_validrE  rF  Úfiles_stringÚvalid_stringÚseparator_reminders                          r   Úwrite_out_filerd  €  s³  € ô
   Ó#€IÜ*¨2¯9©9¸8ÑDÐÜ.¨r¯}©}À8ÑLÐà€EØd€JØÐ$Ó$Ü˜Z×5Ñ5ØˆEàÐØ,@×,HÑ,HÈÈuÓ,UÐ)Ø0H×0PÑ0PÐQUÐW\Ó0]Ð-ô Ð8Ó9¸AÓ=ð )Ð)RÐ(Sð  TOñ  	Pàð ð V€Jæ¦EÜ�
‰
×ÑØ[Ð\aÐ[bÐbcÐduÐcvð  w^ð  _Dð  ^Eð  E]ð  ^tð  ]uð  uwð  xô	
ô 	" "Õ%ä	˜:×	3Ò	3Ü˜uÓ,ˆÞÜ�v“; !Ó#¨°6¸!±9Ó(<ÀÈFÐSTÉIÓAUÐUÐUØ!%ÐÜœ#˜b›'Ð$6Ñ6¼¼CÀ»GÀc¹MÓ8JÓKˆGØ—y‘y 7¸�yÐ<ˆHØ—w‘w˜xŸ~™~Ó.ˆHØ�h Ð-Ñ.×6Ñ6Ø�q‘	 ¨iÀUÐSWð 7ñ ð �h Ð-Ñ.×6Ñ6Ø�q‘	 ¨iÀUÐSWð 7ñ ô $BÀ"Ó#EÑ ˆI�yØÐ!DÑDÐØ˜A‹~Ø!Ð'IÈ)ÈÐTUÐ%VÑVÑ!à!Ð'CÀIÀ;Ð%OÑOÑ!ä�v“; !Ó#Ð#Ð#Ø�˜,Ð'Ñ(×0Ñ0Ø�q‘	 ¨iÀUÐSWð 1ñ ö
  %™¨"°Ñ7¸9¿>¹>È&Ó;QÑRˆÞ/4˜˜v a™y˜k¨Ñ+¸"ˆô Ð8Ó9¸QÓ>ñ àvð  x]ð  w^ð  ^vð  wð 	ô
 	�
‰
×ÑØ# L >ð  2Zð  [að  bcñ  [dð  Zeð  efð  gsð  ftð  uFð  tGð  GKð  L^ð  K_ð  `vð  _wð  wyð  zô	
ô 	" "Õ%ä�
‰
×ÑÐ?Õ@r   c                óÔ   • Sn[        U R                  R                  R                  5       5      S:X  a  g[        U R                  R                  5       5      [        U 5      U-  :  a  gg)z6
Infer the likely fine-tuning task type from the data
é   r   rt   rÅ   zconditional generation)rè   r@   r   r'   rA   Úunique)r(   ÚCLASSIFICATION_THRESHOLDs     r   r‡   r‡   Ë  sU   € ð  !ÐÜ
ˆ2�9‰9�=‰=×ÑÓÓ 1Ó$Ø&ä
ˆ2�=‰=×ÑÓ!Ó"¤S¨£WÐ/GÑ%GÓGØà#r   c                óü   • Sn US:X  a  U R                   [        U5      S-   * S OU R                   S[        U5      S-    nUR                  5       S:w  a   U$ X#R                  S   :X  a   U$ UR                  S   nMz  )zI
Finds the longest common suffix or prefix of all the values in a series
r$   r‘   rx   Nr   )r   r'   rÕ   rÖ   )Úseriesr˜   Úcommon_xfixÚcommon_xfixess       r   r¦   r¦   Ù  s¢   € ð €KØ
à59¸XÓ5EˆF�J‰Jœ˜[Ó)¨AÑ-Ð.Ð0Ñ1È6Ï:É:ÐVlÔX[Ð\gÓXhÐklÑXlÐKmð 	ð × Ñ Ó" aÓ'Øð
 Ðð	 ×0Ñ0°Ñ3Ó3Øð Ðð (×.Ñ.¨qÑ1ˆKñ r   z,Callable[[pd.DataFrame], Remediation | None]r	   Ú	Validatorc                 ó„   • [         S S [        [        [        [        [
        S S [        [        [        [        [        /$ )Nc                ó   • [        U S5      $ r“   ©r?   rR   s    r   rS   Ú get_validators.<locals>.<lambda>ñ  s   € Ô,¨Q°Ô9r   c                ó   • [        U S5      $ rÈ   rp  rR   s    r   rS   rq  ò  s   € Ô,¨Q°Ô=r   c                ó   • [        U S5      $ r“   ©rð   rR   s    r   rS   rq  ø  s   € Ô& q¨(Ô3r   c                ó   • [        U S5      $ rÈ   rt  rR   s    r   rS   rq  ù  s   € Ô& q¨,Ô7r   )r+   rO   rf   r  rr   r‰   r¬   r¹   rÃ   rÌ   r×   r   r   r   Úget_validatorsrv  î  s9   € äÙ9Ù=Ü#Ü!Ü!Ü!ÜÙ3Ù7Ü&Ü&Ü*Ü*Ü)ðð r   c                ód  • / nUb  UR                  U5        U H,  nU" U 5      nUc  M  UR                  U5        [        X5      n M.     [        U Vs/ sH!  nUR                  c  UR                  c  M  UPM#     sn5      n[        U Vs/ sH  o"R                  c  M  UPM     sn5      n	Sn
U(       aB  [
        R                  R                  S5        U H  n[        XU5      u  pU
=(       d    Un
M     O[
        R                  R                  S5        U
=(       d    U	nU" XXÄ5        g s  snf s  snf )NFz?

Based on the analysis we will perform the following actions:
z

No remediations found.
)	Úappendr  r_   r   r   r€   r�   r‚   r&  )r(   r  r  Ú
validatorsr"  Úwrite_out_file_funcÚoptional_remediationsÚ	validatorÚ&any_optional_or_necessary_remediationsÚany_necessary_appliedÚany_optional_appliedr%  Ú!any_optional_or_necessary_applieds                r   Úapply_validatorsr�    s.  € ð 02ÐØÑØ×$Ñ$ [Ô1Ûˆ	Ù “mˆØÓ"Ø!×(Ñ(¨Ô5Ü,¨RÓ=ŠBñ	  ô .1ñ  5ó	
á4�Ø×'Ñ'Ñ3°{×7PÑ7P÷ Ù4ñ	
ó.Ð*ô  Ù(=ÓgÑ(=˜×AZÑAZ�Ñ(=ÑgóÐð !Ðæ-Ü�
‰
×ÑÐ]Ô^Û0ˆKÜ#=¸bÈ{Ó#[Ñ ˆBØ#7×#KÐ;KÒ ò 1ô 	�
‰
×ÑÐ7Ô8à(<×(UÐ@UÐ%á˜Ð#DÕRùò+	
ùò 	hs   ÁD(Á3D(Â	D-ÂD-)r(   r=   r>   r   )r(   r=   r9   r   r>   r   )r(   r=   rF   ú	list[str]r>   r   )rA   )r(   r=   rY   r   r>   r   )r(   r=   r2   r   r>   úRemediation | None)r  r   rF   r‚  r>   z'tuple[pd.DataFrame | None, Remediation])r(   r    r  r   r>   r    )r!  r   r"  Úboolr>   r„  )r(   r=   r  r   r"  r„  r>   ztuple[pd.DataFrame, bool])r(   r=   r>   ÚNone)r  r   r
  r„  r>   r‚  )r(   r=   r>   ztuple[int, object])
r(   r=   r  r   rV  r„  r"  r„  r>   r…  )r(   r=   r>   r   )r‘   )rj  r   r˜   r   r>   r   )r>   úlist[Validator])r(   r=   r  r   r  rƒ  ry  r†  r"  r„  rz  zCallable[..., Any]r>   r…  ),Ú
__future__r   rý   r€   Útypingr   r   r   r   r   Útyping_extensionsr	   Ú_extrasr   r  r   r    r+   r?   rO   rf   rr   r‰   r¬   r¹   rÃ   rÌ   r×   rð   rü   r  r  r#  r&  r5  rB  rG  rd  r‡   r¦   rm  r   rv  r�  r   r   r   Ú<module>r‹     sx  ðæ "ã 	Û 
ß ?Õ ?Ý 'å "ô$�*ô $ñ Ð1Ð9QÑRÐ ôIô!ðH HPÐQ]ÐF^ö ö<ð4 FNÈ|ÐD\ö ô2"ôJAôH$ôN!ôHAôHô2ð. &.¨|Ð$<ðVØðVØ!ðVà,õVôr	Iôô"ð Øð Ø#.ð Ø=Að àô ô$ô:ô ôHAôV$öð$ F€	ˆ9Ó Eôð('SØð'Sàð'Sð $ð'Sð  ð	'Sð
 ð'Sð ,ð'Sð 
õ'Sr   