o
    ȳgu                     @   s
  U d Z ddlZddlmZmZmZmZmZmZ ddl	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m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(m)Z)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z< ddl=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZD ddlEmFZFmGZG dd lHmIZImJZJ dd!lKmLZL dd"lMmNZN dd#lOmPZP dd$lQmRZR dd%lSmTZT dd&lUmVZV dd'lWmXZX dd(lYmZZZ dd)l[m\Z\ dd*l]m^Z^ dd+l_m`Z` dd,lambZb dd-lcmdZd dd.lemfZf dd/lgmhZh dd0limjZj dd1lkmlZl dd2lmmnZn dd3lompZp dd4lqmrZr dd5lsmtZt dd6lumvZv dd7lwmxZx dd8lymzZz dd9l{m|Z| dd:l}m~Z~ dd;lmZ dd<lmZ dd=lmZ dd>lmZ dd?lmZ dd@lmZ ddAlmZ ddBlmZ ddClmZ ddDlmZ ddElmZ ddFlmZmZ dGefdHdIZdGefdJdKZdGefdLdMZdGefdNdOZdGefdPdQZdGefdRdSZdGefdTdUZdVeiZeeeg ef f edW< eeeeeeedXZdYedGefdZd[ZdYedGefd\d]Zeed^Zeeeegef f ed_< dYed`edGefdadbZdYed`edGefdcddZdYed`edGefdedfZd`edGefdgdhZd`edGefdidjZd`edGefdkdlZd`edGefdmdnZd`edGefdodpZd`edGefdqdrZd`edGefdsdtZd`edGefdudvZd`edGefdwdxZd`edGefdydzZd`edGefd{d|Zd`edGefd}d~Zd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZd`edGefddZdYed`edGefddZd`edGefddZd`edGefddZd`edGefddZedgfedgfedgfeg fdZeeeee
edYeegef ee f f ed< i dedgfdeddgfdeg dfdeg d¢fdeddgfdedgfdeg fdedgfdedgfdeddgfdeg dѢfdedgfdedgfdedgfdeddgfdeddgfdeddgfi deddgfdedgfdeg dޢfdeg dfdedgfdeddgfdeg dfdedgfdedgfdeddgfdeg dfdeg fdeg fdeg dfdedgfdeg dfdeg dfedgfeg feg feg dfdZeeeeeegef ee f f ed< dee dedGefdd Z			ddedee dee ded`edGefddZӐdedGdfd	d
Z			ddee dYee deded`edGee fddZdGee fddZdS (  a  Tools provide access to various resources and services.

LangChain has a large ecosystem of integrations with various external resources
like local and remote file systems, APIs and databases.

These integrations allow developers to create versatile applications that combine the
power of LLMs with the ability to access, interact with and manipulate external
resources.

When developing an application, developers should inspect the capabilities and
permissions of the tools that underlie the given agent toolkit, and determine
whether permissions of the given toolkit are appropriate for the application.

See [Security](https://python.langchain.com/docs/security) for more information.
    N)AnyDictListOptionalCallableTuple)ArgKwArg)ArxivQueryRun)BingSearchRun)DataForSeoAPISearchResults)DataForSeoAPISearchRun)DuckDuckGoSearchRunElevenLabsText2SpeechToolReadFileTool)GoldenQueryRunGoogleCloudTextToSpeechTool)GoogleFinanceQueryRun)GoogleJobsQueryRun)GoogleLensQueryRun)GoogleScholarQueryRun)GoogleSearchResultsGoogleSearchRun)GoogleSerperResultsGoogleSerperRun)GoogleTrendsQueryRun)BaseGraphQLToolHumanInputRunMemorize)MerriamWebsterQueryRun)MetaphorSearchResults)OpenWeatherMapQueryRun)PubmedQueryRun)RedditSearchRun)RequestsDeleteToolRequestsGetToolRequestsPatchToolRequestsPostToolRequestsPutToolSceneXplainTool)SearchAPIResultsSearchAPIRun)SearxSearchResultsSearxSearchRun	ShellTool	SleepTool)StackExchangeTool)WikipediaQueryRun)WolframAlphaQueryRun)ArxivAPIWrapper)LambdaWrapper)BingSearchAPIWrapper)DallEAPIWrapper)DataForSeoAPIWrapper)DuckDuckGoSearchAPIWrapper)GoldenQueryAPIWrapper)GoogleBooksAPIWrapper)GoogleFinanceAPIWrapper)GoogleJobsAPIWrapper)GoogleLensAPIWrapper)GoogleScholarAPIWrapper)GoogleSearchAPIWrapper)GoogleSerperAPIWrapper)GoogleTrendsAPIWrapper)GraphQLAPIWrapper)MerriamWebsterAPIWrapper)MetaphorSearchAPIWrapper)OpenWeatherMapAPIWrapper)PubMedAPIWrapper)RedditSearchAPIWrapper)TextRequestsWrapper)SearchApiAPIWrapper)SearxSearchWrapper)SerpAPIWrapper)StackExchangeAPIWrapper)TwilioAPIWrapper)WikipediaAPIWrapper)WolframAlphaAPIWrapper)BaseCallbackManager)	Callbacks)BaseLanguageModel)BaseToolToolreturnc                   C      t t ddS NT)requests_wrapperallow_dangerous_requests)r*   rP    rb   rb   i/var/www/html/chatdoc2/venv/lib/python3.10/site-packages/langchain_community/agent_toolkits/load_tools.py_get_tools_requests_getl      rd   c                   C   r^   r_   )r,   rP   rb   rb   rb   rc   _get_tools_requests_postu   re   rf   c                   C   r^   r_   )r+   rP   rb   rb   rb   rc   _get_tools_requests_patch~   re   rg   c                   C   r^   r_   )r-   rP   rb   rb   rb   rc   _get_tools_requests_put   re   rh   c                   C   r^   r_   )r)   rP   rb   rb   rb   rc   _get_tools_requests_delete   re   ri   c                   C      t  S Nr4   rb   rb   rb   rc   _get_terminal      rl   c                   C   rj   rk   r6   rb   rb   rb   rc   
_get_sleep   rm   rn   sleep_BASE_TOOLS)requestsrequests_getrequests_postrequests_patchrequests_putrequests_deleteterminalllmc                 C   sL   zddl m} W n ty   tdw tdd|j| dj|j| djdS )Nr   )LLMMathChainzoLLM Math tools require the library `langchain` to be installed. Please install it with `pip install langchain`.
Calculatorz8Useful for when you need to answer questions about math.rx   namedescriptionfunc	coroutine)langchain.chains.llm_math.basery   ImportErrorr\   from_llmrunarun)rx   ry   rb   rb   rc   _get_llm_math   s   r   c                 C   sX   zddl m} ddlm} W n ty   tdw |j| |jdgd}tdd|jd	S )
Nr   APIChain)open_meteo_docsjAPI tools require the library `langchain` to be installed. Please install it with `pip install langchain`.zhttps://api.open-meteo.com/)limit_to_domainszOpen-Meteo-APIzUseful for when you want to get weather information from the OpenMeteo API. The input should be a question in natural language that this API can answer.r}   r~   r   )	langchain.chains.api.baser   langchain.chains.apir   r   from_llm_and_api_docsOPEN_METEO_DOCSr\   r   )rx   r   r   chainrb   rb   rc   _get_open_meteo_api   s$   r   )zllm-mathzopen-meteo-api
_LLM_TOOLSkwargsc                 K   f   |d }zddl m} ddlm} W n ty   tdw |j| |jd|idgd}td	d
|jdS )Nnews_api_keyr   r   )	news_docsr   z	X-Api-Keyzhttps://newsapi.org/headersr   zNews-APIzUse this when you want to get information about the top headlines of current news stories. The input should be a question in natural language that this API can answer.r   )	r   r   r   r   r   r   	NEWS_DOCSr\   r   )rx   r   r   r   r   r   rb   rb   rc   _get_news_api   (   r   c                 K   sl   |d }zddl m} ddlm} W n ty   tdw |j| |jdd| idgd	}td
d|jdS )Ntmdb_bearer_tokenr   r   )	tmdb_docsr   AuthorizationzBearer zhttps://api.themoviedb.org/r   zTMDB-APIzUseful for when you want to get information from The Movie Database. The input should be a question in natural language that this API can answer.r   )	r   r   r   r   r   r   	TMDB_DOCSr\   r   )rx   r   r   r   r   r   rb   rb   rc   _get_tmdb_api   s(   r   c                 K   r   )Nlisten_api_keyr   r   )podcast_docsr   zX-ListenAPI-Keyz#https://listen-api.listennotes.com/r   zPodcast-APIzUse the Listen Notes Podcast API to search all podcasts or episodes. The input should be a question in natural language that this API can answer.r   )	r   r   r   r   r   r   PODCAST_DOCSr\   r   )rx   r   r   r   r   r   rb   rb   rc   _get_podcast_api  r   r   c                  K   s"   t | d | d tdi | jdS )Nawslambda_tool_nameawslambda_tool_descriptionr   rb   )r\   r<   r   r   rb   rb   rc   _get_lambda_api-  s
   r   c                  K      t tdi | dS Napi_wrapperrb   )r:   rW   r   rb   rb   rc   _get_wolfram_alpha5     r   c                  K   r   r   )r   rG   r   rb   rb   rc   _get_google_search9  r   r   c                  K   r   r   )r$   rK   r   rb   rb   rc   _get_merriam_webster=  r   r   c                  K   r   r   )r9   rV   r   rb   rb   rc   _get_wikipediaA  r   r   c                  K   r   r   )r
   r;   r   rb   rb   rc   
_get_arxivE  r   r   c                  K   r   r   )r   rA   r   rb   rb   rc   _get_golden_queryI  r   r   c                  K   r   r   )r'   rN   r   rb   rb   rc   _get_pubmedM  r   r   c                  K   s    ddl m} |tdi | dS )Nr   )GoogleBooksQueryRunr   rb   )&langchain_community.tools.google_booksr   rB   )r   r   rb   rb   rc   _get_google_booksQ  s   r   c                  K   r   r   )r   rD   r   rb   rb   rc   _get_google_jobsW  r   r   c                  K   r   r   )r   rE   r   rb   rb   rc   _get_google_lens[  r   r   c                  K   r   r   )r   rH   r   rb   rb   rc   _get_google_serper_  r   r   c                  K   r   r   )r   rF   r   rb   rb   rc   _get_google_scholarc  r   r   c                  K   r   r   )r   rC   r   rb   rb   rc   _get_google_financeg  r   r   c                  K   r   r   )r   rI   r   rb   rb   rc   _get_google_trendsk  r   r   c                  K   r   r   )r   rH   r   rb   rb   rc   _get_google_serper_results_jsono  r   r   c                  K   r   r   )r   rG   r   rb   rb   rc   _get_google_search_results_jsons  r   r   c                  K   r   r   )r1   rQ   r   rb   rb   rc   _get_searchapiw  r   r   c                  K   r   r   )r0   rQ   r   rb   rb   rc   _get_searchapi_results_json{  r   r   c                  K   s(   t ddtdi | jtdi | jdS )NSearchzsA search engine. Useful for when you need to answer questions about current events. Input should be a search query.r|   rb   )r\   rS   r   r   r   rb   rb   rc   _get_serpapi  s   r   c                  K   r   r   )r8   rT   r   rb   rb   rc   _get_stackexchange  r   r   c                  K   s   t dtdi | jdS )NzDall-E-Image-GeneratorzA wrapper around OpenAI DALL-E API. Useful for when you need to generate images from a text description. Input should be an image description.rb   )r\   r>   r   r   rb   rb   rc   _get_dalle_image_generator  s
   r   c                  K   s   t ddtdi | jdS )NzText-MessagezKUseful for when you need to send a text message to a provided phone number.r   rb   )r\   rU   r   r   rb   rb   rc   _get_twilio  s
   r   c                  K   r   )N)wrapperrb   )r3   rR   r   rb   rb   rc   _get_searx_search  r   r   c                  K   s.   dd |   D }tddtdi |i| S )Nc                 S   s   i | ]\}}|d kr||qS )num_resultsrb   ).0kvrb   rb   rc   
<dictcomp>      z2_get_searx_search_results_json.<locals>.<dictcomp>r   rb   )itemsr2   rR   )r   wrapper_kwargsrb   rb   rc   _get_searx_search_results_json  s   r   c                  K   r   r   )r   r=   r   rb   rb   rc   _get_bing_search  r   r   c                  K   r   r   )r%   rL   r   rb   rb   rc   _get_metaphor_search  r   r   c                  K   r   r   )r   r@   r   rb   rb   rc   _get_ddg_search  r   r   c                  K      t di | S Nrb   r    r   rb   rb   rc   _get_human_tool     r   c                  K   r   r   r.   r   rb   rb   rc   _get_scenexplain  r   r   c                  K   r   )N)graphql_wrapperrb   )r   rJ   r   rb   rb   rc   _get_graphql_tool  r   r   c                  K   r   r   )r&   rM   r   rb   rb   rc   _get_openweathermap  r   r   c                  K   r   r   )r   r?   r   rb   rb   rc   _get_dataforseo_api_search  r   r   c                  K   r   r   )r   r?   r   rb   rb   rc   _get_dataforseo_api_search_json  r   r   c                  K   r   r   r   r   rb   rb   rc   _get_eleven_labs_text2speech  r   r   c                 K   s
   t | dS )Nr{   r"   )rx   r   rb   rb   rc   _get_memorize  s   
r   c                  K   r   r   r   r   rb   rb   rc   _get_google_cloud_texttospeech  r   r   c                  K   r   r   r   r   rb   rb   rc   _get_file_management_tool  r   r   c                  K   r   r   )r(   rO   r   rb   rb   rc   _get_reddit_search  r   r   r   r   r   )znews-apiztmdb-apizpodcast-apimemorize_EXTRA_LLM_TOOLSzwolfram-alphawolfram_alpha_appidzgoogle-searchgoogle_api_keygoogle_cse_idzgoogle-search-results-json)r   r   r   zsearx-search-results-json)
searx_hostenginesr   
aiosessionzbing-searchbing_subscription_keybing_search_urlzmetaphor-searchmetaphor_api_keyz
ddg-searchzgoogle-booksgoogle_books_api_keyzgoogle-lensserp_api_keyzgoogle-serperserper_api_keyr   zgoogle-scholar)top_k_resultshllrr   zgoogle-financezgoogle-trendszgoogle-jobszgoogle-serper-results-json	searchapisearchapi_api_keyzsearchapi-results-jsonserpapiserpapi_api_keyzdalle-image-generatoropenai_api_keytwilio)account_sid
auth_tokenfrom_numberzsearx-search)r   r   r   zmerriam-webstermerriam_webster_api_key	wikipediar   langarxiv)r   load_max_docsload_all_available_metazgolden-querygolden_api_keypubmedhumanprompt_func
input_func	awslambda)r   r   function_namestackexchangesceneXplaingraphql)graphql_endpointcustom_headersfetch_schema_from_transportzopenweathermap-apiopenweathermap_api_keyzdataforseo-api-search)	api_loginapi_passwordr   zdataforseo-api-search-jsoneleven_api_key)reddit_client_idreddit_client_secretreddit_user_agent)eleven_labs_text2speechgoogle_cloud_texttospeech	read_filereddit_search_EXTRA_OPTIONAL_TOOLScallback_manager	callbacksc                 C   s,   | d urt dt |d urtd| S |S )Nz=callback_manager is deprecated. Please use callbacks instead.z=Cannot specify both callback_manager and callbacks arguments.)warningswarnDeprecationWarning
ValueErrorr  r  rb   rb   rc   _handle_callbacks:  s   r%  Ftask_or_repo_idmodel_repo_idtokenremotec           	      K   s   zddl m} W n ty   tdw || f|||d|}|j}t|dhkr.td|j}t|dhkr<tdtj|j	|j
|jdS )	a  Loads a tool from the HuggingFace Hub.

    Args:
        task_or_repo_id: Task or model repo id.
        model_repo_id: Optional model repo id. Defaults to None.
        token: Optional token. Defaults to None.
        remote: Optional remote. Defaults to False.
        kwargs: Additional keyword arguments.

    Returns:
        A tool.

    Raises:
        ImportError: If the required libraries are not installed.
        NotImplementedError: If multimodal outputs or inputs are not supported.
    r   )	load_toolzHuggingFace tools require the libraries `transformers>=4.29.0` and `huggingface_hub>=0.14.1` to be installed. Please install it with `pip install --upgrade transformers huggingface_hub`.)r'  r(  r)  textz%Multimodal outputs not supported yet.z$Multimodal inputs not supported yet.)r}   r~   )transformersr*  r   outputssetNotImplementedErrorinputsr\   from_function__call__r}   r~   )	r&  r'  r(  r)  r   r*  hf_toolr-  r0  rb   rb   rc   load_huggingface_toolJ  s2   r4  r}   c                 C   s   t |  d)Na   is a dangerous tool. You cannot use it without opting in by setting allow_dangerous_tools to True. Most tools have some inherit risk to them merely because they are allowed to interact with the "real world".Please refer to LangChain security guidelines to https://python.langchain.com/docs/security.Some tools have been designated as dangerous because they pose risk that is not intuitively obvious. For example, a tool that allows an agent to make requests to the web, can also be used to make requests to a server that is only accessible from the server hosting the code.Again, all tools carry some risk, and it's your responsibility to understand which tools you're using and the risks associated with them.)r#  )r}   rb   rb   rc   raise_dangerous_tools_exception|  s   r5  
tool_namesallow_dangerous_toolsc                    s  g }t  d|d}| D ]}|tv r|st| |dv r"td |dkr9|s,t| dd tD }| | q|tv rF|t|   q|tv rS|t|   q|t	v ro|du rct
d	| d
t	| |}|| q|tv r|du rt
d	| d
t| \}	}
t|
 }|rt
d	| d|  fdd|
D }|	dd|i|}|| q|tv rt| \}}
 fdd|
D }|di |}|| qt
d| |dur|D ]}||_q|S )a  Load tools based on their name.

    Tools allow agents to interact with various resources and services like
    APIs, databases, file systems, etc.

    Please scope the permissions of each tools to the minimum required for the
    application.

    For example, if an application only needs to read from a database,
    the database tool should not be given write permissions. Moreover
    consider scoping the permissions to only allow accessing specific
    tables and impose user-level quota for limiting resource usage.

    Please read the APIs of the individual tools to determine which configuration
    they support.

    See [Security](https://python.langchain.com/docs/security) for more information.

    Args:
        tool_names: name of tools to load.
        llm: An optional language model may be needed to initialize certain tools.
            Defaults to None.
        callbacks: Optional callback manager or list of callback handlers.
            If not provided, default global callback manager will be used.
        allow_dangerous_tools: Optional flag to allow dangerous tools.
            Tools that contain some level of risk.
            Please use with caution and read the documentation of these tools
            to understand the risks and how to mitigate them.
            Refer to https://python.langchain.com/docs/security
            for more information.
            Please note that this list may not be fully exhaustive.
            It is your responsibility to understand which tools
            you're using and the risks associated with them.
            Defaults to False.
        kwargs: Additional keyword arguments.

    Returns:
        List of tools.

    Raises:
        ValueError: If the tool name is unknown.
        ValueError: If the tool requires an LLM to be provided.
        ValueError: If the tool requires some parameters that were not provided.
        ValueError: If the tool is a dangerous tool and allow_dangerous_tools is False.
    r  r$  >   rq   z]tool name `requests` is deprecated - please use `requests_all` or specify the requests methodrequests_allc                 S   s   g | ]	}| d r|qS )	requests_)
startswith)r   _toolrb   rb   rc   
<listcomp>  s
    
zload_tools.<locals>.<listcomp>NzTool z requires an LLM to be providedz2 requires some parameters that were not provided: c                    s   i | ]}| | qS rb   rb   r   r   r   rb   rc   r     s    zload_tools.<locals>.<dictcomp>rx   c                    s   i | ]}| v r| | qS rb   rb   r=  r   rb   rc   r     r   zGot unknown tool rb   )r%  getDANGEROUS_TOOLSr5  r   r!  extendrp   appendr   r#  r   r.  
differencer  r  )r6  rx   r  r7  r   toolsr}   requests_method_toolstool_get_llm_tool_func
extra_keysmissing_keys
sub_kwargs_get_tool_funcrb   r   rc   
load_tools  sf   4
rK  c                   C   s(   t tt t t t t t t t S )z&Get a list of all possible tool names.)listrp   r  r   r   r?  rb   rb   rb   rc   get_all_tool_names  s   rM  )NNF)__doc__r   typingr   r   r   r   r   r   mypy_extensionsr   r	   $langchain_community.tools.arxiv.toolr
   *langchain_community.tools.bing_search.toolr   /langchain_community.tools.dataforseo_api_searchr   r   )langchain_community.tools.ddg_search.toolr   1langchain_community.tools.eleven_labs.text2speechr   )langchain_community.tools.file_managementr   +langchain_community.tools.golden_query.toolr   3langchain_community.tools.google_cloud.texttospeechr   -langchain_community.tools.google_finance.toolr   *langchain_community.tools.google_jobs.toolr   *langchain_community.tools.google_lens.toolr   -langchain_community.tools.google_scholar.toolr   ,langchain_community.tools.google_search.toolr   r   ,langchain_community.tools.google_serper.toolr   r   ,langchain_community.tools.google_trends.toolr   &langchain_community.tools.graphql.toolr   $langchain_community.tools.human.toolr!   'langchain_community.tools.memorize.toolr#   .langchain_community.tools.merriam_webster.toolr$   .langchain_community.tools.metaphor_search.toolr%   -langchain_community.tools.openweathermap.toolr&   %langchain_community.tools.pubmed.toolr'   ,langchain_community.tools.reddit_search.toolr(   'langchain_community.tools.requests.toolr)   r*   r+   r,   r-   *langchain_community.tools.scenexplain.toolr/   (langchain_community.tools.searchapi.toolr0   r1   +langchain_community.tools.searx_search.toolr2   r3   $langchain_community.tools.shell.toolr5   $langchain_community.tools.sleep.toolr7   ,langchain_community.tools.stackexchange.toolr8   (langchain_community.tools.wikipedia.toolr9   ,langchain_community.tools.wolfram_alpha.toolr:   #langchain_community.utilities.arxivr;   'langchain_community.utilities.awslambdar<   )langchain_community.utilities.bing_searchr=   3langchain_community.utilities.dalle_image_generatorr>   3langchain_community.utilities.dataforseo_api_searchr?   /langchain_community.utilities.duckduckgo_searchr@   *langchain_community.utilities.golden_queryrA   *langchain_community.utilities.google_booksrB   ,langchain_community.utilities.google_financerC   )langchain_community.utilities.google_jobsrD   )langchain_community.utilities.google_lensrE   ,langchain_community.utilities.google_scholarrF   +langchain_community.utilities.google_searchrG   +langchain_community.utilities.google_serperrH   +langchain_community.utilities.google_trendsrI   %langchain_community.utilities.graphqlrJ   -langchain_community.utilities.merriam_websterrK   -langchain_community.utilities.metaphor_searchrL   ,langchain_community.utilities.openweathermaprM   $langchain_community.utilities.pubmedrN   +langchain_community.utilities.reddit_searchrO   &langchain_community.utilities.requestsrP   'langchain_community.utilities.searchapirQ   *langchain_community.utilities.searx_searchrR   %langchain_community.utilities.serpapirS   +langchain_community.utilities.stackexchangerT   $langchain_community.utilities.twiliorU   'langchain_community.utilities.wikipediarV   +langchain_community.utilities.wolfram_alpharW   langchain_core.callbacksrX   rY   langchain_core.language_modelsrZ   langchain_core.toolsr[   r\   rd   rf   rg   rh   ri   rl   rn   rp   str__annotations__r?  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r%  boolr4  r5  rK  rM  rb   rb   rb   rc   <module>   sX   					
 	$	



!%&*
+,-
./0
4
567;<=
ABFJ2T2l