Ë
    P/æj<  ã            	       ó  — d dl Z d dlmZ d dlmZmZmZmZmZ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mZ d dlmZmZ d	d
lmZ d	dlmZ g ZdZ G d„ dej8                  «      Z G d„ dej8                  «      Z G d„ de
j>                  j@                  ejB                  «      Z" G d„ de
j>                  j@                  ejB                  «      Z# G d„ d«      Z$ G d„ d«      Z%e G d„ d«      «       Z&e G d„ d«      «       Z' G d„ d«      Z(e G d„ d e'e&e$e«      «       Z)e G d!„ d"e'e&e%e«      «       Z*e G d#„ d$e(e&e$e«      «       Z+e G d%„ d&e(e&e%e«      «       Z, e+d' ejZ                  d(¬)«      ¬*«      Z.d+e._/         e,d, ejZ                  d-¬)«      ¬*«      Z0d.e0_/         e)d/ ejZ                  d(¬)«      d0 ejb                  «       ¬1«      Z2d2e2_/         e*d3 ejZ                  d-¬)«      d0 ejb                  «       ¬1«      Z3d4e3_/        y)5é    N)Ú	dataclass)ÚAnyÚDictÚListÚOptionalÚTupleÚUnion)ÚTensor)Úload_state_dict_from_url)Úmu_law_decoding)Ú	Tacotron2ÚWaveRNN)Ú
GriffinLimÚInverseMelScaleé   )Úutils)ÚTacotron2TTSBundlez.https://download.pytorch.org/torchaudio/modelsc                   óX   ‡ — e Zd Zˆ fd„Zed„ «       Zdeeee   f   de	e
e
f   fd„Zˆ xZS )Ú_EnglishCharProcessorc                 ó¼   •— t         ‰| �  «        t        j                  «       | _        t        | j                  «      D ��ci c]  \  }}||“Œ
 c}}| _        y c c}}w ©N)ÚsuperÚ__init__r   Ú
_get_charsÚ_tokensÚ	enumerateÚ_mapping)ÚselfÚiÚsÚ	__class__s      €úa/root/repos/pocs/video-evals/.venv/lib/python3.12/site-packages/torchaudio/pipelines/_tts/impl.pyr   z_EnglishCharProcessor.__init__   sD   ø€ Ü‰ÑÔÜ×'Ñ'Ó)ˆŒÜ*3°D·L±LÓ*A×B¡$ ! Q˜˜A™ÓBˆ�ùÓBs   ÁAc                 ó   — | j                   S r   ©r   ©r   s    r"   Útokensz_EnglishCharProcessor.tokens   ó   € à�|‰|Ðó    ÚtextsÚreturnc           	      óú   — t        |t        «      r|g}|D ��cg c]<  }|j                  «       D �cg c]   }|| j                  v sŒ| j                  |   ‘Œ" c}‘Œ> }}}t	        j
                  |«      S c c}w c c}}w r   )Ú
isinstanceÚstrÚlowerr   r   Ú
_to_tensor)r   r)   ÚtÚcÚindicess        r"   Ú__call__z_EnglishCharProcessor.__call__#   sf   € Ü�eœSÔ!Ø�GˆEØX]×^ÐST¨a¯g©g«iÖN¨¸1ÀÇÁÒ;M�D—M‘M !Ó$ÔNÐ^ˆÑ^Ü×Ñ Ó(Ð(ùò OùÓ^s   ™A7°A2ÁA2ÁA7Á2A7©Ú__name__Ú
__module__Ú__qualname__r   Úpropertyr&   r	   r-   r   r   r
   r3   Ú__classcell__©r!   s   @r"   r   r      sF   ø„ ôCð
 ñó ðð)˜e C¨¨c© NÑ3ð )¸¸fÀf¸nÑ8M÷ )r(   r   c                   ó^   ‡ — e Zd Zddœˆ fd„
Zed„ «       Zdeeee   f   de	e
e
f   fd„Zˆ xZS )Ú_EnglishPhoneProcessorN©Ú	dl_kwargsc                ó  •— t         ‰| �  «        t        j                  «       | _        t        | j                  «      D ��ci c]  \  }}||“Œ
 c}}| _        t        j                  d|¬«      | _        d| _	        y c c}}w )Nzen_us_cmudict_forward.ptr=   z(\[[A-Z]+?\]|[_!'(),.:;? -]))
r   r   r   Ú_get_phonesr   r   r   Ú_load_phonemizerÚ_phonemizerÚ_pattern)r   r>   r   Úpr!   s       €r"   r   z_EnglishPhoneProcessor.__init__+   se   ø€ Ü‰ÑÔÜ×(Ñ(Ó*ˆŒÜ*3°D·L±LÓ*A×B¡$ ! Q˜˜A™ÓBˆŒÜ ×1Ñ1Ð2LÐXaÔbˆÔØ7ˆ�ùó Cs   ÁA;c                 ó   — | j                   S r   r$   r%   s    r"   r&   z_EnglishPhoneProcessor.tokens2   r'   r(   r)   r*   c           	      óv  — t        |t        «      r|g}g }| j                  |d¬«      D ]p  }t        j                  | j
                  |«      D �cg c]  }t        j                  dd|«      ‘Œ }}|j                  |D �cg c]  }| j                  |   ‘Œ c}«       Œr t        j                  |«      S c c}w c c}w )NÚen_us)Úlangz[\[\]]Ú )r,   r-   rB   ÚreÚfindallrC   ÚsubÚappendr   r   r/   )r   r)   r2   ÚphonesÚrÚretrD   s          r"   r3   z_EnglishPhoneProcessor.__call__6   s¢   € Ü�eœSÔ!Ø�GˆEàˆØ×&Ñ& u°7Ð&Ó;ò 	<ˆFä57·Z±ZÀÇÁÈvÓ5VÖW°”2—6‘6˜) R¨Õ+ÐWˆCÐWØ�N‰N°cÖ:°˜DŸM™M¨!Ó,Ò:Õ;ð	<ô ×Ñ Ó(Ð(ùò XùÚ:s   ÁB1Á=B6
r4   r:   s   @r"   r<   r<   *   sH   ø„ Ø$(ö 8ð ñó ðð	)˜e C¨¨c© NÑ3ð 	)¸¸fÀf¸nÑ8M÷ 	)r(   r<   c                   óH   ‡ — e Zd Zddedee   fˆ fd„Zed„ «       Zdd„Z	ˆ xZ
S )Ú_WaveRNNVocoderÚmodelÚmin_level_dbc                 óL   •— t         ‰| �  «        d| _        || _        || _        y )Né"V  )r   r   Ú_sample_rateÚ_modelÚ_min_level_db)r   rS   rT   r!   s      €r"   r   z_WaveRNNVocoder.__init__H   s%   ø€ Ü‰ÑÔØ!ˆÔØˆŒØ)ˆÕr(   c                 ó   — | j                   S r   ©rW   r%   s    r"   Úsample_ratez_WaveRNNVocoder.sample_rateN   ó   € à× Ñ Ð r(   c                 ó  — t        j                  |«      }dt        j                  t        j                  |d¬«      «      z  }| j                  �4| j                  |z
  | j                  z  }t        j                  |dd¬«      }| j
                  j                  ||«      \  }}t        j                  || j
                  j                  «      }t        || j
                  j                  «      }|j                  d«      }||fS )Né   gñhãˆµøä>)Úminr   r   )r`   Úmax)ÚtorchÚexpÚlog10ÚclamprY   rX   Úinferr   Ú_unnormalize_waveformÚn_bitsr   Ú	n_classesÚsqueeze)r   Úmel_specÚlengthsÚwaveforms       r"   Úforwardz_WaveRNNVocoder.forwardR   sÏ   € Ü—9‘9˜XÓ&ˆØœŸ™¤E§K¡K°¸dÔ$CÓDÑDˆØ×ÑÐ)Ø×*Ñ*¨XÑ5¸×9KÑ9KÑKˆHÜ—{‘{ 8°¸Ô:ˆHØ ŸK™K×-Ñ-¨h¸Ó@Ñˆ�'Ü×.Ñ.¨x¸¿¹×9KÑ9KÓLˆÜ" 8¨T¯[©[×-BÑ-BÓCˆØ×#Ñ# AÓ&ˆØ˜Ð Ð r(   )iœÿÿÿr   )r5   r6   r7   r   r   Úfloatr   r8   r\   rn   r9   r:   s   @r"   rR   rR   G   s3   ø„ ñ*˜gð *°X¸e±_õ *ð ñ!ó ð!÷
!r(   rR   c                   ó6   ‡ — e Zd Zˆ fd„Zed„ «       Zdd„Zˆ xZS )Ú_GriffinLimVocoderc           	      óš   •— t         ‰| �  «        d| _        t        dd| j                  dddd¬«      | _        t        dd	d
d¬«      | _        y )NrV   i  éP   g        g     @¿@Úslaney)Ún_stftÚn_melsr\   Úf_minÚf_maxÚ	mel_scaleÚnormi   r   é   )Ún_fftÚpowerÚ
hop_lengthÚ
win_length)r   r   rW   r   r\   Ú_inv_melr   Ú_griffin_lim)r   r!   s    €r"   r   z_GriffinLimVocoder.__init__`   sX   ø€ Ü‰ÑÔØ!ˆÔÜ'Ø!ØØ×(Ñ(ØØØØô
ˆŒô 'ØØØØô	
ˆÕr(   c                 ó   — | j                   S r   r[   r%   s    r"   r\   z_GriffinLimVocoder.sample_rates   r]   r(   c                 ó  — t        j                  |«      }|j                  «       j                  «       j	                  d«      }| j                  |«      }|j                  «       j	                  d«      }| j                  |«      }||fS )NTF)rb   rc   ÚcloneÚdetachÚrequires_grad_r€   r�   )r   rk   rl   ÚspecÚ	waveformss        r"   rn   z_GriffinLimVocoder.forwardw   so   € Ü—9‘9˜XÓ&ˆØ—>‘>Ó#×*Ñ*Ó,×;Ñ;¸DÓAˆØ�}‰}˜XÓ&ˆØ�{‰{‹}×+Ñ+¨EÓ2ˆØ×%Ñ% dÓ+ˆ	Ø˜'Ð!Ð!r(   r   )r5   r6   r7   r   r8   r\   rn   r9   r:   s   @r"   rq   rq   _   s!   ø„ ô
ð& ñ!ó ð!÷"r(   rq   c                   ó,   — e Zd Zdej                  fd„Zy)Ú
_CharMixinr*   c                 ó   — t        «       S r   )r   r%   s    r"   Úget_text_processorz_CharMixin.get_text_processor†   s   € Ü$Ó&Ð&r(   N©r5   r6   r7   r   ÚTextProcessorrŒ   © r(   r"   rŠ   rŠ   …   s   „ ð'Ð$6×$DÑ$Dô 'r(   rŠ   c                   ó2   — e Zd Zddœdej                  fd„Zy)Ú_PhoneMixinNr=   r*   c                ó   — t        |¬«      S ©Nr=   )r<   )r   r>   s     r"   rŒ   z_PhoneMixin.get_text_processor‹   s   € Ü%°	Ô:Ð:r(   r�   r�   r(   r"   r‘   r‘   Š   s   „ Ø.2ò ;Ð7I×7WÑ7Wô ;r(   r‘   c                   ó>   — e Zd ZU eed<   eeef   ed<   ddœdefd„Zy)Ú_Tacotron2MixinÚ_tacotron2_pathÚ_tacotron2_paramsNr=   r*   c                óÀ   — t        di | j                  ¤Ž}t        › d| j                  › �}|€i n|}t	        |fi |¤Ž}|j                  |«       |j                  «        |S ©Nú/r�   )r   r—   Ú	_BASE_URLr–   r   Úload_state_dictÚeval©r   r>   rS   ÚurlÚ
state_dicts        r"   Úget_tacotron2z_Tacotron2Mixin.get_tacotron2”   sc   € ÜÑ3˜D×2Ñ2Ñ3ˆÜ�˜1˜T×1Ñ1Ð2Ð3ˆØ#Ð+‘B°ˆ	Ü-¨cÑ?°YÑ?ˆ
Ø×Ñ˜jÔ)Ø�
‰
ŒØˆr(   )	r5   r6   r7   r-   Ú__annotations__r   r   r   r¡   r�   r(   r"   r•   r•   �   s%   … àÓØ˜C ˜H‘~Ó%à)-ò °)ô r(   r•   c                   óP   — e Zd ZU ee   ed<   eeeef      ed<   ddœd„Zddœd„Z	y)Ú_WaveRNNMixinÚ_wavernn_pathÚ_wavernn_paramsNr=   c                ó<   — | j                  |¬«      }t        |«      S r“   )Ú_get_wavernnrR   )r   r>   Úwavernns      r"   Úget_vocoderz_WaveRNNMixin.get_vocoder£   s    € Ø×#Ñ#¨iÐ#Ó8ˆÜ˜wÓ'Ð'r(   c                óÀ   — t        di | j                  ¤Ž}t        › d| j                  › �}|€i n|}t	        |fi |¤Ž}|j                  |«       |j                  «        |S r™   )r   r¦   r›   r¥   r   rœ   r�   rž   s        r"   r¨   z_WaveRNNMixin._get_wavernn§   sc   € ÜÑ/˜$×.Ñ.Ñ/ˆÜ�˜1˜T×/Ñ/Ð0Ð1ˆØ#Ð+‘B°ˆ	Ü-¨cÑ?°YÑ?ˆ
Ø×Ñ˜jÔ)Ø�
‰
ŒØˆr(   )
r5   r6   r7   r   r-   r¢   r   r   rª   r¨   r�   r(   r"   r¤   r¤   ž   s1   … à˜C‘=Ó Ø˜d 3¨ 8™nÑ-Ó-à'+ô (ð )-õ r(   r¤   c                   ó   — e Zd Zd„ Zy)Ú_GriffinLimMixinc                 ó   — t        «       S r   )rq   )r   Ú_s     r"   rª   z_GriffinLimMixin.get_vocoder²   s   € Ü!Ó#Ð#r(   N)r5   r6   r7   rª   r�   r(   r"   r­   r­   ±   s   „ ó$r(   r­   c                   ó   — e Zd Zy)Ú_Tacotron2WaveRNNCharBundleN©r5   r6   r7   r�   r(   r"   r±   r±   »   ó   „ àr(   r±   c                   ó   — e Zd Zy)Ú_Tacotron2WaveRNNPhoneBundleNr²   r�   r(   r"   rµ   rµ   À   r³   r(   rµ   c                   ó   — e Zd Zy)Ú_Tacotron2GriffinLimCharBundleNr²   r�   r(   r"   r·   r·   Å   r³   r(   r·   c                   ó   — e Zd Zy)Ú_Tacotron2GriffinLimPhoneBundleNr²   r�   r(   r"   r¹   r¹   Ê   r³   r(   r¹   z5tacotron2_english_characters_1500_epochs_ljspeech.pthé&   )Ú	n_symbols)r–   r—   aþ  Character-based TTS pipeline with :py:class:`~torchaudio.models.Tacotron2` trained on *LJSpeech* :cite:`ljspeech17` for 1,500 epochs, and
:py:class:`~torchaudio.transforms.GriffinLim` as vocoder.

The text processor encodes the input texts character-by-character.

You can find the training script `here <https://github.com/pytorch/audio/tree/main/examples/pipeline_tacotron2>`__.
The default parameters were used.

Please refer to :func:`torchaudio.pipelines.Tacotron2TTSBundle` for the usage.

Example - "Hello world! T T S stands for Text to Speech!"

   .. image:: https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_GRIFFINLIM_CHAR_LJSPEECH.png
      :alt: Spectrogram generated by Tacotron2

   .. raw:: html

      <audio controls="controls">
         <source src="https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_GRIFFINLIM_CHAR_LJSPEECH.wav" type="audio/wav">
         Your browser does not support the <code>audio</code> element.
      </audio>

Example - "The examination and testimony of the experts enabled the Commission to conclude that five shots may have been fired,"

   .. image:: https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_GRIFFINLIM_CHAR_LJSPEECH_v2.png
      :alt: Spectrogram generated by Tacotron2

   .. raw:: html

      <audio controls="controls">
         <source src="https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_GRIFFINLIM_CHAR_LJSPEECH_v2.wav" type="audio/wav">
         Your browser does not support the <code>audio</code> element.
      </audio>
z3tacotron2_english_phonemes_1500_epochs_ljspeech.pthé`   aè  Phoneme-based TTS pipeline with :py:class:`~torchaudio.models.Tacotron2` trained on *LJSpeech* :cite:`ljspeech17` for 1,500 epochs and
:py:class:`~torchaudio.transforms.GriffinLim` as vocoder.

The text processor encodes the input texts based on phoneme.
It uses `DeepPhonemizer <https://github.com/as-ideas/DeepPhonemizer>`__ to convert
graphemes to phonemes.
The model (*en_us_cmudict_forward*) was trained on
`CMUDict <http://www.speech.cs.cmu.edu/cgi-bin/cmudict>`__.

You can find the training script `here <https://github.com/pytorch/audio/tree/main/examples/pipeline_tacotron2>`__.
The text processor is set to the *"english_phonemes"*.

Please refer to :func:`torchaudio.pipelines.Tacotron2TTSBundle` for the usage.

Example - "Hello world! T T S stands for Text to Speech!"

   .. image:: https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_GRIFFINLIM_PHONE_LJSPEECH.png
      :alt: Spectrogram generated by Tacotron2

   .. raw:: html

      <audio controls="controls">
         <source src="https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_GRIFFINLIM_PHONE_LJSPEECH.wav" type="audio/wav">
         Your browser does not support the <code>audio</code> element.
      </audio>

Example - "The examination and testimony of the experts enabled the Commission to conclude that five shots may have been fired,"

   .. image:: https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_GRIFFINLIM_PHONE_LJSPEECH_v2.png
      :alt: Spectrogram generated by Tacotron2

   .. raw:: html

      <audio controls="controls">
         <source src="https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_GRIFFINLIM_PHONE_LJSPEECH_v2.wav" type="audio/wav">
         Your browser does not support the <code>audio</code> element.
      </audio>

z=tacotron2_english_characters_1500_epochs_wavernn_ljspeech.pthz%wavernn_10k_epochs_8bits_ljspeech.pth)r–   r—   r¥   r¦   a  Character-based TTS pipeline with :py:class:`~torchaudio.models.Tacotron2` trained on *LJSpeech* :cite:`ljspeech17` for 1,500 epochs and :py:class:`~torchaudio.models.WaveRNN` vocoder trained on 8 bits depth waveform of *LJSpeech* :cite:`ljspeech17` for 10,000 epochs.

The text processor encodes the input texts character-by-character.

You can find the training script `here <https://github.com/pytorch/audio/tree/main/examples/pipeline_tacotron2>`__.
The following parameters were used; ``win_length=1100``, ``hop_length=275``, ``n_fft=2048``,
``mel_fmin=40``, and ``mel_fmax=11025``.

You can find the training script `here <https://github.com/pytorch/audio/tree/main/examples/pipeline_wavernn>`__.

Please refer to :func:`torchaudio.pipelines.Tacotron2TTSBundle` for the usage.

Example - "Hello world! T T S stands for Text to Speech!"

   .. image:: https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_WAVERNN_CHAR_LJSPEECH.png
      :alt: Spectrogram generated by Tacotron2

   .. raw:: html

      <audio controls="controls">
         <source src="https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_WAVERNN_CHAR_LJSPEECH.wav" type="audio/wav">
         Your browser does not support the <code>audio</code> element.
      </audio>

Example - "The examination and testimony of the experts enabled the Commission to conclude that five shots may have been fired,"

   .. image:: https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_WAVERNN_CHAR_LJSPEECH_v2.png
      :alt: Spectrogram generated by Tacotron2

   .. raw:: html

      <audio controls="controls">
         <source src="https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_WAVERNN_CHAR_LJSPEECH_v2.wav" type="audio/wav">
         Your browser does not support the <code>audio</code> element.
      </audio>
z;tacotron2_english_phonemes_1500_epochs_wavernn_ljspeech.ptha  Phoneme-based TTS pipeline with :py:class:`~torchaudio.models.Tacotron2` trained on *LJSpeech* :cite:`ljspeech17` for 1,500 epochs, and
:py:class:`~torchaudio.models.WaveRNN` vocoder trained on 8 bits depth waveform of *LJSpeech* :cite:`ljspeech17` for 10,000 epochs.

The text processor encodes the input texts based on phoneme.
It uses `DeepPhonemizer <https://github.com/as-ideas/DeepPhonemizer>`__ to convert
graphemes to phonemes.
The model (*en_us_cmudict_forward*) was trained on
`CMUDict <http://www.speech.cs.cmu.edu/cgi-bin/cmudict>`__.

You can find the training script for Tacotron2 `here <https://github.com/pytorch/audio/tree/main/examples/pipeline_tacotron2>`__.
The following parameters were used; ``win_length=1100``, ``hop_length=275``, ``n_fft=2048``,
``mel_fmin=40``, and ``mel_fmax=11025``.

You can find the training script for WaveRNN `here <https://github.com/pytorch/audio/tree/main/examples/pipeline_wavernn>`__.

Please refer to :func:`torchaudio.pipelines.Tacotron2TTSBundle` for the usage.

Example - "Hello world! T T S stands for Text to Speech!"

   .. image:: https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_WAVERNN_PHONE_LJSPEECH.png
      :alt: Spectrogram generated by Tacotron2

   .. raw:: html

      <audio controls="controls">
         <source src="https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_WAVERNN_PHONE_LJSPEECH.wav" type="audio/wav">
         Your browser does not support the <code>audio</code> element.
      </audio>


Example - "The examination and testimony of the experts enabled the Commission to conclude that five shots may have been fired,"

   .. image:: https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_WAVERNN_PHONE_LJSPEECH_v2.png
      :alt: Spectrogram generated by Tacotron2

   .. raw:: html

      <audio controls="controls">
         <source src="https://download.pytorch.org/torchaudio/doc-assets/TACOTRON2_WAVERNN_PHONE_LJSPEECH_v2.wav" type="audio/wav">
         Your browser does not support the <code>audio</code> element.
      </audio>
)4rJ   Údataclassesr   Útypingr   r   r   r   r   r	   rb   r
   Útorchaudio._internalr   Útorchaudio.functionalr   Útorchaudio.modelsr   r   Útorchaudio.transformsr   r   rI   r   Ú	interfacer   Ú__all__r›   rŽ   r   r<   ÚnnÚModuleÚVocoderrR   rq   rŠ   r‘   r•   r¤   r­   r±   rµ   r·   r¹   Ú_get_taco_paramsÚ"TACOTRON2_GRIFFINLIM_CHAR_LJSPEECHÚ__doc__Ú#TACOTRON2_GRIFFINLIM_PHONE_LJSPEECHÚ_get_wrnn_paramsÚTACOTRON2_WAVERNN_CHAR_LJSPEECHÚ TACOTRON2_WAVERNN_PHONE_LJSPEECHr�   r(   r"   ú<module>rÏ      sB  ðÛ 	Ý !ß :× :ã Ý Ý 9Ý 1ß 0ß =å Ý )à
€à<€	ô)Ð.×<Ñ<ô )ô")Ð/×=Ñ=ô )ô:!�e—h‘h—o‘oÐ'9×'AÑ'Aô !ô0"˜Ÿ™Ÿ™Ð*<×*DÑ*Dô "÷L'ñ '÷
;ñ ;ð
 ÷ð ó ðð ÷ð ó ð÷$$ñ $ð ô	 -°À*ÐN`ó 	ó ð	ð ô	 =°/À;ÐPbó 	ó ð	ð ô	Ð%5°È
ÐTfó 	ó ð	ð ô	Ð&6¸ÈÐVhó 	ó ð	ñ &DØKØ,�e×,Ñ,°rÔ:ô&Ð "ð!.Ð "Ô *ñF 'FØIØ,�e×,Ñ,°rÔ:ô'Ð #ð&/Ð #Ô +ñP #>ØSØ,�e×,Ñ,°rÔ:Ø9Ø*�E×*Ñ*Ó,ô	#Ð ð#+Ð Ô 'ñJ $@ØQØ,�e×,Ñ,°rÔ:Ø9Ø*�E×*Ñ*Ó,ô	$Ð  ð),Ð  Õ (r(   