§
    ŽnËj²-  ã                  óF  — d Z ddlmZ ddlmZ ddlZddlmZ ddlZddl	m
Z
mZmZ ddlmZmZ ddlZddlmZ dd	lmZmZmZ  ej        e¦  «        Zd
Z ej        d¦  «        Ze G d„ d¦  «        ¦   «         Zd&d„Zd&d„Z d'd„Z!d(d„Z"d)d„Z#d*d„Z$	 	 d+d,d#„Z%ed$dfd-d%„Z&dS ).uó  
YouTube Downloader Module for VideoDetection.
Há»— trá»£ táº£i video hoáº·c 1 Ä‘oáº¡n chá»‰ Ä‘á»‹nh (máº·c Ä‘á»‹nh 1h Ä‘áº§u) tá»« YouTube:
- Há»— trá»£ ID 11 kÃ½ tá»±, Full URL, URL rÃºt gá»�n youtu.be, Shorts, Embed, Live.
- Chá»‰ táº£i Ä‘Ãºng phÃ¢n Ä‘oáº¡n dá»¯ liá»‡u cáº§n thiáº¿t (Range request) qua yt-dlp vÃ  ffmpeg.
- Máº·c Ä‘á»‹nh lÆ°u vÃ o Target/, tÃ¹y chá»�n lÆ°u vÃ o Data/ hoáº·c thÆ° má»¥c chá»‰ Ä‘á»‹nh.
- Há»— trá»£ bÃ¡o cÃ¡o tiáº¿n Ä‘á»™ thá»�i gian thá»±c cho cáº£ CLI vÃ  GUI.
é    )Úannotations)Ú	dataclassN)ÚPath)ÚCallableÚOptionalÚTuple)Úparse_qsÚurlparseé   )ÚDATA_DIRÚ
TARGET_DIRÚget_ffmpeg_pathz*00:00:00-01:00:00z^[a-zA-Z0-9_-]{11}$c                  ó€   — e Zd ZU dZded<   dZded<   dZded	<   dZded
<   dZded<   dZ	ded<   dZ
ded<   dZded<   dS )ÚYouTubeDownloadResultu    Káº¿t quáº£ táº£i video YouTube.ÚboolÚsuccessNzOptional[Path]Ú	file_pathÚ ÚstrÚvideo_idÚtitleç        ÚfloatÚduration_secúOptional[str]ÚsectionÚdest_dirÚerror_message)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r   r   r   r   r   r   © ó    ú>C:\Projects\VideoDetection\src\ingestion\youtube_downloader.pyr   r       s”   € € € € € € à*Ð*Ø€M€M�MØ $€IÐ$Ð$Ð$Ñ$Ø€HÐÐÐÑØ€E€O€O€O�OØ€LÐÐÐÑØ!€GÐ!Ð!Ð!Ñ!Ø#€HÐ#Ð#Ð#Ñ#Ø#'€MÐ'Ð'Ð'Ñ'Ð'Ð'r%   r   Ú	url_or_idr   Úreturnc                óæ  — | st          d¦  «        ‚|                      ¦   «         }t                               |¦  «        r|S |                     d¦  «        sd|z   }t          |¦  «        }|j        pd                     ¦   «         }d|v rNd„ |j         	                    d¦  «        D ¦   «         }|r(t                               |d         ¦  «        r|d         S d	|v sd
|v rÔ|j        dk    s|j                             d¦  «        rJt          |j        ¦  «        }d|v r2|d         r*|d         d         }t                               |¦  «        r|S d„ |j         	                    d¦  «        D ¦   «         }t          |¦  «        dk    r.|d         dv r$|d         }t                               |¦  «        r|S t          j        d| ¦  «        }|r|                     d¦  «        S t          d| › d�¦  «        ‚)u²   
    TrÃ­ch xuáº¥t YouTube video ID (11 kÃ½ tá»±) tá»« chuá»—i nháº­p vÃ o:
    Há»— trá»£: ID thÃ´, link Ä‘áº§y Ä‘á»§ youtube.com, rÃºt gá»�n youtu.be, shorts, embed, live.
    u2   URL hoáº·c Video ID khÃ´ng Ä‘Æ°á»£c Ä‘á»ƒ trá»‘ng.)zhttp://úhttps://r*   r   zyoutu.bec                ó   — g | ]}|¯|‘ŒS r$   r$   ©Ú.0Úps     r&   ú
<listcomp>z&extract_youtube_id.<locals>.<listcomp>D   ó   € Ð=Ð=Ð=˜A¸1Ð=�aÐ=Ð=Ð=r%   ú/r   zyoutube.comzyoutube-nocookie.comz/watchz/watch/Úvc                ó   — g | ]}|¯|‘ŒS r$   r$   r,   s     r&   r/   z&extract_youtube_id.<locals>.<listcomp>S   r0   r%   r   )ÚembedÚshortsÚliver2   é   z&(?:v=|\/)([a-zA-Z0-9_-]{11})(?:[&?]|$)uI   KhÃ´ng thá»ƒ nháº­n diá»‡n YouTube Video ID hoáº·c URL há»£p lá»‡ tá»«: 'ú')Ú
ValueErrorÚstripÚYOUTUBE_ID_REGEXÚmatchÚ
startswithr
   ÚhostnameÚlowerÚpathÚsplitr	   ÚqueryÚlenÚreÚsearchÚgroup)r'   ÚcleanedÚparsedr>   Ú
path_partsÚqsÚvidÚfallback_matchs           r&   Úextract_youtube_idrM   -   s"  € ð
 ð OÝÐMÑNÔNÐNà�oŠoÑÔ€Gõ ×Ò˜gÑ&Ô&ð Øˆð ×ÒÐ5Ñ6Ô6ð 'Ø˜wÑ&ˆå�gÑÔ€FØ”Ð% 2×,Ò,Ñ.Ô.€Hð �XÐÐØ=Ð= ¤×!2Ò!2°3Ñ!7Ô!7Ð=Ñ=Ô=ˆ
Øð 	!Õ*×0Ò0°¸A´Ñ?Ô?ð 	!Ø˜a”=Ð ð ˜Ð Ð Ð$:¸hÐ$FÐ$FàŒ;˜(Ò"Ð" f¤k×&<Ò&<¸YÑ&GÔ&GÐ"Ý˜&œ,Ñ'Ô'ˆBØ�bˆyˆy˜R œWˆyØ˜”g˜a”j�Ý#×)Ò)¨#Ñ.Ô.ð Ø�Jð >Ð= ¤×!2Ò!2°3Ñ!7Ô!7Ð=Ñ=Ô=ˆ
Ýˆz‰?Œ?˜aÒÐ J¨q¤MÐ5UÐ$UÐ$UØ˜Q”-ˆCÝ×%Ò% cÑ*Ô*ð Ø�
õ ”YÐHÈ)ÑTÔT€NØð 'Ø×#Ò# AÑ&Ô&Ð&å
ÐmÐajÐmÐmÐmÑ
nÔ
nÐnr%   c                ó*   — t          | ¦  «        }d|› �S )uW   Chuáº©n hÃ³a thÃ nh URL xem trá»±c tiáº¿p chuáº©n: https://www.youtube.com/watch?v=<ID>z https://www.youtube.com/watch?v=)rM   )r'   rK   s     r&   Únormalize_youtube_urlrO   a   s   € å
˜YÑ
'Ô
'€CØ3¨cÐ3Ð3Ð3r%   Útokenr   c                ó.  — |                       ¦   «                              d¦  «        } |                      ¦   «         dv rt          d¦  «        S |                      ¦   «         rt          | ¦  «        S t          j        | ¦  «        }|�t          |¦  «        ndS )uL   Chuyá»ƒn Ä‘á»•i token thá»�i gian (giÃ¢y hoáº·c HH:MM:SS) thÃ nh sá»‘ giÃ¢y.Ú*)ÚinfÚinfinityÚendÚhetrS   Nr   )r:   Úlstripr?   r   ÚisdigitÚytdlp_utilsÚparse_duration)rP   Údurs     r&   Ú_parse_time_token_to_secr\   g   s}   € à�KŠK‰MŒM× Ò  Ñ%Ô%€EØ‡{‚{�}„}Ð9Ð9Ð9Ý�U‰|Œ|ÐØ‡}‚}�„ð Ý�U‰|Œ|Ðå
Ô
$ UÑ
+Ô
+€CØ˜�5�‰:Œ:ˆ:¨cÐ1r%   r   r   c                óŠ  — | €dS |                       ¦   «         }|                     ¦   «         dv rdS |r|                     ¦   «         dv rt          S d„ |                     d¦  «                             d¦  «        D ¦   «         }t          |¦  «        dk    rd|d         › d|d	         › �S |                     d¦  «        sd|› �S |S )
uã   
    Chuáº©n hÃ³a chuá»—i section:
    - None / "all" / "full" / "toan_bo" -> None (táº£i toÃ n bá»™ video)
    - "" / "default" / "1h" / "1h_dau" -> "*00:00:00-01:00:00" (1h Ä‘áº§u)
    - "01:30 - 05:00" -> "*01:30-05:00"
    N)ÚallÚfullÚtoan_boÚnone)ÚdefaultÚ1hÚ1h_dauc                ó6   — g | ]}|                      ¦   «         ‘ŒS r$   )r:   r,   s     r&   r/   z'parse_section_range.<locals>.<listcomp>…   s    € Ð?Ð?Ð?˜1ˆQ�WŠW‰YŒYÐ?Ð?Ð?r%   rR   ú-r   r   r7   )r:   r?   ÚDEFAULT_SECTION_1HrW   rA   rC   r=   )r   Úsec_strÚpartss      r&   Úparse_section_rangerj   s   sÙ   € ð €Øˆtà�mŠm‰oŒo€GØ‡}‚}�„Ð<Ð<Ð<Øˆtàð "�g—m’m‘o”oÐ)DÐDÐDÝ!Ð!ð @Ð? §¢¨sÑ 3Ô 3× 9Ò 9¸#Ñ >Ô >Ð?Ñ?Ô?€EÝ
ˆ5�z„z�Q‚€Ø(�5˜”8Ð(Ð(˜e AœhÐ(Ð(Ð(à×Ò˜cÑ"Ô"ð Ø�7ˆ}ˆ}ÐØ€Nr%   úOptional[Tuple[float, float]]c                ó  — t          | ¦  «        }|€dS |                     d¦  «        }|                     d¦  «        }t          |¦  «        dk    rdS t	          |d         ¦  «        }t	          |d         ¦  «        }||fS )uD   PhÃ¢n tÃ­ch chuá»—i section thÃ nh cáº·p tuple (start_sec, end_sec).NrR   rf   r   )r   g      ¬@r   r7   )rj   rW   rA   rC   r\   )r   Únorm_sectionrG   ri   ÚstartrU   s         r&   Úparse_range_to_secondsro   Ž   s~   € å& wÑ/Ô/€LØÐØˆtà×!Ò! #Ñ&Ô&€GØ�MŠM˜#ÑÔ€EÝ
ˆ5�z„z�Q‚€Øˆ}å$ U¨1¤XÑ.Ô.€EÝ
" 5¨¤8Ñ
,Ô
,€CØ�3ˆ<Ðr%   ÚdestúOptional[str | Path]r   c                ó|  — | €t           }nšt          | t          ¦  «        rd|                      ¦   «                              ¦   «         }|dk    rt           }nQ|dk    rt
          }nCt          | ¦  «                             ¦   «         }n!t          | ¦  «                             ¦   «         }|                     dd¬¦  «         |S )uÖ   
    XÃ¡c Ä‘á»‹nh thÆ° má»¥c Ä‘Ã­ch:
    - 'target' / 'Target' / None -> TARGET_DIR
    - 'data' / 'Data' -> DATA_DIR
    - Ä�Æ°á»�ng dáº«n tÃ¹y biáº¿n Path/str -> resolve vÃ  táº¡o thÆ° má»¥c náº¿u chÆ°a cÃ³.
    NÚtargetÚdataT)ÚparentsÚexist_ok)	r   Ú
isinstancer   r:   r?   r   r   ÚresolveÚmkdir)rp   Úout_dirÚ
lower_dests      r&   Úresolve_dest_dirr|   ž   sª   € ð €|ÝˆˆÝ	�D�#Ñ	Ô	ð 	'Ø—Z’Z‘\”\×'Ò'Ñ)Ô)ˆ
Ø˜Ò!Ð!Ý ˆGˆGØ˜6Ò!Ð!ÝˆGˆGå˜4‘j”j×(Ò(Ñ*Ô*ˆGˆGå�t‘*”*×$Ò$Ñ&Ô&ˆà‡M‚M˜$¨€MÑ.Ô.Ð.Ø€Nr%   r   Úprogress_callbackú$Optional[Callable[[int, str], None]]Údictc           
     óf  ‡— t          |¦  «        }t          | dz  ¦  «        }ddddd|iddddi idœ	}t          ¦   «         }|rEt          |¦  «                             ¦   «         r$t          t          |¦  «        j        ¦  «        |d	<   |�t          j        d
|g¦  «        |d<   ‰rdˆfd„}|g|d<   |S )u  
    XÃ¢y dá»±ng cáº¥u hÃ¬nh YoutubeDL tá»‘i Æ°u cho VideoDetection:
    - Ä�á»‹nh dáº¡ng MP4 chuáº©n vá»›i H.264/AAC.
    - Cáº¯t section chÃ­nh xÃ¡c khÃ´ng giáº­t khung hÃ¬nh (--force-keyframes-at-cuts).
    - Táº­n dá»¥ng Node.js runtime cho JavaScript engine cá»§a YouTube.
    z%(title).100B [%(id)s].%(ext)sTz8bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/bestÚmp4rb   FÚnode)	ÚquietÚno_warningsÚformatÚmerge_output_formatÚouttmplÚwindowsfilenamesÚrestrictfilenamesÚforce_keyframes_at_cutsÚjs_runtimesÚffmpeg_locationNÚdownload_rangesÚdr   c           	     óH  •— |                       d¦  «        }|dk    rñ|                       d¦  «        p|                       d¦  «        pd}|                       d¦  «        pd}|dk    rt          ||z  dz  ¦  «        nd}|                       d	d
¦  «                             ¦   «         }|                       dd
¦  «                             ¦   «         }|rd|› �nd
}|rd|› �nd
} ‰	t          dt	          d|¦  «        ¦  «        d|› |› �¦  «         d S |dk    r ‰	dd¦  «         d S d S )NÚstatusÚdownloadingÚtotal_bytesÚtotal_bytes_estimater   Údownloaded_byteséZ   é2   Ú
_speed_strr   Ú_eta_stru    | Tá»‘c Ä‘á»™: u    | CÃ²n láº¡i: é   u   Ä�ang táº£i video...Úfinishedé_   u(   Ä�ang ghÃ©p ná»‘i vÃ  Ä‘Ã³ng gÃ³i MP4...)ÚgetÚintr:   ÚminÚmax)
rŽ   r�   ÚtotalÚ
downloadedÚpctÚspeedÚetaÚ	speed_strÚeta_strr}   s
            €r&   Úprogress_hookz*build_ytdlp_options.<locals>.progress_hookÜ   sV  ø€ Ø—U’U˜8‘_”_ˆFØ˜Ò&Ð&ØŸš˜mÑ,Ô,ÐR°·²Ð6LÑ0MÔ0MÐRÐQR�ØŸUšUÐ#5Ñ6Ô6Ð;¸!�
Ø8=Àº	¸	•c˜:¨Ñ-°Ñ2Ñ4Ô4Ð4Àr�ØŸš˜l¨BÑ/Ô/×5Ò5Ñ7Ô7�Ø—e’e˜J¨Ñ+Ô+×1Ò1Ñ3Ô3�Ø:?ÐGÐ6¨uÐ6Ð6Ð6ÀR�	Ø58Ð@Ð1¨CÐ1Ð1Ð1¸b�Ø!Ð!¥# b­#¨a°©+¬+Ñ"6Ô"6Ð8cÈyÐ8cÐZaÐ8cÐ8cÑdÔdÐdÐdÐdØ˜:Ò%Ð%Ø!Ð! "Ð&PÑQÔQÐQÐQÐQð &Ð%r%   Úprogress_hooks)rŽ   r   )ro   r   r   r   ÚexistsÚparentrY   Údownload_range_func)r   r   r}   Ú	sec_ranger‡   ÚoptsÚ
ffmpeg_exer§   s     `     r&   Úbuild_ytdlp_optionsr¯   ¶   s	  ø€ õ ' wÑ/Ô/€Iå�(Ð=Ñ=Ñ>Ô>€Gð ØØLØ$Ø˜wÐ'Ø Ø"Ø#'Ø �|ð
ð 
€Dõ !Ñ"Ô"€JØð ?•d˜:Ñ&Ô&×-Ò-Ñ/Ô/ð ?Ý"%¥d¨:Ñ&6Ô&6Ô&=Ñ">Ô">ˆÐÑð ÐÝ"-Ô"AÀ$ÈÈÑ"TÔ"TˆÐÑð ð 1ð	Rð 	Rð 	Rð 	Rð 	Rð 	Rð #0 ˆÐÑà€Kr%   rs   c           
     óà  — d}	 t          | ¦  «        }t          |¦  «        }t          |¦  «        }t          |¦  «        }|r$|t          k    rdn|pd} |dd|› d|› d�¦  «         t          |||¬¦  «        }	t          j        |	¦  «        5 }
|
                     |d	¬
¦  «        }|st          d|› �¦  «        ‚| 
                    dd|› �¦  «        }t          | 
                    dd¦  «        ¦  «        }|
                     |¦  «        }t          |¦  «                             d¦  «        }|                     ¦   «         s`t          |¦  «        }|                     ¦   «         r|}n:t!          |                     d|› d�¦  «        ¦  «        }|rt%          |d„ ¬¦  «        }|                     ¦   «         st'          d|› �¦  «        ‚|r |dd|j        › �¦  «         t+          d	||||||¬¦  «        cddd¦  «         S # 1 swxY w Y   dS # t,          $ rY}t.                               d|› �d	¬¦  «         |r |dd|› �¦  «         t+          d|t3          |¦  «        ¬¦  «        cY d}~S d}~ww xY w) u´  
    Táº£i video hoáº·c má»™t Ä‘oáº¡n chá»‰ Ä‘á»‹nh tá»« YouTube vÃ o thÆ° má»¥c Ä‘Ã­ch:
    - url_or_id: ID 11 kÃ½ tá»± hoáº·c link YouTube báº¥t ká»³.
    - section: Ä�oáº¡n cáº§n táº£i (Máº·c Ä‘á»‹nh 1h Ä‘áº§u: '*00:00:00-01:00:00', hoáº·c 'all' Ä‘á»ƒ táº£i háº¿t).
    - dest: 'target' (máº·c Ä‘á»‹nh) hoáº·c 'data' hoáº·c Ä‘Æ°á»�ng dáº«n Path tÃ¹y chá»�n.
    - progress_callback: HÃ m nháº­n (tiáº¿n Ä‘á»™ %, thÃ´ng Ä‘iá»‡p).
    r   u   1 Giá»� Ä‘áº§uu
   ToÃ n bá»™r™   u   Ä�ang káº¿t ná»‘i YouTube (ID: u   , PhÃ¢n Ä‘oáº¡n: z)...)r   r   r}   T)Údownloadu*   KhÃ´ng thá»ƒ láº¥y thÃ´ng tin video tá»«: r   ÚYouTube_Údurationr   z.mp4rR   z*.mp4c                ó4   — |                       ¦   «         j        S )N)ÚstatÚst_mtime)r.   s    r&   ú<lambda>z(download_youtube_video.<locals>.<lambda>"  s   € ÀaÇfÂfÁhÄhÔFW€ r%   )Úkeyu7   KhÃ´ng tÃ¬m tháº¥y file video Ä‘áº§u ra sau khi táº£i: éd   u   Táº£i hoÃ n táº¥t: )r   r   r   r   r   r   r   Nu   Lá»—i khi táº£i video YouTube: )Úexc_infor   u   Lá»—i táº£i video: F)r   r   r   )rM   rO   r|   rj   rg   r¯   Úyt_dlpÚ	YoutubeDLÚextract_infoÚRuntimeErrorrœ   r   Úprepare_filenamer   Úwith_suffixr©   ÚlistÚglobrŸ   ÚFileNotFoundErrorÚnamer   Ú	ExceptionÚloggerÚerrorr   )r'   r   rp   r}   r   Úcanonical_urlÚ
target_dirrm   Úsec_displayÚydl_optsÚydlÚinfor   r[   Úraw_filenameÚ
final_pathÚ	candidateÚmatched_filesÚes                      r&   Údownload_youtube_videorÓ   ï   sf  € ð €Hð?
Ý% iÑ0Ô0ˆÝ-¨hÑ7Ô7ˆÝ% dÑ+Ô+ˆ
Ý*¨7Ñ3Ô3ˆàð 	qØ.:Õ>PÒ.PÐ.PÐ*Ð*ÐWcÐWsÐgsˆKØÐ˜aÐ!oÀ8Ð!oÐ!oÐ^iÐ!oÐ!oÐ!oÑpÔpÐpå&ØØ Ø/ð
ñ 
ô 
ˆõ Ô˜hÑ'Ô'ð %	¨3Ø×#Ò# M¸DÐ#ÑAÔAˆDØð aÝ"Ð#_ÐP]Ð#_Ð#_Ñ`Ô`Ð`à—H’H˜WÐ&;°Ð&;Ð&;Ñ<Ô<ˆEÝ˜Ÿš ¨SÑ1Ô1Ñ2Ô2ˆCð ×/Ò/°Ñ5Ô5ˆLÝ˜lÑ+Ô+×7Ò7¸Ñ?Ô?ˆJð ×$Ò$Ñ&Ô&ð YÝ  Ñ.Ô.�	Ø×#Ò#Ñ%Ô%ð YØ!*�J�Jõ %)¨¯ªÐ9L¸XÐ9LÐ9LÐ9LÑ)MÔ)MÑ$NÔ$N�MØ$ð YÝ%(¨Ð<WÐ<WÐ%XÑ%XÔ%X˜
à×$Ò$Ñ&Ô&ð pÝ'Ð(nÐblÐ(nÐ(nÑoÔoÐoà ð PØ!Ð! #Ð'N¸Z¼_Ð'NÐ'NÑOÔOÐOå(ØØ$Ø!ØØ Ø$Ø#ðñ ô ð;%	ð %	ð %	ð %	ñ %	ô %	ð %	ð %	ð %	ð %	ð %	ð %	øøøð %	ð %	ð %	ð %	ð %	ð %	øõN ð 
ð 
ð 
Ý�ŠÐ:°qÐ:Ð:ÀTˆÑJÔJÐJØð 	<ØÐ˜aÐ!:°qÐ!:Ð!:Ñ;Ô;Ð;Ý$ØØÝ˜a™&œ&ð
ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøøð	
øøøsD   „BH
 ÂE$G=Ç0H
 Ç=HÈH
 ÈHÈH
 È

I-ÈAI(É"I-É(I-)r'   r   r(   r   )rP   r   r(   r   )r   r   r(   r   )r   r   r(   rk   )rp   rq   r(   r   )NN)r   r   r   r   r}   r~   r(   r   )
r'   r   r   r   rp   rq   r}   r~   r(   r   )'r"   Ú
__future__r   Údataclassesr   ÚloggingÚpathlibr   rD   Útypingr   r   r   Úurllib.parser	   r
   r»   Úyt_dlp.utilsÚutilsrY   Ú
core.pathsr   r   r   Ú	getLoggerr   rÆ   rg   Úcompiler;   r   rM   rO   r\   rj   ro   r|   r¯   rÓ   r$   r%   r&   ú<module>rß      sÿ  ððð ð #Ð "Ð "Ð "Ð "Ð "à !Ð !Ð !Ð !Ð !Ð !Ø €€€Ø Ð Ð Ð Ð Ð Ø 	€	€	€	Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +à €€€Ø "Ð "Ð "Ð "Ð "Ð "à >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ð >à	ˆÔ	˜8Ñ	$Ô	$€ð *Ð ð �2”:Ð4Ñ5Ô5Ð ð ð	(ð 	(ð 	(ð 	(ð 	(ñ 	(ô 	(ñ „ð	(ð1oð 1oð 1oð 1oðh4ð 4ð 4ð 4ð	2ð 	2ð 	2ð 	2ðð ð ð ð6ð ð ð ð ð ð ð ð4 "Ø>Bð6ð 6ð 6ð 6ð 6ðv 0Ø!)Ø>Bð	M
ð M
ð M
ð M
ð M
ð M
ð M
r%   