Ë
    zbãjû7  ã            
       ó¾  — d dl Z e j                  j                  d d«       d dlmZ d dlmZmZmZm	Z	m
Z
m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 d dlmZ d dlmZ d dlmZ d dl m!Z!  eddg¬«      Z"d„ Z#de$de$fd„Z%de$de$fd„Z&de$de$fd„Z' G d„ de«      Z( G d„ de«      Z) G d„ de«      Z*dede+fd „Z,e"j[                  d!d"d#¬$«       ee«       ee«      fd%ed&efd'„«       Z.e"j_                  d!d(d)d*¬+«       ee«       ee«      fd,e(d%ed&efd-„«       Z0e"jc                  d.d/d0¬$«       ee«       ee«      fd1e2d,e)d%ed&efd2„«       Z3e"j[                  d.d3d4¬$«       ee«       ee«      fd1e2d%ed&efd5„«       Z4d6e$d7e+fd8„Z5de$fd9„Z6de$d:e$d;e$fd<„Z7de$fd=„Z8e"j_                  d>d?d@¬$«       edA«       ee«       ee«      fd1e2dBe
d%ed&efdC„«       Z9y)Dé    Nú/var/www/html/metafoliadorv2)Úurlparse)Ú	APIRouterÚDependsÚHTTPExceptionÚRequestÚ
UploadFileÚFile)ÚJSONResponse)ÚSession)Úcreate_engine)Ú	BaseModelÚField)ÚOptional)Úget_main_dbÚMainBase©ÚMainUser)ÚCustomer)Úget_main_current_user)Úsettingsz/main/api/customerszmain-customers)ÚprefixÚtagsc                  ó²   — t        t        j                  «      } | j                  xs d| j                  xs d| j
                  xs d| j                  xs ddœS )NÚmetafoliadorÚ Ú	localhosti8  )ÚuserÚpasswordÚhostÚport)r   r   Úmain_database_urlÚusernamer   Úhostnamer!   )Úus    ú6/var/www/html/metafoliadorv2/app/api/main/customers.pyÚ_parse_main_db_urlr'      sK   € Ü”×+Ñ+Ó,€Aà—
‘
Ò,˜nØ—J‘JÒ$ "Ø—
‘
Ò)˜kØ—‘’˜$ñ	ð ó    Ú	subdomainÚreturnc                 ó   — d| › �S )NÚmetafoliador_tenant_© )r)   s    r&   Ú_build_tenant_db_namer.       s   € Ø! ) Ð-Ð-r(   c           
      óf   — t        | «      }t        «       }d|d   › d|d   › d|d   › d|d   › d|› �
S )	Nzpostgresql://r   ú:r   ú@r    r!   ú/)r.   r'   )r)   Údb_nameÚps      r&   Ú_build_tenant_db_urlr5   $   sI   € Ü# IÓ.€GÜÓ€AØ˜1˜V™9˜+ Q q¨¡} o°Q°q¸±y°kÀÀ1ÀVÁ9À+ÈQÈwÈiÐXÐXr(   Údb_urlc                 ój   — t        | «      }|j                  r|j                  j                  d«      S dS )Nr2   r   )r   ÚpathÚlstrip)r6   r%   s     r&   Ú_extract_db_name_from_urlr:   *   s*   € Ü�Ó€AØ!"§¢ˆ1�6‰6�=‰=˜ÓÐ/¨RÐ/r(   c                   ón   — e Zd ZU  edd¬«      Zeed<    edd¬«      Zeed<    edd¬«      Ze	e   ed	<   y)
ÚCreateCustomerRequest.úNombre del cliente©ÚdescriptionÚnameúSubdominio del tenantr)   Nz Dominio personalizado (opcional)Úcustom_domain)
Ú__name__Ú
__module__Ú__qualname__r   r@   ÚstrÚ__annotations__r)   rB   r   r-   r(   r&   r<   r<   /   s<   … Ù�cÐ';Ô<€Dˆ#Ó<Ù˜3Ð,CÔD€IˆsÓDÙ#(¨Ð;]Ô#^€M�8˜C‘=Ô^r(   r<   c                   óž   — e Zd ZU  edd¬«      Zee   ed<    edd¬«      Zee   ed<    edd¬«      Z	ee   ed<    edd	¬«      Z
ee   ed
<   y)ÚUpdateCustomerRequestNr=   r>   r@   rA   r)   zDominio personalizadorB   z!Estado activo/inactivo del tenantÚactive)rC   rD   rE   r   r@   r   rF   rG   r)   rB   rJ   Úboolr-   r(   r&   rI   rI   5   sZ   … Ù Ð2FÔG€Dˆ(�3‰-ÓGÙ$ TÐ7NÔO€Iˆx˜‰}ÓOÙ#(¨Ð;RÔ#S€M�8˜C‘=ÓSÙ" 4Ð5XÔY€FˆH�T‰NÔYr(   rI   c                   óT   — e Zd ZU eed<   eed<   eed<   dZee   ed<   eed<   eed<   y)ÚCustomerResponseÚidr@   r)   NrB   r3   rJ   )	rC   rD   rE   ÚintrG   rF   rB   r   rK   r-   r(   r&   rM   rM   <   s)   … ØƒGØ
ƒIØƒNØ#'€M�8˜C‘=Ó'ØƒLØ„Lr(   rM   Úcc                 ó´   — | j                   | j                  | j                  | j                  t	        | j
                  «      | j                  | j                  dœS )N)rN   r@   r)   rB   r3   rJ   Úbackground_image)rN   r@   r)   rB   r:   r6   rJ   rR   )rP   s    r&   Ú_customer_to_dictrS   E   sD   € à�d‰dØ—‘Ø—[‘[ØŸ™Ü,¨Q¯X©XÓ6Ø—(‘(Ø×.Ñ.ñð r(   r   zListar clientesz%Lista todos los clientes registrados.)Úsummaryr?   ÚdbÚcurrent_userc              ƒ   óÆ   K  — | j                  t        «      j                  t        j                  «      j	                  «       }|D �cg c]  }t        |«      ‘Œ c}S c c}w ­w)N)Úqueryr   Úorder_byr@   ÚallrS   )rU   rV   Ú	customersrP   s       r&   Úlist_customersr\   Q   sH   è ø€ ð
 —‘œÓ"×+Ñ+¬H¯M©MÓ:×>Ñ>Ó@€IØ*3Ö4 QÔ˜aÕ Ò4Ð4ùÒ4ùs   ‚AA!ÁAÁA!éÉ   zCrear clientezwCrea un nuevo cliente y su base de datos tenant. La BD se nombra automaticamente como metafoliador_tenant_{subdominio}.)Ústatus_coderT   r?   Úbodyc              ƒ   ó®  K  — |j                  t        «      j                  t        j                  | j                  k(  «      j	                  «       }|rt        dd¬«      ‚| j                  r\|j                  t        «      j                  t        j                  | j                  k(  «      j	                  «       }|rt        dd¬«      ‚t        | j                  «      }t        | j                  «      }t        «       }	 t        ||«       	 t        |«       	 t        ||j                  |j                   «       	 t#        |«       t        | j                   | j                  | j                  |d
¬«      }	|j%                  |	«       |j'                  «        |j)                  |	«       t+        |	«      S # t        $ r}t        ddt        |«      › �¬«      ‚d }~ww xY w# t        $ r}t        ddt        |«      › �¬«      ‚d }~ww xY w# t        $ r}t        ddt        |«      › �¬«      ‚d }~ww xY w# t        $ r}t        dd	t        |«      › �¬«      ‚d }~ww xY w­w)Né�  z'Ya existe un cliente con ese subdominio©r^   Údetailz2Ya existe un cliente con ese dominio personalizadoiô  z,Error al crear la base de datos del tenant: z3Error al ejecutar migraciones en la BD del tenant: z%Error al crear usuario en el tenant: z(Error al sembrar permisos en el tenant: T)r@   r)   rB   r6   rJ   )rX   r   Úfilterr)   Úfirstr   rB   r.   r5   r'   Ú_create_tenant_databaseÚ	ExceptionrF   Ú_run_tenant_migrationsÚ_seed_tenant_userÚemailr@   Ú_seed_tenant_permissionsÚaddÚcommitÚrefreshrS   )
r_   rU   rV   ÚexistingÚexisting_domainr3   r6   Úconn_paramsÚeÚcustomers
             r&   Úcreate_customerrt   Z   s  è ø€ ð �x‰xœÓ!×(Ñ(¬×);Ñ);¸t¿~¹~Ñ)MÓN×TÑTÓV€HÙÜ¨Ð4]Ô^Ð^à×ÒØŸ(™(¤8Ó,×3Ñ3´H×4JÑ4JÈd×N`ÑN`Ñ4`Óa×gÑgÓiˆÙÜ¨CÐ8lÔmÐmä# D§N¡NÓ3€GÜ! $§.¡.Ó1€FÜ$Ó&€KðmÜ ¨Ô5ðtÜ˜vÔ&ðfÜ˜& ,×"4Ñ"4°l×6GÑ6GÔHðiÜ  Ô(ô Ø�Y‰YØ—.‘.Ø×(Ñ(ØØô€Hð ‡F�Fˆ8ÔØ‡I�I„KØ‡J�JˆxÔä˜XÓ&Ð&øô; ò mÜ¨Ð6bÔcfÐghÓciÐbjÐ4kÔlÐlûðmûô
 ò tÜ¨Ð6iÔjmÐnoÓjpÐiqÐ4rÔsÐsûðtûô
 ò fÜ¨Ð6[Ô\_Ð`aÓ\bÐ[cÐ4dÔeÐeûðfûô
 ò iÜ¨Ð6^Ô_bÐcdÓ_eÐ^fÐ4gÔhÐhûðiüs…   ‚C9IÃ<F- Ä	G Ä!H Ä7H+ ÅA+IÆ-	GÆ6GÇGÇIÇ	G>Ç G9Ç9G>Ç>IÈ	H(È
H#È#H(È(IÈ+	IÈ4IÉIÉIz/{customer_id}zActualizar clienteur   Edita los datos del cliente. No permite modificar la conexiÃ³n a la BD ya que se usa la misma que la BD principal.Úcustomer_idc              ƒ   óÚ  K  — |j                  t        «      j                  t        j                  | k(  «      j	                  «       }|st        dd¬«      ‚|j                  �|j                  |_        |j                  �|j                  t        «      j                  t        j                  |j                  k(  t        j                  | k7  «      j	                  «       }|rt        dd¬«      ‚|j                  |_        |j                  �™|j                  rn|j                  t        «      j                  t        j                  |j                  k(  t        j                  | k7  «      j	                  «       }|rt        dd¬«      ‚|j                  r|j                  nd |_        |j                  �|j                  |_	        |j                  «        |j                  |«       t        |«      S ­w)Né”  úCliente no encontradorb   ra   z)Ya existe otro cliente con ese subdominioz&Ya existe otro cliente con ese dominio)rX   r   rd   rN   re   r   r@   r)   rB   rJ   rm   rn   rS   )ru   r_   rU   rV   rs   ro   s         r&   Úupdate_customerry   �   s  è ø€ ð �x‰xœÓ!×(Ñ(¬¯©¸Ñ)CÓD×JÑJÓL€HÙÜ¨Ð4KÔLÐLà‡y�yÐØŸ	™	ˆŒØ‡~�~Ð!Ø—8‘8œHÓ%×,Ñ,Ü×Ñ $§.¡.Ñ0Ü�K‰K˜;Ñ&ó
÷ ‰%‹'ð 	ñ Ü¨CÐ8cÔdÐdØ!Ÿ^™^ˆÔØ×ÑÐ%Ø×ÒØ—x‘x¤Ó)×0Ñ0Ü×&Ñ&¨$×*<Ñ*<Ñ<Ü—‘˜{Ñ*ó÷ ‰e‹gð ñ Ü#°Ð<dÔeÐeØ7;×7IÒ7I ×!3Ò!3ÈtˆÔØ‡{�{ÐØŸ+™+ˆŒà‡I�I„KØ‡J�JˆxÔä˜XÓ&Ð&ùs   ‚G)G+zObtener clientez'Obtiene los datos de un cliente por ID.c              ƒ   óÄ   K  — |j                  t        «      j                  t        j                  | k(  «      j	                  «       }|st        dd¬«      ‚t        |«      S ­w)Nrw   rx   rb   )rX   r   rd   rN   re   r   rS   )ru   rU   rV   rs   s       r&   Úget_customerr{   ¶   sO   è ø€ ð �x‰xœÓ!×(Ñ(¬¯©¸Ñ)CÓD×JÑJÓL€HÙÜ¨Ð4KÔLÐLÜ˜XÓ&Ð&ùs   ‚AA r3   rq   c                 óf  — dd l }ddl m} ddlm} |j	                  d|d   |d   |d   |d   ¬	«      }|j                  |«       |j                  «       }|j                  |j                  d
«      j                  |j                  | «      «      «       |j                  «        |j                  «        y )Nr   )Úsql)ÚISOLATION_LEVEL_AUTOCOMMITÚpostgresr   r   r    r!   ©Údbnamer   r   r    r!   z:CREATE DATABASE {} WITH ENCODING 'UTF8' TEMPLATE template0)Úpsycopg2r}   Úpsycopg2.extensionsr~   ÚconnectÚset_isolation_levelÚcursorÚexecuteÚSQLÚformatÚ
IdentifierÚclose)r3   rq   r‚   r}   r~   ÚconnÚcurs          r&   rf   rf   Â   s£   € ÛÝÝ>à×ÑØØ˜Ñ Ø˜ZÑ(Ø˜Ñ Ø˜Ñ ð ó €Dð 	×ÑÐ7Ô8Ø
�+‰+‹-€CØ‡K�KØ�‰ÐLÓM×TÑTØ�N‰N˜7Ó#ó	
ôð
 ‡I�I„KØ‡J�J…Lr(   c                 ó&  — dd l }dd l}|j                  j                  «       }|j	                  ddd| › �ddgd|dd¬	«      }|j
                  dk7  rBt        d
|j                  j                  «       xs |j                  j                  «       › �«      ‚y )Nr   z-/var/www/html/metafoliadorv2/venv/bin/alembicz-xzdb_url=ÚupgradeÚheadr   T)ÚcwdÚenvÚcapture_outputÚtextzMigraciones fallaron: )
Ú
subprocessÚosÚenvironÚcopyÚrunÚ
returncodeÚRuntimeErrorÚstderrÚstripÚstdout)r6   r•   r–   r’   Úresults        r&   rh   rh   Ù   sš   € ÛÛà
�*‰*�/‰/Ó
€CØ�^‰^à;Ø�G˜F˜8Ð$Ø�vð	
ð
 +ØØØð ó 
€Fð ×Ñ˜AÒÜÐ3°F·M±M×4GÑ4GÓ4IÒ4bÈVÏ]É]×M`ÑM`ÓMbÐ3cÐdÓeÐeð r(   rj   r@   c                 óx  — dd l }ddlm} ddlm} ddlm}  |«       }	 |j                  |«      j                  |j                  |k(  «      j                  «       }|r|j                  n |d«      }	|j                  «        t        «       }
|j                  t        | «      |
d   |
d   |
d   |
d	   ¬
«      }	 |j!                  «       }|j#                  d||	|xs dddf«       |j%                  «        |j                  «        |j                  «        y # |j                  «        w xY w# |j                  «        w xY w)Nr   )Úhash_password)ÚMainSessionLocalr   zChangeme123!r   r   r    r!   r€   zwINSERT INTO users (email, password_hash, name, role, active) VALUES (%s, %s, %s, %s, %s) ON CONFLICT (email) DO NOTHINGÚAdministradorÚadminT)r‚   Úapp.services.auth_servicer¡   Úapp.models.main_databaser¢   Úapp.models.main_userr   rX   rd   rj   re   Úpassword_hashr‹   r'   r„   r:   r†   r‡   rm   )r6   rj   r@   r‚   r¡   r¢   r   Úmain_dbÚ	main_userr¨   r%   rŒ   r�   s                r&   ri   ri   í   s  € ÛÝ7Ý9Ý-áÓ €GðØ—M‘M (Ó+×2Ñ2°8·>±>ÀUÑ3JÓK×QÑQÓSˆ	Ù3<˜	×/Ò/Á-ÐP^ÓB_ˆà�‰ŒäÓ€AØ×ÑÜ(¨Ó0Øˆv‰YØ�:‘Øˆv‰YØˆv‰Yð ó €Dð	Ø�k‰k‹mˆØ�‰ð FØ�M 4Ò#:¨?¸GÀTÐJô	
ð 	�‰ŒØ�	‰	Œà�
‰
�øð' 	�‰�ûð& 	�
‰
�ús   ŸAD Â6AD' ÄD$Ä'D9c                 óÔ  — dd l }g d¢}t        «       }|j                  t        | «      |d   |d   |d   |d   ¬«      }	 |j	                  «       }|D ]  \  }}}|j                  d|||f«       Œ |j                  d	d
«       |j                  d	d«       |j                  d«       |j                  «        |j                  «        |j                  «        y # |j                  «        w xY w)Nr   )$)zdashboard.viewzVer DashboardÚ	Dashboard)zconexiones.viewzVer ConexionesúConexiones API)zconexiones.createzCrear Conexionr­   )zconexiones.editzEditar Conexionr­   )zconexiones.deletezEliminar Conexionr­   )zconexiones.synczSincronizar Sitiosr­   )zsitios.viewz
Ver SitiosÚSitios)zsitios.createzCrear Sitior®   )zsitios.editzEditar Sitior®   )zsitios.deletezEliminar Sitior®   )zsitios.synczSincronizar Sitior®   )zcarpetas.viewu   Ver Cuadro de ClasificaciÃ³núSeries, Subseries y Expedientes)zcarpetas.syncz+Sincronizar Series, Subseries y Expedientesr¯   )z
index.viewzVer Indice ElectronicoúIndice Electronico)zindex.generatezGenerar Indicer°   )zusuarios.viewzVer UsuariosÚUsuarios)zusuarios.createzCrear Usuarior±   )zusuarios.editzEditar Usuarior±   )zusuarios.deletezEliminar Usuarior±   )z
roles.viewz	Ver RolesÚRoles)zroles.createz	Crear Rolr²   )z
roles.editz
Editar Rolr²   )zroles.deletezEliminar Rolr²   )z	jobs.viewzVer TrabajosúTrabajos en Cola)zjobs.cancelzCancelar Trabajosr³   )z
jobs.purgezLimpiar Colar³   )zlistener-logs.viewzVer Logs APIzLogs API)zreportes.generatezGenerar ReportesÚReportes)zreportes.createzCrear Reporte Externor´   )zreportes.editzEditar Reporte Externor´   )zreportes.deletezEliminar Reporte Externor´   )zreportes.togglezActivar/Inactivar Reportesr´   )ztipologias.viewu   Ver TipologÃ­asõ   TipologÃ­as)ztipologias.createu   Crear TipologÃ­arµ   )ztipologias.editu   Editar TipologÃ­arµ   )ztipologias.deleteu   Eliminar TipologÃ­arµ   r   r   r    r!   r€   zqINSERT INTO permissions (code, name, module, created_at) VALUES (%s, %s, %s, now()) ON CONFLICT (code) DO NOTHINGz{INSERT INTO roles (name, all_permissions, description, created_at) VALUES (%s, %s, %s, now()) ON CONFLICT (name) DO NOTHING)r¤   Tz*Administrador del sistema con acceso total)r   Fz&Usuario basico sin permisos especialeszªINSERT INTO role_permissions (role_id, permission_id) SELECT r.id, p.id FROM roles r, permissions p WHERE r.name = 'admin' ON CONFLICT (role_id, permission_id) DO NOTHING)r‚   r'   r„   r:   r†   r‡   rm   r‹   )	r6   r‚   Úpermissions_datar%   rŒ   r�   Úcoder@   Úmodules	            r&   rk   rk     sû   € Ûò%ÐôN 	Ó€AØ×ÑÜ(¨Ó0Øˆv‰YØ�:‘Øˆv‰YØˆv‰Yð ó €DðØ�k‰k‹mˆà"2ò 	ÑˆD�$˜Ø�K‰Kð DØ�t˜VÐ$õð	ð 	�‰ð JØIô	
ð 	�‰ð JØEô	
ð
 	�‰ð>ô	
ð 	�‰ŒØ�	‰	Œà�
‰
�øˆ�
‰
�ús   ¿BC ÃC'z/{customer_id}/backgroundzSubir imagen de fondoz2Sube una imagen de fondo para el login del tenant..Úfilec              ƒ   óž  K  — |j                  t        «      j                  t        j                  | k(  «      j	                  «       }|st        dd¬«      ‚dd l}dd l}d}|j                  |d¬«       |j                  j                  |j                  xs d«      d	   j                  «       }|d
vrt        dd¬«      ‚|j                  rR|j                  j                  ||j                  «      }	|j                  j                  |	«      r|j!                  |	«       |j"                  › dt%        |j                  «       «      › |› �}
|j                  j                  ||
«      }|j'                  «       ƒ d {  –—† }t)        |d«      5 }|j+                  |«       d d d «       |
|_        |j-                  «        d|
d|
› �dœS 7 ŒJ# 1 sw Y   Œ+xY w­w)Nrw   rx   rb   r   z6/var/www/html/metafoliadorv2/static/img/img_backgroundT)Úexist_okzimg.jpgé   )z.jpgz.jpegz.pngz.gifz.webpra   z.Formato no permitido. Use JPG, PNG, GIF o WebPÚ_Úwbz/static/img/img_background/)ÚokrR   Úurl)rX   r   rd   rN   re   r   r–   ÚtimeÚmakedirsr8   ÚsplitextÚfilenameÚlowerrR   ÚjoinÚexistsÚremover)   rO   ÚreadÚopenÚwriterm   )ru   r¹   rU   rV   rs   r–   rÁ   Ú
upload_dirÚextÚold_pathrÄ   ÚfilepathÚcontentÚfs                 r&   Úupload_backgroundrÒ   ^  sŠ  è ø€ ð �x‰xœÓ!×(Ñ(¬¯©¸Ñ)CÓD×JÑJÓL€HÙÜ¨Ð4KÔLÐLãÛàI€JØ‡K�K�
 T€KÔ*à
�'‰'×
Ñ
˜4Ÿ=™=Ò5¨IÓ
6°qÑ
9×
?Ñ
?Ó
A€CØ
Ð<Ñ<Ü¨Ð4dÔeÐeà× Ò Ø—7‘7—<‘< 
¨H×,EÑ,EÓFˆØ�7‰7�>‰>˜(Ô#Ø�I‰I�hÔà×$Ñ$Ð% Q¤s¨4¯9©9«;Ó'7Ð&8¸¸Ð>€HØ�w‰w�|‰|˜J¨Ó1€Hà—I‘I“K×€GÜ	ˆh˜Ó	ð  Ø	�‰�Ô÷ð !)€HÔØ‡I�I„Kð Ø$Ø,¨X¨JÐ7ñð ð  ø÷ð üs*   ‚E2GÅ4F?Å5GÆGÆ)GÇG
ÇG):Úsysr8   ÚinsertÚurllib.parser   Úfastapir   r   r   r   r	   r
   Úfastapi.responsesr   Úsqlalchemy.ormr   Ú
sqlalchemyr   Úpydanticr   r   Útypingr   r¦   r   r   r§   r   Úapp.models.main_customerr   Úapp.api.main.authr   Ú
app.configr   Úrouterr'   rF   r.   r5   r:   r<   rI   rM   ÚdictrS   Úgetr\   Úpostrt   ÚputrO   ry   r{   rf   rh   ri   rk   rÒ   r-   r(   r&   ú<module>rä      sã  ðÛ 
Ø ‡�‡��Ð1Ô 2å !ç P× PÝ *Ý "Ý $ß %Ý ç :Ý )Ý -Ý 3Ý á	Ð/Ð7GÐ6HÔ	I€òð. Sð .¨Só .ðY Cð Y¨Có Yð0 cð 0¨có 0ô
_˜Iô _ôZ˜Iô Zô�yô ð	˜ð 	 dó 	ð ‡�ˆBÐ)Ð7^€Ó_á˜+Ó&Ù$Ð%:Ó;ñ5Øð5àò5ó `ð5ð ‡�ˆR˜S¨/ð  HA€ó  Bñ ˜+Ó&Ù$Ð%:Ó;ñ1'Ø
ð1'àð1'ð ò1'ó Bð1'ðh ‡�ÐÐ&:ð  I}€ó  ~ñ ˜+Ó&Ù$Ð%:Ó;ñ	#'Øð#'à
ð#'ð 	ð#'ð ò	#'ó ~ð#'ðL ‡�ÐÐ&7ÐEn€Óoñ ˜+Ó&Ù$Ð%:Ó;ñ'Øð'àð'ð ò'ó pð'ð Sð °tó ð.f 3ó fð(˜cð ¨#ð °Só ðBM Só Mð` ‡�Ð(Ð2Ið  XL€ó  Mñ ˜C“yÙ˜+Ó&Ù$Ð%:Ó;ñ	'Øð'à
ð'ð 	ð'ð ò	'ó Mñ'r(   