o
    >h                     @   s  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 d dl	m
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 d d	lmZ d
dlmZmZmZmZ ddlmZ ddlmZ ddl m!Z!m"Z"m#Z#m$Z$m%Z% zd dl&m'Z' e'dZ(W n e)y   d dl*Z*e*+djZ(Y nw zd dl,m-Z-m.Z. ej/e.fZ0W n e)y   e1dZ-ej/fZ0Y nw e2e3Z4G dd deZ5G dd de5Z6dd Z7dd Z8d\ddZ9dd Z:dd  Z;d!d" Z<G d#d$ d$eZ=d%d& Z>ej?ej@ejAfZBejCeBd'ejDfejEeBd(ejFfejGejHd)ejDfejIejHd*ejFfejGejJejKfd+ejDfejIejJejKfd,ejFfgZLd-d. ZMd/d0 ZNejOejPdffejQejRejSffejTejUdffejVejRejWffejXejRejYffejAeNejZffej[ejRdffej@ej\dffej?ejPdffej]ejRej^ffej_ejRej`ffejaejRejbffejcejRdffejdejRdffejeejRejfffejHejRdffgZgej^ej`d1ZhejiejRejjffejaejRejbffejkejRejlffej]ejRd2d3 ffejeejRejfffejmejRdffejHejRdffejTejUdffej?ejPdffej@ej\dffejAeNejZffej[ejRdffejXejRejYffejVejRejWffejnejRdffgZoepe(epd4k rDegqejrejUdff eoqejrejUdff eoeg Zsd5d6 Ztd7d8 ZuevejUdffewejPdffexejRdffeyej\dffezej{dffe
euejZffej|ejRejfffe j ejRejWffe j}ejRejYffg	Z~eed9rejZejZnd:d; Zd<d= Zd>d? Ze~qejejfef d@dA ZG dBdC dCeZG dDdE dEeZG dFdG dGeZG dHdI dIeZG dJdK dKeZG dLdM dMeZG dNdO dOeZG dPdQ dQeZzd dRlmZ d dSlmZmZ W n e)y   d ZZdTdU ZY nw G dVdW dWeZzd dXlmZ W n e)y<   G dYdZ dZeZY dS w G d[dZ dZeZdS )]    N)suppress)OrderedDict)Decimal)
validators)models)version)serializers)api_settings   )call_view_methodFieldInspector
NotHandledSerializerInspector   )openapi)SwaggerGenerationError)decimal_as_floatfield_value_to_representationfilter_noneget_serializer_classget_serializer_ref_name)metadatadjangorestframework)NoneType	UnionTypec                   @   sT   e Zd 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dS )InlineSerializerInspectorzVProvides serializer conversions using :meth:`.FieldInspector.field_to_swagger_object`.Fc                 C   s   |  |tj| jS N)probe_field_inspectorsr   Schemause_definitionsself
serializer r#   y/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/drf_yasg/inspectors/field.py
get_schema0      z$InlineSerializerInspector.get_schemac                 C   s   |S )a  Add/replace parameters from the given list of automatically generated request parameters. This method
        is called only when the serializer is converted into a list of parameters for use in a form data request.

        :param serializer: serializer instance
        :param list[openapi.Parameter] parameters: generated parameters
        :return: modified parameters
        :rtype: list[openapi.Parameter]
        r#   )r!   r"   
parametersr#   r#   r$   add_manual_parameters3   s   	z/InlineSerializerInspector.add_manual_parametersc                    s0   t |di } fdd| D }||S )Nfieldsc              	      s:   g | ]\}}t |d dsj|tjj| dqS )	read_onlyF)namein_)getattrr   r   	Parameterr   get_parameter_name).0keyvaluer,   r!   r#   r$   
<listcomp>@   s    


zDInlineSerializerInspector.get_request_parameters.<locals>.<listcomp>)r-   itemsr(   )r!   r"   r,   r)   r'   r#   r3   r$   get_request_parameters>   s
   
z0InlineSerializerInspector.get_request_parametersc                 C      |S r   r#   r!   
field_namer#   r#   r$   get_property_nameL      z+InlineSerializerInspector.get_property_namec                 C   r7   r   r#   r8   r#   r#   r$   r/   O   r;   z,InlineSerializerInspector.get_parameter_namec                 C   s   t |S r   )r   r    r#   r#   r$   r   R   s   z1InlineSerializerInspector.get_serializer_ref_namec                 C   s   t |dd }t|dS )NMetaref_name)r-   hasattr)r!   r"   serializer_metar#   r#   r$   _has_ref_nameU   s   
z'InlineSerializerInspector._has_ref_namec                    s*  j ||fi |\ t|tjtjfr/|j }t|p#i }dtj	|d|S t|tj
r|tjkrAtd|j |}|f fdd	}|rUsX| S jtj}	|	||}
|
  t|
dd }t|}|r||kr|o|}|std||f t|	|S tS )Ntyper5   z(cannot instantiate nested serializer as c                    s   t  }g }| j D ]3\}}|}dt|jpd i}t|}j| fi |}|||< |jr=t	|dds=|
| q
dtj||pFd d}t|dt|  |S )Nr*   F)use_field_titlerB   
propertiesrequired_NP_serializer)r   r)   r5   r:   boolr*   r   r   rE   r-   appendr   TYPE_OBJECTsetattrr   )r"   rD   rE   property_namechildprop_kwargschild_schemaresultChildSwaggerTypeSwaggerTyper!   use_referencesr#   r$   make_schema_definitionj   s0   

	zQInlineSerializerInspector.field_to_swagger_object.<locals>.make_schema_definitionrF   zSchema for %s would override distinct serializer %s because they implicitly share the same ref_name; explicitly set the ref_name attribute on both serializers' Meta classesr#   )_get_partial_types
isinstancer   ListSerializer	ListFieldr   rL   find_limitsr   
TYPE_ARRAY
Serializerr   r   __name__r   
components
with_scopeSCHEMA_DEFINITIONS
setdefault_remove_read_onlyr-   r   r@   	SchemaRefr   )r!   fieldswagger_object_typerS   kwargsrN   limitsr=   rT   definitionsactual_schemaactual_serializerthis_serializerexplicit_refsr#   rP   r$   field_to_swagger_objectY   s@   

z1InlineSerializerInspector.field_to_swagger_objectN)r\   
__module____qualname____doc__r   r%   r(   r6   r:   r/   r   r@   rl   r#   r#   r#   r$   r   *   s    r   c                   @      e Zd ZdZdS )ReferencingSerializerInspectorTN)r\   rm   rn   r   r#   r#   r#   r$   rq      s    rq   c                 C   s   t | dd}t||}||fS )a  Try to get information about a model and model field from a queryset.

    :param queryset: the queryset
    :param field_name: target field name
    :returns: the model and target field from the queryset as a 2-tuple; both elements can be ``None``
    :rtype: tuple
    modelN)r-   get_model_field)querysetr9   rr   model_fieldr#   r#   r$   get_queryset_field   s   
rv   c                 C   s6   z|dkr
| j jW S | j |W S  ty   Y dS w )zTry to get the given field from a django db model.

    :param model: the model
    :param field_name: target field name
    :return: model field or ``None``
    pkN)_metarw   	get_field	Exception)rr   r9   r#   r#   r$   rs      s   
rs   c                 C   sP   zt | dd}|dur|durt|t | ddu sJ |W S  ty'   Y dS w )zTry to get the queryset of the given view

    :param view: the view instance or class
    :param serializer: if given, will check that the view's get_serializer_class return matches this serializer
    :return: queryset or ``None``
    get_querysetrt   Nr   serializer_class)r   rB   rz   )viewr"   rt   r#   r#   r$   get_queryset_from_view   s   r~   c                 C   s*   | durt | tjr| S | j} | dusdS )zqGet the nearest parent ``Serializer`` instance for the given field.

    :return: ``Serializer`` or ``None``
    N)rV   r   r[   parentrc   r#   r#   r$   get_parent_serializer   s   r   c              	   C   sb   t t# z| jjW W  d    S  ty&   | jjj Y W  d    S w 1 s*w   Y  d S r   )r   rz   relrelated_modelrc   remote_fieldrr   )
descriptorr#   r#   r$   get_model_from_descriptor   s   
r   c                 C   s   t t2 d|v r(|dr(|jddd\}}ttt| ||W  d   S tt| |W  d   S 1 s9w   Y  dS )zTry to find the other side of a model relationship given the name of a related field.

    :param model: one side of the relationship
    :param str source: related field name
    :return: related model or ``None``
    .r
   )maxsplitN)r   rz   indexsplitget_related_modelr   r-   )rr   sourceattrr#   r#   r$   r      s   
$r   c                   @      e Zd ZdZdd ZdS )RelatedFieldInspectorz-Provides conversions for ``RelatedField``\ s.c                 K   s  | j |||fi |\}}t|tjr#| |j||}|tj|ddS t|tjs+t	S t
|dd }t|tjtjfrt
|ddrQ| j|j||fi |}	||	dS t
|dd}
|d urct||
\}}n>t|}t
|d	d }t
|d
d }|st| j|}t
|d
d }t
|ddp|j}|st|jtjr|jj}t||}t||
}t|pdtji}|di |S t|tjr|tjtjdS t	S )NT)rB   r5   unique_itemsrt   pk_field )existing_object
slug_fieldrw   r<   rr   r   rB   )rB   formatr#   )rU   rV   r   ManyRelatedFieldr   child_relationr   rZ   RelatedFieldr   r-   PrimaryKeyRelatedFieldSlugRelatedFieldr   rv   r   r~   r}   r9   r   r   rs   get_basic_type_infoTYPE_STRINGHyperlinkedRelatedField
FORMAT_URI)r!   rc   rd   rS   re   rR   rQ   rN   field_querysetrO   target_fieldrr   ru   parent_serializerr?   
this_modelview_querysetr   attrsr#   r#   r$   rl      sD   


z-RelatedFieldInspector.field_to_swagger_objectNr\   rm   rn   ro   rl   r#   r#   r#   r$   r          r   c                 C   s   d}| j D ]}t|t jr"t|t js|t jkrq|dur  dS |}qztt|dddd}W n tyD   tjdt	|  dd Y dS w |rY|
dsQ|
drY|dd	 d
 }|S )zGiven a ``Field``, look for a ``RegexValidator`` and try to extract its pattern and return it as a string.

    :param serializers.Field regex_field: the field instance
    :return: the extracted pattern, or ``None``
    :rtype: str
    Nregexpatternz%failed to compile regex validator of T)exc_infoz\Zz\z$)r   rV   RegexValidatorURLValidatorvalidate_ipv4_addressr-   rz   loggerwarningstrendswith)regex_fieldregex_validator	validatorr   r#   r#   r$   
find_regex1  s&   
r   minimummaximum
min_length
max_length	min_items	max_itemsc                    s   i } fddt D }t tjrt s|S  jD ]4}t|ds"q|j}t|tr2t r2t	|}|D ]\}}}t||rM||vsI|||| rM|||< q4qt drc j
sc|dddk rcd|d< tt| S )zGiven a ``Field``, look for min/max value/length validators and return appropriate limit validation attributes.

    :param serializers.Field field: the field instance
    :return: the extracted limits
    :rtype: OrderedDict
    c                    s(   g | ]\}}}}t  |r|||fqS r#   )rV   )r0   r   field_classr   improvesr   r#   r$   r4   l  s    
zfind_limits.<locals>.<listcomp>limit_valueallow_blankr   r   r
   )limit_validatorsrV   r   DecimalFieldr   r   r>   r   r   floatr   getr   sortedr5   )rc   rf   applicable_limitsr   r   validator_classr   r   r#   r   r$   rY   d  s,   



rY   c                 C   s   t | rtjS tjS r   )r   r   TYPE_NUMBERr   r   r#   r#   r$   decimal_field_type  s   r   )ipv4ipv6c                 C   s   t | jd S r   )	ip_formatr   protocolr   r#   r#   r$   <lambda>  s    r   z3.14.0c                 C   s   | du rdS t D ]\}}t| |r'|\}}t|r|| }t|r%|| } nqdS d}|tjkr5t| }t| }td|fd|fd|fg}|| t	|}|S )a?  Given a serializer or model ``Field``, return its basic type information - ``type``, ``format``, ``pattern``,
    and any applicable min/max limit values.

    :param field: the field instance
    :return: the extracted attributes as a dictionary, or ``None`` if the field type is not known
    :rtype: OrderedDict
    NrB   r   r   )
basic_type_inforV   callabler   r   r   rY   r   updater   )rc   r   type_formatswagger_typer   r   rf   rO   r#   r#   r$   r     s0   


r   c                   C   s   t jrtjS tjS r   )rest_framework_settingsCOERCE_DECIMAL_TO_STRINGr   r   r   r#   r#   r#   r$   decimal_return_type  r&   r   get_argsc                 C   s   t | ddS )N__args__r#   r-   tpr#   r#   r$   typing_get_args     r   c                 C   s   t | dd S )N
__origin__r   r   r#   r#   r$   typing_get_origin   r   r   c                 C   sL   t | }|r
|d nt}t|pdtji}tdtjfdtjdi |fgS )Nr   rB   r5   r#   )r   r   get_basic_type_info_from_hintr   r   r   rZ   Items)
hint_classargschild_classchild_type_infor#   r#   r$   inspect_collection_hint_class  s   r   c                 C   s   t | tv r%dd t| D }t|dkr#t|d }|r!d|d< |S dS t | p*| }t|s2dS tD ]*\}}t||r^t	|rG||   S |\}}t	|rR| }t
d|fd	|fg  S q4dS )
a[  Given a class (eg from a SerializerMethodField's return type hint,
    return its basic type information - ``type``, ``format``, ``pattern``,
    and any applicable min/max limit values.

    :param hint_class: the class
    :return: the extracted attributes as a dictionary, or ``None`` if the field type is not known
    :rtype: OrderedDict
    c                 S   s   g | ]}|t ur|qS r#   )r   )r0   tr#   r#   r$   r4     s    z1get_basic_type_info_from_hint.<locals>.<listcomp>r
   r   Tz
x-nullableNrB   r   )r   UNION_TYPESr   lenr   inspectisclasshinting_type_info
issubclassr   r   )r   filtered_typesrO   resolved_classcheck_classinfor   r   r#   r#   r$   r     s0   



r   c                   @   r   )SerializerMethodFieldInspectorzProvides conversion for SerializerMethodField, optionally using information from the swagger_serializer_method
    decorator.
    c                 K   s0  t |tjstS t|j|jd }|d u rtS t|dd }|re|j}|d u r+t|dd }|d u r2|j}|j	}|d u r?t|dd }t
|rS||dd}	|jdi |	}n	||_||_	d|_| j|||ddS t|d}
t
|
rzt|
t
jrztS t|
}|d ur| j|||fi |\}}|di |S tS )	N_swagger_serializer	help_textlabelT)r   r   r*   )r*   returnr#   )rV   r   SerializerMethodFieldr   r-   r   method_namer   ro   r   r   r   r   r*   r   typingget_type_hintsr   r   _emptyr   rU   )r!   rc   rd   rS   re   methodr"   descriptionr   serializer_kwargsr   	type_inforR   rQ   r#   r#   r$   rl   E  sJ   

z6SerializerMethodFieldInspector.field_to_swagger_objectNr   r#   r#   r#   r$   r   @      r   c                   @   r   )SimpleFieldInspectorzProvides conversions for fields which can be described using just ``type``, ``format``, ``pattern``
    and min/max validators.
    c                 K   s<   t |}|d u r
tS | j|||fi |\}}|di |S )Nr#   )r   r   rU   )r!   rc   rd   rS   re   r   rR   rQ   r#   r#   r$   rl     s
   z,SimpleFieldInspector.field_to_swagger_objectNr   r#   r#   r#   r$   r    r   r  c                   @   r   )ChoiceFieldInspectorzEProvides conversions for ``ChoiceField`` and ``MultipleChoiceField``.c                 K   sr  | j |||fi |\}}t|tjrtj}g }|j D ]}	t|tjr.t	||	gd }	nt	||	}	|
|	 qt|}
t|
tjrmtt|
dd}t||jpS|jj}t|dd r^|j}|rlt|}|rl|d|}ndd |D }t|dkrttt|}|r|d|}t|tjr|tj|||d	d
}|tjkr|d tjtjfv rd|_|S |||d	}|S tS )Nr   r<   rr   
base_fieldrB   c                 S   s   h | ]}t |qS r#   rB   )r0   vr#   r#   r$   	<setcomp>  s    z?ChoiceFieldInspector.field_to_swagger_object.<locals>.<setcomp>r
   )rB   enumrA   inmulti)rU   rV   r   ChoiceFieldr   r   choiceskeysMultipleChoiceFieldr   rH   r   ModelSerializerr-   rs   r   r   r  r   r   r   r   nextiterrZ   r.   IN_FORMIN_QUERYcollection_formatr   )r!   rc   rd   rS   re   rR   rQ   	enum_typeenum_valueschoicer"   rr   ru   
model_typeenum_value_typesvalues_typerO   r#   r#   r$   rl     sP   

z,ChoiceFieldInspector.field_to_swagger_objectNr   r#   r#   r#   r$   r    r   r  c                   @   r   )FileFieldInspectorz*Provides conversions for ``FileField``\ s.c           
      K   s   | j |||fi |\}}t|tjrHtd}|tjkr0|tjdd}t|dt	j
r.tj|_|S |tjkrF|tjd}	|	d tjkrD||	S |tS )NzFFileField is supported only in a formData Parameter or response SchemaT)rB   r*   use_urlr  r  )rU   rV   r   	FileFieldr   r   r   r   r-   r   UPLOADED_FILES_USE_URLr   r   r.   	TYPE_FILEr  r   )
r!   rc   rd   rS   re   rR   rQ   errrO   paramr#   r#   r$   rl     s   

z*FileFieldInspector.field_to_swagger_objectNr   r#   r#   r#   r$   r    r   r  c                   @   r   )DictFieldInspectorz&Provides conversion for ``DictField``.c                 K   sR   | j |||fi |\}}t|tjr'|tjkr'| |j||}|tj|dS t	S )N)rB   additional_properties)
rU   rV   r   	DictFieldr   r   r   rL   rI   r   )r!   rc   rd   rS   re   rR   rQ   rN   r#   r#   r$   rl     s   z*DictFieldInspector.field_to_swagger_objectNr   r#   r#   r#   r$   r!    r   r!  c                   @   r   )HiddenFieldInspectorzHide ``HiddenField``.c                 K   s   t |tjrd S tS r   )rV   r   HiddenFieldr   )r!   rc   rd   rS   re   r#   r#   r$   rl     s   z,HiddenFieldInspector.field_to_swagger_objectNr   r#   r#   r#   r$   r$    r   r$  c                   @   r   )JSONFieldInspectorz&Provides conversion for ``JSONField``.c                 K   s@   | j |||fi |\}}t|tjr|tjkr|tjdS tS Nr  )rU   rV   r   	JSONFieldr   r   rI   r   r!   rc   rd   rS   re   rR   rQ   r#   r#   r$   rl     s   z*JSONFieldInspector.field_to_swagger_objectNr   r#   r#   r#   r$   r&    r   r&  c                   @   r   )StringDefaultFieldInspectorzRFor otherwise unhandled fields, return them as plain :data:`.TYPE_STRING` objects.c                 K   s&   | j |||fi |\}}|tjdS r'  )rU   r   r   r)  r#   r#   r$   rl     s   z3StringDefaultFieldInspector.field_to_swagger_objectNr   r#   r#   r#   r$   r*    r   r*  )CamelCaseJSONParser)CamelCaseJSONRenderercamelizec                 C   s   | S r   r#   )datar#   r#   r$   r-    r;   r-  c                   @   sD   e Zd ZdZdd Zdd Zdd Zererdd	 Z	dS d
d	 Z	dS )CamelCaseJSONFilterzSConverts property names to camelCase if ``djangorestframework_camel_case`` is used.c                 C   s   t tt|diS )zHack to force ``djangorestframework_camel_case`` to camelize a plain string.

        :param str s: the string
        :return: camelized string
        :rtype: str
        r   )r  r  r-  )r!   sr#   r#   r$   camelize_string  s   z#CamelCaseJSONFilter.camelize_stringc                    sX   t |di r(t fdd|j D |_t |dg r* fdd|jD |_dS dS dS )zRecursively camelize property names for the given schema using ``djangorestframework_camel_case``.
        The target schema object must be modified in-place.

        :param openapi.Schema schema: the :class:`.Schema` object
        rD   c                 3   s6    | ]\}}  | t| jp|fV  qd S r   )r1  camelize_schemar   resolve_refr]   )r0   r1   valr!   r#   r$   	<genexpr>.  s
     
z6CamelCaseJSONFilter.camelize_schema.<locals>.<genexpr>rE   c                    s   g | ]}  |qS r#   )r1  )r0   pr5  r#   r$   r4   4  s    z7CamelCaseJSONFilter.camelize_schema.<locals>.<listcomp>N)r-   r   rD   r5   rE   )r!   schemar#   r5  r$   r2  '  s   
z#CamelCaseJSONFilter.camelize_schemac                 K   s2   t |tjjr|  rt|| j}| | |S r   )rV   r   r   OR_REFis_camel_caser3  r]   r2  )r!   rO   r   objre   r8  r#   r#   r$   process_result6  s   
z"CamelCaseJSONFilter.process_resultc                 C   s,   t dd |  D pt dd |  D S )Nc                 s       | ]}t |tV  qd S r   )r   r+  )r0   parserr#   r#   r$   r6  @      z4CamelCaseJSONFilter.is_camel_case.<locals>.<genexpr>c                 s   r=  r   )r   r,  )r0   rendererr#   r#   r$   r6  A  r?  )anyget_parser_classesget_renderer_classesr5  r#   r#   r$   r:  >  s   z!CamelCaseJSONFilter.is_camel_casec                 C   s   dS )NFr#   r5  r#   r#   r$   r:  D  r;   N)
r\   rm   rn   ro   r1  r2  r<  r+  r,  r:  r#   r#   r#   r$   r/    s    	r/  )RecursiveFieldc                   @   rp   )RecursiveFieldInspectorbProvides conversion for RecursiveField (https://github.com/heywbj/django-rest-framework-recursive)N)r\   rm   rn   ro   r#   r#   r#   r$   rE  K  s    rE  c                   @   r   )rE  rF  c           	      K   s   t |trQ|tjkrQ|du sJ d|j}t |jtjr|j}t|}|d us1J dt	t
| | jtj}tj||dd}t |jtjrOtjtj|d}|S tS )NTzECan not create schema for RecursiveField when use_references is Falsez.Can't create RecursiveField schema for inline )ignore_unresolvedrA   )rV   rD  r   r   proxiedr   rW   rL   r   r   rB   r]   r^   r_   rb   r   rZ   r   )	r!   rc   rd   rS   re   rH  r=   rg   refr#   r#   r$   rl   R  s   z/RecursiveFieldInspector.field_to_swagger_objectNr   r#   r#   r#   r$   rE  O  r   r   )datetimer   loggingoperatoruuid
contextlibr   collectionsr   decimalr   r   django.corer   	django.dbr   	packagingr   rest_frameworkr   rest_framework.settingsr	   r   baser   r   r   r   r   r   errorsr   utilsr   r   r   r   r   	importlibr   drf_versionImportErrorpkg_resourcesget_distributiontypesr   r   Unionr   rB   	getLoggerr\   r   r   rq   rv   rs   r~   r   r   r   r   r   IntegerField
FloatFieldr   numeric_fieldsMinValueValidator__gt__MaxValueValidator__lt__MinLengthValidator	CharFieldMaxLengthValidatorrX   rW   r   rY   r   	AutoFieldTYPE_INTEGERBinaryFieldr   FORMAT_BINARYBooleanFieldTYPE_BOOLEANDateTimeFieldFORMAT_DATETIME	DateFieldFORMAT_DATEFORMAT_DECIMALDurationFieldr   IPAddressFieldFORMAT_IPV4GenericIPAddressFieldFORMAT_IPV6	SlugFieldFORMAT_SLUG	TextField	TimeField	UUIDFieldFORMAT_UUIDmodel_field_to_basic_typer   
EmailFieldFORMAT_EMAILURLFieldr   
RegexField
ModelFieldserializer_field_to_basic_typeparserH   NullBooleanFieldr   r   r   rG   intr   r   dictrI   UUIDdater   r>   r   r   
get_originr   r   SequenceAbstractSetr   r   r  r  r  r!  r$  r&  r*  %djangorestframework_camel_case.parserr+  %djangorestframework_camel_case.renderr,  r-  r/  rest_framework_recursive.fieldsrD  rE  r#   r#   r#   r$   <module>   s   
t
:#%&.@9
	-