Ë
    ÎwÀj�   ã            X       ó
  — U d dl mZmZmZmZmZmZ d dl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 d dlmZmZmZmZmZmZmZmZmZmZmZ d dlm Z  d d	l!m"Z"m#Z#m$Z$m%Z%m&Z& d d
l'm(Z( d dl)m*Z*m+Z+ d dl,m-Z-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9 d dl:m:Z:m;Z;m<Z< d dl=Z=d dl>Z>d dl?Z? e e e8d«      «      g¬«      Z@e?j‚                  j…                  e?j‚                  j…                  e?j‚                  j…                  e?j‚                  j‡                  eD«      «      «      «      ZE ee?j‚                  j�                  eEd«      ¬«      ZGi ZHeIeJeIf   eKd<   dZLe@j›                  de¬«       ee«      fdedefd„«       ZNe@j›                  d«       ee«      fdeJdeOdefd „«       ZPe@j£                  d«       ed!«       ed!«       ed!«       ed!«       ed!«       ed"«       ed!«       ed«       ed«       ed#«       ed$«       ed%«       ed«       ed«       ed«       ed«       ed«       ed&«       ed&«       ed'«       ed(«       ed)«       ed*«       ed«       ed«       ed«       ed«       ed+«       ed,«       ed-«       ed«       ed«       ed«       ed«       ed«       ed.«       ed.«       ed.«       ed.«       ed«       ed«       ee«      f*ded/eOd0eOd1eOd2eOd3eOd4eOd5eJd6eOd7eJdz  d8eOd9eOd:eOd;eOd<eOd=eOd>eOd?eJdz  d@eJdAeJdBeJdCeJdDeJdEeOdFeOdGeOdeJdz  dHeJdz  dIeOdJeOdKeOdLeOdMeOdNeJdz  dOeOdPeOdQeOdReOdSeOdTeOdUeOdVeJdz  defVdW„«       ZRe@j›                  dXe¬«       ee«       ee9«      fdYeJdedefdZ„«       ZSe@j£                  d[e¬«       ed\«       ee«       ee9«      fdYeJded]eOdefd^„«       ZTe@j›                  d_e¬«       ee«      fdYeJdedefd`„«       ZUe@j£                  da«       ed!«       ee«       ee9«      fdYeJdbeOdefdc„«       ZVe@j›                  dd«       ee«      fdYeJdefde„«       ZWe@j£                  df«       ee«      fdYeJdefdg„«       ZXe@j£                  dh«       ee«       ee9«      fdYeJdefdi„«       ZYe@j£                  dj«       ee«       ee9«      fdYeJdefdk„«       ZZe@j£                  dl«       ee«       ee9«      fdYeJdefdm„«       Z[e@j¹                  d_«       ee«       e e8dn«      «      fdYeJdefdo„«       Z]y)pé    )Ú	APIRouterÚRequestÚFormÚDependsÚstatusÚHTTPException)ÚHTMLResponseÚJSONResponseÚRedirectResponse)ÚJinja2Templates)ÚAsyncSession)Úselect)Úget_db)ÚCustomerÚCustomerTypeÚCustomerStatusÚProvisioningJobÚProvisioningEventÚServicePackageÚODPÚ	OLTDeviceÚMikrotikDeviceÚAuditLogÚDeviceCredential)Úprovision_customer)Úvalidate_nikÚcustomer_code_forÚdefault_pppoe_usernameÚencrypt_default_pppoe_passwordÚdecrypt_pppoe_password)Úencrypt_secret)Úget_olt_adapterÚUnsupportedOLTError)Úrun_onboardingÚrefresh_customer_online_status)Úget_vendor_profileÚvendor_profiles_for_ui)ÚDiscoveryUnavailableErrorÚInvalidPonPortErrorÚdiscover_unregistered_ontsÚnormalize_pon_port)Úrequire_rolesÚget_current_user)ÚdatetimeÚtimezoneÚ	timedeltaNÚadmin_cs)Údependencieszapp/templates)Ú	directoryÚ_ONU_REBOOT_STATESéx   z/add-customer)Úresponse_classÚrequestÚdbc           
   ƒ   óª  K  — |j                  t        t        «      j                  t        j                  dk(  t        j
                  dk(  t        j                  dk(  «      j                  t        j                  «      «      ƒ d {  –—† j                  «       j                  «       }|j                  t        t        «      j                  t        j                  dk(  «      j                  t        j                  «      «      ƒ d {  –—† j                  «       j                  «       }|j                  t        t        «      j                  t        j                  dk(  «      j                  t        j                  «      «      ƒ d {  –—† j                  «       j                  «       }|j                  t        t        «      j                  t        j                  dk(  «      j                  t        j                  «      «      ƒ d {  –—† j                  «       j                  «       }t        j!                  | d||||t#        «       dœ¬«      S 7 �ŒÄ7 �ŒH7 ŒË7 ŒN­w)NTÚbulanan_pppÚprivate_pppoezadd_customer.html)ÚpackagesÚodpsÚoltsÚ	mikrotiksÚvendor_profiles©r7   ÚnameÚcontext)Úexecuter   r   ÚwhereÚ	is_activeÚservice_typeÚservice_modeÚorder_byrB   ÚscalarsÚallr   Úcoder   r   Ú	templatesÚTemplateResponser'   )r7   r8   r<   r=   r>   r?   s         úapp/routes/customers.pyÚadd_customer_pagerP   #   sÒ  è ø€ à—j‘j¤¬Ó!7×!=Ñ!=Ü× Ñ  DÑ(Ü×#Ñ# }Ñ4Ü×#Ñ# Ñ6ó"÷ �hŒ~×"Ñ"Ó#ó	%÷ %÷ '.¡g£i·±³ð	 ð
 —*‘*œV¤C›[×.Ñ.¬s¯}©}ÀÑ/DÓE×NÑNÌsÏxÉxÓXÓY×Y×bÑbÓd×hÑhÓj€DØ—*‘*œV¤IÓ.×4Ñ4´Y×5HÑ5HÈDÑ5PÓQ×ZÑZÔ[d×[iÑ[iÓjÓk×k×tÑtÓv×zÑzÓ|€DØ—z‘z¤&¬Ó"8×">Ñ">¼~×?WÑ?WÐ[_Ñ?_Ó"`×"iÑ"iÔjx×j}Ñj}Ó"~Ó×÷  Iñ  Ió  K÷  Oñ  Oó  Q€IÜ×%Ñ%¨gÐ<OÐfnÐx|ð  GKð  Zcô  xNó  xPñ  ZQÐ%ó  Rð  Rð%ùð
 ZùØkøØúsL   ‚BIÂI	ÂA>IÄIÄA>IÆIÆA>IÈIÈAIÉIÉIÉIz(/api/olt-devices/{olt_device_id}/auto-snÚolt_device_idÚpon_portc              ƒ   óX  K  — 	 t        |«      }|j	                  t
        | «      ƒ d{  –—† }|�|j                  st        dd¬«      ‚t        |j                  |j                  «      }|�7|j                  j                  «       |j                  j                  «       fdk7  rt        dd¬«      ‚|j                  st        d	d
g | |ddœ¬«      S |j	                  t        |j                  «      ƒ d{  –—† }|�)|j                  r|j                  j                  «       dk7  rt        d	d
g | |ddœ¬«      S 	 t        j                   t"        |j$                  |j&                  |j(                  |j*                  t-        j.                  d|j0                  › d�«      |¬«      ƒ d{  –—† }d|D �	cg c]  }	|	j4                  ‘Œ c}	| |dœS # t        $ r}t        dt        |«      ¬«      |‚d}~ww xY w7 �ŒÄ7 Œþ7 ŒP# t2        $ r&}t        d	d
g | |t        |«      dœ¬«      cY d}~S d}~ww xY wc c}	w ­w)zHRead unregistered ONT serials through the pinned, read-only OLT session.é¦  ©Ústatus_codeÚdetailNé”  zOLT tidak tersedia)úc-dataú
fd1601s-b1é™  z*Auto SN belum tersedia untuk model OLT inii÷  Fz#Credential Vault OLT belum terikat.)Ú	availableÚresultsrQ   rR   Úreason)rV   ÚcontentÚsshz"Credential SSH OLT tidak tersedia.ÚOLT_Ú_SSH_HOST_KEY_SHA256)ÚhostÚportÚusernameÚencrypted_secretÚpinned_host_keyrR   T)r\   r]   rQ   rR   )r+   r)   r   ÚstrÚgetr   rF   r&   ÚvendorÚmodelÚcasefoldÚcredential_idr
   r   ÚprotocolÚasyncioÚ	to_threadr*   rc   Úapi_portre   rf   ÚosÚgetenvÚidr(   Ú__dict__)
rQ   rR   r8   Únormalized_portÚexcÚoltÚprofileÚ
credentialr]   Úitems
             rO   Úauto_sn_discoveryr|   0   sE  è ø€ ðGÜ,¨XÓ6ˆð —‘”y -Ó0×
0€CØ
€{˜#Ÿ-š-Ü¨Ð4HÔIÐIÜ  §¡¨S¯Y©YÓ7€GØ€˜7Ÿ>™>×2Ñ2Ó4°g·m±m×6LÑ6LÓ6NÐOÐSkÒkÜ¨Ð4`ÔaÐaØ×ÒÜ¨À5ÐUWÐjwð  FUð  aFñ  6Gô  Hð  	HØ—v‘vÔ.°×0AÑ0AÓB×B€JØÐ ×!5Ò!5¸×9LÑ9L×9UÑ9UÓ9WÐ[`Ò9`Ü¨À5ÐUWÐjwð  FUð  aEñ  6Fô  Gð  	GðkÜ×)Ñ)Ü&Ø—‘Ø—‘Ø×(Ñ(Ø'×8Ñ8ÜŸI™I¨¨S¯V©V¨HÐ4HÐ&IÓJØ$ô
÷ 
ˆð ÀWÖ*M¸T¨4¯=«=Ò*MÐ`mð  |Kñ  Lð  Løô5 ò GÜ¨´C¸³HÔ=À3ÐFûðGúð 1ùð Cøð
ùô %ò kÜ¨À5ÐUWÐjwð  FUô  adð  ehó  aiñ  6jô  kõ  	kûðküâ*Mùs”   ‚H*„G �H*¨G,©CH*Ã0G/Ã1AH*Ä4A,G3 Æ G1Æ!G3 Æ%H*Æ*H%Æ=H*Ç	G)ÇG$Ç$G)Ç)H*Ç/H*Ç1G3 Ç3	H"Ç<HÈH"ÈH*ÈH"È"H*.Ú1playr;   z	["pppoe"]Únoneé¯   éd   é–   é   Úbnbv1009ú{}ÚZTEÚC320ÚmanualrB   ÚnikÚaddressÚphoneÚ	cust_typeÚ	play_typeÚharga_paketÚservice_profileÚ
package_idÚprovisioning_modeÚservice_modes_jsonÚont_management_modeÚmanagement_pppoe_usernameÚmanagement_pppoe_passwordÚpppoe_usernameÚpppoe_passwordÚonu_idÚwan_vlanÚservice_vlanÚ
pppoe_vlanÚhotspot_vlanÚ	iptv_vlanÚolt_vlan_profileÚont_snÚ	ont_brandÚmikrotik_device_idÚolt_fields_jsonÚ
olt_vendorÚ	olt_modelÚolt_portÚodp_infoÚodp_idÚodp_latitudeÚodp_longitudeÚont_sn_modeÚonu_id_modeÚolt_port_modeÚont_brand_modeÚmikrotik_userÚvlan_idc+           	   ƒ   óê  K  — 	 t        |«      }|*j	                  t        t        j                  «      j                  t        j                  |k(  «      «      ƒ d {  –—† rt        dd¬«      ‚|	r|*j                  t        |	«      ƒ d {  –—† nd },|	r9|,r*|,j                  r|,j                  dk7  s|,j                  dk7  rt        dd¬«      ‚|,r`|,j                  |,j                   }}|,j                  }
|,j"                  |,j$                  |,j&                  }}}|,j(                  |,j*                  }}|d	k7  rt        dd
¬«      ‚dg}-d}
d }d }t-        j.                  |-d¬«      }|!r|*j                  t0        |!«      ƒ d {  –—† nd }.|.�|.j                  st        dd¬«      ‚|r|*j                  t2        |«      ƒ d {  –—† nd }/|/�|/j                  st        dd¬«      ‚|r|*j                  t4        |«      ƒ d {  –—† nd }0|r|0�|0j                  st        dd¬«      ‚|0€6|.r4|.j6                  r(|*j                  t4        |.j6                  «      ƒ d {  –—† }0|0�|0j                  st        dd¬«      ‚||d i f\  }1}2}3}4|/�ru|/j8                  |/j:                  }2}1t=        |1|2«      }5|5€t        dd|1› d|2› �¬«      ‚	 t-        j>                  |xs d«      }6tC        |6tD        «      st        dd¬«      ‚|5jF                  D �7ch c]  }7|7d   ’Œ	 }8}7|6jI                  «       D �9�:ci c]A  \  }9}:|9|8v sŒt        |:«      jK                  «       sŒ%|9t        |:«      jK                  «       d d “ŒC }4}9}:ddddœ|   };dD ]  }<|<|8v sŒ|;|4|<<   Œ |5jF                  D �7cg c]1  }7|7j                  d«      dk(  sŒ|4j                  |7d   «      rŒ-|7d    ‘Œ3 }=}7|=rt        dd!d"jM                  |=«      z   ¬«      ‚|5jN                  }3|1jQ                  «       d#k(  r|2jQ                  «       d$k(  rd%\  }}}|}t        d_i d&|“d'|“d(|“d)|“d*|“d+|“d,|“d-|,r|,j                  nd “d.|,r|,jR                  nd “d/|,r|,j                  n|
“d0|“d1|d2v r|nd3“d4|“d5|“d6|
“d7|“d8d “d9d “d:|“d;|“d<|“d=|“d>|“d?|“d@|“dA|“dB|“dC|/r|/j                  nd “dD|0r|0j                  nd “dE|1“dF|2“dG|3“dH|4rt-        j.                  |4dI¬J«      nd “dK|“dL| “dM|.r|.j                  nd “dN|"“dO|#“dP|$dQv r|$ndR“dS|%dQv r|%ndR“dT|&dQv r|&ndR“dU|'dQv r|'ndR“dVdW“dX|(“dY|)“dZtT        jV                  “Ž}>|*jY                  |>«       |*j[                  «       ƒ d {  –—†  t]        |>j                  «      |>_/        ta        |>j^                  «      |>_1        te        |>j^                  «      |>_3        d[|>_4        tk        |>|*«      ƒ d {  –—†  tm        d\|>j                  › d]�tn        jp                  ¬^«      S # t        $ r}+t        dt        |+«      ¬«      ‚d }+~+ww xY w7 �ŒÎ7 �Œ¤7 �Œ¶7 �Œ|7 �ŒB7 �Œî# t,        j@                  $ r t        dd¬«      ‚w xY wc c}7w c c}:}9w c c}7w 7 �Œ7 Œ�­w)`NrT   rU   r[   zNIK sudah terdaftarr:   r;   é�  z&PSB hanya menerima paket bulanan PPPoEr}   z/Form PSB ini hanya menerima layanan 1Play PPPoEÚpppoe)ú,ú:)Ú
separatorsz$Pilih ODP aktif sebelum provisioningz$Pilih OLT aktif sebelum provisioningzMikroTik/NAS tidak tersediaz-Pilih MikroTik/NAS aktif sebelum provisioningz)Profil provisioning belum tersedia untuk ú r„   z"Field provisioning OLT tidak validz)Field provisioning OLT harus berupa objekÚkeyé    Ú1pÚ2pÚ3p)r}   Ú2playÚ3play)Úline_profilerŽ   Úont_line_profileÚont_srv_profileÚrequiredÚtrueÚlabelzField OLT wajib: z, rY   rZ   )r€   r�   éÈ   rB   rˆ   r‰   rŠ   ÚtyperŒ   r�   Úservice_package_idÚservice_profile_idrH   rŽ   r’   >   r~   r±   r~   r“   r”   r�   r‘   r•   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   rQ   r    r¢   r£   Úolt_adapter_keyr¡   T)Ú	sort_keysr¤   r¥   r¦   r§   r¨   r©   >   Úautor‡   r‡   rª   r«   r¬   Úhardware_discovery_statusÚunavailabler­   r®   r   é   ú/customers/z/credentials/initial©ÚurlrV   © )9r   Ú
ValueErrorr   rh   Úscalarr   r   rt   rE   rˆ   ri   r   rF   rG   rH   ÚpriceÚmikrotik_profiler�   r™   rœ   rš   r›   ÚjsonÚdumpsr   r   r   r    rj   rk   r&   ÚloadsÚJSONDecodeErrorÚ
isinstanceÚdictÚfieldsÚitemsÚstripÚjoinr¶   rl   rÆ   r   ÚREQUESTÚaddÚflushr   Úcustomer_coder   r•   r   r–   Úpppoe_secret_versionr$   r   r   ÚHTTP_303_SEE_OTHER)?r7   rB   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   r”   r•   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   rQ   r    r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   r8   rw   ÚpackageÚservice_modesÚselected_odpÚselected_oltÚselected_mikrotikrj   rk   Úadapter_keyÚ
olt_fieldsry   Úsupplied_fieldsÚfieldÚallowedr¶   ÚvalueÚprofile_nameÚprofile_keyÚmissingÚnew_customers?                                                                  rO   Úadd_customerrô   U   sÏ  è ø€ ð\>Ü˜3Óˆð �Y‰Y”vœhŸk™kÓ*×0Ñ0´·±ÀÑ1DÓEÓF×FÐFÜ¨Ð4IÔJÐJÙ:D�B—F‘Fœ>¨:Ó6×6Ð6È$€GÙ™7¨'×*;Ò*;¸w×?SÑ?SÐWdÒ?dÐho×h|Ñh|ð  APò  iPÜ¨Ð4\Ô]Ð]ÙØ'.§}¡}°g×6NÑ6N�_ˆØ#×0Ñ0ÐØ4;×4LÑ4LÈg×NbÑNbÐdk×duÑdu¨	˜,ÐØ#*×#5Ñ#5°w×7KÑ7K�Lˆ
Ø�GÒÜ¨Ð4eÔfÐfØ�I€MØ'Ðð €NØ€NÜŸ™ M¸jÔIÐÙ06˜Ÿ™¤ VÓ,×,Ð,¸D€LØÐ <×#9Ò#9Ü¨Ð4ZÔ[Ð[Ù=J˜Ÿ™¤	¨=Ó9×9Ð9ÐPT€LØÐ <×#9Ò#9Ü¨Ð4ZÔ[Ð[ÙL^˜bŸf™f¤^Ð5GÓH×HÐHÐdhÐÙÐ0Ð8Ð@Q×@[Ò@[Ü¨Ð4QÔRÐRØÐ ¡\°l×6UÒ6UØ"$§&¡&¬¸×9XÑ9XÓ"Y×YÐØÐ Ð(9×(CÒ(CÜ¨Ð4cÔdÐdØ-7¸ÀDÈ"Ð-LÑ*€FˆE�; 
ÚØ$×+Ñ+¨\×-?Ñ-?�ˆÜ$ V¨UÓ3ˆØˆ?Ü¨CÐ:cÐdjÐckÐklÐmrÐlsÐ8tÔuÐuð	^Ü"Ÿj™j¨Ò)@¸DÓAˆOô ˜/¬4Ô0Ü¨CÐ8cÔdÐdØ-4¯^©^Ö< E�5˜“<Ð<ˆÐ<ØFU×F[ÑF[ÓF]÷  H¹
¸¸UÐadÐhoÒaoÔtwÐx}Ót~÷  uEñ  uEõ  uG�cœ3˜u›:×+Ñ+Ó-¨d¨sÐ3Ñ3ð  Hˆ
ñ  HØ!%°¸tÑDÀYÑOˆØeò 	7ˆKØ˜gÒ%Ø*6�
˜;Ò'ð	7ð 07¯~©~ö  G eÀÇÁÈ:ÓAVÐZ`ÓA`Ðis×iwÑiwÐx}ð  Dñ  yEõ  jF�5˜“>ð  Gˆð  GÙÜ¨CÐ8KÈdÏiÉiÐX_ÓN`Ñ8`ÔaÐaØ—k‘kˆØ‡�Ó˜HÒ$¨¯©Ó)9¸\Ò)IØ.;Ñ+ˆ
�L )Ø€LÜò 0Ùð0áð0ñ ð0ñ ð	0ñ
 ð0ñ ð0ñ  ð0ñ *1˜7Ÿ:š:°døð0ñ :A˜7×5Ò5Àdøð0ñ .5�W×)Ò)Ð:Køð0ñ (ð0ð 4GÐJ[Ñ3[Ñ/Ðagøð0ñ #<ð0ñ #<ð0ñ ,ð0ñ  .ð!0ñ$ ð%0ñ& ð'0ñ( ð)0ñ* ð+0ñ, "ð-0ñ. ð/0ñ0 "ð10ñ2 ð30ñ4 *ð50ñ6 ð70ñ8 ð90ñ: *6�l—o’o¸4øð;0ñ< 4EÐ,×/Ò/È$øð=0ñ> ð?0ñ@ ðA0ñB $ðC0ñD CMœŸ
™
 :¸Õ>ÐRVøðE0ñF ðG0ñH ðI0ñJ #/ˆ|�Š°DøðK0ñL "ðM0ñN $ðO0ðP $/Ð2DÑ#D‘KÈ(øðQ0ðR $/Ð2DÑ#D‘KÈ(øðS0ðT (5Ð8JÑ'J‘mÐPXøðU0ðV *8Ð;MÑ)M‘~ÐS[øðW0ñX #0ðY0ñZ $ð[0ñ\ ð]0ô^ ×%Ò%ð_0€Lðb ‡F�Fˆ<ÔØ
�(‰(‹*×ÐÜ!2°<·?±?Ó!C€LÔÜ"8¸×9SÑ9SÓ"T€LÔÜ"@À×A[ÑA[Ó"\€LÔØ()€LÔ%ä
˜ rÓ
*×*Ð*Ü +¨l¯o©oÐ->Ð>RÐ SÔag×azÑazÔ{Ð{øôi ò >Ü¨´C¸³HÔ=Ð=ûð>úàFùà6ùð" -ùð :ùð Iùð Zúô ×#Ñ#ò 	^Ü¨CÐ8\Ô]Ð]ð	^üò =ùó Hùò
 Gðr ùð +ús  ‚Y3„X �AY3ÁX(Á,Y3ÂX+ÂC0Y3Å8X.Å9<Y3Æ5X1Æ6<Y3Ç2X4Ç3AY3É	X7É
A&Y3Ê1X: Ë
+Y3Ë5YÌY3ÌY#Ì#Y#Ì=Y#ÍY3Í2Y3ÎY)Î!Y)Î6Y)Î=F-Y3Õ*Y.Õ+A(Y3×Y1×-Y3Ø	X%Ø
X Ø X%Ø%Y3Ø+Y3Ø.Y3Ø1Y3Ø4Y3Ø7Y3Ø:!YÙY3Ù1Y3z,/customers/{customer_id}/credentials/initialÚcustomer_idc           	   ƒ   óú  K  — |j                  t        | «      ƒ d {  –—† }|st        dd¬«      ‚|j                  �t        dd¬«      ‚t	        |j
                  «      }t        j                  t        j                  «      |_        |j                  t        |j                  dd|j                  |j                  ¬«      «       |j                  «       ƒ d {  –—†  t        j!                  |d	||d
dœ¬«      S 7 ŒÚ7 Œ"­w)NrX   úPelanggan tidak ditemukanrU   iš  zGKredensial awal sudah ditampilkan. Gunakan reset admin bila diperlukan.Úreveal_initial_pppoeÚcustomer©Úuser_idÚactionÚentityÚ	entity_idrW   úcredential_notice.htmlzKredensial provisioning awal©rù   ÚpasswordÚmoderA   )ri   r   r   Úpppoe_secret_revealed_atr    r–   r.   Únowr/   Úutcrà   r   rt   râ   ÚcommitrM   rN   )rõ   r7   r8   Úuserrù   r  s         rO   Úreveal_initial_pppoe_credentialr  û   sò   è ø€ à—V‘VœH kÓ2×2€HÙÜ¨Ð4OÔPÐPØ×(Ñ(Ð4Ü¨Ð4}Ô~Ð~Ü% h×&=Ñ&=Ó>€HÜ(0¯©´X·\±\Ó(B€HÔ%Ø‡F�FŒ8˜DŸG™GÐ,BÈ:Ðai×alÑalÐu}÷  vLñ  vLô  Mô  NØ
�)‰)‹+×ÐÜ×%Ñ%¨gÐ<TÐksð  BJð  Trñ  _sÐ%ó  tð  tð 3øð ús"   ‚C;œC7�B9C;ÃC9Ã!C;Ã9C;z*/customers/{customer_id}/credentials/resetÚ Únew_passwordc           	   ƒ   ó,  K  — |j                  t        | «      ƒ d {  –—† }|st        dd¬«      ‚|j                  «       xs |j                  }t        |«      dk  st        |«      dkD  rt        dd¬«      ‚t        |«      |_        |j                  xs dd	z   |_        |j                  t        |j                  d
d|j                  |j                  ¬«      «       |j                  «       ƒ d {  –—†  t        j                  |d||ddœ¬«      S 7 Œó7 Œ"­w)NrX   r÷   rU   é   é€   rT   z*Password PPPoE harus 8 sampai 128 karakterr   rÌ   Úreset_pppoerù   rú   rÿ   zKredensial PPPoE setelah resetr   rA   )ri   r   r   rÝ   râ   Úlenr   r–   rã   rà   r   rt   r  rM   rN   )rõ   r7   r
  r8   r  rù   r  s          rO   Úreset_pppoe_credentialr    s  è ø€ à—V‘VœH kÓ2×2€HÙÜ¨Ð4OÔPÐPØ×!Ñ!Ó#Ò= x×'=Ñ'=€HÜ
ˆ8ƒ}�qÒœC ›M¨CÒ/Ü¨Ð4`ÔaÐaÜ<¸XÓF€HÔØ%-×%BÑ%BÒ%GÀaÈ1Ñ$L€HÔ!Ø‡F�FŒ8˜DŸG™G¨MÀ*ÐX`×XcÑXcÐlt÷  mCñ  mCô  Dô  EØ
�)‰)‹+×ÐÜ×%Ñ%¨gÐ<TÐksð  BJð  Ttñ  _uÐ%ó  vð  vð 3øð ús"   ‚DœD�CDÃ/DÃ0!DÄDz/customers/{customer_id}c           
   ƒ   óú  K  — |j                  t        t        «      j                  t        j                  | k(  «      «      ƒ d {  –—† }|j                  «       }|st        dd¬«      ‚t        ||«      ƒ d {  –—†  d }d }	 t        |j                  |j                  «      }|j                  |«      }t        j!                  |d|||||dœ¬«      S 7 Œ‹7 ŒZ# t        t        f$ r}t        |«      }Y d }~ŒAd }~ww xY w­w)NrX   r÷   rU   zcustomer_detail.html)rù   Ú
zte_configÚzte_config_errorÚdevice_configÚdevice_config_errorrA   )rD   r   r   rE   rt   Úscalar_one_or_noner   r%   r"   r¢   r£   Úgenerate_configrÑ   r#   rh   rM   rN   )	rõ   r7   r8   Úresultrù   r  r  Úadapterrw   s	            rO   Úcustomer_detailr    s	  è ø€ à—:‘:œf¤XÓ.×4Ñ4´X·[±[ÀKÑ5OÓPÓQ×Q€FØ×(Ñ(Ó*€HÙÜ¨Ð4OÔPÐPÜ
(¨°2Ó
6×6Ð6Ø€MØÐð'Ü! (×"5Ñ"5°x×7IÑ7IÓJˆØ×/Ñ/°Ó9ˆô ×%Ñ%¨gÐ<RÐiqð  BOð  exð  KXð  qDñ  ]EÐ%ó  Fð  Fð Røð 7ùô Ô+Ð,ò 'Ü! #›hÕûð'üsN   ‚AC;ÁCÁ2C;Á7CÁ8C;Â1C Â2C;ÃC;ÃC8Ã#C3Ã.C;Ã3C8Ã8C;z#/customers/{customer_id}/onu-actionrü   c              ƒ   óÞ  K  — ddl m}m}m}m} |dvrt        dd¬«      ‚|dk(  rt        dd	¬«      ‚|j                  t        t        «      j                  t        j                  | k(  «      «      ƒ d
{  –—† j                  «       }|st        dd¬«      ‚t        |j                  |j                  |j                  |j                   f«      st        dd¬«      ‚|j#                  t$        |j                  «      ƒ d
{  –—† }	|	r4|	j&                  r(|j#                  t(        |	j&                  «      ƒ d
{  –—† nd
}
|	r#t+        j,                  d|	j                  › d�«      nd
}|	r|
r|
j.                  r|st        dd¬«      ‚	 t1        j2                  ||	j4                  |	j6                  xs d|
j8                  |
j:                  ||j                  |j                  |j                   ¬«	      ƒ d
{  –—† }|st        dd¬«      ‚	 t1        j2                  ||	j4                  |	j6                  xs d|
j8                  |
j:                  ||j                  |j                  ¬«      ƒ d
{  –—† }tA        jB                  tD        jF                  «      }||tI        tJ        ¬«      z   ddd|jL                  dœtN        |j                  <   |jL                  |_(        |jS                  «       ƒ d
{  –—†  tU        d|jL                  ddtJ        d œ«      S 7 �Œ’7 �Œ7 �ŒÙ7 �Œ## t<        $ r"}t        ddt?        |«      d
d › �¬«      |‚d
}~ww xY w7 ŒÞ# |$ r"}t        ddt?        |«      d
d › �¬«      |‚d
}~ww xY w7 Œ‰­w)!a
  Reboot or factory-reset one ONU, then read state back from the OLT.

    Requires a supported OLT, a pinned host key, and a complete ONU address
    (PON port + ONU ID). The response carries the observed state so the table
    can repaint without a page reload.
    r   )ÚCDataExecutionErrorÚfactory_reset_cdata_onuÚreboot_cdata_onuÚverify_cdata_onu)ÚrebootÚresetr°   zAksi tidak dikenal.rU   r!  r[   z=Factory reset dinonaktifkan; hanya reboot aman yang tersedia.NrX   r÷   zPData ONU belum lengkap: perangkat OLT, port PON, ONU ID, dan SN ONT wajib diisi.ra   rb   z4Credential atau fingerprint host-key OLT belum siap.é   ©rc   rd   re   rf   rg   rR   r—   Úserial_numberiö  zVerifikasi target ONU gagal: éð   z@Reboot diblokir: ONU target tidak terverifikasi online pada OLT.©rc   rd   re   rf   rg   rR   r—   zPerintah OLT gagal: i,  )ÚsecondsFTÚcommand_sent)Ú
started_atÚdeadlineÚseen_offlineÚlast_onlineÚphaseÚmessageé¸  )Úokr.  ÚstateÚpoll_interval_msÚtimeout_seconds)+Úapp.core.cdata_executorr  r  r  r  r   rD   r   r   rE   rt   r  rK   rQ   r¤   r—   rž   ri   r   rm   r   rr   rs   rF   ro   rp   rc   rq   re   rf   Ú	Exceptionrh   r.   r  r/   r  r0   Ú_ONU_REBOOT_TIMEOUT_SECONDSr.  r4   Úprovisioning_messager  r
   )rõ   rü   r8   Úcurrent_userr  r  r  r  rù   rx   ÚcredÚpinnedÚ
pre_onlinerw   r  r)  s                   rO   Úcustomer_onu_action_router<  '  s  è ø€ ÷ó ð Ð(Ñ(Ü¨Ð4IÔJÐJØ�ÒÜ¨Ð4sÔtÐtà—j‘j¤¬Ó!1×!7Ñ!7¼¿¹À{Ñ8RÓ!SÓT×T×hÑhÓj€HÙÜ¨Ð4OÔPÐPÜ�×&Ñ&¨×(9Ñ(9¸8¿?¹?ÈHÏOÉOÐ\Ô]ÜØØeô
ð 	
ð
 —‘”y (×"8Ñ"8Ó9×
9€CÙ@CÈ×HYÒHY�—‘Ô(¨#×*;Ñ*;Ó<×<Ð<Ð_c€DÙ?BŒR�Y‰Y˜˜cŸf™f˜XÐ%9Ð:Ô;È€FÙ‘D˜TŸ^š^±Ü¨Ð4jÔkÐkðoÜ"×,Ñ,Ø 3§8¡8°#·,±,Ò2DÀ"ÈtÏ}É}Ø!×2Ñ2ÀFØ×&Ñ&¨x¯©ÈhÏoÉoô
÷ 
ˆ
ñ Ü¨Ð4vÔwÐwðfÜ×(Ñ(Ø 3§8¡8°#·,±,Ò2DÀ"ÈtÏ}É}Ø!×2Ñ2ÀFØ×&Ñ&¨x¯©ô
÷ 
ˆô —‘œhŸl™lÓ+€Jà Ø¤Ô3NÔ!OÑOØØØØ—>‘>ñ'Ô�x—{‘{Ñ#ð %+§N¡N€HÔ!Ø
�)‰)‹+×ÐäØØ—>‘>ØØ Ü6ñó ð ða Uùð :ùØ<ùð
úô
 ò oÜ¨Ð6SÔTWÐX[ÓT\Ð]aÐ^aÐTbÐScÐ4dÔeÐknÐnûðoúð
ùð
 ò fÜ¨Ð6JÌ3ÈsË8ÐTXÐUXÈ>ÐJZÐ4[Ô\ÐbeÐeûðfúð ús³   ‚A1M-Á3LÁ4BM-Ã<LÃ=5M-Ä2LÄ3AM-Æ A+L Ç+LÇ,L Ç0M-È A M É L?É!M É%A<M-Ë!M+Ë"$M-ÌM-ÌM-ÌL Ì	L<ÌL7Ì7L<Ì<M-Ì?M ÍM(ÍM#Í#M(Í(M-z*/customers/{customer_id}/onu-reboot-statusc              ƒ   ó  K  — ddl m} t        j                  | «      }|st	        ddddœ«      S |j                  t
        | «      ƒ d{  –—† }|s#t        j                  | d«       t        dd	¬
«      ‚|j                  t        |j                  «      ƒ d{  –—† }|r4|j                  r(|j                  t        |j                  «      ƒ d{  –—† nd}|r#t        j                  d|j                  › d�«      nd}|r|r|j                  r|st        dd¬
«      ‚t!        j"                  t$        j&                  «      }d}	d}
	 t)        j*                  ||j,                  |j.                  xs d|j0                  |j2                  ||j4                  |j6                  |j8                  ¬«	      ƒ d{  –—† }	|	du rd|d<   d|d<   d|d<   nx|	du rf|d   rad|d<   d|d<   d|_        d|_         |jC                  «       ƒ d{  –—†  t        j                  | d«       t	        dddd|j@                  dœ«      S |	du r
d|d<   d|d<   ||d   k\  rR|d   rdnd}||_         |jC                  «       ƒ d{  –—†  t        j                  | d«       t	        dd|	|d   |dœ«      S t	        |d   d|	|d   |
tE        ||d    z
  jG                  «       «      d!d"œ«      S 7 �Œ„7 �Œ:7 �Œ7 �Œ*# t:        $ r}t=        |«      dd }
Y d}~�ŒEd}~ww xY w7 �Œ7 Œ˜­w)#zJRead the exact ONU from the OLT and advance reboot state from observation.r   )r  ÚidleTzTidak ada reboot aktif.)r1  Úterminalr.  NrX   r÷   rU   ra   rb   r[   zProbe OLT tidak tersedia.r"  r#  é´   Fr+  r,  Úoffliner-  ÚonlineÚprovisionedz2Reboot terverifikasi: ONU kembali online pada OLT.)r1  r?  rB  r+  r.  Úwaiting_offliner*  zCReboot dikirim, tetapi ONU belum kembali online sampai batas waktu.uL   Perintah reboot diterima OLT, tetapi siklus offlineâ†’online belum teramati.Útimeoutr)  r/  )r1  r?  rB  r+  Úprobe_errorÚelapsed_secondsr2  )$r4  r  r4   ri   r
   r   Úpopr   r   rQ   rm   r   rr   rs   rt   rF   r.   r  r/   r  ro   rp   rc   rq   re   rf   r¤   r—   rž   r5  rh   Úolt_provisioning_statusr7  r  ÚintÚtotal_seconds)rõ   r8   r  r1  rù   rx   r9  r:  r  rB  rF  rw   r.  s                rO   Ú customer_onu_reboot_status_routerL  v  s  è ø€ õ 9ä×"Ñ" ;Ó/€EÙÜ f¸$ÐKdÑeÓfÐfà—V‘VœH kÓ2×2€HÙÜ×Ñ˜{¨DÔ1Ü¨Ð4OÔPÐPØ—‘”y (×"8Ñ"8Ó9×
9€CÙ@CÈ×HYÒHY�—‘Ô(¨#×*;Ñ*;Ó<×<Ð<Ð_c€DÙ?BŒR�Y‰Y˜˜cŸf™f˜XÐ%9Ð:Ô;È€FÙ‘D˜TŸ^š^±Ü¨Ð4OÔPÐPä
�,‰,”x—|‘|Ó
$€CØ€FØ€Kð%Ü×(Ñ(Ø 3§8¡8°#·,±,Ò2DÀ"ÈtÏ}É}Ø!×2Ñ2ÀFØ×&Ñ&¨x¯©ÈhÏoÉoô
÷ 
ˆð ��Ø $ˆˆnÑØ$ˆˆmÑØ"ˆˆgŠØ	�4‰˜E .Ò1Ø#ˆˆmÑØ!ˆˆg‰Ø+8ˆÔ(Ø(\ˆÔ%Ø�i‰i‹k×ÐÜ×Ñ˜{¨DÔ1ÜØ¨4¸4Ø ¨X×-JÑ-Jñ
ó ð 	ð 
�4‰Ø#ˆˆmÑØ*ˆˆg‰à
ˆe�JÑÒð �^Ò$ñ RàZð 	ð
 )0ˆÔ%Ø�i‰i‹k×ÐÜ×Ñ˜{¨DÔ1ÜØ¨D¸FØ! .Ñ1¸gñ
ó ð 	ô
 Ø�w‘¨U¸fØ˜nÑ-¸kÜ  e¨LÑ&9Ñ 9×HÑHÓJÓKØ ñ	ó ð ðo 3ùð :ùØ<ùð
úô
 ò %Ü˜#“h˜t �nŽûð%úð 	ùð" 	ús–   ‚ALÁKÁ	ALÂKÂ5LÃKÃA3LÅ A+K Æ+KÆ,K Æ0ALÇ8K=Ç9A.LÉ'L É(A%LËLËLËK Ë	K:Ë!K5Ë/LË5K:Ë:LÌ Lz"/customers/{customer_id}/provisionc              ƒ   ó   K  — |j                  t        t        «      j                  t        j                  | k(  «      «      ƒ d {  –—† j                  «       }|st        dd¬«      ‚t        ||«      ƒ d {  –—†  t        d| › �d¬«      S 7 ŒE7 Œ­w)NrX   r÷   rU   rÍ   i/  rÎ   )	rD   r   r   rE   rt   r  r   r$   r   )rõ   r8   rù   s      rO   Úprovision_customer_routerN  Á  sz   è ø€ à—j‘j¤¬Ó!1×!7Ñ!7¼¿¹À{Ñ8RÓ!SÓT×T×hÑhÓj€HÙÜ¨Ð4OÔPÐPÜ
˜ 2Ó
&×&Ð&Ü +¨k¨]Ð ;ÈÔMÐMð	 Uøð 'ús$   ‚ABÁB
Á0BÁ5BÁ6BÂBz&/customers/{customer_id}/provision-oltc              ƒ   ó6   K  — t        | |«      ƒ d{  –—† S 7 Œ­w)zøExplicitly register one ONU on a supported C-DATA OLT.

    Technician status changes never call this endpoint. Hardware execution is
    an explicit admin action, guarded by pinned SSH identity and a single
    active job per customer/target.
    N)>rN  r4  r  Úprovision_cdata_onurD   r   r   rE   rt   r  r   rÇ   r¢   r£   rQ   rž   r¤   r—   ri   r   rF   Úmanagement_protocolrm   r   rr   rs   rÒ   r   rõ   Útargetr   Úin_rÕ   rÖ   rj   rk   r™   r˜   rà   rI  r  ro   rp   rc   rq   re   rf   rŽ   rh   Ú
last_errorr7  r   r5  r.   r  r/   r  Úexecuted_atr.  Úmikrotik_provisioning_statusÚprovisioning_statusr   )rõ   r8   r8  r  rP  rù   rx   rz   rg   Ú
active_jobÚpayload_summaryÚjobr  rw   r.  s                  rO   Úprovision_olt_router[  Ê  s   è ø€ ô *¨+°rÓ:×:Ð:Ð:úó   ‚’“z+/customers/{customer_id}/provision-mikrotikc              ƒ   ó6   K  — t        | |«      ƒ d{  –—† S 7 Œ­w)zCExplicitly create/update one PPPoE secret on the assigned MikroTik.N)8rN  Úapp.core.mikrotikÚMikrotikProvisioningErrorÚRealMikrotikAdapterÚapp.core.device_credentialsÚdecrypt_secretÚapp.core.customer_identityr    rD   r   r   rE   rt   r  r   r    r•   r–   ri   r   rF   rm   r   rÒ   r   rõ   rR  r   rS  rÕ   rÖ   rŽ   rà   rV  r  rf   rc   re   rq   ro   rp   Úresolve_profileÚupsert_pppoe_secretr7  rh   rT  r   r5  r.   r  r/   r  rU  rI  rW  r   )rõ   r8   r8  r_  r`  rb  r    rù   Úmikrotikrz   rX  rY  rZ  Údevice_passwordÚcustomer_passwordr  Úeffective_profileÚused_default_profilerw   r.  s                       rO   Úprovision_mikrotik_routerk  6  s   è ø€ ô *¨+°rÓ:×:Ð:Ð:úr\  z,/customers/{customer_id}/provision-olt-pppoec              ƒ   ó6   K  — t        | |«      ƒ d{  –—† S 7 Œ­w)z:Apply the verified C-DATA WAN PPPoE sequence from Billing.N)=rN  r4  r  Úprovision_cdata_pppoerc  r    rD   r   r   rE   rt   r  r   r¢   r£   rK   rQ   rž   r¤   r—   r•   r–   ri   r   rF   rQ  rm   r   rr   rs   rÒ   r   rõ   rR  r   rS  rÕ   rÖ   rj   rk   r™   rà   r  ro   rp   rc   rq   re   rf   rh   rT  rI  r7  r   r.   r  r/   r  rU  r.  r   )rõ   r8   r8  r  rm  r    rù   rx   rz   r:  ÚactiveÚpayloadrZ  r  rw   Úmsgs                   rO   Úprovision_olt_pppoe_routerq  ¦  s   è ø€ ô *¨+°rÓ:×:Ð:Ð:úr\  Úadminc           	   ƒ   óœ  K  — ddl m}m}m} ddlm} ddlm} ddlm	} |j                  t        t        «      j                  t        j                  | k(  «      «      ƒ d {  –—† j                  «       }	|	st!        dd¬«      ‚|	j"                  �r&|	j$                  �r|	j&                  �r|j                  t        |«      j                  |j                  |	j"                  k(  «      «      ƒ d {  –—† j                  «       }
|
r´|
j(                  r¨|j                  t        |«      j                  |j                  |
j(                  k(  «      «      ƒ d {  –—† j                  «       }|rP	  ||
j*                  |
j,                  xs d	|j.                  |j0                  d
|	j&                  |	j$                  ¬«       |	j4                  �r#|	j6                  �r|j                  t        |«      j                  |j                  |	j4                  k(  «      «      ƒ d {  –—† j                  «       }|r¾|j(                  r²|j                  t        |«      j                  |j                  |j(                  k(  «      «      ƒ d {  –—† j                  «       }|rZ	  ||j*                  |j.                   ||j0                  «      |j,                  xs d¬«      }|j9                  |	j6                  «       |j;                  |	«      ƒ d {  –—†  |j=                  «       ƒ d {  –—†  dddœS 7 �Œ»7 �Œ27 �ŒÑ# t2        $ r Y �Œ{w xY w7 �Œ"7 ŒÀ# t2        $ r Y Œ_w xY w7 ŒN7 Œ8­w)Nr   )r   r   r   )Údeprovision_cdata_onu)r`  )r    rX   r÷   rU   r"  z+I/zDmJGfTPy3NkMNPghkjawVdeI357pJ/k+xm2qtLdYr&  i"  )rc   re   r  rq   Údeletedz4Pelanggan dan konfigurasi perangkat berhasil dihapus)r   r.  )Úapp.models.modelsr   r   r   r4  rt  r^  r`  rc  r    rD   r   r   rE   rt   r  r   rQ   r—   r¤   rm   rc   rq   re   rf   r5  r    r•   Údelete_pppoe_secretÚdeleter  )rõ   r8   r  r   r   r   rt  r`  r    rù   rx   r9  Úmkr  s                 rO   Údelete_customerrz  Ê  sÝ  è ø€ ÷ NÑMÝ=Ý5ÝAà—j‘j¤¬Ó!1×!7Ñ!7¼¿¹À{Ñ8RÓ!SÓT×T×hÑhÓj€HÙÜ¨Ð4OÔPÐPð ×Ó (§/£/°h×6GÓ6GØ—Z‘Z¤ yÓ 1× 7Ñ 7¸	¿¹È×H^ÑH^Ñ8^Ó _Ó`×`×tÑtÓvˆÙ�3×$Ò$ØŸ*™*¤VÐ,<Ó%=×%CÑ%CÐDT×DWÑDWÐ[^×[lÑ[lÑDlÓ%mÓn×n÷  Cñ  Có  EˆDÙðÙ)Ø ŸX™XØ Ÿ\™\Ò/¨RØ!%§¡Ø)-×)>Ñ)>Ø(UØ!)×!2Ñ!2Ø'Ÿ™õð ×"Ó" x×'>Ó'>Ø—J‘Jœv nÓ5×;Ñ;¸N×<MÑ<MÐQY×QlÑQlÑ<lÓmÓn×n÷  Cñ  Có  EˆÙ�"×"Ò"ØŸ*™*¤VÐ,<Ó%=×%CÑ%CÐDT×DWÑDWÐ[]×[kÑ[kÑDkÓ%lÓm×m÷  Bñ  Bó  DˆDÙðÙ1°r·w±wÈÏÉÑawÐx|÷  yNñ  yNó  bOð  Z\÷  Zeñ  Zeò  Zmð  imô  n�GØ×/Ñ/°×0GÑ0GÔHð �)‰)�HÓ
×ÐØ
�)‰)‹+×ÐØÐ,bÑcÐcðK Uùð aùànúô !ò Úðúð
 oùàmùô
 !ò Ùðúð øØúsÀ   ‚AMÁ LÁ!BMÃ,LÃ-A#MÅL!ÅMÅ&AL$ Æ5AMÈL4ÈA#MÉ6L7É7MÊAL9 Ë%MË9MË:MÌM
Ì
MÌMÌ!MÌ$	L1Ì-MÌ0L1Ì1MÌ7MÌ9	MÍMÍMÍMÍ
M)^Úfastapir   r   r   r   r   r   Úfastapi.responsesr	   r
   r   Úfastapi.templatingr   Úsqlalchemy.ext.asyncior   Ú
sqlalchemyr   Úapp.core.databaser   rv  r   r   r   r   r   r   r   r   r   r   r   Úapp.core.provisioningr   rc  r   r   r   r   r    ra  r!   Úapp.core.olt_adaptersr"   r#   Úapp.core.onboardingr$   r%   Úapp.core.olt_vendor_profilesr&   r'   Ú app.core.cdata_fd1601s_discoveryr(   r)   r*   r+   Úapp.core.securityr,   r-   r.   r/   r0   ro   rÕ   rr   ÚrouterÚpathÚdirnameÚabspathÚ__file__ÚBASE_DIRrÞ   rM   r4   rÚ   rJ  Ú__annotations__r6  ri   rP   rh   r|   Úpostrô   r  r  r  r<  rL  rN  r[  rk  rq  rx  rz  rÐ   ó    rO   ú<module>r�     sñ  ðß L× LÐ Lß JÑ JÝ .Ý /Ý Ý $÷ u÷  u÷  uñ  uÝ 4÷ Wõ  WÝ 6ß Fß Nß S÷ó ÷ >ß 2Ñ 2Û Û Û 	á	¡©°zÓ)BÓ!CÐ DÔ	E€Ø�7‰7�?‰?˜2Ÿ7™7Ÿ?™?¨2¯7©7¯?©?¸2¿7¹7¿?¹?È8Ó;TÓ+UÓVÓW€Ù b§g¡g§l¡l°8¸_Ó&MÔN€	ð ')Ð �D˜˜d˜‘OÓ (Ø!Ð à‡�ˆO¨L€Ó9ÙAHÈÃñ 	R Wð 	R°,ò 	Ró :ð	Rð ‡�Ð6Ó7ñ ˜v“ñ"LØð"Làð"Lð 	ò"Ló 8ð"LðH ‡�ˆ_Óñ �S“	Ù�C‹yÙ˜“9Ù�c“Ù˜#“YÙ˜'“]Ù˜C“yÙ ›:Ù! $›ZÙ! /Ó2Ù" =Ó1Ù# F›|Ù%)¨$£ZÙ%)¨$£ZÙ˜t›*Ù˜t›*Ù˜d›Ù˜“IÙ˜S›	Ù˜3“iÙ˜S›	Ù˜"“XÙ  Ó,Ù�t“*Ù˜$“ZÙ $ T£
Ù%)¨$£ZÙ ›:Ù˜5“kÙ˜&“\Ù˜“JÙ˜“JÙ˜d›Ù˜T›
Ù˜d›Ù˜H“~Ù˜H“~Ù˜h›Ù˜x›.Ù˜d›Ù˜t›*Ù˜v“ñWc|Øðc|à
ðc|ð 
ðc|ð ð	c|ð
 ðc|ð ðc|ð ðc|ð ðc|ð ðc|ð �d‘
ðc|ð ðc|ð ðc|ð ðc|ð  #ðc|ð  #ðc|ð  ð!c|ð" ð#c|ð$ �$‰Jð%c|ð& ð'c|ð( ð)c|ð* ð+c|ð, ð-c|ð. ð/c|ð0 ð1c|ð2 ð3c|ð4 ð5c|ð6 ˜‘:ð7c|ð8 ˜d™
ð9c|ð: ð;c|ð< ð=c|ð> ð?c|ð@ ðAc|ðB ðCc|ðD �$‰JðEc|ðF ðGc|ðH ðIc|ðJ ðKc|ðL ðMc|ðN ðOc|ðP ðQc|ðR ðSc|ðT �4‰ZðUc|ðV 	òWc|ó ðc|ðJ ‡�Ð:È<€ÓXÙahÐioÓapÑw~ð  @Pó  xQñ 
t°sð 
tÀWð 
tÐR^ò 
tó Yð
tð ‡�Ð9È,€ÓWÙY]Ð^`ÓYaÑv}ð  Eó  wFñ  MTð  Ueó  Mfñ v¨cð v¸Gð vÐSVð vÐgsò vó Xðvð ‡�Ð&°|€ÓDÙQXÐY_ÓQ`ñ F sð F°Wð FÀ,ò Fó EðFð ‡�Ð2Ó3ñ �s“)Ù˜v“ÙÐ)Ó*ñ	KØðKàðKð 	òKó 4ðKð\ ‡�Ð8Ó9ñ ˜v“ñGØðGàòGó :ðGðT ‡�Ð1Ó2ÙHOÐPVËñ N°ð N¸ò Nó 3ðNð ‡�Ð5Ó6ñ ˜v“ÙÐ)Ó*ñhNØðhNàòhNó 7ðhNðV ‡�Ð:Ó;ñ ˜v“ÙÐ)Ó*ñlNØðlNàòlNó <ðlNð^ ‡�Ð;Ó<ÙIPÐQWËÑgnÐoó  hAñ  N°ð  N¸,ò  Nó =ð NðF ‡�Ð)Ó*ñ ˜v“Ù‘= Ó)Ó*ñ/dØð/dàò/dó +ñ/dr�  