Ë
    uPêj_á  ã                  óî  — U d dl m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 e
r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mZ d dlm Z m!Z! e
rd dl"m#Z#  G d„ de«      Z$dZ%de&d<   	 	 	 	 	 	 dPd„Z'da(ed   Z)d dddddœZ*de&d<   d„ Z+ ejX                  d¬«      dQd„«       Z-dRd„Z.	 	 	 	 	 	 dSd„Z/dTd „Z0dUd!„Z1dTd"„Z2dTd#„Z3 G d$„ d%«      Z4d&„ Z5dVd'„Z6	 	 	 	 	 	 	 	 	 	 	 dW	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dXd(„Z7 G d)„ d*«      Z8dYd+„Z9da:d,e&d-<   dZd.„Z;dZd/„Z<d[d0„Z=d\d1„Z>d[d2„Z?d[d3„Z@d4ZAd5e&d6<   	 	 	 	 	 	 	 	 d]d7„ZBd[d8„ZCd\d9„ZDd\d:„ZE ejŒ                  d;«      ZGd5e&d<<   d\d=„ZHd^d>„ZId_d?„ZJ	 	 	 	 d`d@„ZKd dAlLmMZM  G dB„ dCe«      ZNdadD„ZOdE„ ZP ejX                  d¬«      dF„ «       ZQ G dG„ dHe«      ZR	 	 	 	 	 	 dbdI„ZS G dJ„ dK«      ZTdcdL„ZU	 dd	 	 	 	 	 dedM„ZV G dN„ dO«      ZWy)fé    )ÚannotationsN)ÚMapping)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚ	TypedDict)ÚShape)ÚBedrockCreateBatchRequest)Úverbose_logger)Úget_aws_dns_suffix)ÚBaseAnthropicMessagesConfig)ÚBaseLLMModelInfoÚBaseTokenCounter)ÚBaseLLMException)Ú
get_secretÚget_secret_str)ÚAllMessageValuesc                  ó   — e Zd Zy)ÚBedrockErrorN)Ú__name__Ú
__module__Ú__qualname__© ó    úf/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/llms/bedrock/common_utils.pyr   r   $   s   „ Ør   r   )
Úaws_access_key_idÚaws_secret_access_keyÚaws_session_tokenÚaws_region_nameÚaws_session_nameÚaws_profile_nameÚaws_role_nameÚaws_web_identity_tokenÚaws_sts_endpointÚaws_external_idzFinal[tuple[str, ...]]Ú _BEDROCK_AWS_AUTH_PARAMETER_KEYSc                ó„   ‡ — i |¥‰ ¥}t        ˆ fd„dD «       «      }|r"t        D ]  }|‰ vsŒ|j                  |d«       Œ |S )a­  Merge deployment and request parameters without allowing auth escalation.

    Deployment configuration is authoritative for AWS authentication. When a
    deployment supplies static credentials, caller-supplied profile/role/token
    selectors must not redirect signing to another identity available on the
    server. Requests may still provide AWS credentials when the deployment has
    no static credentials configured.
    c              3  ó”   •K  — | ]?  }t        ‰j                  |«      t        «      xr t        ‰j                  |«      «      –— ŒA y ­w©N)Ú
isinstanceÚgetÚstrÚbool)Ú.0ÚkeyÚlitellm_paramss     €r   ú	<genexpr>z3merge_bedrock_aws_request_params.<locals>.<genexpr>C   sC   øè ø€ ò 3àô 	�>×%Ñ% cÓ*¬CÓ0ÒR´T¸.×:LÑ:LÈSÓ:QÓ5RÓRñ3ùs   ƒAA)r   r   r    N)Úallr'   Úpop)r1   Úoptional_paramsÚrequest_paramsÚ!has_static_deployment_credentialsr0   s   `    r   Ú merge_bedrock_aws_request_paramsr8   6   sa   ø€ ð B˜ÐA°.ÐA€NÜ/2ó 3àTô3ó 0Ð%ñ )Ü3ò 	.ˆCØ˜.Ò(Ø×"Ñ" 3¨Õ-ð	.ð Ðr   )ÚlowÚmediumÚhighÚmaxÚxhighé   é   é   é   z+Final[dict[BedrockOutputConfigEffort, int]]Ú#_BEDROCK_OUTPUT_CONFIG_EFFORT_ORDERc                 ó*   — t         €ddlm}  | a t         S )a/  
    Lazy import and cache get_model_info to avoid circular imports.

    This function is used by bedrock transformation classes that need get_model_info
    but cannot import it at module level due to circular import issues.
    The function is cached after first use to avoid performance impact.
    r   ©Úget_model_info)Ú_get_model_infoÚlitellmrE   rD   s    r   Úget_cached_model_inforH   [   s   € ô ÐÝ*à(ˆÜÐr   )Úmaxsizec                 ó.   — ddl m}  | j                  «       S )Nr   ©ÚGetModelCostMap)Ú-litellm.litellm_core_utils.get_model_cost_maprL   Úload_local_model_cost_maprK   s    r   Ú_get_local_model_cost_maprO   k   s   € åMà×4Ñ4Ó6Ð6r   c                ó¸   — | j                  d«      }t        |t        «      sy|j                  dd«      }|s| j                  dd«       t        |t        «      r|S y)zä
    Remove and return Anthropic's nested ``output_config.format`` field.

    Bedrock Invoke paths convert the schema to inline message text. Any remaining
    ``output_config`` keys, such as ``effort``, are left in place.
    Úoutput_configNÚformat)r,   r+   Údictr4   )Úrequest_bodyrQ   Úoutput_formats      r   Ú'pop_bedrock_invoke_output_config_formatrV   r   sY   € ð (×+Ñ+¨OÓ<€MÜ�m¤TÔ*Øà(×,Ñ,¨X°tÓ<€MÙØ×Ñ˜¨$Ô/ä�-¤Ô&ØÐØr   c                ó
  — | j                  d«      }|sy|j                  d«      }t        |t        «      r|syd}t        t	        |«      dz
  dd«      D ]0  }||   }t        |t
        «      sŒ|j                  d«      dk(  sŒ.|} n |€y||   }|j                  dg «      }d	t        j                  |«      d
œ}	t        |t        «      rd	|d
œ|	g}
nt        |t        «      rg |¢|	‘}
nyt        |«      }i |¥d|
i¥||<   ||d<   y)a¯  
    Embed an Anthropic structured-output schema into the last user message.

    Bedrock Invoke does not support ``output_format`` directly, so the schema is
    appended to the final user message for prompt-engineered structured output.
    The caller's ``messages`` list, message dict, and content list are not
    mutated; a fresh ``messages`` list with a copied final user message is
    written back to ``request_body``.
    ÚschemaNÚmessagesr>   éÿÿÿÿÚroleÚuserÚcontentÚtext)Útyper^   )	r,   r+   ÚlistÚrangeÚlenrS   ÚjsonÚdumpsr-   )rU   rT   rX   rY   Úlast_user_idxÚiÚmessageÚoriginalr]   Úschema_blockÚnew_contentÚnew_messagess               r   Ú5convert_bedrock_invoke_output_format_to_inline_schemarl   †   s   € ð "×%Ñ% hÓ/€FÙØà"×&Ñ& zÓ2€HÜ�h¤Ô%©XØà€MÜ”3�x“= 1Ñ$ b¨"Ó-ò ˆØ˜1‘+ˆÜ�gœtÕ$¨¯©°VÓ)<ÀÓ)FØˆMÙð	ð ÐØà˜}Ñ-€HØ—\‘\ )¨RÓ0€GØ#)´4·:±:¸fÓ3EÑF€LÜ�'œ3ÔØ &°Ñ8¸,ÐG‰Ü	�GœTÔ	"Ø.˜Ð. Ð.‰àä˜x›.€LØ"F XÐ"F¨y¸+Ñ"F€L�ÑØ+€L�Òr   c                ó  — | j                  d«      }|rt        |t        «      sy|D ]a  }t        |t        «      sŒ|j	                  dd«      }t        |t        «      rd|v rŒ;|j                  d«      }t        |t
        «      sŒ]||d<   Œc y)a  
    Drop the ``custom`` field from each tool, first hoisting a boolean
    ``custom.defer_loading`` onto the top-level ``defer_loading`` flag that
    Bedrock and Anthropic actually document, unless the tool already carries one.

    Claude Code (v2.1.69+) is reported to send ``custom: {defer_loading: true}`` on
    tool definitions, which Bedrock rejects with ``"Extra inputs are not permitted"``.

    Args:
        request_body: The request dictionary to modify in-place.

    Ref: https://github.com/BerriAI/litellm/issues/22847
    ÚtoolsNÚcustomÚdefer_loading)r,   r+   r`   rS   r4   r.   )rT   rn   Útoolro   Údeferreds        r   Únormalize_custom_field_on_toolsrs   ´   s…   € ð  ×#Ñ# GÓ,€EÙœ
 5¬$Ô/ØØò -ˆÜ˜$¤Ô%ØØ+/¯8©8°H¸dÓ+CˆÜ˜&¤$Ô'¨?¸dÑ+BØØ!Ÿ:™: oÓ6ˆÜ�h¤Õ%Ø$,ˆD�Ò!ñ-r   c                ó   — | g}t        «       }|�rn|j                  «       }t        |t        «      sŒ$t	        |«      }||v rŒ4|j                  |«       |j                  d«      dk(  rd|d<   |j                  d«      }t        |t        «      r|j                  |«       |j                  d«      }t        |t        «      r|j                  |«       |j                  d«      }t        |t        «      r7|j                  «       D ]$  }t        |t        «      sŒ|j                  |«       Œ& dD ]M  }	|j                  |	«      }
t        |
t        «      sŒ%|
D ]$  }t        |t        «      sŒ|j                  |«       Œ& ŒO |r�Œmyy)	aK  
    In-place: replace JSON Schema ``type: "custom"`` with ``"object"`` (iterative walk).

    Anthropic / Claude Code use ``custom`` for tool schemas; Bedrock Invoke and
    Bedrock Converse only accept standard JSON Schema type strings.

    Uses an explicit stack (not recursion) to satisfy recursive-function guards in CI.
    r_   ro   ÚobjectÚitemsÚadditionalPropertiesÚ
properties)ÚallOfÚanyOfÚoneOfN)
Úsetr4   r+   rS   ÚidÚaddr,   ÚappendÚvaluesr`   )rX   ÚstackÚseenÚnodeÚnode_idrv   ÚaddlÚpropsÚsubÚcombinerÚarrs              r   Ú,normalize_json_schema_custom_types_to_objectrŠ   Ð   sE  € ð  &˜h€EÜ›E€DÚ
Ø�y‰y‹{ˆÜ˜$¤Ô%ØÜ�T“(ˆØ�d‰?ØØ�‰�ÔØ�8‰8�FÓ˜xÒ'Ø#ˆD�‰LØ—‘˜Ó!ˆÜ�eœTÔ"Ø�L‰L˜ÔØ�x‰xÐ.Ó/ˆÜ�dœDÔ!Ø�L‰L˜ÔØ—‘˜Ó&ˆÜ�eœTÔ"Ø—|‘|“~ò &�Ü˜c¤4Õ(Ø—L‘L Õ%ð&ð 4ò 	*ˆHØ—(‘(˜8Ó$ˆCÜ˜#œtÕ$Øò *�CÜ! #¤tÕ,ØŸ™ SÕ)ñ*ð	*õ+ r   c                óÖ   — | j                  d«      }|rt        |t        «      sy|D ]@  }t        |t        «      sŒ|j                  d«      }t        |t        «      sŒ6t	        |«       ŒB y)aß  
    Bedrock Invoke (Anthropic Messages) validates ``input_schema`` as JSON Schema.
    Anthropic's API allows ``type: "custom"`` for Claude Code custom tools; Bedrock
    rejects it with: ``tools.0.custom.input_schema.type: Input should be 'object'``.

    Normalizes ``type: "custom"`` to ``"object"`` throughout each tool's
    ``input_schema`` (recursive for nested properties, items, combinators).

    Args:
        request_body: Request dictionary to modify in-place.
    rn   NÚinput_schema)r,   r+   r`   rS   rŠ   )rT   rn   rq   rŒ   s       r   Ú4normalize_tool_input_schema_types_for_bedrock_invoker�   ø   sa   € ð  ×#Ñ# GÓ,€EÙœ
 5¬$Ô/ØØò GˆÜ˜$¤Ô%ØØ—x‘x Ó/ˆÜ�l¤DÕ)Ü8¸ÕFñGr   c                ó  — | j                  d«      }|rt        |t        «      syt        |«      D ]S  \  }}t        |t        «      sŒ|j                  d«      }|�"t        |t
        «      sŒ;|j                  «       rŒLd|› �|d<   ŒU y)a  
    Bedrock Invoke (Anthropic Messages) requires each tool to include ``name``.
    Some clients send only ``input_schema``; Bedrock then errors with
    ``tools.0.custom.name: Field required``.

    In-place: set ``name`` to ``litellm_unnamed_tool_{index}`` when missing or blank.
    rn   NÚnameÚlitellm_unnamed_tool_)r,   r+   r`   Ú	enumeraterS   r-   Ústrip)rT   rn   rf   rq   r�   s        r   Ú,ensure_bedrock_anthropic_messages_tool_namesr“     s|   € ð  ×#Ñ# GÓ,€EÙœ
 5¬$Ô/ØÜ˜UÓ#ò 7‰ˆˆ4Ü˜$¤Ô%ØØ�x‰x˜ÓˆØˆ<œJ t¬SÕ1¸$¿*¹*½,Ø2°1°#Ð6ˆD�ŠLñ7r   c                  óR   — e Zd Zd„ Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dd	„Zy
)ÚAmazonBedrockGlobalConfigc                 ó   — y r*   r   ©Úselfs    r   Ú__init__z"AmazonBedrockGlobalConfig.__init__#  s   € Ør   c                ó
   — ddiS )zS
        Mapping of common auth params across bedrock/vertex/azure/watsonx
        Úregion_namer    r   r—   s    r   Úget_mapped_special_auth_paramsz8AmazonBedrockGlobalConfig.get_mapped_special_auth_params&  s   € ð Ð0Ð1Ð1r   c                óp   — | j                  «       }|j                  «       D ]  \  }}||v sŒ||||   <   Œ |S r*   )rœ   rv   )r˜   Únon_default_paramsr5   Úmapped_paramsÚparamÚvalues         r   Úmap_special_auth_paramsz1AmazonBedrockGlobalConfig.map_special_auth_params,  sK   € Ø#×BÑBÓDˆØ.×4Ñ4Ó6ò 	>‰LˆE�5Ø˜Ò%Ø8=� ¨eÑ 4Ò5ð	>ð Ðr   c                óª   — | j                  «       | j                  «       z   | j                  «       z   | j                  «       z   | j	                  «       z   S r*   )Úget_us_regionsÚget_eu_regionsÚget_ap_regionsÚget_ca_regionsÚget_sa_regionsr—   s    r   Úget_all_regionsz)AmazonBedrockGlobalConfig.get_all_regions3  s[   € à×ÑÓ!Ø×!Ñ!Ó#ñ$à×!Ñ!Ó#ñ$ð ×!Ñ!Ó#ñ$ð ×!Ñ!Ó#ñ	$ð	
r   c                ó
   — g d¢S )úD
        Source: https://www.aws-services.info/bedrock.html
        )zap-northeast-1zap-northeast-2zap-northeast-3z
ap-south-1z
ap-south-2zap-southeast-1zap-southeast-2r   r—   s    r   r¦   z(AmazonBedrockGlobalConfig.get_ap_regions<  s   € ò
ð 	
r   c                ó   — dgS )Nz	sa-east-1r   r—   s    r   r¨   z(AmazonBedrockGlobalConfig.get_sa_regionsJ  s
   € Øˆ}Ðr   c                ó
   — g d¢S )r«   )z	eu-west-1z	eu-west-2z	eu-west-3zeu-central-1zeu-central-2z
eu-south-1z
eu-south-2z
eu-north-1r   r—   s    r   r¥   z(AmazonBedrockGlobalConfig.get_eu_regionsM  s   € ò	
ð 		
r   c                ó   — dgS )Nzca-central-1r   r—   s    r   r§   z(AmazonBedrockGlobalConfig.get_ca_regions\  s   € ØÐÐr   c                ó
   — g d¢S )r«   )z	us-east-1z	us-east-2z	us-west-1z	us-west-2zus-gov-east-1zus-gov-west-1r   r—   s    r   r¤   z(AmazonBedrockGlobalConfig.get_us_regions_  s   € ò
ð 	
r   N©ÚreturnrS   )rž   rS   r5   rS   ©r±   ú	list[str])r   r   r   r™   rœ   r¢   r©   r¦   r¨   r¥   r§   r¤   r   r   r   r•   r•   "  s/   „ òó2óó
ó
óó
ó ô
r   r•   c                ó   ‡ — ˆ fd„}|S )z,Closure to capture the headers and add them.c                ón   •— ‰j                  «       D ]!  \  }}| j                  j                  ||«       Œ# y)z.Actual callback function that Boto3 will call.N)rv   ÚheadersÚ
add_header)ÚrequestÚkwargsÚheader_nameÚheader_valuer¶   s       €r   Úcallbackz#add_custom_header.<locals>.callbackp  s3   ø€ à)0¯©«ò 	BÑ%ˆK˜Ø�O‰O×&Ñ& {°LÕAñ	Br   r   )r¶   r¼   s   ` r   Úadd_custom_headerr½   m  s   ø€ ôBð
 €Or   c                 ó   — ddl m}   | «       S )zì
    Get SSL verification setting for Bedrock client.

    Returns the SSL verification setting which can be:
    - True: Use default SSL verification
    - False: Disable SSL verification
    - str: Path to a custom CA bundle file
    r   ©Úget_ssl_verify)Ú&litellm.llms.custom_httpx.http_handlerrÀ   r¿   s    r   Ú_get_bedrock_client_ssl_verifyrÂ   x  s   € õ FáÓÐr   c           
     óV  — t        dd «      }t        dd «      }||||||||g}t        |«      D ](  \  }}|sŒ	|j                  d«      sŒt        |«      ||<   Œ* |\  }}}}}}}}t        «       }t	        d„ | |||fD «       d «      }|€t        dd¬«      ‚t        d«      }|r|}n|r|}nd	|› d
t        |«      › �}dd l}t        |
t        «      r|j                  j                  |
|
¬«      }nft        |
t        j                  «      r2|j                  j                  |
j                  |
j                  ¬«      }n|j                  j                  «       }|�r|�p|�nt        |«      }|€t        dd¬«      ‚|j!                  d|¬«      }|j#                  |||d¬«      }|j!                  d|d   d   |d   d   |d   d   ||||¬«      }n²|�V|�T|j!                  d|||¬«      }|j%                  ||¬«      }|j!                  d|d   d   |d   d   |d   d   ||||¬«      }nZ|�|j!                  d||||||¬«      }n?|�'|j'                  |¬«      j!                  d||||¬«      }n|j!                  d||||¬«      }|	r/|j(                  j*                  j-                  dt/        |	«      «       |S )NÚAWS_REGION_NAMEÚ
AWS_REGIONzos.environ/c              3  óD   K  — | ]  }t        |t        «      r|r|–— Œ y ­wr*   ©r+   r-   ©r/   Ú	candidates     r   r2   z&init_bedrock_client.<locals>.<genexpr>·  s$   è ø€ ò 	
àÜ˜)¤SÔ)©iô ñ	
ùs   ‚ zRAWS region not set: set AWS_REGION_NAME or AWS_REGION env variable or in .env filei‘  )rg   Ústatus_codeÚAWS_BEDROCK_RUNTIME_ENDPOINTzhttps://bedrock-runtime.ú.r   )Úconnect_timeoutÚread_timeoutz6OIDC token could not be retrieved from secret manager.Ústs)Úverifyi  )ÚRoleArnÚRoleSessionNameÚWebIdentityTokenÚDurationSecondsúbedrock-runtimeÚCredentialsÚAccessKeyIdÚSecretAccessKeyÚSessionToken)Úservice_namer   r   r   r›   Úendpoint_urlÚconfigrÐ   )r   r   rÐ   )rÑ   rÒ   )rÚ   r   r   r›   rÛ   rÜ   rÐ   )Úprofile_name)rÚ   r›   rÛ   rÜ   rÐ   zbefore-sign.bedrock-runtime.*)r   r‘   Ú
startswithrÂ   Únextr   r   Úboto3r+   ÚfloatÚsessionÚConfigÚhttpxÚTimeoutÚconnectÚreadÚclientÚassume_role_with_web_identityÚassume_roleÚSessionÚmetaÚeventsÚregisterr½   )r›   r   r   r    Úaws_bedrock_runtime_endpointr!   r"   r#   r$   Úextra_headersÚtimeoutÚlitellm_aws_region_nameÚstandard_aws_region_nameÚparams_to_checkrf   r    Ú
ssl_verifyÚresolved_region_nameÚ env_aws_bedrock_runtime_endpointrÛ   rà   rÜ   Ú
oidc_tokenÚ
sts_clientÚsts_responserè   s                             r   Úinit_bedrock_clientrû   †  s•  € ô &0Ð0AÀ4Ó%HÐÜ&0°¸tÓ&DÐð 	ØØØ$ØØØØð	€Oô ˜oÓ.ò 3‰ˆˆ5Ú�U×%Ñ% mÕ4Ü!+¨EÓ!2ˆO˜AÒð3ð 	ñ	ØØØØ$ØØØØô 7Ó8€Jô #'ñ	
à)¨?Ð<SÐUmÐnô	
ð
 	ó#Ðð Ð#ÜØhØô
ð 	
ô /9Ð9WÓ.XÐ$Ù#Ø3‰Ù	)Ø7‰à1Ð2FÐ1GÀqÔI[Ð\pÓIqÐHrÐsˆãä�'œ5Ô!Ø—‘×%Ñ%°gÈGÐ%ÓT‰Ü	�GœUŸ]™]Ô	+Ø—‘×%Ñ%°g·o±oÐT[×T`ÑT`Ð%Óa‰à—‘×%Ñ%Ó'ˆð Ð)¨mÐ.GÐL\ÐLhÜ&Ð'=Ó>ˆ
àÐÜØPØôð ð
 —\‘\ %°
�\Ó;ˆ
ð "×?Ñ?Ø!Ø,Ø'Ø ð	 @ó 
ˆð —‘Ø*Ø*¨=Ñ9¸-ÑHØ".¨}Ñ"=Ð>OÑ"PØ*¨=Ñ9¸.ÑIØ,Ø%ØØð ó 	
‰ð 
Ð	"Ð'7Ð'Cà—\‘\ØØ/Ø"7Øð	 "ó 
ˆ
ð "×-Ñ-°mÐUeÐ-Ófˆà—‘Ø*Ø*¨=Ñ9¸-ÑHØ".¨}Ñ"=Ð>OÑ"PØ*¨=Ñ9¸.ÑIØ,Ø%ØØð ó 	
‰ð 
Ð	&ð —‘Ø*Ø/Ø"7Ø,Ø%ØØð ó 
‰ð 
Ð	%ð —‘Ð,<�Ó=×DÑDØ*Ø,Ø%ØØð Eó 
‰ð —‘Ø*Ø,Ø%ØØð ó 
ˆñ Ø�‰×Ñ×#Ñ#Ð$CÔEVÐWdÓEeÔfà€Mr   c                  ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚModelResponseIteratorc                ó    — || _         d| _        y )NF)Úmodel_responseÚis_done)r˜   rÿ   s     r   r™   zModelResponseIterator.__init__3  s   € Ø,ˆÔØˆ�r   c                ó   — | S r*   r   r—   s    r   Ú__iter__zModelResponseIterator.__iter__8  ó   € Øˆr   c                óL   — | j                   rt        ‚d| _         | j                  S ©NT)r   ÚStopIterationrÿ   r—   s    r   Ú__next__zModelResponseIterator.__next__;  s"   € Ø�<Š<ÜÐØˆŒØ×"Ñ"Ð"r   c                ó   — | S r*   r   r—   s    r   Ú	__aiter__zModelResponseIterator.__aiter__B  r  r   c              ƒ  óT   K  — | j                   rt        ‚d| _         | j                  S ­wr  )r   ÚStopAsyncIterationrÿ   r—   s    r   Ú	__anext__zModelResponseIterator.__anext__E  s&   è ø€ Ø�<Š<Ü$Ð$ØˆŒØ×"Ñ"Ð"ùs   ‚&(N)r   r   r   r™   r  r  r	  r  r   r   r   rý   rý   2  s   „ òò
ò#òó#r   rý   c                óx   — | t         j                  j                  v rt         j                  j                  |    } | S )zÿ
    If litellm formatted the input tool name, we need to convert it back to the original name.

    Args:
        response_tool_name (str): The name of the tool as received from the response.

    Returns:
        str: The original name of the tool.
    )rG   Úbedrock_tool_name_mappingsÚ
cache_dict)Úresponse_tool_names    r   Úget_bedrock_tool_namer  L  s6   € ð œW×?Ñ?×JÑJÑJÜ$×?Ñ?×JÑJÐK]Ñ^ÐØÐr   zlist[str] | NoneÚ_BEDROCK_GLOBAL_REGIONSc                 óJ   — t         €t        «       j                  «       a t         S )z0Get all Bedrock regions, cached at module level.)r  r•   r©   r   r   r   Ú_get_all_bedrock_regionsr  `  s"   € ô Ð&Ü";Ó"=×"MÑ"MÓ"OÐÜ"Ð"r   c                 ó
   — g d¢S )zIAbbreviations of regions AWS Bedrock supports for cross region inference.)ÚglobalÚusÚeuÚapacÚjpÚauzus-govr   r   r   r   Ú*get_bedrock_cross_region_inference_regionsr  h  s   € â?Ð?r   c                óR   — d| j                  «       v r| j                  d«      d   S | S )z„
    Extract the model name from an AWS Bedrock ARN.
    Returns the string after the last '/' if 'arn' is in the input string.
    Úarnú/rZ   )ÚlowerÚsplit©Úmodels    r   Ú#extract_model_name_from_bedrock_arnr$  m  s+   € ð
 �—‘“ÑØ�{‰{˜3Ó Ñ#Ð#Ø€Lr   c                ó
   — d| v S )zÝ
    An application inference profile ARN ends in an opaque id with no provider
    substring, so the invoke path cannot resolve a provider from it. Such ARNs
    must use the converse route, which needs no provider.
    z:application-inference-profile/r   r"  s    r   Ú,is_bedrock_application_inference_profile_arnr&  w  s   € ð -°Ð5Ð5r   c                ób   — dD ])  }| j                  |«      sŒ| j                  dd«      d   } Œ+ | S )z/Strip LiteLLM routing prefixes from model name.)úbedrock/ú	converse/úinvoke/úopenai/únova-2/únova/r  r>   )rÞ   r!  ©r#  Úprefixs     r   Ústrip_bedrock_routing_prefixr0  €  s;   € àUò +ˆØ×Ñ˜FÕ#Ø—K‘K  QÓ'¨Ñ*‰Eð+ð €Lr   c                ó^   — ddl } |j                  dd| «      }  |j                  dd| «      } | S )zTStrip throughput tier suffixes and context window suffixes from Bedrock model names.r   Nz(:\d+):\d+k$z\1z\[\w+\]$Ú )Úrer‡   )r#  r3  s     r   Ústrip_bedrock_throughput_suffixr4  ˆ  s6   € ãð ˆB�F‰F�? E¨5Ó1€Eð ˆB�F‰F�;  EÓ*€EØ€Lr   z/anthropic/v1/messagesr   ÚMANTLE_MESSAGES_PATHc                óŽ   — | xs |}|r2|j                  d«      }|j                  t        «      r|S |› t        › �S d|› dt        › �S )a¤  Build the bedrock-mantle Anthropic /messages URL.

    Honors an explicit endpoint override (``api_base``, then
    ``aws_bedrock_runtime_endpoint``) so private VPC / VPCE / GovCloud Mantle
    endpoints are reachable; otherwise falls back to the public regional host.
    The mantle messages path is appended unless the override already carries it,
    so callers can pass either the host or the full messages URL.
    r  zhttps://bedrock-mantle.z.api.aws)ÚrstripÚendswithr5  )Úapi_baserï   ÚregionÚoverrideÚbases        r   Úbuild_mantle_messages_urlr=  ˜  sX   € ð Ò>Ð">€HÙØ—o‘o cÓ*ˆØ�=‰=Ô-Ô.ØˆKØ�Ô,Ð-Ð.Ð.Ø$ V H¨HÔ5IÐ4JÐKÐKr   c                óø  — | }dD ]#  }|j                  |«      sŒ|t        |«      d } n |j                  d«      ry|j                  d«      ryt        | «      } t        | «      } t	        | «      } | j                  dd«      d	   }| j                  d
d«      d	   }|t        «       v r| j                  dd«      d   S |t        «       v r3t        | j                  d
d«      «      dkD  r| j                  d
d«      d   S | S )a¨  
    Get the base model from the given model name.

    Handle model names like:
    - "us.meta.llama3-2-11b-instruct-v1:0" -> "meta.llama3-2-11b-instruct-v1"
    - "bedrock/converse/model" -> "model"
    - "anthropic.claude-3-5-sonnet-20241022-v2:0:51k" -> "anthropic.claude-3-5-sonnet-20241022-v2:0"
    - "bedrock/nova-2/arn:aws:..." -> "amazon.nova-2-custom"
    - "bedrock/nova/arn:aws:..." -> "amazon.nova-custom"
    )zbedrock/converse/r(  r)  Nr,  zamazon.nova-2-customr-  zamazon.nova-customrÌ   r>   r   r  )rÞ   rb   r0  r$  r4  r!  r  r  )r#  ÚstrippedÚrpÚpotential_regionÚalt_potential_regions        r   Úget_bedrock_base_modelrC  ®  s
  € ð €HØ<ò ˆØ×Ñ˜rÕ"Ø¤ B£ 	Ð*ˆHÙðð ×Ñ˜9Ô%Ø%Ø	×	Ñ	˜WÔ	%Ø#ä(¨Ó/€EÜ/°Ó6€EÜ+¨EÓ2€Eà#Ÿk™k¨#¨qÓ1°!Ñ4ÐØ"'§+¡+¨c°1Ó"5°aÑ"8ÐàÔEÓGÑGØ�{‰{˜3 Ó" 1Ñ%Ð%Ø	Ô!9Ó!;Ñ	;ÄÀEÇKÁKÐPSÐUVÓDWÓ@XÐ[\Ò@\Ø�{‰{˜3 Ó" 1Ñ%Ð%à€Lr   c                ó<   — t        d„ | t        | «      fD «       «      S )Nc              3  ó„   K  — | ]8  }t         j                  j                  |«      xs i j                  d «      du –— Œ: y­w)Ú!supports_parallel_tool_use_configTN©rG   Ú
model_costr,   rÈ   s     r   r2   zEbedrock_converse_supports_parallel_tool_use_config.<locals>.<genexpr>Ô  s@   è ø€ ò àô 
×	Ñ	×	Ñ	 	Ó	*Ò	0¨b×5Ñ5Ð6YÓZÐ^bÔbñùó   ‚>A ©ÚanyrC  r"  s    r   Ú2bedrock_converse_supports_parallel_tool_use_configrL  Ó  s'   € Üñ àÔ!7¸Ó!>Ð?ôó ð r   c                ó<   — t        d„ | t        | «      fD «       «      S )a¤  
    Check if the model supports Bedrock prompt caching with an extended '1h' TTL
    (in addition to the default 5m TTL).

    Backed by the ``cache_creation_input_token_cost_above_1hr`` field in
    ``model_prices_and_context_window.json`` instead of a hardcoded list of
    model-name patterns, so newly released models pick up support as soon as
    their pricing entry ships, with no code change required here.
    c              3  ó„   K  — | ]8  }t         j                  j                  |«      xs i j                  d «      du–— Œ: y­w)Ú)cache_creation_input_token_cost_above_1hrNrG  rÈ   s     r   r2   z+is_claude_4_5_on_bedrock.<locals>.<genexpr>ä  s@   è ø€ ò àô 
×	Ñ	×	Ñ	 	Ó	*Ò	0¨b×5Ñ5Ð6aÓbÐjnÔnñùrI  rJ  r"  s    r   Úis_claude_4_5_on_bedrockrP  Ú  s)   € ô ñ àÔ!7¸Ó!>Ð?ôó ð r   z-v\d+(?::\d+)?$Ú _BEDROCK_MODEL_VERSION_SUFFIX_REc                ó^   — t        | «      }|j                  d«      syt        |«      }|�|S dS )u#  
    Whether ``toolSpec.strict`` can be forwarded to Bedrock Converse for ``model``.

    Non-Anthropic Bedrock families (Nova, Llama, GPT-OSS) reject the field
    outright. Anthropic models forward it unless their entry in
    ``model_prices_and_context_window.json`` sets
    ``bedrock_converse_supports_strict_tools: false`` â€” Bedrock routes those
    (Opus 4.7/4.8, see #31582) through a stricter validator that rejects the
    ``strict`` key on ``toolSpec`` even though Anthropic's native API accepts
    it as a top-level tool field.
    Ú	anthropicFT)rC  rÞ   Ú'_get_bedrock_converse_strict_tools_flag)r#  r<  Úflags      r   Ú&bedrock_converse_supports_strict_toolsrV  í  s7   € ô )¨Ó/€DØ�?‰?˜;Ô'ØÜ9¸$Ó?€DØÐ#ˆ4Ð-¨Ð-r   c                ó  — t         j                  | t        j                  d| «      f«      }|D ]Ë  }t	        j
                  t        «      5   t        «       |d¬«      }|j                  d«      }t        |t        «      r|cd d d «       c S |j                  d«      }t        |t        «      rFt        «       j                  |i «      j                  d«      }t        |t        «      r|cd d d «       c S d d d «       ŒÍ y # 1 sw Y   ŒØxY w)Nr2  Úbedrock©r#  Úcustom_llm_providerrV  r0   )rS   ÚfromkeysrQ  r‡   Ú
contextlibÚsuppressÚ	ExceptionrH   r,   r+   r.   r-   rO   )Ú
base_modelÚ
candidatesrÉ   Ú
model_inforU  Úmodel_cost_keyÚ
local_flags          r   rT  rT     sñ   € ÜŸ™ zÔ3S×3WÑ3WÐXZÐ\fÓ3gÐ&hÓi€JØò &ˆ	Ü× Ñ ¤Ó+ñ 	&Ø0Ô.Ó0ØØ$-ôˆJð
 —>‘>Ð"JÓKˆDÜ˜$¤Ô%Ø÷	&ó 	&ð (Ÿ^™^¨EÓ2ˆNÜ˜.¬#Ô.ä-Ó/×3Ñ3°NÀBÓG×KÑKÐLtÓuð ô ˜j¬$Ô/Ø%÷!	&÷ 	&ô 	&ð&ð$ ÷#	&ð 	&ús   Á
5C=ÂAC=Ã=D	c                ó¨   — t        |t        «      sy|j                  d«      }|t        vryt	        | «      }|€yt        |   t        |   kD  r||d<   yy)aá  
    Normalize Anthropic ``output_config.effort`` values for Bedrock Opus ids.

    Bedrock's Claude Opus request validator can accept a narrower effort
    vocabulary than Anthropic's compatibility surface. The Bedrock ceiling is
    read from ``model_prices_and_context_window.json`` via
    ``bedrock_output_config_effort_ceiling``.

    Mutates ``output_config`` in place so callers can accept Claude Code's
    ``xhigh`` input without forwarding a provider-invalid value.
    NÚeffort)r+   rS   r,   rB   Ú)_get_bedrock_output_config_effort_ceiling)r#  rQ   re  Úceilings       r   Ú+normalize_bedrock_opus_output_config_effortrh    sc   € ô �m¤TÔ*Øà!×%Ñ% hÓ/€FØÔ8Ñ8Øä>¸uÓE€GØ€Øä*¨6Ñ2Ô5XÐY`Ñ5aÒaØ")ˆ�hÒð br   c                ól  — 	  t        «       | d¬«      }|j                  d«      }t        |t        «      r
|t
        v r|S |j                  d«      }t        |t        «      sy t        «       j                  |i «      }|j                  d«      }t        |t        «      r
|t
        v r|S y # t        $ r Y y w xY w)NrX  rY  Ú$bedrock_output_config_effort_ceilingr0   )rH   r^  r,   r+   r-   rB   rO   )r#  ra  rg  rb  Úlocal_model_infos        r   rf  rf  2  sµ   € ðØ3Ô1Ó3ØØ )ô
ˆ
ð �n‰nÐCÓD€GÜ�'œ3Ô GÔ/RÑ$RØˆà&ŸN™N¨5Ó1€NÜ�n¤cÔ*Øä7Ó9×=Ñ=¸nÈbÓQÐØ×"Ñ"Ð#IÓJ€GÜ�'œ3Ô GÔ/RÑ$RØˆØøô ò Ùðús   ‚B' Â'	B3Â2B3©ÚBedrockTokenCounterc                  óô  — e Zd Z e«       Zej                  «       Zeddd„«       Zeddd„«       Z		 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Z
ddd„Zdd„Zed d„«       Zed d„«       Zed d	„«       Zed!d
„«       Ze	 	 	 	 d"d„«       Zed#d„«       Zed#d„«       Zed d„«       Zed$d„«       Zed#d„«       Zed#d„«       Zed#d„«       Zed%d„«       Zed#d„«       Zed#d„«       Zed#d„«       Zed#d„«       Ze	 	 	 	 d&d„«       Zy)'ÚBedrockModelInfoNc                ó   — | S )z7
        Get the API base for the given model.
        r   )r9  s    r   Úget_api_basezBedrockModelInfo.get_api_baseT  s	   € ð
 ˆr   c                ó   — | S )z6
        Get the API key for the given model.
        r   )Úapi_keys    r   Úget_api_keyzBedrockModelInfo.get_api_key[  s	   € ð
 ˆr   c                ó   — |S r*   r   )r˜   r¶   r#  rY   r5   r1   rs  r9  s           r   Úvalidate_environmentz%BedrockModelInfo.validate_environmentb  s	   € ð ˆr   c                ó   — g S r*   r   )r˜   rs  r9  s      r   Ú
get_modelszBedrockModelInfo.get_modelsn  s   € Øˆ	r   c                ó   — t        «       S )z‘
        Factory method to create a Bedrock token counter.

        Returns:
            BedrockTokenCounter instance for this provider.
        rl  r—   s    r   Úget_token_counterz"BedrockModelInfo.get_token_counter�  s   € ô #Ó$Ð$r   c                ó   — t        | «      S )zKWrapper for standalone function. See extract_model_name_from_bedrock_arn().)r$  r"  s    r   Úextract_model_name_from_arnz,BedrockModelInfo.extract_model_name_from_arnŠ  s   € ô 3°5Ó9Ð9r   c                ó   — t        | «      S )zDWrapper for standalone function. See strip_bedrock_routing_prefix().)r0  r"  s    r   Ú"get_non_litellm_routing_model_namez3BedrockModelInfo.get_non_litellm_routing_model_name�  s   € ô ,¨EÓ2Ð2r   c                ó   — t        | «      S )z>Wrapper for standalone function. See get_bedrock_base_model().)rC  r"  s    r   Úget_base_modelzBedrockModelInfo.get_base_model”  s   € ô & eÓ,Ð,r   c                 ó   — t        «       S )zRWrapper for standalone function. See get_bedrock_cross_region_inference_regions().)r  r   r   r   Ú(_supported_cross_region_inference_regionz9BedrockModelInfo._supported_cross_region_inference_region™  s   € ô :Ó;Ð;r   c           
     ó¤  — ddddddddd	d
œ	}|j                  «       D ]  \  }}t        j                  | |«      sŒ|c S  | j                  ddd«      }|j	                  d«      s|j	                  d«      ryt        | «      ryt        j                  | «      }t        j                  | ¬«      }|t        j                  v s|t        j                  v ryy)z<
        Get the bedrock route for the given model.
        ÚinvokeÚclaude_platformÚconverse_likeÚconverseÚagentÚ	agentcoreÚasync_invokeÚopenaiÚmantle)	r*  úclaude_platform/úconverse_like/r)  úagent/ú
agentcore/úasync_invoke/r+  úmantle/r(  r2  r>   r,  r-  r"  )
rv   ro  Ú_model_has_route_prefixÚreplacerÞ   r&  r€  r~  rG   Úbedrock_converse_models)r#  Úroute_mappingsr/  Ú
route_typeÚ_model_after_bedrockr_  Ú	alt_models          r   Úget_bedrock_routez"BedrockModelInfo.get_bedrock_routež  sã   € ð>  Ø 1Ø-Ø#ØØ%Ø+ØØñ

ð 	ð: #1×"6Ñ"6Ó"8ò 	"ÑˆF�JÜ×7Ñ7¸¸vÕFØ!Ò!ð	"ð
 ',§m¡m°JÀÀAÓ&FÐØ×*Ñ*¨9Ô5Ð9M×9XÑ9XÐY`Ô9aØä7¸Ô>Øä,×;Ñ;¸EÓBˆ
Ü+×NÑNÐUZÐNÓ[ˆ	Øœ×8Ñ8Ñ8¸IÌ×IhÑIhÑ<hØØr   c                ó.   — t         j                  | d«      S )zC
        Check if the model is an explicit converse route.
        r)  ©ro  r“  r"  s    r   Ú_explicit_converse_routez)BedrockModelInfo._explicit_converse_routeÞ  s   € ô
  ×7Ñ7¸¸{ÓKÐKr   c                ó.   — t         j                  | d«      S )zQ
        Check if the model is an explicit Claude Platform on AWS route.
        r�  rœ  r"  s    r   Ú_explicit_claude_platform_routez0BedrockModelInfo._explicit_claude_platform_routeå  s   € ô
  ×7Ñ7¸Ð?QÓRÐRr   c                ó(   — | j                  ddd«      S )zS
        Strip the Claude Platform route prefix from a Bedrock model name.
        r�  r2  r>   )r”  r"  s    r   Úget_claude_platform_modelz*BedrockModelInfo.get_claude_platform_modelì  s   € ð
 �}‰}Ð/°°QÓ7Ð7r   c                ó.   — dD ]  }|| v sŒ| |   ||<   Œ |S )z[
        Map Claude Platform route auth params that are not OpenAI request params.
        )Úworkspace_idÚaws_workspace_idÚanthropic_workspace_idr   )Úpassed_paramsr5   r0   s      r   Úmap_claude_platform_auth_paramsz0BedrockModelInfo.map_claude_platform_auth_paramsó  s4   € ð

ò 	:ˆCð
 �mÒ#Ø'4°SÑ'9� Ò$ð	:ð Ðr   c                ó.   — t         j                  | d«      S )zA
        Check if the model is an explicit invoke route.
        r*  rœ  r"  s    r   Ú_explicit_invoke_routez'BedrockModelInfo._explicit_invoke_route  ó   € ô
  ×7Ñ7¸¸yÓIÐIr   c                ó.   — t         j                  | d«      S )z@
        Check if the model is an explicit agent route.
        r�  rœ  r"  s    r   Ú_explicit_agent_routez&BedrockModelInfo._explicit_agent_route  s   € ô
  ×7Ñ7¸¸xÓHÐHr   c                ó.   — t         j                  | d«      S )zD
        Check if the model is an explicit agentcore route.
        r�  rœ  r"  s    r   Ú_explicit_agentcore_routez*BedrockModelInfo._explicit_agentcore_route  s   € ô
  ×7Ñ7¸¸|ÓLÐLr   c                ó6   — | j                  |«      xs d|› �| v S )aŠ  Whether a route prefix (e.g. ``mantle/``) appears as a leading path segment.

        A route token is only valid at the start of the model id or immediately
        after a ``/``. A plain substring check matches the ``bedrock_mantle/``
        provider prefix against the ``mantle/`` route, so the body model gets
        mangled to ``bedrock_openai.gpt-5.5``; anchoring to a segment boundary
        keeps the bare model id intact.

        ``f"/{prefix}" in model`` matches the token as a segment at any path
        depth, not just the second segment; that is intentional and acceptable
        for these short, unambiguous route tokens.
        r  ©rÞ   r.  s     r   r“  z(BedrockModelInfo._model_has_route_prefix  s%   € ð ×Ñ Ó'Ò@¨Q¨v¨h¨<¸5Ð+@Ð@r   c                ó.   — t         j                  | d«      S )z[
        Check if the model is an explicit mantle route (bedrock-mantle endpoint).
        r’  rœ  r"  s    r   Ú_explicit_mantle_routez'BedrockModelInfo._explicit_mantle_route&  rª  r   c                ó.   — t         j                  | d«      S )zH
        Check if the model is an explicit converse like route.
        rŽ  rœ  r"  s    r   Ú_explicit_converse_like_routez.BedrockModelInfo._explicit_converse_like_route-  s   € ô
  ×7Ñ7¸Ð?OÓPÐPr   c                ó.   — t         j                  | d«      S )zG
        Check if the model is an explicit async invoke route.
        r‘  rœ  r"  s    r   Ú_explicit_async_invoke_routez-BedrockModelInfo._explicit_async_invoke_route4  s   € ô
  ×7Ñ7¸¸ÓOÐOr   c                ó.   — t         j                  | d«      S )z“
        Check if the model is an explicit openai route.
        Used for Bedrock imported models that use OpenAI Chat Completions format.
        r+  rœ  r"  s    r   Ú_explicit_openai_routez'BedrockModelInfo._explicit_openai_route;  s   € ô  ×7Ñ7¸¸yÓIÐIr   c                óö   — t         j                  | «      rt        j                  «       S t         j	                  | «      ryt         j                  | «      rddlm}  |«       S d| v rt        j                  «       S y)zö
        Get the bedrock provider config for the given model.

        Only route to AmazonAnthropicClaude3MessagesConfig() for BaseMessagesConfig

        All other routes should return None since they will go through litellm.completion
        Nr   )ÚAmazonMantleMessagesConfigÚclaude)	ro  rŸ  rG   Ú#BedrockClaudePlatformMessagesConfigr�  r²  Ú3litellm.llms.bedrock.messages.mantle_transformationrº  Ú#AmazonAnthropicClaudeMessagesConfig)r#  rº  s     r   Ú,get_bedrock_provider_config_for_messages_apiz=BedrockModelInfo.get_bedrock_provider_config_for_messages_apiC  sr   € ô ×;Ñ;¸EÔBÜ×>Ñ>Ó@Ð@ô ×4Ñ4°UÔ;Øô
 ×2Ñ2°5Ô9õñ .Ó/Ð/ð �uÑÜ×>Ñ>Ó@Ð@ð
 r   r*   )r9  ú
str | Noner±   rÀ  )rs  rÀ  r±   rÀ  )NN)r¶   rS   r#  r-   rY   zlist[AllMessageValues]r5   rS   r1   rS   rs  rÀ  r9  rÀ  r±   rS   )rs  rÀ  r9  rÀ  r±   r³   )r±   zBaseTokenCounter | None©r#  r-   r±   r-   r²   )r#  r-   r±   z{Literal['converse', 'invoke', 'claude_platform', 'converse_like', 'agent', 'agentcore', 'async_invoke', 'openai', 'mantle']©r#  r-   r±   r.   )r¦  rS   r5   rS   r±   rS   )r#  r-   r/  r-   r±   r.   )r#  r-   r±   z"BaseAnthropicMessagesConfig | None)r   r   r   r•   Úglobal_configr©   Úall_global_regionsÚstaticmethodrq  rt  rv  rx  rz  r|  r~  r€  r‚  rš  r�  rŸ  r¡  r§  r©  r¬  r®  r“  r²  r´  r¶  r¸  r¿  r   r   r   ro  ro  P  sC  „ Ù-Ó/€MØ&×6Ñ6Ó8Ðàóó ðð óó ðð #Ø#ð
àð
ð ð
ð )ð	
ð
 ð
ð ð
ð ð
ð ð
ð 
ó
ôó&%ð ò:ó ð:ð ò3ó ð3ð ò-ó ð-ð ò<ó ð<ð ð=Øð=ð

ò=ó ð=ð~ òLó ðLð òSó ðSð ò8ó ð8ð òó ðð òJó ðJð òIó ðIð òMó ðMð òAó ðAð òJó ðJð òQó ðQð òPó ðPð òJó ðJð ð*Øð*à	+ò*ó ñ*r   ro  c                ó„  — ddl m} t        j                  | «      }|j	                  | ¬«      }t        j                  | «      }|dk(  rt        j                  «       S |dk(  s|dk(  rt        j                  «       S |dk(  rt        j                  «       S |dk(  rdd	l
m}  |«       S |d
k(  rddlm}  |«       S |dk(  rddlm}  |«       S |dk(  rt        j                   «       S |dk(  rH|t        j"                  j%                  «       v rt        j"                  «       S t        j&                  «       S |dk(  s|dk(  rt        j(                  «       S |dk(  rt        j*                  «       S |dk(  rt        j,                  «       S |dk(  rt        j.                  «       S |dk(  rt        j0                  «       S |dk(  rt        j2                  «       S |dk(  rt        j4                  «       S |dk(  rt        j6                  «       S |dk(  rt        j8                  «       S |dk(  rt        j:                  «       S t        j<                  «       S )zÖ
    Helper function to get the appropriate Bedrock chat config based on model and route.

    Args:
        model: The model name/identifier

    Returns:
        The appropriate Bedrock config class instance
    r   ©Ú
BaseAWSLLMr"  r…  r‡  r†  r‹  rˆ  )ÚAmazonInvokeAgentConfigr‰  )ÚAmazonAgentCoreConfigrŒ  )ÚAmazonMantleConfigÚamazonrS  rì   ÚllamaÚai21ÚcohereÚmistralÚmoonshotÚdeepseek_r1ÚnovaÚqwen3Úqwen2Ú
twelvelabs)Ú!litellm.llms.bedrock.base_aws_llmrÈ  ro  rš  Úget_bedrock_invoke_providerr€  rG   ÚBedrockClaudePlatformConfigÚAmazonConverseConfigÚAmazonBedrockOpenAIConfigÚ5litellm.llms.bedrock.chat.invoke_agent.transformationrÉ  Ú2litellm.llms.bedrock.chat.agentcore.transformationrÊ  Ú/litellm.llms.bedrock.chat.mantle.transformationrË  ÚAmazonTitanConfigÚAmazonAnthropicConfigÚ get_legacy_anthropic_model_namesÚAmazonAnthropicClaudeConfigÚAmazonLlamaConfigÚAmazonAI21ConfigÚAmazonCohereConfigÚAmazonMistralConfigÚAmazonMoonshotConfigÚAmazonDeepSeekR1ConfigÚAmazonInvokeNovaConfigÚAmazonQwen3ConfigÚAmazonQwen2ConfigÚAmazonTwelveLabsPegasusConfigÚAmazonInvokeConfig)r#  rÈ  Úbedrock_routeÚbedrock_invoke_providerr_  rÉ  rÊ  rË  s           r   Úget_bedrock_chat_configrð  q  s&  € õ =ä+×=Ñ=¸eÓD€MØ%/×%KÑ%KÐRWÐ%KÓ%XÐÜ(×7Ñ7¸Ó>€Jð Ð)Ò)Ü×2Ñ2Ó4Ð4Ø	˜*Ò	$¨¸Ò(HÜ×+Ñ+Ó-Ð-Ø	˜(Ò	"Ü×0Ñ0Ó2Ð2Ø	˜'Ò	!õ	
ñ 'Ó(Ð(Ø	˜+Ò	%õ	
ñ %Ó&Ð&Ø	˜(Ò	"õ	
ñ "Ó#Ð#ð  (Ò*Ü×(Ñ(Ó*Ð*Ø	  KÒ	/Øœ×6Ñ6×WÑWÓYÑYÜ×0Ñ0Ó2Ð2ä×6Ñ6Ó8Ð8Ø	  FÒ	*Ð.EÈÒ.PÜ×(Ñ(Ó*Ð*Ø	  FÒ	*Ü×'Ñ'Ó)Ð)Ø	  HÒ	,Ü×)Ñ)Ó+Ð+Ø	  IÒ	-Ü×*Ñ*Ó,Ð,Ø	  JÒ	.Ü×+Ñ+Ó-Ð-Ø	  MÒ	1Ü×-Ñ-Ó/Ð/Ø	  FÒ	*Ü×-Ñ-Ó/Ð/Ø	  GÒ	+Ü×(Ñ(Ó*Ð*Ø	  GÒ	+Ü×(Ñ(Ó*Ð*Ø	  LÒ	0Ü×4Ñ4Ó6Ð6ä×)Ñ)Ó+Ð+r   c                 óÔ   — 	 ddl m}  ddlm}  | «       }|j	                  dd«      } ||«      j                  d«      S # t        $ r }t        j                  d|«       Y d}~yd}~ww xY w)	z³
    Load the ResponseStream shape from botocore's bundled bedrock-runtime schema.

    Returns ``None`` if botocore is unavailable or the service model cannot be
    loaded.
    r   )ÚLoader)ÚServiceModelrÕ   z	service-2ÚResponseStreamu~   litellm: could not load bedrock-runtime response stream shape â€” Bedrock event-stream decoding will be unavailable. Error: %sN)	Úbotocore.loadersrò  Úbotocore.modelró  Úload_service_modelÚ	shape_forr^  r   Úwarning)rò  ró  ÚloaderÚservice_dictÚes        r   Ú#_load_bedrock_response_stream_shaperý  »  sj   € ðÝ+Ý/á›ˆØ$×7Ñ7Ð8IÈ;ÓWˆÙ˜LÓ)×3Ñ3Ð4DÓEÐEøÜò Ü×ÑðOàô	
ô
 ûðús   ‚;> ¾	A'ÁA"Á"A'c                 ó   — t        «       S )zÌ
    Lazily load and cache the bedrock-runtime ResponseStream shape for the process.

    Avoids importing botocore (and logging warnings) unless Bedrock event-stream
    decoding is actually needed.
    )rý  r   r   r   Ú!get_bedrock_response_stream_shaperÿ  Ò  s   € ô /Ó0Ð0r   c                  ó,   — e Zd ZU ded<   ded<   ded<   y)ÚBedrockEventStreamResponseDictÚintrÊ   zMapping[str, str]r¶   ÚbytesÚbodyN)r   r   r   Ú__annotations__r   r   r   r  r  Ý  s   … ØÓØÓØ
„Kr   r  c                óD  — | d   j                  d«      }| d   j                  «       }|r|› d|› �n|}| d   }|�[|�Y|j                  j                  |«      }|�<|j                  xs i j                  di «      j                  d«      }|�t	        |«      }t        ||¬«      S )	a.  Build a BedrockError for a non-200 event-stream error event.

    botocore hard-codes HTTP 400 on every mid-stream error event, so the modeled
    ResponseStream member's httpStatusCode is the real status. Resolve it from the
    shape and fall back to the raw status when the type is not modeled.
    r¶   z:exception-typer  ú rÊ   ÚerrorÚhttpStatusCode©rÊ   rg   )r,   ÚdecodeÚmembersÚmetadatar  r   )Úresponse_dictÚresponse_stream_shapeÚexception_typeÚdecoded_bodyrg   rÊ   ÚmemberÚmodeled_statuss           r   Úbuild_bedrock_stream_errorr  ã  s¸   € ð *¨)Ñ4×8Ñ8Ð9JÓK€NØ'¨Ñ/×6Ñ6Ó8€LÙ;I˜Ð' q¨¨Ñ7È|€Gà Ñ.€KØÐ!Ð&;Ð&GØ-×5Ñ5×9Ñ9¸.ÓIˆØÐØ%+§_¡_Ò%:¸×$?Ñ$?ÀÈÓ$L×$PÑ$PÐQaÓ$bˆNØÐ)Ü! .Ó1�ä K¸ÔAÐAr   c                  ó   — e Zd ZdZd„ Zdd„Zy)ÚBedrockEventStreamDecoderBasez:
    Base class for event stream decoding for Bedrock
    c                ó(   — ddl m}  |«       | _        y )Nr   )ÚEventStreamJSONParser)Úbotocore.parsersr  Úparser)r˜   r  s     r   r™   z&BedrockEventStreamDecoderBase.__init__  s   € Ý:á+Ó-ˆ�r   c                ój  — t        «       }|€t        dd¬«      ‚|j                  «       }| j                  j	                  ||«      }|d   dk7  rt        ||«      ‚d|v r3|j                  d«      }|sy |j                  d«      j                  «       S |j                  d«      }|sy |j                  «       S )	Niô  zeBedrock event-stream shape could not be loaded from botocore. Ensure botocore is correctly installed.r
  rÊ   éÈ   Úchunkr  r  )rÿ  r   Úto_response_dictr  Úparser  r,   r  )r˜   Úeventr  r  Úparsed_responser  s         r   Ú_parse_message_from_eventz7BedrockEventStreamDecoderBase._parse_message_from_event  sÀ   € Ü'HÓ'JÐØ Ð(ÜØð>ôð ð  %×5Ñ5Ó7ˆØ!%§¡×!2Ñ!2°=ÐBWÓ!Xˆà˜Ñ'¨3Ò.Ü,¨]Ð<QÓRÐRØ�oÑ%Ø#×'Ñ'¨Ó0ˆEÙØØ—9‘9˜WÓ%×,Ñ,Ó.Ð.à!×%Ñ% fÓ-ˆEÙØà—<‘<“>Ð!r   N)r±   rÀ  )r   r   r   Ú__doc__r™   r"  r   r   r   r  r  ü  s   „ ñò.ô
"r   r  c                ó  — | j                  d«      }|sg S t        |t        «      r|S t        |t        «      r­|j	                  «       }|j                  d«      r_|j                  d«      rN	 t        j                  |«      }t        |t        «      r'|D �cg c]  }t        |«      j	                  «       ‘Œ c}S 	 |j                  d«      D �cg c]  }|j	                  «       ‘Œ c}S g S c c}w # t        j                  $ r Y ŒIw xY wc c}w )aÍ  
    Extract anthropic-beta header values and convert them to a list.
    Supports both JSON array format and comma-separated values from user headers.

    Used by both converse and invoke transformations for consistent handling
    of anthropic-beta headers that should be passed to AWS Bedrock.

    Args:
        headers (dict): Request headers dictionary

    Returns:
        List[str]: List of anthropic beta feature strings, empty list if no header
    zanthropic-betaú[ú]ú,)r,   r+   r`   r-   r’   rÞ   r8  rc   ÚloadsÚJSONDecodeErrorr!  )r¶   Úanthropic_beta_headerÚparsedÚbetas       r   Úget_anthropic_beta_from_headersr-  "  só   € ð $ŸK™KÐ(8Ó9ÐÙ Øˆ	ô Ð'¬Ô.Ø$Ð$ô Ð'¬Ô-Ø 5× ;Ñ ;Ó =ÐØ ×+Ñ+¨CÔ0Ð5J×5SÑ5SÐTWÔ5XðÜ $§
¡
Ð+@Ó A�Ü˜f¤dÔ+Ø:@ÖA°$œC ›IŸO™OÕ-ÒAÐAð ,ð *?×)DÑ)DÀSÓ)IÖJ �—
‘
•ÒJÐJà€Iùò BøÜ×'Ñ'ò Ùðüò Ks*   Á+)C, Â C'Â4C, ÃDÃ'C, Ã,DÄDc                ón   — t        d„ | |fD «       «      }t        d„ |D «       d«      }|xs t        d«      S )zî
    Resolve the SSE-KMS key configured for Bedrock batch/file S3 objects.

    Precedence: `s3_encryption_key_id` in litellm_params, then optional_params
    (client-side / request params), then the AWS_S3_ENCRYPTION_KEY_ID env var.
    c              3  óD   K  — | ]  }|€Œ|j                  d«      –— Œ y ­w)NÚs3_encryption_key_id)r,   )r/   Úsources     r   r2   z/resolve_s3_encryption_key_id.<locals>.<genexpr>S  s%   è ø€ ò Ø/5Ð^dÑ^pˆ�
‰
Ð)×*ñùs   ‚ Š c              3  óH   K  — | ]  }t        |t        «      sŒ|sŒ|–— Œ y ­wr*   rÇ   )r/   r¡   s     r   r2   z/resolve_s3_encryption_key_id.<locals>.<genexpr>V  s   è ø€ Ò^ e¼ZÈÌsÕ=SÒX]œEÑ^ùs   ‚"˜"›"NÚAWS_S3_ENCRYPTION_KEY_ID)Útuplerß   r   )r1   r5   r`  Úexplicits       r   Úresolve_s3_encryption_key_idr6  I  sF   € ô ñ Ø:HÈ/Ð9Zôó €Jô Ñ^¨zÔ^Ð`dÓe€HØÒA”~Ð&@ÓAÐAr   c                  ó‚   — e Zd ZdZd„ Zdd„Zdd„Zdd„Z	 d	 	 	 	 	 	 	 	 	 	 	 dd„Zddd„Z		 	 d	 	 	 	 	 	 	 	 	 dd„Z
dd	„Zy
)ÚCommonBatchFilesUtilsz™
    Common utilities for Bedrock batch and file operations.
    Provides shared functionality to reduce code duplication between batches and files.
    c                ó(   — ddl m}  |«       | _        y )Nr>   rÇ  )Úbase_aws_llmrÈ  Ú	_base_aws)r˜   rÈ  s     r   r™   zCommonBatchFilesUtils.__init__`  s   € å,á#›ˆ�r   c                ó2   — |j                  d«      r|dd S |S )a  
        Extract the actual Bedrock model ID from LiteLLM model name.

        Args:
            model: LiteLLM model name (e.g., "bedrock/anthropic.claude-3-sonnet-20240229-v1:0")

        Returns:
            Bedrock model ID (e.g., "anthropic.claude-3-sonnet-20240229-v1:0")
        r(  é   Nr°  )r˜   r#  s     r   Ú'get_bedrock_model_id_from_litellm_modelz=CommonBatchFilesUtils.get_bedrock_model_id_from_litellm_modelf  s#   € ð ×Ñ˜JÔ'Ø˜˜�9ÐØˆr   c                ó¶   — |j                  d«      st        d|› �«      ‚|dd j                  dd«      }t        |«      dk7  rt        d|› �«      ‚|d   |d   fS )	zþ
        Parse S3 URI into bucket and key components.

        Args:
            s3_uri: S3 URI (e.g., "s3://bucket/key/path")

        Returns:
            Tuple of (bucket, key)

        Raises:
            ValueError: If URI format is invalid
        zs3://zInvalid S3 URI format: é   Nr  r>   r?   r   )rÞ   Ú
ValueErrorr!  rb   )r˜   Ús3_uriÚs3_partss      r   Úparse_s3_uriz"CommonBatchFilesUtils.parse_s3_urit  so   € ð × Ñ  Ô)ÜÐ6°v°hÐ?Ó@Ð@à   ˜*×*Ñ*¨3°Ó2ˆÜˆx‹=˜AÒÜÐ6°v°hÐ?Ó@Ð@à˜‰{˜H Q™KÐ'Ð'r   c                ó>  — d|v r|d   r| j                  |d   «      S 	 | j                  |«      \  }}|j                  d«      rK|dd }|j                  d«      }t	        |«      dkD  r'dj                  |dd «      }|j                  d«      }|S y	# t        $ r Y y	w xY w)
zÖ
        Extract model ID from S3 file path.

        The Bedrock file transformation creates S3 objects with the model name embedded:
        Format: s3://bucket/litellm-bedrock-files-{model}-{uuid}.jsonl
        r#  zlitellm-bedrock-files-é   Nú-r>   rZ   z.jsonlz)anthropic.claude-3-5-sonnet-20240620-v1:0)r>  rD  rÞ   r!  rb   ÚjoinÚremovesuffixr^  )r˜   rB  r5   ÚbucketÚ
object_keyÚ
model_partÚpartsÚ
model_names           r   Úextract_model_from_s3_file_pathz5CommonBatchFilesUtils.extract_model_from_s3_file_pathŠ  sÃ   € ð �oÑ%¨/¸'Ò*BØ×?Ñ?ÀÐPWÑ@XÓYÐYð	Ø!%×!2Ñ!2°6Ó!:ÑˆF�Jð ×$Ñ$Ð%=Ô>à$.¨r¨s O�
à)×/Ñ/°Ó4�Ü�u“: ’>à!$§¡¨%°°¨*Ó!5�JØ!+×!8Ñ!8¸Ó!B�JØ%Ð%ð
 ;øô	 ò 	Øð ;ð		ús   ŸA/B Â	BÂBc                ó,  — 	 ddl m} ddlm} | j
                  j                  |d¬«      }| j
                  j                  |j                  d«      |j                  d«      |j                  d	«      ||j                  d
«      |j                  d«      |j                  d«      |j                  d«      |j                  d«      ¬«	      }	|j                  «       }
|
dk(  rd}i }n-t        |t        «      rddl} |j                  |«      }n|}ddi} ||	||«      } ||
|||¬«      }|j                  |«       |j                  «       }t        |j                   «      t        |t"        «      r|j%                  d«      fS |fS # t        $ r t	        d«      ‚w xY w)a¨  
        Sign AWS request using Signature Version 4.

        Args:
            service_name: AWS service name ("bedrock" or "s3")
            data: Request data (string or dict)
            endpoint_url: Full endpoint URL
            optional_params: Optional parameters containing AWS credentials
            method: HTTP method (default: POST)

        Returns:
            Tuple of (signed_headers, signed_data)
        r   )Ú	SigV4Auth)Ú
AWSRequestz7Missing boto3 to call bedrock. Run 'pip install boto3'.r2  )r5   r#  r   r   r   r!   r"   r#   r$   r%   )	r   r   r   r    r!   r"   r#   r$   r%   ÚGETNzContent-Typezapplication/json)ÚmethodÚurlÚdatar¶   zutf-8)Úbotocore.authrQ  Úbotocore.awsrequestrR  ÚImportErrorr;  Ú_get_aws_region_nameÚget_credentialsr,   Úupperr+   rS   rc   rd   Úadd_authÚpreparer¶   r-   Úencode)r˜   rÚ   rV  rÛ   r5   rT  rQ  rR  r    ÚcredentialsÚmethod_upperÚrequest_datar¶   rc   Úsigv4r¸   Úpreppeds                    r   Úsign_aws_requestz&CommonBatchFilesUtils.sign_aws_request«  s   € ð*	YÝ/Ý6ð
 "&§¡×!DÑ!DÐUdÐlnÐ!DÓ!oˆØ!Ÿ^™^×;Ñ;Ø-×1Ñ1Ð2EÓFØ"1×"5Ñ"5Ð6MÓ"NØ-×1Ñ1Ð2EÓFØ+Ø,×0Ñ0Ð1CÓDØ,×0Ñ0Ð1CÓDØ)×-Ñ-¨oÓ>Ø#2×#6Ñ#6Ð7OÓ#PØ,×0Ñ0Ð1CÓDð <ó 

ˆð %Ÿl™l›nˆØ˜5Ò àˆLØ‰Gä˜$¤Ô%Ûà)˜tŸz™z¨$Ó/‘à#�à%Ð'9Ð:ˆGñ ! ¨l¸OÓLˆÙ#¨<¸\ÐP\ÐfmÔnˆØ�‰�wÔØ Ÿ™Ó*ˆô �—‘Ó!Ü-7¸ÄcÔ-Jˆ\× Ñ  Ó)ð
ð 	
àP\ð
ð 	
øôO ò 	YÜÐWÓXÐXð	Yús   ‚E> Å>Fc                óX   — ddl m} t        |j                  «       «      dd }|› d|› �}|S )u]  
        Generate a unique job name for AWS services.
        AWS services often have length limits, so this creates a concise name.

        Args:
            model: Model name to include in the job name
            prefix: Prefix for the job name

        Returns:
            Unique job name (â‰¤ 63 characters for Bedrock compatibility)
        r   ©ÚuuidNr=  z-batch-)Úlitellm._uuidrh  r-   Úuuid4)r˜   r#  r/  rh  Ú	unique_idÚjob_names         r   Úgenerate_unique_job_namez.CommonBatchFilesUtils.generate_unique_job_nameï  s5   € õ 	'ä˜tŸz™z›|Ó,¨R¨aÐ0ˆ	ð $˜H G¨I¨;Ð7ˆàˆr   c                ó4  — ddl }ddlm} |j                  d«      xs( |j                  d«      xs t	        j
                  |«      }|st        d|› d�«      ‚t        |j                  «       «      }t        |j                  «       «      dd }	|› d|› d|	› �}
||
fS )	al  
        Get S3 bucket and generate a unique key from configuration.

        Args:
            litellm_params: LiteLLM parameters
            optional_params: Optional parameters
            bucket_env_var: Environment variable name for bucket
            key_prefix: Prefix for the S3 key

        Returns:
            Tuple of (bucket_name, object_key)
        r   Nrg  Ús3_bucket_namez>S3 bucket name is required. Set 's3_bucket_name' parameter or z env varr=  rG  )
Útimeri  rh  r,   ÚosÚgetenvrA  r  r-   rj  )r˜   r1   r5   Úbucket_env_varÚ
key_prefixrp  rh  Úbucket_nameÚ	timestamprk  rK  s              r   Ú!get_s3_bucket_and_key_from_configz7CommonBatchFilesUtils.get_s3_bucket_and_key_from_config  sª   € ó& 	å&ð ×ÑÐ/Ó0Òv°O×4GÑ4GÐHXÓ4YÒvÔ]_×]fÑ]fÐguÓ]vð 	ñ ÜÐ]Ð^lÐ]mÐmuÐvÓwÐwô ˜tŸy™y›{Ó+ˆ	Ü˜tŸz™z›|Ó,¨R¨aÐ0ˆ	Ø)˜l¨!¨I¨;°a¸	°{ÐCˆ
à˜JÐ&Ð&r   c                ó   — t        |||¬«      S )z3
        Get Bedrock-specific error class.
        )rÊ   rg   r¶   )r   )r˜   Úerror_messagerÊ   r¶   s       r   Úget_error_classz%CommonBatchFilesUtils.get_error_class)  s   € ô ¨¸]ÐT[Ô\Ð\r   NrÁ  )rB  r-   r±   r4  )rB  r-   r5   rS   r±   r-   )ÚPOST)rÚ   r-   rV  z&str | dict | BedrockCreateBatchRequestrÛ   r-   r5   rS   rT  r-   r±   r4  )rG   )r#  r-   r/  r-   r±   r-   )ÚAWS_S3_BUCKET_NAMErG   )
r1   rS   r5   rS   rs  r-   rt  r-   r±   r4  )ry  r-   rÊ   r  r¶   zdict | httpx.Headersr±   r   )r   r   r   r#  r™   r>  rD  rO  re  rm  rw  rz  r   r   r   r8  r8  Z  s±   „ ñò
&óó(ó,;ðN ðB
àðB
ð 5ðB
ð ð	B
ð
 ðB
ð ðB
ð 
óB
ôHð2 3Ø#ð#'àð#'ð ð#'ð ð	#'ð
 ð#'ð 
ó#'ôJ]r   r8  )r1   úMapping[str, Any]r5   r}  r±   zdict[str, Any]r°   )rT   rS   r±   údict | None)rU   rS   rT   rS   r±   ÚNone)rT   rS   r±   r  )rX   rS   r±   r  )r±   z
bool | str)NNNNNNNNNNN)r   rÀ  r   rÀ  r    rÀ  rï   rÀ  r!   rÀ  r"   rÀ  r#   rÀ  r$   rÀ  rð   r~  rñ   zfloat | httpx.Timeout | None)r  r-   r±   r-   r²   rÁ  rÂ  )r9  rÀ  rï   rÀ  r:  r-   r±   r-   )r_  r-   r±   zbool | None)r#  r-   rQ   r   r±   r  )r#  r-   r±   z BedrockOutputConfigEffort | None)r#  r-   )r  r  r  zShape | Noner±   r   )r¶   rS   r±   r³   r*   )r1   r}  r5   zMapping[str, Any] | Noner±   rÀ  )XÚ
__future__r   r\  Ú	functoolsrc   rq  r3  Úcollections.abcr   Útypingr   r   r   r   r	   rö  r
   Úlitellm.types.llms.bedrockr   rä   rG   r   Ú(litellm.litellm_core_utils.aws_partitionr   Ú7litellm.llms.base_llm.anthropic_messages.transformationr   Ú litellm.llms.base_llm.base_utilsr   r   Ú)litellm.llms.base_llm.chat.transformationr   Úlitellm.secret_managers.mainr   r   Úlitellm.types.llms.openair   r   r'   r  r8   rF   ÚBedrockOutputConfigEffortrB   rH   Ú	lru_cacherO   rV   rl   rs   rŠ   r�   r“   r•   r½   rÂ   rû   rý   r  r  r  r  r$  r&  r0  r4  r5  r=  rC  rL  rP  ÚcompilerQ  rV  rT  rh  rf  Ú7litellm.llms.bedrock.count_tokens.bedrock_token_counterrm  ro  rð  rý  rÿ  r  r  r  r-  r6  r8  r   r   r   ú<module>r�     sM  ðÞ "ðó Û Û Û 	Û 	Ý #ß @Õ @áÝ$åDã ã Ý "Ý Gõ÷ PÝ Fß CáÝ:ô	Ð#ô 	ð<Ð  Ð"8ó ðØ%ðà&ðð óð2 €à#Ð$KÑLÐ àØØØØñTÐ #Ð%Pó òð  €×Ñ˜QÔò7ó  ð7óð(+,Øð+,àð+,ð 
ó+,ó\-ó8%*óPGó.7÷&H
ñ H
òVóð Ø$(Ø(,Ø"&Ø/3Ø#'Ø#'Ø $Ø)-Ø!%Ø,0ðià!ðið &ðið  ð	ið
 #-ðið !ðið !ðið ðið 'ðið ðið *ói÷X#ñ #ó4ð" -1Ð Ð)Ó 0ó#ó@ó
ó6óó
ð 7Ð �eÓ 6ðLØðLà",ðLð ðLð 	ó	Ló,"óJóð  +5¨"¯*©*Ð5GÓ*HÐ   %Ó Hó.ó&ó.*ð6Øðà%óõ6 Xô^Ð'ô ^óB	G,òTð. €×Ñ˜QÔñ1ó  ð1ô Yô ðBØ1ðBà'ðBð óB÷2#"ñ #"óL$ðR 15ðBØ%ðBà-ðBð óB÷"S]ò S]r   