Ë
    x[hª>  ã                   óR  — 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Zd dlZd dlm	Z	m
Z
mZmZmZ  ej                  e«      ZdZdZdgZdZ G d„ dej*                  «      Z G d	„ d
e«      Z G d„ de«      Z G d„ d«      Zd„ Zd„ Zd„ Zdd„Zdd„Zd„ Z eZ!eejD                  ffgZ#d„ Z$y)é    N)Úatomic_helperÚnetÚsourcesÚsubpÚutilziid-dsopennebulaÚnobodyú
context.sh)ÚEPOCHREALTIMEÚEPOCHSECONDSÚRANDOMÚLINENOÚSECONDSÚ_ÚSRANDOMÚ__vc                   ó@   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zed„ «       Z	d	d„Z
y)
ÚDataSourceOpenNebulaÚ
OpenNebulac                 óÂ   — t         j                  j                  | |||«       d | _        t        j
                  j                  |j                  d«      | _        d | _        y )NÚ
opennebula)	r   Ú
DataSourceÚ__init__ÚseedÚosÚpathÚjoinÚseed_dirÚnetwork)ÚselfÚsys_cfgÚdistroÚpathss       úH/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOpenNebula.pyr   zDataSourceOpenNebula.__init__/   sD   € Ü×Ñ×#Ñ# D¨'°6¸5ÔAØˆŒ	ÜŸ™Ÿ™ U§^¡^°\ÓBˆŒØˆ�ó    c                 ó~   — t         j                  j                  | «      }|›d| j                  ›d| j                  ›d�S )Nz [seed=z	][dsmode=ú])r   r   Ú__str__r   Údsmode)r   Úroots     r#   r'   zDataSourceOpenNebula.__str__5   s-   € Ü×!Ñ!×)Ñ)¨$Ó/ˆÚ,0°$·)³)¸T¿[»[ÐIÐIr$   c                 ó,  — dt         i}d }d }t        }d| j                  v r| j                  j                  d«      }| j                  g}|j                  t        «       «       |D ]®  }	 t        j                  j                  | j                  «      rt        || j                  |¬«      }nM|j                  d«      r<t        j                  t        || j                  ¬«      }t        j                   ||«      }|sŒ–|}t(        j-                  d|«        n |sy|d	   }	t        j.                  |	|g«      }	| j1                  |j                  d
«      | j                  j                  d«      g«      | _        | j2                  t4        j6                  k(  ry|| _        |j                  d«      | _        |	| _        |j                  d«      | _        y# t"        $ r Y �Œut$        $ r}|‚d }~wt        j&                  $ r t(        j+                  d|«       Y �Œw xY w)Nzinstance-idÚ	parseuser©Úasuserz/dev)r-   r!   z%s was not mountablezfound datasource in %sFÚmetadataÚDSMODEr(   únetwork-interfacesÚuserdataT) ÚDEFAULT_IIDÚDEFAULT_PARSEUSERÚds_cfgÚgetr   ÚextendÚfind_candidate_devsr   r   ÚisdirÚread_context_disk_dirr!   Ú
startswithÚ	functoolsÚpartialr   Úmount_cbÚNonContextDiskDirÚBrokenContextDiskDirÚMountFailedErrorÚLOGÚwarningÚdebugÚmergemanydictÚ_determine_dsmoder(   r   ÚDSMODE_DISABLEDr   r   r.   Úuserdata_raw)
r   ÚdefaultsÚresultsr   r+   Ú
candidatesÚcdevÚpartially_applied_funcÚexcÚmds
             r#   Ú	_get_datazDataSourceOpenNebula._get_data9   sÕ  € Ø!¤;Ð/ˆØˆØˆô &ˆ	Ø˜$Ÿ+™+Ñ%ØŸ™Ÿ™¨Ó4ˆIà—m‘m�_ˆ
Ø×ÑÔ-Ó/Ô0Øò 	ˆDð:Ü—7‘7—=‘= §¡Ô/Ü3Ø˜dŸk™k°)ô‘Gð —_‘_ VÔ,ô .7×->Ñ->Ü-Ø(Ø#Ÿ{™{ô.Ð*ô
 #Ÿm™m¨DÐ2HÓI�Gò Ø�Ü—	‘	Ð2°DÔ9Ùð5	ñ8 Øð �ZÑ ˆÜ×Ñ  X Ó/ˆð ×,Ñ,Ø�[‰[˜Ó" D§K¡K§O¡O°HÓ$=Ð>ó
ˆŒð �;‰;œ'×1Ñ1Ò1ØàˆŒ	Ø—{‘{Ð#7Ó8ˆŒØˆŒØ#ŸK™K¨
Ó3ˆÔØøô? %ò ÚÜ'ò Ø�	ûÜ×(Ñ(ò :Ü—‘Ð2°D×9ð:ús%   Á(BGÇ	HÇHÇ!G#Ç#,HÈHc                 ó`   — | j                   | j                  v rd}nd}|›d| j                  ›d�S )z/Return the subplatform metadata source details.zseed-dirzconfig-diskz (ú))r   r   )r   Úsubplatform_types     r#   Ú_get_subplatformz%DataSourceOpenNebula._get_subplatformv   s-   € à�=‰=˜DŸI™IÑ%Ø)Ñà,ÐÚ,¨d¯i«iÐ8Ð8r$   c                 ó4   — | j                   �| j                   S y ©N)r   )r   s    r#   Únetwork_configz#DataSourceOpenNebula.network_config~   s   € à�<‰<Ð#Ø—<‘<Ðàr$   c                 óŒ   — |€"| j                   t        j                  k(  rd}nd}t        j                  j	                  | ||«      S )NTF)r(   r   ÚDSMODE_NETWORKr   Úget_hostname)r   ÚfqdnÚ
resolve_ipÚmetadata_onlys       r#   rY   z!DataSourceOpenNebula.get_hostname…   s?   € ØÐØ�{‰{œg×4Ñ4Ò4Ø!‘
à"�
Ü×!Ñ!×.Ñ.¨t°T¸:ÓFÐFr$   N)FFF)Ú__name__Ú
__module__Ú__qualname__Údsnamer   r'   rO   rS   ÚpropertyrV   rY   © r$   r#   r   r   +   s7   „ à€FòòJò;òz9ð ñó ðôGr$   r   c                   ó   — e Zd Zy)r>   N©r]   r^   r_   rb   r$   r#   r>   r>   Ž   ó   „ Ør$   r>   c                   ó   — e Zd Zy)r?   Nrd   rb   r$   r#   r?   r?   ’   re   r$   r?   c                   óX   — e Zd Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zdd„Zd„ Zy)ÚOpenNebulaNetworkNc                 ó‚  — || _         |€t        |«      }t        j                  t	        |j                  «       d„ ¬«      D �cg c]  }|‘Œ c}«      | _        i | _        |j                  «       D ]J  \  }}t        j                  d|«      }|sŒ|j                  d«      | j                  |j                  «       <   ŒL y c c}w )Nc                 ó2   — t        j                  | d   «      S )Né   )r   Únatural_sort_key)Úks    r#   ú<lambda>z,OpenNebulaNetwork.__init__.<locals>.<lambda>    s   € ¤#×"6Ñ"6°q¸±tÓ"<€ r$   )Úkeyz
^(.+)_MAC$rk   )ÚcontextÚget_physical_nics_by_macÚcollectionsÚOrderedDictÚsortedÚitemsÚifacesÚcontext_devnameÚreÚmatchÚgroupÚlower)r   rp   r!   Úsystem_nics_by_macrm   ÚvÚms          r#   r   zOpenNebulaNetwork.__init__—   s±   € ØˆŒØÐ%Ü!9¸&Ó!AÐÜ!×-Ñ-ô  Ø&×,Ñ,Ó.Ù<ôöàò òó
ˆŒð  "ˆÔØ—M‘M“Oò 	=‰DˆAˆqÜ—‘˜¨Ó*ˆAÚØ23·'±'¸!³*�×$Ñ$ Q§W¡W£YÒ/ñ	=ùòs   Á	B<c                 ó”   — dj                  |j                  d«      dd  D �cg c]  }t        t        |d«      «      ‘Œ c}«      S c c}w )Nú.ú:é   é   )r   ÚsplitÚstrÚint)r   ÚmacÚcs      r#   Úmac2ipzOpenNebulaNetwork.mac2ip­   s8   € Ø�x‰x°#·)±)¸C³.ÀÀÐ2DÖE¨QœœS  B›Z�ÒEÓFÐFùÒEs   ¢Ac                 ó  — i }| j                  |dd«      j                  «       }|j                  | j                  j	                  dd«      j                  «       «       |r||d<   | j                  |dd«      j                  «       }|r||d<   |S )NÚdnsÚ ÚDNSÚ	addressesÚsearch_domainÚsearch)Ú	get_fieldr„   r6   rp   r5   )r   ÚdevÚnameserversr‹   r�   s        r#   Úget_nameserversz!OpenNebulaNetwork.get_nameservers°   sƒ   € ØˆØ�n‰n˜S %¨Ó,×2Ñ2Ó4ˆØ�
‰
�4—<‘<×#Ñ# E¨2Ó.×4Ñ4Ó6Ô7ÙØ'*ˆK˜Ñ$ØŸ™ s¨O¸RÓ@×FÑFÓHˆÙØ$1ˆK˜Ñ!ØÐr$   c                 ó&   — | j                  |d«      S )NÚmtu©r‘   ©r   r’   s     r#   Úget_mtuzOpenNebulaNetwork.get_mtu»   s   € Ø�~‰~˜c 5Ó)Ð)r$   c                 óF   — | j                  |d| j                  |«      «      S )NÚip)r‘   r‰   )r   r’   r‡   s      r#   Úget_ipzOpenNebulaNetwork.get_ip¾   s   € Ø�~‰~˜c 4¨¯©°SÓ)9Ó:Ð:r$   c                 óž   — g }| j                  |d«      }|r|j                  |«       | j                  |d«      }|r|j                  |«       |S )NÚip6Úip6_ula)r‘   Úappend)r   r’   Ú
addresses6rž   rŸ   s        r#   Úget_ip6zOpenNebulaNetwork.get_ip6Á   sO   € Øˆ
Ø�n‰n˜S %Ó(ˆÙØ×Ñ˜cÔ"Ø—.‘.  iÓ0ˆÙØ×Ñ˜gÔ&ØÐr$   c                 ó(   — | j                  |dd«      S )NÚip6_prefix_lengthÚ64r—   r˜   s     r#   Úget_ip6_prefixz OpenNebulaNetwork.get_ip6_prefixË   s   € Ø�~‰~˜cÐ#6¸Ó=Ð=r$   c                 ó&   — | j                  |d«      S )NÚgatewayr—   r˜   s     r#   Úget_gatewayzOpenNebulaNetwork.get_gatewayÎ   s   € Ø�~‰~˜c 9Ó-Ð-r$   c                 óH   — | j                  |d| j                  |d«      «      S )NÚip6_gatewayÚgateway6r—   r˜   s     r#   Úget_gateway6zOpenNebulaNetwork.get_gateway6Ñ   s'   € ð �~‰~Ø� §¡¨s°JÓ ?ó
ð 	
r$   c                 ó(   — | j                  |dd«      S )NÚmaskz255.255.255.0r—   r˜   s     r#   Úget_maskzOpenNebulaNetwork.get_maskÙ   s   € Ø�~‰~˜c 6¨?Ó;Ð;r$   c                 ó†   — | j                   j                  dj                  ||f«      j                  «       «      }|dv r|S |S )z¤return the field name in context for device dev.

        context stores <dev>_<NAME> (example: eth0_DOMAIN).
        an empty string for value will return default.r   )NrŒ   )rp   r5   r   Úupper)r   r’   ÚnameÚdefaultÚvals        r#   r‘   zOpenNebulaNetwork.get_fieldÜ   sL   € ð
 �l‰l×ÑØ�H‰HàØðó÷
 ‰e‹gó
ˆð  Ñ+ˆwÐ4°Ð4r$   c                 ó  — i }d|d<   i |d<   i }| j                   j                  «       D �]J  \  }}|j                  «       }| j                  j	                  ||«      }i }d|i|d<   g |d<   | j                  |«      }t        t        j                  |«      «      }|d   j                  | j                  ||«      dz   |z   «       | j                  |«      }	|	r9| j                  |«      }
|d   j                  |	D �cg c]
  }|dz   |
z   ‘Œ c}«       | j                  |«      }|r||d<   | j                  |«      }|r||d	<   | j!                  |«      }|r||d
<   | j#                  |«      }|r||d<   |||<   �ŒM ||d<   |S c c}w )Nr‚   ÚversionÚ	ethernetsÚ
macaddressry   rŽ   ú/Úgateway4r¬   r“   r–   )rv   ru   r{   rw   r5   r°   r…   r   Úipv4_mask_to_net_prefixr    rœ   r¢   r¦   r6   r©   r­   r”   r™   )r   Únetconfr¸   r‡   r’   Úc_devÚdevconfr¯   Úprefixr¡   Úprefix6Úir¨   r¬   r“   r–   s                   r#   Úgen_confzOpenNebulaNetwork.gen_confì   s¹  € ØˆØˆ�	ÑØ!ˆ�Ñàˆ	ØŸ™×)Ñ)Ó+ó .	%‰HˆC�Ø—)‘)“+ˆCð ×(Ñ(×,Ñ,¨S°#Ó6ˆEàˆGð !-¨cÐ2ˆG�GÑð $&ˆG�KÑ Ø—=‘= Ó'ˆDÜœ×4Ñ4°TÓ:Ó;ˆFØ�KÑ ×'Ñ'¨¯©°E¸3Ó(?À#Ñ(EÈÑ(NÔOð Ÿ™ eÓ,ˆJÙØ×-Ñ-¨eÓ4�Ø˜Ñ$×+Ñ+Ø0:Ö;¨1�Q˜‘W˜wÓ&Ò;ôð
 ×&Ñ& uÓ-ˆGÙØ&-�˜
Ñ#ð ×(Ñ(¨Ó/ˆHÙØ&.�˜
Ñ#ð ×.Ñ.¨uÓ5ˆKÙØ)4�˜Ñ&ð —,‘,˜uÓ%ˆCÙØ!$�˜‘à$ˆI�c‹Nð].	%ð`  )ˆ�ÑØˆùò5 <s   Ã9E>
rU   )r]   r^   r_   r   r‰   r”   r™   rœ   r¢   r¦   r©   r­   r°   r‘   rÃ   rb   r$   r#   rh   rh   –   s?   „ ó=ò,Gò	ò*ò;òò>ò.ò
ò<ó5ó 7r$   rh   c                  óœ   — g } dD ]D  }t        j                  |«      }|j                  «        |D ]  }|| vsŒ| j                  |«       Œ ŒF | S )zE
    Return a list of devices that may contain the context disk.
    )zLABEL=CONTEXTzLABEL=CDROMzTYPE=iso9660)r   Úfind_devs_withÚsortr    )ÚcombinedÚfÚdevsÚds       r#   r7   r7   &  s[   € ð €HØ=ò #ˆÜ×"Ñ" 1Ó%ˆØ�	‰	ŒØò 	#ˆAØ˜Ò Ø—‘ Õ"ñ	#ð#ð €Or$   c                 ó   — dd| gS )NÚsudoz-urb   ©Úusers    r#   Úswitch_user_cmdrÏ   5  s   € Ø�D˜$ÐÐr$   c                  ó,   — t        j                  d«      S )zDprint the shell environment variables within delimiters to be parsedzŸ
        printf "%s\0" _start_
        [ $0 != 'sh' ] && set -o posix
        set
        [ $0 != 'sh' ] && set +o posix
        printf "%s\0" _start_
        )ÚtextwrapÚdedentrb   r$   r#   Ú
varprinterrÓ   9  s   € ä�?‰?ð	óð r$   c                 óà  — d| j                  «       v rt        j                  d«       t        «       d| z  z   t        «       z   dz   }g }|�t	        |«      }|j                  ddg«       t        j                  ||¬«      j                  }i }|j                  d	«      d
d }|d   |d   }}t        d„ t        j                  |«      D «       «      }	t        d„ t        j                  |«      D «       «      }
t        |	j                  «       «      j                  t        |
j                  «       «      «      D ]9  }|t        v rŒ|
j                  |«      }|€Œ ||	j                  |«      k7  sŒ5|||<   Œ; |S )a<  run content and return environment variables which changed

    WARNING: the special variable _start_ is used to delimit content

    a context.sh that defines this variable might break in unexpected
    ways

    compatible with posix shells such as dash and ash and any shell
    which supports `set -o posix`
    s   _start_ zYUser defined _start_ variable in context.sh, this may breakcloud-init in unexpected ways.z{
%s

:
} > /dev/null
ú
NÚshz-e)Údataz_start_ rk   r   r‚   c              3   óB   K  — | ]  }|j                  d d¬«      –— Œ y­w©ú=rk   )ÚmaxsplitN©r„   ©Ú.0Úvariables     r#   ú	<genexpr>z%parse_shell_config.<locals>.<genexpr>}  s"   è ø€ ò Ø,4ˆ�‰�s Qˆ×'ñùó   ‚c              3   óB   K  — | ]  }|j                  d d¬«      –— Œ y­wrÙ   rÜ   rÝ   s     r#   rà   z%parse_shell_config.<locals>.<genexpr>€  s"   è ø€ ò Ø,4ˆ�‰�s Qˆ×'ñùrá   )ÚencoderA   rB   rÓ   rÏ   r6   r   Ústdoutr„   ÚdictÚshlexÚsetÚkeysÚunionÚEXCLUDED_VARSr5   )Úcontentr-   ÚbcmdÚcmdÚoutputÚretÚsectionsÚbeforeÚafterÚpre_envÚpost_envro   Úvalues                r#   Úparse_shell_configrö   F  sr  € ð ˜Ÿ™Ó)Ñ)Ü�‰ð-ô	
ô$ 	‹Ø
'¨'Ñ
1ñ	2ä
‹,ñ	ð ñ	ð 	ð €CØÐÜ˜fÓ%ˆØ‡J�J��dˆ|Ôä�Y‰Y�s Ô&×-Ñ-€Fð €Cð �|‰|˜MÓ*¨1¨2Ð.€Hð
 ˜Q‘K ¨!¡ˆE€Fäñ Ü8=¿¹ÀFÓ8Kôó €Gô ñ Ü8=¿¹ÀEÓ8Jôó €Hô �7—<‘<“>Ó"×(Ñ(¬¨X¯]©]«_Ó)=Ó>ò ˆØ”-ÑØØ—‘˜SÓ!ˆØÑ ¨'¯+©+°cÓ*:Ó!:ØˆC�ŠHðð €Jr$   c                 óH  — i }t         D ]G  }t        j                  j                  | |«      }t        j                  j	                  |«      sŒC|||<   ŒI |st        | ›dd›�«      ‚i }di dœ}d|v r\|�	 t        j                  |«       	 t        j                  j                  | d«      }	t        j                  |	«      }
t        |
|¬«      }nt        d«      ‚|s|S ||d<   d}d|v rd}nd|v rd}|rS|j#                  |«      j%                  «       }|D �cg c]"  }t'        |«      sŒ|j)                  d«      rŒ!|‘Œ$ c}|d   d<   dD ]  }||v sŒ||   |d   d<    n d|v r	|d   |d<   nd|v r|d   |d<   d|v rB|j#                  d|j#                  d«      «      }|dk(  r	 t+        j,                  |d   «      |d<   |D �cg c]  }t5        j6                  d|«      sŒ|‘Œ }}|rt9        ||«      }|j;                  «       |d<   |S # t        $ r!}t        dj                  |¬«      «      |‚d}~ww xY w# t        j                  $ r}t        d	|z  «      |‚d}~wt         $ r}t        d
|z  «      |‚d}~ww xY wc c}w # t.        $ r t0        j3                  d«       Y Œàw xY wc c}w )z¹
    read_context_disk_dir(source_dir):
    read source_dir and return a tuple with metadata dict and user-data
    string populated.  If not a valid dir, raise a NonContextDiskDir
    z: zno files foundN)r1   r.   r	   z'configured user '{user}' does not existrÍ   r,   zError processing context.sh: %szError reading context.sh: %szMissing context.shr.   ÚSSH_KEYÚSSH_PUBLIC_KEYú#zpublic-keys)ÚSET_HOSTNAMEÚHOSTNAMEÚ	PUBLIC_IPÚ	IP_PUBLICÚETH0_IPzlocal-hostnameÚ	USER_DATAr1   ÚUSERDATAÚUSERDATA_ENCODINGÚUSER_DATA_ENCODINGÚbase64z"Failed base64 decoding of userdataz^ETH\d+_IP.*$r0   )ÚCONTEXT_DISK_FILESr   r   r   Úisfiler>   ÚpwdÚgetpwnamÚKeyErrorr?   Úformatr   Úload_text_filerö   r   ÚProcessExecutionErrorÚIOErrorr5   Ú
splitlinesÚlenr:   r   Úb64dÚ	TypeErrorrA   rB   rx   ry   rh   rÃ   )Ú
source_dirr!   r-   ÚfoundÚafÚfnrp   rI   Úer   rë   Ússh_key_varÚlinesÚlinerm   ÚencodingÚipaddr_keysÚonets                     r#   r9   r9   �  sù  € ð €EÜ ò ˆÜ�W‰W�\‰\˜* bÓ)ˆÜ�7‰7�>‰>˜"ÕØˆE�"ŠIðñ
 ÜªJÑ8HÐ IÓJÐJà€GØ¨RÑ0€Gà�uÑØÐðÜ—‘˜VÔ$ð	Ü—7‘7—<‘< 
¨LÓ9ˆDÜ×)Ñ)¨$Ó/ˆGÜ(¨¸Ô@‰Gô  Ð 4Ó5Ð5áØˆà!€GˆJÑð €KØ�GÑØ‰Ø	˜WÑ	$Ø&ˆáØ—‘˜KÓ(×3Ñ3Ó5ˆà"ö.
Ø¤c¨$¥i¸¿¹ÈÕ8LŠDò.
ˆ�
Ñ˜MÑ*ð Oò ˆØ�Š<Ø4;¸A±JˆG�JÑÐ 0Ñ1Ùðð �gÑØ% kÑ2ˆ�
ÒØ	�wÑ	Ø% jÑ1ˆ�
Ñð �WÑØ—;‘;Ø §¡Ð-AÓ!Bó
ˆð �xÒðBÜ&3×&8Ñ&8¸ÀÑ9LÓ&M�˜
Ñ#ð &ÖG˜¬¯©Ð2BÀAÕ)F’1ÐG€KÐGÙÜ  ¨&Ó1ˆØ(,¯©«ˆÐ$Ñ%à€NøôO ò Ü*Ø=×DÑDØ#ð Eó óð ð	ûðûô ×)Ñ)ò 	Ü&Ø1°QÑ7óàðûô ò 	Ü#Ø.°!Ñ4óàðûð	üò*.
øô2 ò BÜ—‘Ð@ÖAðBüò Hsm   Á3H Â	AH1 ÄI6Ä%I6Ä7I6Æ I; Æ?JÇJÈ	H.ÈH)È)H.È1I3ÉIÉI3ÉI.É.I3É;JÊJc           	      óÊ   — t        j                  «       }t        |j                  «       D ��cg c]%  \  }}| j                  j                  |«      sŒ"||f‘Œ' c}}«      S c c}}w rU   )r   Úget_interfaces_by_macrå   ru   Ú
networkingÚis_physical)r!   rÉ   r~   Úns       r#   rq   rq   í  sO   € Ü×$Ñ$Ó&€DÜØ ŸJ™J›L×M‘D�A�q¨F×,=Ñ,=×,IÑ,IÈ!Õ,Lˆ!ˆQŠÓMóð ùÛMs   ­#A
ÁA
c                 ó6   — t        j                  | t        «      S rU   )r   Úlist_from_dependsÚdatasources)Údependss    r#   Úget_datasource_listr&  þ  s   € Ü×$Ñ$ W¬kÓ:Ð:r$   rU   )%rr   r;   Úloggingr   r  rx   ræ   rÑ   Ú	cloudinitr   r   r   r   r   Ú	getLoggerr]   rA   r2   r3   r  rê   r   r   Ú	Exceptionr>   r?   rh   r7   rÏ   rÓ   rö   r9   rq   ÚDataSourceOpenNebulaNetÚDEP_FILESYSTEMr$  r&  rb   r$   r#   ú<module>r-     sÖ   ðó Û Û Û 	Û 
Û 	Û Û ç =Õ =à€g×Ñ˜Ó!€à €ØÐ Ø"�^Ð ð	€ô`G˜7×-Ñ-ô `GôF	˜	ô 	ô	˜9ô 	÷Mñ Mò`ò ò
óDóN]ò@ð /Ð ð ˜G×2Ñ2Ð4Ð5ð€ó;r$   