o
    Yg>                  
   @   s  d Z ddlmZ ddlmZ ddlZddlmZmZmZ ddl	m	Z	 ddl
mZ ddlZddlZddlmZ dd	lmZ dd
l	mZ ddlmZmZ ddlZddlZddlmZ ddlmZmZmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) ddl(m*Z* ddl+m,Z, ddl-m.Z. ddl/Z/ddl0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9Z9ddlZddl:Z:ddlm;Z; ddl<m=Z= ddl>m?Z? ej@Aej@Bej@CeD ddlEZEeEF ZGddlHmIZI edd  ZJed!d" ZKed#d$ ZLed%d& ZMed'd( ZNe8d)ejOd*< eGPd+e8d)  e# ZQe8d,ZRe8d-ZSe3d.d/d0d1ZTd2d3 ZUze%eTg d4eQe%V d5ZWW n* eXyl ZY zeGZd6eY  eU rbe%eTg d4eQe%V d5ZWW Y dZY[YndZY[Yww d7d8 Z[d9d: Z\d;d< Z]d=d> Z^d?d@ Z_dAdB Z`dCdD ZadEdF ZbdGecdHecdIedfdJdKZedLdM ZfdNdO ZgedPdQ ZhedRdS ZiedTdU ZjedVdW ZkdXdY ZledZd[ Zmd\d] Zned^d_ Zod`da Zpdbdc Zqddde Zrdfdg ZsdS )hz:
Created on Tue Oct 29 23:30:08 2024

@author: karthikraj
    )render)csrf_exemptN)	timedeltadatetimetimezone)time)
ChatOpenAI)dumps)floor)sleep)JsonResponseHttpResponse)	natsorted)BaseMessagemessage_to_dictmessages_from_dict)OpenAI)PromptTemplate)OpenAIEmbeddings)ElasticsearchStore)ConversationalRetrievalChain)ConversationBufferMemory)ConversationBufferWindowMemory)HumanMessage)	AIMessage)HTTPBasicAuth)ElasticsearchNotFoundError)OrderedDict)config)redirect)	send_mail)reverse)xframe_options_exemptc                 C   s(   | j d}|rt| dd|iS tdS )Nnamez
index.html	user_namelogin)sessiongetr   r    )requestr$    r*   ,/var/www/html/AlliBot_CAA/AlliBot_R/views.pychatbot7   s   r,   c              
   C   sH  | j dkr| jd }| jd }td| td| td|  zetjddddd	d|iigiiid
}|d d d dkr}|d d D ]+}|d }d|v rd|d |krY|| jd< qCt| dddi  W S t| dddi  W S td| d t	t
W S t| dddiW S  ty } ztd| W  Y d }~S d }~ww t| dS )NPOSTusernamepasswordzusername%s allibotv5_user_detailsqueryboolmustmatchindexbodyhitstotalvaluer   _sourcer$   
login.htmlerrorzInvalid credentialszUser z4 authenticated successfully. Redirecting to chatbot.An error occurred: )methodr-   printloggerinfoessearchr'   r   r    r,   	Exceptionr   )r)   r.   r/   responsehitsourceer*   r*   r+   
login_view?   sD   







rJ   c              
   C   s  | j dkr| jd}z`tjdddd|iiid}|d d d	 d
krc|d d d
 d }|d}|rZtd| d}|| d7 }td| td|d|gdd t| dddiW S t| dddiW S t| dddiW S  t	y } zt
d| W  Y d }~S d }~ww t| dS )Nr-   r.   r0   r1   r4   r5   r8   r9   r:   r   r;   mail
user_emailz.Click the link below to reset your password:

z/reset-password/messagezPassword Reset Requestztna@scic.comF)subjectrM   
from_emailrecipient_listfail_silentlyzforgot_password.htmlz'Password reset link sent to your email.r=   zEmail not found for this user.User not found.r>   )r?   r-   r(   rC   rD   r@   build_absolute_urir!   r   rE   r   )r)   r.   rF   	user_datarL   rM   rI   r*   r*   r+   forgot_password_views   sB   
	



rU   c              
   C   s   | j dkrf| jd}| jd}z;tjdddd|iiid}|d d	 d
 dkrH|d d d d }tjd|dd|iid t| dddiW S tdW S  tye } ztd| W  Y d }~S d }~ww t| dS )Nr-   r.   new_passwordr0   r1   r4   r5   r8   r9   r:   r   _iddocr/   r6   idr7   r<   rM   z%Password has been reset successfully.rR   r>   zreset_password.html)	r?   r-   r(   rC   rD   updater   r   rE   )r)   r.   rV   rF   user_idrI   r*   r*   r+   reset_password_view   s8   
		

r]   c                 C   s   | j d= td}td|dS )Nr$   r&   zSignout successful)rM   redirect_url)r'   r"   r   )r)   	login_urlr*   r*   r+   signout   s   r`   
SECRET_KEYOPENAI_API_KEYz	key caa%ses_index_namechatname_indexz^https://elastic:8oKIqy312EBsAPzWT64NUzji@scic-elasticsearch.es.us-central1.gcp.cloud.es.io:443i,  T)request_timeoutretry_on_timeoutc                  C   s*   t dd} tjd| d}|jdkrdS dS )Nelastic8oKIqy312EBsAPzWT64NUzjiz9https://scic-elasticsearch.es.us-central1.gcp.cloud.es.io)auth   TF)r   requestsr(   status_code)basicrF   r*   r*   r+   check_elastic_status   s
   

rn   )docx_new_pagepdf_new_pageadditional_commercial_formsdocx_pdf_pagebotcoach_indexhtml_unstructured1excel_json_indpdf_json_indiso_forms_pdf_full_pdfiso_forms_pdf_pagewisejson_othersallibot_faq)es_connection
index_name	embeddingstrategyException occured due to %sc                 C   s8   ddd|iidddiigd}t j| |d}|d	 d	 S )
N  r4   
session_idlastmodified_atorderasc)sizer1   sortr5   r8   )rC   rD   )r|   r   r1   rF   r*   r*   r+   search_by_session_id   s   r   c                 C   s4   t t  d }dd|ii}tj| ||d d S )Nr   rX   r   rY   )intr   now	timestamprC   r[   )r|   doc_idcurrent_timestampupdate_bodyr*   r*   r+   update_lastmodified_at  s   r   c
                 C   sX   | |||||t t d t t d tjtt|ddd|||	d}
tj||
d}|S )Nr   contentTensure_ascii)r.   alliance_number	modelnameappnamer   user_prompt
created_atr   historyzhuman tokenis_safeflagged_categoriesr5   )roundr   jsonr	   r   r   rC   r6   )customerr   r   r   r   r6   
user_tokenr   r   r   rX   resr*   r*   r+   add_user_message_to_es  s$   r   c           	      C   sV   | |||||t t d t t d tjtt|ddd|dd}tjt|d}|S )Nr   r   Tr   null)r.   r   r   r   r   answerr   r   r   zassistant tokenfeedbackr5   )	r   r   r   r	   r   r   rC   r6   rc   )	r   r   r   r   r   assistant_tokenr   rX   r   r*   r*   r+   add_assistant_message_to_es5  s"   r   c                 C   s*   t | |}|D ]}|d }t| | qd S )NrW   )r   r   )r|   r   	documentsrX   r   r*   r*   r+   update_create_at_with_sessionidM  s
   
r   c                 C   sT   ddd|iid}t j| |d}d}|d d D ]}|d }d	|v r'|d	}q|S )
N  termsession_id.keywordr   r1   r5    r8   r;   chat_id_name)rC   rD   r(   )r|   r   r1   rF   r   rG   rH   r*   r*   r+   get_chat_id_names_by_session_idV  s   

r   c                 C   sb   ddd| iid}d}t jj|dr/t j||d}g }|d d D ]	}||d	  q!t| |S )
N'  match_phrasetextr   rs   )r6   r5   r8   rW   )rC   indicesexistsrD   appendr@   )r   search_queryrc   resultsidsrG   r*   r*   r+   Bot_coach_quesg  s   	r   c                 C   sP   t  }| D ]}|dd}tj|}tj|d }|| qd|}|S )NrH   r   r   z, )setr(   ospathbasenamesplitextaddjoin)	meta_dataunique_sourcesitemrH   filenamename_without_extunique_sources_strr*   r*   r+   unique_sources_with_pages}  s   
r   stringmodelreturnc                 C   s   t |}t|| }|S )z.Returns the number of tokens in a text string.)tiktokenencoding_for_modellenencode)r   r   encoding
num_tokensr*   r*   r+   num_tokens_from_string  s   
r   c                 C   s   t jdddd|iiidd d }|r`|D ]
}|d }|d }q|d	d
}|dd
}| | }	|| }
|	|
 }d}t|| d }d|
|	|||di}t jd||d}td| d|  d S d S )N&organization_level_alli_v2_token_countr1   r4   organization_namer5   r8   rW   r;   input_overall_tokensr   output_overall_tokensi d   rX   )r   r   overall_tokensr   
percenatgerY   zUpdated document ID: z, Response: )rC   rD   r(   r
   r[   r@   )input_tokensoutput_tokensorg_nameorg_toksrX   r   
doc_sourceinpoutpr   r   r   tokens_usable
percentage
update_docr   r*   r*   r+   	org_token  sF   		

r   c                 C   s6  t jddddd| iigdd|iidddd	diiiigd
iidd d }|rd}|D ]G}|d }|d }	|	d|krrd}|	dd}
|	dd}||
 }|| }|| }d|||||| di}t jd||d td|   nq+|s|||||| | d}t jd|d td|  d S d S td|   d S )N risk_insurance_education_alli_v2r1   r2   r4   r   r.   must_notr   field)r3   shouldr5   r8   FrW   r;   Tr   r   r   rX   )participant_namer.   r   r   r   r   rY   zDocument updated for username: z#New document created for username: z$No document found for organization: )rC   rD   r(   r[   r@   r6   )r   candidatenamer.   r   r   user_tokensusername_foundrX   r   r   r   r   r   r   r   updated_docnew_docr*   r*   r+   user_org_tokens  sl   

r   c              
   C   s   z+t  }|jjd| d}| }|d d d }|d d d }| |r(|fW S i fW S  tyH } ztd|  di fW  Y d	}~S d	}~ww )
zg
    Check user input using the Moderation API.
    Returns a tuple (is_safe, flagged_categories).
    zomni-moderation-latest)r   inputr   r   flagged
categorieszModeration API failed: TN)r   moderationscreateto_dictrE   r@   )r   clientrF   ar   r   rI   r*   r*   r+   moderate_input	  s   r   c                  C   sL  z{| j dkrz| jd}d}| jd}|dkrq| jd}| jd}| jd}td	 | jd
}tt| t|d}t|\}	}
t	|||||t|d|	|

 |	rnd}t
g d|d}tdddd}td tjtdd|iidd}|rt|d d dkrdd |d d D }ng }t|}|rtdt|D ]%}t|| tkr|j|| j qt|| tkr|j|| j qtjtddtjddid|d|idd }||}|d }t|d}t||||||d t||| t ||||| |d! }g }|D ]	}|!|j" qt#|}z/t$d"%d#d |d! D }t$|}t$|}t$|}d$| d%| d%| d%| }t&'| W n! t(ye } zt)*d&|  t)+d'|  W Y d }~nd }~ww t,||d(W S W d S t,d)||
d*W S W d S  t(y } zt)*d&|  t)+d+|  t,d,t-|iW  Y d }~S d }~ww )-Nr-   operational_typezCA-12345r$   action1r   r   r   z/nrM   zgpt-4-turboa  Answer the question in your own words as truthfully as possible from the context given to you. If there is any MCQ question explain why the choice is correct.
                    If you do not know the answer to the question, simply respond with "That's a great question! I'm not sure of the answer right now.  Can you ask your question a different way? I am excited to assist you further!".
                    Response must be in and around 200 words. it must be in paragraph manner and it must not exceed 4 paragraphs.
                    Give a line of space between the paragraphs.
                    If questions are asked where there is no relevant context available, simply respond with "That's a great question! I'm not sure of the answer right now.  Can you ask your question a different way? I am excited to assist you further!"
                    Context: {context}
            
            
                    {chat_history}
                    Human: {question}
                    Assistant:)contextchat_historyquestion)input_variablestemplater   Tr   )
memory_keyreturn_messages
output_key   r4   lastmodified_at:ascr6   r1   r   r8   r   c                 S   s   g | ]}t |d  d qS )r;   r   r   loads.0documentr*   r*   r+   
<listcomp>W  s    zallibot.<locals>.<listcomp>)r   k   )search_kwargsprompt)llm	retrievermemorycombine_docs_chain_kwargsreturn_source_documentssource_documentsr   c                 S   s   g | ]	}|j d  d qS )page_content
_lc_kwargs)r  )r  rX   r*   r*   r+   r	    s    zHpython3 /var/www/html/AlliBot_CAA/AlliBot_R/Quesgen_answer_relevancy.py  r   zfirst exception%s)rF   r   zjThe Question you asked violates AlliBot usage policies.Don't repeat this from blocking of AlliBot account.)rF   r   r   zsecond exception%sr=   ).r?   r-   r(   r'   r@   r   rc   r   r   r   r   r   r   rC   rD   r   r   rangetyper   chat_memoryadd_user_messager   r   add_ai_messager   from_llmr   dbas_retrieverr   r   r   r   metadatar   r	   r   r   popenrE   rA   	exceptionrB   r   str) r)   action_typer   r.   r   r   r   r   "input_token_cost_gpt4_0125_previewr   r   r   r  r  resultitemssession_chat_histiqaformatted_responser   #output_token_cost_gpt4_0125_previewrH   r   sorunique_entries_mod_strjson_str	user_quesanswer_promptunique_entries_strcmdrI   r*   r*   r+   allibot!  s   





P
pr3  c           
   	   C   s2  z| j dkrtd | jd}| jd}| jd}| jd}td tj|dd	d
|iidd}|d d d }td| |dkrw|d d D ]#}|d }d|d v rn|d d }	|	|krntj||d|iddd qKtdddW S tdddddW S W d S  t	y   td| d | d! Y d S w )"Nr-   zthumbs flagr   	indexnamer   thumbs_flag   r   r   r   r   r5   r8   r9   r:   
total_docsr   rW   r;   r   T)rX   doc_as_upsertrY   successzDocument updated)statusrM   failurezNo documents foundi  r:  z)Error: No documents found for session_id z and answer 'z'.)
r?   r@   r-   r(   r   rC   rD   r[   r   r   )
r)   r   r|   r   r5  rF   r7  rG   r   r   r*   r*   r+   update_thumbs_flag  sJ   



,r=  c              
   C   s   | j dkrWtd | jd}|stddiddS z!td| tjjjd	d
|d}|j	}t
|d}td|iW S  tyV } ztdt|iddW  Y d }~S d }~ww tddiddS )Nr-   enteredrM   r=   zNo input text provided  r<  
input_textztts-1alloy)r   voicer   zutf-8audio  Invalid request method  )r?   r@   r-   r(   r   openairC  speechr   r   base64	b64encodedecoderE   r"  )r)   r@  rF   audio_contentbase64_encoded_audiorI   r*   r*   r+   text_to_speech  s(   

 rN  c              	   C   s(   ddd| dddd|g	}t j|dd	 |S )
a'  
    Re-encodes the input audio file to mono and 16kHz, saving it as a WAV file.
    
    Parameters:
    input_file_path (str): Path to the input audio file.
    output_file_path (str): Path to save the re-encoded output file.
    
    Returns:
    str: Path to the re-encoded output file.
    ffmpegz-yz-iz-ac1z-ar16000T)check)
subprocessrun)input_file_pathoutput_file_pathffmpeg_commandr*   r*   r+   reencode_audio  s   	rX  c              
   C   s  | j dkrd| jv r| jd }z| }t  d|j }tjtj	t
d }tjtj	t
d }tj|dd tj|dd tj||}t|d}|| W d    n1 s`w   Y  td	|  t|d
 | |d
 |  t }t|d
 | d}|jjjd|dd}	t|d
 |  t|d
 |  td|	  td|	iW S  ty }
 ztd|
  tdt|
iddW  Y d }
~
S d }
~
ww tddiddS tddiddS )Nr-   file_z/files_audioz/files_encoded_audioT)exist_okwbzFile saved to /rbz	whisper-1r   )r   rY  response_formatzTranscription%stranscriptionzError processing file: r=   rD  r<  zNo file providedr?  rE  rF  )r?   FILESreaduuiduuid4r$   r   r   r   dirname__file__makedirsopenwriterA   rB   rX  r   rC  transcriptionsr   remover   rE   r=   r"  )r)   
audio_fileaudio_bytesunique_filenameuploads_diruploads_dir_encoded	file_pathfr   r`  rI   r*   r*   r+   speech_to_text  s@   


 rs  c                 C   sP   dddd| iigiiddddiigd	}t jt|d
}dd |d d D }|S )Nr2   r3   r4   r.   r   r   r   r   )r1   r   r   r5   c                 S   s   g | ]}|d  qS )r;   r*   )r  rG   r*   r*   r+   r	  R  s    z4get_messages_by_user_and_session.<locals>.<listcomp>r8   )rC   rD   rc   )r.   r1   rF   messagesr*   r*   r+    get_messages_by_user_and_session>  s   

ru  c              
   C   s(  | j dkrzc| jd}| jd}ddddd|iidd|iigiii}tjd|d	}d
}|d d D ].}|d dd}|d dd}|rL|sLd
}q3|ra|ra|| }	|	dk s\|	dkr_d}q3d
}q3td|iW S  ty }
 ztd|
  tdt	|
iddW  Y d }
~
S d }
~
ww tddiddS )Nr-   r   r.   r1   r2   r3   r4   risk_insurance_educationr5   Tr8   r;   assigned_tokensr   r   r   Factivate_convzcheck token index %sr=   rD  r<  zMethod not allowedrF  )
r?   r-   r(   rC   rD   r   rE   rA   rB   r"  )r)   r   r.   r1   rF   rx  rG   rw  r   sub_resrI   r*   r*   r+   activate_query_conversationU  sB   


 rz  c              
   C   s.  zg }| j d}t| jdd}d}|d | }t|}ttj}|j	ddddd}|D ]}	tj
|	d d tjd	}
||
  krG|krNn q/||	 q/t|d
d dd}||t|| t| }|d d d }t|t|| t|k}|rttdd |D }g }|d d d D ]P}tjtdd|iidd}|rt|d d dkrtdd |d d D }g }|D ]}t|trd|jind|ji}|| qtt|}||||d q||d}ng dd}td|iW S  ty } ztd|  tdt|idd W  Y d }~S d }~ww )!N
X-Usernamepager  2   r   hourminutesecondmicrosecondr   r   tzc                 S      | d S Nr   r*   r   r*   r*   r+   <lambda>      z today_messages.<locals>.<lambda>Tkeyr"   c                 s       | ]}|d  V  qdS r   Nr*   r  dr*   r*   r+   	<genexpr>      z!today_messages.<locals>.<genexpr>r4   r   r  r  r8   c                 s   "    | ]}t |d  d V  qdS r;   r   Nr  r  r*   r*   r+   r        user	assistantr   r   r   rt  has_moreFrt  zError in today_messages view: r=   rD  r<  )headersr(   r   GETru  r   r   r   utcreplacefromtimestampr   sortedminr   listr   fromkeysrC   rD   rc   r   
isinstancer   r   r   rd   r   rE   r@   r"  )r)   tr.   r|  limitoffsettestcurrent_datetimestart_of_todayr   lastmodified_at_datetimepaginated_today_messagesr  session_idsr&  id_userr%  session_histtot_histr(  chat_hchat_id_namesformatted_today_dictrI   r*   r*   r+   today_messages  sd   




 r  c              
   C   sL  z g }| j d}t| jdd}d}|d | }t|}ttj}|j	ddddd}|t
dd }	|t
dd }
|D ]}tj|d	 d
 tjd}|	|  krV|
kr]n q>|| q>t|dd dd}||t|| t| }|d d d }t|t|| t|k}|rttdd |D }g }|d d d D ]P}tjtdd|iidd}|rt|d d dkrtdd |d d D }g }|D ]}t|trd|jind|ji}|| qtt|}||||d q||d}ng dd}td|iW S  ty% } ztd|  td t|id!d"W  Y d }~S d }~ww )#Nr{  r|  r  r}  r   r~  days)microsecondsr   r   r  c                 S   r  r  r*   r  r*   r*   r+   r    r  z$yesterday_messages.<locals>.<lambda>Tr  r  c                 s   r  r  r*   r  r*   r*   r+   r    r  z%yesterday_messages.<locals>.<genexpr>r4   r   r  r  r8   c                 s   r  r  r  r  r*   r*   r+   r    r  r  r  r  r  Frt  z!Error in yesteday_messages view: r=   rD  r<   r  r(   r   r  ru  r   r   r   r  r  r   r  r   r  r  r   r  r   r  rC   rD   rc   r   r  r   r   r   rd   r   rE   r@   r"  )r)   yr.   r|  r  r  r  r  r  start_of_yesterdayend_of_yesterdayr   r  paginated_yesterday_messagesr  r  r&  r  r%  r  r  r(  r  r  formatted_yesteday_dictrI   r*   r*   r+   yesterday_messages  sh   




 r  c              
   C   sL  z g }| j d}t| jdd}d}|d | }t|}ttj}|j	ddddd}|t
dd }	|t
dd }
|D ]}tj|d	 d
 tjd}|
|  krV|	k r]n q>|| q>t|dd dd}||t|| t| }|d d d }t|t|| t|k}|rttdd |D }g }|d d d D ]P}tjtdd|iidd}|rt|d d dkrtdd |d d D }g }|D ]}t|trd|jind|ji}|| qtt|}||||d q||d}ng dd}td|iW S  ty% } ztd|  td t|id!d"W  Y d }~S d }~ww )#Nr{  r|  r  r}  r   r~  r     r   r   r  c                 S   r  r  r*   r  r*   r*   r+   r  +  r  z!previous_7_days.<locals>.<lambda>Tr  r  c                 s   r  r  r*   r  r*   r*   r+   r  9  r  z"previous_7_days.<locals>.<genexpr>r4   r   r  r  r8   c                 s   r  r  r  r  r*   r*   r+   r  B  r  r  r  r  r  Frt  z&Error in previous7days_messages view: r=   rD  r<  r  )r)   sr.   r|  r  r  r  r  r  r  start_of_seven_days_agor   r   paginated_previous7days_messagesr  r  r&  r  r%  r  r  r(  r  r  formatted_previous7days_dictrI   r*   r*   r+   previous_7_days  sh   




 r  c              
   C   sP  zg }| j d}t| jdd}d}|d | }t|}ttj}|j	ddddd}|t
dd }	|t
d	d }
t|D ]}tj|d
 d tjd}|
|  krX|	k r_n q@|| q@t|dd dd}||t|| t| }|d d d }t|t|| t|k}|rttdd |D }g }|d d d D ]P}tjtdd|iidd}|rt|d d dkrtdd |d d D }g }|D ]}t|trd|jind|ji}|| qtt|}||||d q||d}ng dd}td|iW S  ty' } ztd |  td!t |id"d#W  Y d }~S d }~ww )$Nr{  r|  r  r}  r   r~  r  r     r   r   r  c                 S   r  r  r*   r  r*   r*   r+   r  t  r  z"previous_30_days.<locals>.<lambda>Tr  r  c                 s   r  r  r*   r  r*   r*   r+   r  ~  r  z#previous_30_days.<locals>.<genexpr>r4   r   r  r  r8   c                 s   r  r  r  r  r*   r*   r+   r    r  r  r  r  r  Frt  z'Error in previous30days_messages view: r=   rD  r<  )!r  r(   r   r  ru  r   r   r   r  r  r   r   r  r   r  r  r   r  r   r  rC   rD   rc   r   r  r   r   r   rd   r   rE   r@   r"  )r)   thr.   r|  r  r  r  r  r  r  start_of_thirty_days_agor   r  !paginated_previous30days_messagesr  r  r&  r  r%  r  r  r(  r  r  formatted_previous30days_dictrI   r*   r*   r+   previous_30_days\  sh   




 r  )t__doc__django.shortcutsr   django.views.decorators.csrfr   r   r   r   r   r   langchain.chat_modelsr   r   syslangchain.load.dumpr	   mathr
   r   django.httpr   r   rS  rc  natsortr   langchain_core.messagesr   r   r   rG  r   langchain.promptsr   langchain_openair    langchain_community.vectorstoresr   langchain.chainsr   langchain.memoryr   r   langchain_core.messages.humanr   langchain_core.messages.air   rk   requests.authr   elasticsearchr   r   collectionsr   decoupler   r   rI  r    django.core.mailr!   django.urlsr"   r   r   r   re  rf  LogUtilsgetRootLoggerrA   $django.views.decorators.clickjackingr#   r,   rJ   rU   r]   r`   environrB   
embeddingsrc   rd   rC   rn   ExactRetrievalStrategyr  rE   exr!  r   r   r   r   r   r   r   r   r"  r   r   r   r   r   r3  r=  rN  rX  rs  ru  rz  r  r  r  r  r*   r*   r*   r+   <module>   s   

3
/
'
	

	.H

{
3

8
:D@H