o
    gБ                     @   s  d Z dZddl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 ej	dkr4ddl
mZ ddlmZ nddlmZ ddlmZ ddlZddlZddlZdd	lmZmZmZmZ ej	dkr_eZd
d Zdd Z	d8ddZ	d8ddZ	d8ddZ	d8ddZ	d8ddZ	d8ddZ 	d8ddZ!	d8ddZ"	d8ddZ#	d8d d!Z$	d8d"d#Z%	d8d$d%Z&	d8d&d'Z'd9d(d)Z(d*d+ Z)d,d- Z*G d.d/ d/ej+Z+G d0d1 d1ej,Z,G d2d3 d3ej-ej.Z-G d4d5 d5eZG d6d7 d7e/Z0dS ):au  
Command-line and common processing for Docutils front-end tools.

Exports the following classes:

* `OptionParser`: Standard Docutils command-line processing.
* `Option`: Customized version of `optparse.Option`; validation support.
* `Values`: Runtime settings; objects are simple structs
  (``object.attribute``).  Supports cumulative list settings (attributes).
* `ConfigParser`: Standard Docutils config file processing.

Also exports the following functions:

* Option callbacks: `store_multiple`, `read_config_file`.
* Setting validators: `validate_encoding`,
  `validate_encoding_error_handler`,
  `validate_encoding_and_error_handler`,
  `validate_boolean`, `validate_ternary`, `validate_threshold`,
  `validate_colon_separated_list`,
  `validate_comma_separated_list`,
  `validate_dependency_file`.
* `make_paths_absolute`.
* SettingSpec manipulation: `filter_settings_spec`.
reStructuredText    N)SUPPRESS_HELP   r   )RawConfigParser)getcwd)getcwdu)locale_encoding
SafeStringErrorOutputErrorStringc                 O   s<   |D ]	}t |j|d q| D ]\}}t |j|| qdS )z
    Store multiple values in `parser.values`.  (Option callback.)

    Store `None` for each attribute named in `args`, and store the value for
    each key (attribute name) in `kwargs`.
    N)setattrvaluesitems)optionoptvalueparserargskwargs	attributekey r   O/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/docutils/frontend.pystore_multiple8   s
   r   c              
   C   sP   z| |}W n ty } z|| W Y d}~nd}~ww |j|| dS )zQ
    Read a configuration file during option processing.  (Option callback.)
    N)get_config_file_settings
ValueErrorerrorr   update)r   r   r   r   new_settingsr   r   r   r   read_config_fileD   s   r    c                 C   s0   zt | W |S  ty   td| |f w )Nz$setting "%s": unknown encoding: "%s")codecslookupLookupErrorsettingr   option_parserconfig_parserconfig_sectionr   r   r   validate_encodingN   s   r)   c                 C   s,   zt | W |S  ty   td| w )Nzunknown encoding error handler: "%s" (choices: "strict", "ignore", "replace", "backslashreplace", "xmlcharrefreplace", and possibly others; see documentation for the Python ``codecs`` module))r!   lookup_errorr#   r$   r   r   r   validate_encoding_error_handlerW   s   r+   c                 C   sn   d|v r+| d\}}t| d |||| |r!||| d | nt|j| d | n|}t| |||| |S )z
    Side-effect: if an error handler is included in the value, it is inserted
    into the appropriate place as if it was a separate setting/option.
    :_error_handler)splitr+   setr   r   r)   )r%   r   r&   r'   r(   encodinghandlerr   r   r   #validate_encoding_and_error_handlerc   s    
r2   c                 C   s>   t |tr|S z
|j|   W S  ty   td| w )z|Check/normalize boolean settings:
         True:  '1', 'on', 'yes', 'true'
         False: '0', 'off', 'no','false', ''
    zunknown boolean value: "%s")
isinstanceboolbooleansstriplowerKeyErrorr#   r$   r   r   r   validate_booleany   s   
r9   c                 C   sB   t |ts	|du r|S z
|j|   W S  ty    | Y S w )zCheck/normalize three-value settings:
         True:  '1', 'on', 'yes', 'true'
         False: '0', 'off', 'no','false', ''
         any other value: returned as-is.
    N)r3   r4   r5   r6   r7   r8   r$   r   r   r   validate_ternary   s   r:   c                 C   s   t |}|dk rtd|S )Nr   z(negative value; must be positive or zero)intr   r$   r   r   r   validate_nonnegative_int   s   r<   c                 C   sN   zt |W S  ty&   z
|j|  W  Y S  ttfy%   td| w w )Nzunknown threshold: %r.)r;   r   
thresholdsr7   r8   AttributeErrorr#   r$   r   r   r   validate_threshold   s   
r?   c                 C   s4   t |ts|d}|S | }||d |S )Nr,   )r3   listr.   popextend)r%   r   r&   r'   r(   lastr   r   r   $validate_colon_separated_string_list   s   

rD   c                 C   s:   t |ts|g}| }dd |dD }|| |S )zHCheck/normalize list arguments (split at "," and strip whitespace).
    c                 S   s    g | ]}| d r| d qS )z 	
r6   ).0ir   r   r   
<listcomp>   s     z1validate_comma_separated_list.<locals>.<listcomp>,)r3   r@   rA   r.   rB   )r%   r   r&   r'   r(   rC   r   r   r   r   validate_comma_separated_list   s   

rJ   c                 C   s   |sdS | dr|S |d S )Nz.//)endswithr$   r   r   r   validate_url_trailing_slash   s
   
rM   c                 C   s.   zt j|W S  ty   t jd  Y S w N)docutilsutilsDependencyListIOErrorr$   r   r   r   validate_dependency_file   s
   rS   c                 C   sB   t | ||||}|D ]}tj|}||krtd||f q
|S )Nz$Invalid class value %r (perhaps %r?))rJ   rO   nodesmake_idr   )r%   r   r&   r'   r(   cls
normalizedr   r   r   validate_strip_class   s   rX   c           
   
   C   s   t | ||||}g }|D ]T}z
|dd\}}W n ty&   || Y q ty6   td|dd w | }|d}	t|	dkrI|	}nt|dkrYtd|dd |||f q|S )z~Check/normalize a comma separated list of smart quote definitions.

    Return a list of (language-tag, quotes) string tuples.r,      z4Invalid value "%s". Format is "<language>:<quotes>".asciibackslashreplace   z[Invalid value "%s". Please specify 4 quotes
    (primary open/close; secondary open/close).)rJ   r.   r>   appendr   encoder6   len)
r%   r   r&   r'   r(   	lc_quotesitemlangquotesmultichar_quotesr   r   r   validate_smartquotes_locales   s2   



re   c                    s`    du rt   |D ]$}|| v r-| | }t|tr" fdd|D }n|r)t |}|| |< q	dS )z
    Interpret filesystem path settings relative to the `base_path` given.

    Paths are values in `pathdict` whose keys are in `keys`.  Get `keys` from
    `OptionParser.relative_path_settings`.
    Nc                    s   g | ]}t  |qS r   )make_one_path_absolute)rF   path	base_pathr   r   rH     s    z'make_paths_absolute.<locals>.<listcomp>)r   r3   r@   rf   )pathdictkeysri   r   r   r   rh   r   make_paths_absolute   s   


rl   c                 C   s   t jt j| |S rN   )osrg   abspathjoin)ri   rg   r   r   r   rf     s   rf   c                 O   s   t | }tdt|dD ]4}g }|| D ]%}dd |d D d }||v r&q|| v r4|||  q|| qt|||< qt|S )a  Return a copy of `settings_spec` excluding/replacing some settings.

    `settings_spec` is a tuple of configuration settings with a structure
    described for docutils.SettingsSpec.settings_spec.

    Optional positional arguments are names of to-be-excluded settings.
    Keyword arguments are option specification replacements.
    (See the html4strict writer for an example.)
       r   c                 S   s*   g | ]}| d r|dd ddqS )z--rp   N-_)
startswithreplace)rF   
opt_stringr   r   r   rH   $  s    z(filter_settings_spec.<locals>.<listcomp>rY   r   )r@   ranger_   rk   r]   tuple)settings_specexcludert   settingsrG   newoptsopt_specopt_namer   r   r   filter_settings_spec  s    
r~   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Valuesz
    Updates list attributes by extension rather than by replacement.
    Works in conjunction with the `OptionParser.lists` instance attribute.
    c                 O   sB   t jj| g|R i | t| dr| jd u rtj | _d S d S )Nrecord_dependencies)optparser   __init__hasattrr   rO   rP   rQ   selfr   r   r   r   r   r   9  s
   

zValues.__init__c                 C   sh   t |tr|j}| }|j D ]}t| |r,||v r,t| |}|r,||| 7 }||= q| | d S rN   )	r3   r   __dict__copylistsrk   r   getattr_update_loose)r   
other_dictr&   r%   r   r   r   r   r   @  s   

zValues.updatec                 C   s   | j | jdS )z Return a shallow copy of `self`.)defaults)	__class__r   )r   r   r   r   r   L  s   zValues.copyc                 C   s&   t | |ddu rt| || t | |S )zUV.setdefault(n[,d]) -> getattr(V,n,d), also set D.n=d if n not in D or None.
        N)r   r   )r   namedefaultr   r   r   
setdefaultP  s   
zValues.setdefaultN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   2  s    r   c                   @   s$   e Zd Zejjddg Zdd ZdS )Option	validator	overridesc           	   
   C   s   t j| ||||}| j}|rH| jr>t||}z	| |||}W n ty7 } zt d|t|f d}~ww t	||| | j
rHt	|| j
d |S )z
        Call the validator function on applicable settings and
        evaluate the 'overrides' option.
        Extends `optparse.Option.process`.
        zError in option "%s":
    %sN)r   r   processdestr   r   	ExceptionOptionValueErrorr   r   r   )	r   r   r   r   r   resultr%   	new_valuer   r   r   r   r   \  s&   

zOption.processN)r   r   r   r   r   ATTRSr   r   r   r   r   r   X  s    r   c                   @   s  e Zd ZdZg dZ	 d Z	 dddddd	Z	 d
d
d
d
dddddd	Z	 e	e
jddp0ep0dZdZddg ddgi fdddgdedfddgdddfddd gd!d"d#d$fd%d&d'gd!d(d#d$fd)d*gd!dd#d$fd+d,d-gdedfd.d/gd0d1ifd2d3gd4ed5d6fd7d8gd9d!d:d:d;fd<d=gd9d!d>d?fd@dAgd9ddBfdCdDgddedEfdFdGgdHddBfdIdJgddKdedLfdMdNgddKdfdOdPgdedfdQdRgddSdfdTdUgdVdWdXedYfdZd[gdVd\dXedYfd]d^d_gedd`daedbfdcdddegd!dd`d$fdfdgdhgd!dd`d$fdidjgedkddaedlfdmdngd!ddkd$fdodpgedqddaedlfdrdsgdedfdtdugddvdfdwdxgdydzd{fd|d}gddedEfd~dgdddBfdddgdedfddgdedfdddgddedfddgdedfdeef ddgdeedfde dgeedfdddgddddfddgdzeddfddgdzdd4edfdddgddifdddgddifedgddifedgddifedgddifedgddifedgddifedgddifedgdVdedfedgddifR fZ	 dddddZ	 dZdZdejejr=dej p>de
j  d e
j!f Z"	 dddZ#ddĄ Z$ddƄ Z%ddȄ Z&ddʄ Z'dd̄ Z(dd΄ Z)ddЄ Z*dd҄ Z+ddԄ Z,dS )OptionParsera  
    Parser for command-line and library use.  The `settings_spec`
    specification here and in other Docutils components are merged to build
    the set of command-line options and runtime settings for this process.

    Common settings (defined below) and component-specific settings must not
    conflict.  Short options are reserved for common settings, and components
    are restrict to using long options.
    )z/etc/docutils.confz./docutils.confz~/.docutilsz(info 1 warning 2 error 3 severe 4 none 5rY   rp   r   r\      )infowarningr   severenoneTF)	1onyestrue0offnofalse r0   NrZ   r[   zGeneral Docutils Optionsz'Specify the document title as metadata.z--titlez2Include a "Generated by Docutils" credit and link.z--generatorz-g
store_true)actionr   z"Do not include a generator credit.z--no-generatorstore_false	generator)r   r   z2Include the date at the end of the document (UTC).z--datez-dstore_constz%Y-%m-%d	datestamp)r   constr   zInclude the time & date (UTC).z--timez-tz%Y-%m-%d %H:%M UTCz'Do not include a datestamp of any kind.z--no-datestampz&Include a "View document source" link.z--source-linkz-sz3Use <URL> for a source link; implies --source-link.z--source-urlmetavarz<URL>z-Do not include a "View document source" link.z--no-source-linkcallback)source_link
source_url)r   r   callback_argsz4Link from section headers to TOC entries.  (default)z--toc-entry-backlinkstoc_backlinksentry)r   r   r   r   z0Link from section headers to the top of the TOC.z--toc-top-backlinkstop)r   r   r   z+Disable backlinks to the table of contents.z--no-toc-backlinks)r   r   z6Link from footnotes/citations to references. (default)z--footnote-backlinks)r   r   r   z/Disable backlinks from footnotes and citations.z--no-footnote-backlinksfootnote_backlinksz0Enable section numbering by Docutils.  (default)z--section-numberingsectnum_xform)r   r   r   r   z&Disable section numbering by Docutils.z--no-section-numberingz/Remove comment elements from the document tree.z--strip-commentsz6Leave comment elements in the document tree. (default)z--leave-commentsstrip_commentszRemove all elements with classes="<class>" from the document tree. Warning: potentially dangerous; use with caution. (Multiple-use option.)z--strip-elements-with-classr]   strip_elements_with_classesz<class>)r   r   r   r   zRemove all classes="<class>" attributes from elements in the document tree. Warning: potentially dangerous; use with caution. (Multiple-use option.)z--strip-classstrip_classeszReport system messages at or higher than <level>: "info" or "1", "warning"/"2" (default), "error"/"3", "severe"/"4", "none"/"5"z--reportz-rreport_levelz<level>)choicesr   r   r   r   z4Report all system messages.  (Same as "--report=1".)z	--verbosez-vz3Report no system messages.  (Same as "--report=5".)z--quietz-qzdHalt execution at system messages at or above <level>.  Levels as in --report.  Default: 4 (severe).z--halt
halt_level)r   r   r   r   r   z6Halt at the slightest problem.  Same as "--halt=info".z--strictzjEnable a non-zero exit status for non-halting system messages at or above <level>.  Default: 5 (disabled).z--exit-statusexit_status_levelz3Enable debug-level system messages and diagnostics.z--debugz Disable debug output.  (default)z
--no-debugdebugz-Send the output of system messages to <file>.z
--warningswarning_streamz<file>)r   r   z1Enable Python tracebacks when Docutils is halted.z--tracebackz%Disable Python tracebacks.  (default)z--no-traceback	tracebackziSpecify the encoding and optionally the error handler of input text.  Default: <locale-dependent>:strict.z--input-encodingz-iz<name[:handler]>)r   r   zlSpecify the error handler for undecodable characters.  Choices: "strict" (default), "ignore", and "replace".z--input-encoding-error-handlerstrict)r   r   z^Specify the text encoding and optionally the error handler for output.  Default: UTF-8:strict.z--output-encodingz-outf-8)r   r   r   zSpecify error handler for unencodable output characters; "strict" (default), "ignore", "replace", "xmlcharrefreplace", "backslashreplace".z--output-encoding-error-handlerzJSpecify text encoding and error handler for error output.  Default: %s:%s.z--error-encodingz-ezSSpecify the error handler for unencodable characters in error output.  Default: %s.z--error-encoding-error-handlerz<Specify the language (as BCP 47 language tag).  Default: en.z
--languagez-llanguage_codeenz<name>)r   r   r   z)Write output file dependencies to <file>.z--record-dependencies)r   r   r   z6Read configuration settings from <file>, if it exists.z--configstring)r   typer   r   z,Show this program's version number and exit.z	--versionz-Vr   versionz Show this help message and exit.z--helpz-hhelpz--id-prefixr   r   z--auto-id-prefix%z--dump-settingsz--dump-internalsz--dump-transformsz--dump-pseudo-xmlz--expose-internal-attributeexpose_internals)r   r   r   z--strict-visitor)_disable_config_source_destination_config_files)r   generalz(%%prog (Docutils %s%s, Python %s, on %s)z [%s]r   r   c              
   O   s   i | _ 	 g | _	 tjj| g|R tdtjddd| | js$| j| _t	| j
| _
| ft| | _| | j | |p=i  |rn| jd spz|  }W n tye } z| t| W Y d}~nd}~ww | |j dS dS dS )z
        `components` is a list of Docutils components each containing a
        ``.settings_spec`` attribute.  `defaults` is a mapping of setting
        default overrides.
        NN   )width)option_classadd_help_option	formatterr   )r   config_filesr   r   r   r   TitledHelpFormatterr   version_templater@   relative_path_settingsrw   
componentspopulate_from_componentsset_defaults_from_dictr   get_standard_config_settingsr   r   r
   r   )r   r   r   read_config_filesr   r   config_settingsr   r   r   r   r   O  s:   
zOptionParser.__init__c                 C   s   |D ]a}|du r	q|j }| j|j tdt|dD ]G}|||d  \}}}|r7t| ||}| | n| }|D ]\}	}
}|j|
d|	i|}|	ddkrWd| j
|j< q;|jrb| j|j qq|D ]}|rt|jrt| j|j qfdS )aE  
        For each component, first populate from the `SettingsSpec.settings_spec`
        structure, then from the `SettingsSpec.settings_defaults` dictionary.
        After all components have been processed, check for and populate from
        each component's `SettingsSpec.settings_default_overrides` dictionary.
        Nr   r   r   r   r]   T)rx   r   rB   rv   r_   r   OptionGroupadd_option_group
add_optiongetr   r   settings_defaultsr   r   settings_default_overrides)r   r   	componentrx   rG   titledescriptionoption_specgroup	help_textoption_stringsr   r   r   r   r   r   o  s:   
z%OptionParser.populate_from_componentsc                    s|   zt jd t j}W n ty   | j}Y nw t jj dt jvr5zddl}W n t	y4   dd  Y nw  fdd|D S )	z:Return list of config files, from environment or standard.DOCUTILSCONFIGHOMEr   Nc                 S   s   | S rN   r   )xr   r   r   <lambda>  s    z8OptionParser.get_standard_config_files.<locals>.<lambda>c                    s   g | ]
}|  r |qS r   rE   )rF   fexpandr   r   rH     s    z:OptionParser.get_standard_config_files.<locals>.<listcomp>)
rm   environr.   pathsepr8   standard_config_filesrg   
expanduserpwdImportError)r   r   r   r   r   r   get_standard_config_files  s   

z&OptionParser.get_standard_config_filesc                 C   s*   t  }|  D ]}|| ||  q|S rN   )r   r  r   r   )r   rz   filenamer   r   r   r     s   z)OptionParser.get_standard_config_settingsc                 C   s   t  }|||  | j|j tj|}t }t	 }| j
D ]&}|s$qt|jp)d|jf D ]}||v r6q/|| ||||  q/qt|j| j| |jS )zAReturns a dictionary containing appropriate config file settings.r   )ConfigParserreadr   rB   _filesrm   rg   dirnamer/   r   r   rw   config_section_dependenciesr(   addr   get_sectionrl   r   r   )r   config_filer   ri   appliedrz   r   sectionr   r   r   r     s*   


z%OptionParser.get_config_file_settingsc                 C   s,   |  |\|_|_t|j| j | j|_|S )z/Store positional arguments as runtime settings.)
check_argsr   r   rl   r   r   r   r   )r   r   r   r   r   r   check_values  s   zOptionParser.check_valuesc                 C   sh   d  }}|r| d}|dkrd }|r| d}|dkrd }|r%| d |r0||kr0| d ||fS )Nr   rq   zMaximum 2 arguments allowed.z_Do not specify the same file for both source and destination.  It will clobber the source file.)rA   r   )r   r   sourcedestinationr   r   r   r    s   



zOptionParser.check_argsc                 C   s   | j | d S rN   )r   r   r   r   r   r   r   r     s   z#OptionParser.set_defaults_from_dictc                 C   s   t | j}| j|_|S )z(Needed to get custom `Values` instances.)r   r   r   r   r  r   r   r   get_default_values  s   
zOptionParser.get_default_valuesc                 C   s@   | j | g D ]}|jD ]}|j|kr|    S qqtd| )a  
        Get an option by its dest.

        If you're supplying a dest which is shared by several options,
        it is undefined which option of those is returned.

        A KeyError is raised if there is no option with the supplied
        dest.
        zNo option with dest == %r.)option_groupsoption_listr   r8   )r   r   r   r   r   r   r   get_option_by_dest  s   


zOptionParser.get_option_by_dest)r   NN)-r   r   r   r   r   r.   threshold_choicesr=   r5   r   sysstderrr	   default_error_encoding$default_error_encoding_error_handlerr9   r   rX   r?   r2   r+   rS   r    r   rD   rx   r   r   r(   rO   __version____version_details__r   platformr   r   r   r  r   r   r  r  r   r  r  r   r   r   r   r   s  s   





!$(+/258>D
I
L
OTW]_acfhmqv{   
                        !  &
 r   c                   @   sR   e Zd Zddd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S )r  )pep_html writer
stylesheet)r  stylesheet_path)r  template)pep_stylesheetpep_stylesheet_pathpep_templatea  
The "[option]" section is deprecated.  Support for old-format configuration
files may be removed in a future Docutils release.  Please revise your
configuration files.  See <http://docutils.sf.net/docs/user/config.html>,
section "Old-Format Configuration Files".
zhUnable to read configuration file "%s": content not encoded as UTF-8.
Skipping "%s" configuration file.
c                 O   s,   t j| g|R i | g | _	 t | _d S rN   )r   r   r  r   _stderrr   r   r   r   r     s
   zConfigParser.__init__c              	   C   s   t |ttfv r|g}|D ]^}z	t|dd}W n	 ty!   Y qw ztjdk r0t	| || nt
| || W n tyP   | j| j||f  |  Y qw |  | j| | dre| | | || qd S )Nrr   r   options)r   strunicoder!   openrR   r  version_infor   readfp	read_fileUnicodeDecodeErrorr%  writenot_utf8_errorcloser  r]   has_sectionhandle_old_configvalidate_settings)r   	filenamesr&   r  fpr   r   r   r    s0   


zConfigParser.readc                 C   s   t | jt|d | d}| ds| d | D ],\}}|| jv r7| j| \}}| |s6| | nd}|}| 	||sH| 
||| q| d d S )Nr   r'  r   )warningswarn_explicitold_warningConfigDeprecationWarningr	  r2  add_sectionr   old_settings
has_optionr/   remove_section)r   r  r'  r   r   r  r%   r   r   r   r3  %  s$   






zConfigParser.handle_old_configc           	      C   s   |   D ]\}| |D ]T}z||}W n	 ty   Y qw |jrT| ||}z|j|||| |d}W n tyL } ztd||t|||f d}~ww | 	||| |j
r_| 	||j
d qqdS )zi
        Call the validator function and implement overrides on all applicable
        settings.
        )r'   r(   zAError in config file "%s", section "[%s]":
    %s
        %s = %sN)sectionsr'  r  r8   r   r   r   r   r   r/   r   )	r   r  r&   r  r%   r   r   r   r   r   r   r   r4  7  s<   

zConfigParser.validate_settingsc                 C   s   |  ddS )zW
        Transform '-' to '_' so the cmdline form of option names can be used.
        rq   rr   )r7   rt   )r   	optionstrr   r   r   optionxformS  s   zConfigParser.optionxformc                 C   s2   i }|  |r| |D ]
}| ||||< q|S )zf
        Return a given section as a dictionary (empty if the section
        doesn't exist).
        )r2  r'  r   )r   r  section_dictr   r   r   r   r	  Y  s
   
zConfigParser.get_sectionN)r   r   r   r<  r9  r0  r   r  r3  r4  rA  r	  r   r   r   r   r    s    	r  c                   @   s   e Zd ZdZdS )r:  z3Warning for deprecated configuration file features.N)r   r   r   r   r   r   r   r   r:  e  s    r:  )NNrN   )1r   __docformat__rm   os.pathr  r7  r!   r   r   r+  configparserr   r   r  r   rO   docutils.utilsdocutils.nodesdocutils.utils.error_reportingr	   r
   r   r   r(  r)  r   r    r)   r+   r2   r9   r:   r<   r?   rD   rJ   rM   rS   rX   re   rl   rf   r~   r   r   r   SettingsSpecDeprecationWarningr:  r   r   r   r   <module>   st   


















#&  ~v