ó
    0P©j_º  ã                   óš  • S r SSKJrJr  SSKJr  SSKrSSKrSSKJ	r	   SSK
rSrSrS	rS
rSrSrSrSr1 SkrSr1 Skr/ SQr/ SQrSSSS.SSSS.SSSS.SSSS.SSSS.SSSSS /S!./r1 S"krS#rS$r\\\\\" \5      \S%.r0 S&\(       a  \ " \!" \S'S(5      5      OS(_S)/ _S*\" \5      _S+\"" \5      _S,\ V s/ s H  n \"" U 5      PM     sn _S-\ V s/ s H  n \#" U 5      PM     sn _S.\" \5      _S/\_S0\S1-  _S2\_S3S4_S5S_S6S7_S8S_S9S:_S;S<_S=S_S>S?S?S?S@S4S4S40 \ESA\0E0 \ESA\0E0 \ESB/ 0E0 \ESB/ 0E0 \ESA\0ESC.SD.	Er$SCr%SE\&SF\&4SG jr'SH\\&   SF\&4SI jr(SÃSJ\\#   SF\ 4SK jjr)SL\\&   SF\&4SM jr*SNSOSP/SQ.SRSSST/S/SUSVSW.SXSY/SZS/SUSVS[.S\S]ST/S/S^.S_S`ST/S/SaSb.ScS]Sd/SQ.SeSfSg/ShS/S^.SeSiSj/Sf/ShS/Sk.SlSOSm/Sn/S^.SlSo/SQ.SpSqSr/SQ.SsSOSr/SQ.SsSt/SQ.SuSvSw/SxSy/S^.SuSz/SxSy/S{.SuS|S}/S~.SSqS€/SQ.SS€/SQ.S�S`S‚/SQ.SƒS`S„/SQ.S…S†S„/SQ.S‡SvSˆ/SQ.S‰SSSw/SxSy/S^.S‰SŠ/SQ.S‹SŒS�/S/S^.SŽS`/S�S/S�./r+SN1 S�kSOS‘.S’1 S“kS]S‘.S”1 S“kS`S‘.S•1 S“kS†S‘.S–S1SSSUSVS—.S˜S1SYSUSVS—.S\S1S]S‘.S_S1S`SaS™.SšShS1SfS‘.S›Sn1SOS‘.Sœ1 S�kSqS‘.SžSŸ1SOS‘.S SxSy1SSS‘.S¡1 S¢kSqS‘.S£S¤1S`S‘./r,\ " S¥ S¦5      5       r-\ " S§ S¨5      5       r.\ " S© Sª5      5       r/SÃS«\&S¬\\R`                     SF\\1   4S­ jjr2SÃS®\\1   S¬\\R`                     SF\\1   4S¯ jjr3SF\\1   4S° jr4SÃS±\-SJ\\#   SF\\&   4S² jjr5S±\-SF\\&   4S³ jr6SÃS±\-SJ\\#   SF\\&   4S´ jjr7   SÄS±\-S¬\\R`                     Sµ\ S¶\ SJ\\#   SF\"4S· jjr8SÃS±\-SJ\\#   SF\\.   4S¸ jjr9SF\ 4S¹ jr:S±\-SF\\&   4Sº jr;SÃS±\-SJ\\#   SF\\&   4S» jjr<  SÅS±\-S¬\\R`                     SJ\\#   SF\"4S¼ jjr=   SÄS±\-S¬\\R`                     Sµ\ S¶\ SJ\\#   SF\"4S½ jjr>S¾\#SF\&4S¿ jr?   SÆS±\-S¬\\R`                     Sµ\ S¶\ SJ\\#   S¾\\#   SF\/4SÀ jjr@SF\&4SÁ jrASÃS¬\\R`                     4SÂ jjrBg! \ a    Sr GNf = fs  sn f s  sn f )ÇaS  
The BidBrain buying brain. Section 3 of the build brief.

This module holds the signed off logic and nothing else. It does not read the
web, it does not touch the database, it just takes a car and decides three
things:

  1. Is the car allowed at all (the bans and the hard gate).
  2. If it is allowed, what is the most Steven should pay (the pricing rule).
  3. What should be flagged on the card (service history, VAT qualifying).

Golden rules honoured here:
  . When the engine cannot be confirmed, the car is excluded. Play safe.
  . A car is never priced on a guessed valuation. If exactly one of Glass's or
    Cazana reads, the car is priced on that real value and the missing one is
    flagged. Only when BOTH are missing is the car held back.
  . Nothing here ever places a bid. It only recommends.

All money is handled in whole pounds.
é    )Ú	dataclassÚfield)ÚOptionalNé   )Úferryi¸  g333333Ã?i'  i�_ iø*  é   é
   éÒ   >   r   r   é   é   >   ÚmgÚalfaÚjeepÚisuzuÚsmartÚvolvoÚjaguarÚinfinitiÚ
mitsubishiú
alfa romeoú
land rover)ÚtransitÚconnectÚpartnerÚberlingoÚcaddyÚcomboÚkangooÚdobloÚexpertÚvivaroÚtrafficÚtransporterÚscudoÚproaceÚnv200ÚrifterÚhorizonÚindependenceÚmasterÚmovano))ÚsuzukiÚswift)ÚfiatÚ500)r.   Ú500xÚfordÚfiestaiX  )ÚmakeÚmodelÚcapÚcitroenÚseatÚibizaÚkiaÚstonicÚmazdaÚminiÚ
countrymanÚclubman)r3   r4   r5   Úexcept>   Úc1ÚkaÚupÚ108Úi10Úmg3ÚmiiÚadamÚaltoÚaygoÚvivaÚignisÚpandaÚsparkÚcitigoÚfortwoÚmirageÚtwingoÚcelerioÚforfourÚpicantoÚsanderoúka+úup!iˆ  )	ztyre pressureÚtpmszservice duezservice reminderzservice requiredzservice indicatorzservice lightzservice soonÚservice)Úmax_mileageÚmax_reserveÚmin_ageÚmax_ageÚallowed_gradesÚ
max_ownersÚno_ferry_crossingÚNO_FERRY_CROSSING_DEFAULTFÚferry_placesÚbanned_makesÚ
van_modelsÚbanned_modelsÚ
value_capsÚsmall_car_tokensÚsmall_car_cap_limitÚretail_upliftéd   Úflat_spreadÚdealer_postcodeÚ Údefault_price_ceilingÚdetails_styleÚdrawerÚretail_price_capÚretail_estimate_marginiô  Úretail_estimate_endingé_   Údealerkit_photosz#f9fafbz#ff306az#E9EDEBÚmax_distance_milesÚallowed_locations)ÚmotorwayÚcarwowÚauction4carsÚdealerauctionÚ	dealerway)	Útheme_bgÚtheme_priceÚ
theme_pillÚ
theme_iconÚtheme_sidebarÚtheme_logo_fullÚtheme_logo_smallÚtheme_faviconÚ	platformsÚlocationÚreturnc                 óh   • SU =(       d    S;  a  gU R                  SS5      S   R                  5       $ )a\  "Washington, Tyne And Wear" -> "Tyne And Wear". Dealer Auction's own
location string is always "Town, County"; the county (after the last
comma) is what the allow list is matched against, since there are far
too many distinct towns to list one by one. Returns "" when there is no
comma to split on, so an unreadable location never matches anything.Ú,rm   r   éÿÿÿÿ)ÚrsplitÚstrip)r†   s    Ú1/Users/stevendouglas/BidBrain/bidbrain/pricing.pyÚ_dealerauction_countyrŽ     s2   € ð �8—>˜rÓ"ØØ�?‰?˜3 Ó" 2Ñ&×,Ñ,Ó.Ð.ó    Úsourcec                 óŒ   • U =(       d    SR                  5       R                  5       R                  SS5      nU[        ;   a  U$ S$ )Nrm   Ú rx   )rŒ   ÚlowerÚreplaceÚ_PLATFORM_SETTINGS_KEYS)r�   Úkeys     r�   Ú_platform_settings_keyr—     s=   € Ø�<�R×
Ñ
Ó
 ×
&Ñ
&Ó
(×
0Ñ
0°°bÓ
9€CØÔ0Ó0ˆ3Ð@°jÐ@r�   Úsettingsc                 óÂ  • 0 [         EU=(       d    0 En[        US   5      n[        U R                  5      n[        U R                  5      nUS;   aY  UR                  SS5      R                  5       nSU;   d2  SU;   d,  UR                  S5      (       d  UR                  S5      (       a  g[        UR                  SS5      R                  5       5      n[        Xs-  5      $ )Nrg   )r.   ÚabarthÚ+r’   r/   Ú595T)	ÚDEFAULT_SETTINGSÚsetÚ_normr3   r4   r”   ÚsplitÚ
startswithÚbool)Úcarr˜   ÚsÚtokensr3   r4   Útoks0Útokss           r�   Úis_small_city_carr¨     s¿   € Ø0ÔÐ0 §¨BÐ0€AÜ�Ð%Ñ&Ó'€FÜ�—‘‹?€DÜ�#—)‘)Ó€EØÐ!Ó!Ø—‘˜c 3Ó'×-Ñ-Ó/ˆØ�E‹>˜U e›^¨u×/?Ñ/?À×/FÑ/FÈ%×JZÑJZÐ[`×JaÑJaØÜˆu�}‰}˜S #Ó&×,Ñ,Ó.Ó/€DÜ�‘ÓÐr�   Útextc                 ó„   • U c  g[         R                  " SS[        U 5      R                  5       R	                  5       5      $ )z8Lowercase, collapse spaces. Keeps dots so 1.5 stays 1.5.rm   z\s+r’   )ÚreÚsubÚstrrŒ   r“   )r©   s    r�   rŸ   rŸ     s1   € à�|ØÜ�6Š6�&˜#œs 4›yŸ™Ó0×6Ñ6Ó8Ó9Ð9r�   z1.2 PureTechz1.2Úpuretech)ÚnameÚallz(Ford 1.0 EcoBoost wet belt, 2014 to 2019z1.0ÚecoboostiÞ  iã  )r¯   r°   ÚmakesÚ	year_fromÚyear_tozFord 1.1 petrol, 2014 to 2019z1.1Úpetrol)r¯   r°   Úfuelr²   r³   r´   zFord 1.5 EcoBoostz1.5)r¯   r°   r²   zFord 2.0 EcoBoost, pre 2019z2.0iâ  )r¯   r°   r²   r´   zVW and Audi 1.5 TSI, EA211 evoÚtsiz#Hyundai and Kia 1.6 Gamma or Nu GDIz1.6ÚgdiÚhyundaiÚgammaÚnu)r¯   Ú	any_tokenr°   r²   zNissan 1.2 DIG-T, HR12DDRÚdigÚnissanÚhr12ddrzRenault and Nissan 0.9 TCez0.9ÚtcezRenault 1.2 TCe, H5FtÚh5ftz-Vauxhall and Opel 1.4 Turbo, A14NET or B14NETz1.4ÚturboÚvauxhallÚopelz1.4t)r¯   r¼   r²   Úa14netÚb14net)r¯   r¼   zFiat and Alfa 0.9 TwinAirÚtwinairz)Jaguar and Land Rover 2.0 Ingenium petrolÚingeniumzAudi and VW 2.0 TFSI, EA888ÚtfsizAudi and VW 1.8 TFSI, EA888z1.8zFiat 1.4 MultiAir, 500 and TipoÚmultiairz#Vauxhall and Opel 1.0 Turbo, B10XFLÚb10xflzMazda 2.2 Skyactiv-D dieselz2.2ÚdieselzFord 2.0 diesel)r¯   r°   r¶   r²   >   ÚdsrÄ   r6   ÚpeugeotrÃ   )r¯   r²   ÚlitreszVW and Audi 1.5 TSI>   ÚvwÚaudir7   ÚcupraÚskodaÚ
volkswagenzVW and Audi 2.0 TFSIzVW and Audi 1.8 TFSIzFord 1.0 EcoBoost wet belt)r¯   r²   rÏ   r³   r´   zFord 1.1 petrol)r¯   r²   rÏ   r´   zHyundai or Kia 1.6 GDIzNissan 1.2 DIG-Tz Renault, Nissan or Dacia 0.9 TCe>   Údaciar¾   ÚrenaultzRenault 1.2 TCerÖ   zVauxhall or Opel 1.0 Turboz Fiat, Alfa or Abarth 0.9 TwinAir>   r   r.   rš   r   zJaguar 2.0 Ingenium petrolr   c                   ó\  • \ rS rSr% SrSr\\S'   Sr\\S'   Sr	\\S'   Sr
\\S'   Sr\\   \S	'   Sr\\   \S
'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\S'   Sr\\   \S'   Sr\\   \S'   Sr\\   \S'   Sr \\S'   Sr!\\S'   Sr"\\S'   \#" \$S9r%\$\S'   Sr&\\S '   Sr'\\S!'   Sr(\\S"'   Sr)\\   \S#'   Sr*\\S$'   Sr+\\S%'   Sr,\\S&'   Sr-\\S''   Sr.\\S('   Sr/\\S)'   Sr0\\S*'   S+r1g),ÚCari–  z�One car as entered by hand for Phase 1. Reads from the platforms come
later. Money fields are whole pounds. Missing optional fields are None.rm   Úregr3   r4   Ú
derivativeNÚyearÚmileageÚownersÚgradeÚreserveÚ	cap_cleanÚdistance_milesÚengineÚtransmissionr¶   Ú	body_typeÚ	equipmentÚservice_historyFÚvat_qualifyingÚfinanceÚglass_retailÚcazana_retailÚ
cazana_urlÚglass_checkedÚ	photo_url©Údefault_factoryÚ
photo_urlsÚlisting_urlr†   r�   Úactually_paidÚkeeper_startÚ
mech_issueÚwarning_lightsÚelectrical_issueÚselling_vrmÚnotesÚauction_ends_at© )2Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rÙ   r­   Ú__annotations__r3   r4   rÚ   rÛ   r   ÚintrÜ   rÝ   rÞ   rß   rà   rá   Úfloatrâ   rã   r¶   rä   rå   ræ   rç   r¢   rè   ré   rê   rë   rì   rí   r   Úlistrð   rñ   r†   r�   rò   ró   rô   rõ   rö   r÷   rø   rù   Ú__static_attributes__rú   r�   r�   rØ   rØ   –  s¥  ‡ ñOà€CˆƒMØ€Dˆ#ƒNØ€Eˆ3ƒOØ€J�ÓØ€Dˆ(�3‰-ÓØ!€GˆX�c‰]Ó!Ø €FˆH�S‰MÓ Ø€Eˆ8�C‰=ÓØ!€GˆX�c‰]Ó!Ø#€Iˆx˜‰}Ó#Ø&*€N�H˜U‘OÓ*Ø€FˆCÓØ€L�#ÓØ€Dˆ#ƒNØ€IˆsÓØ€IˆsÓØ€O�SÓØ €N�DÓ Ø"€GˆX�d‰^Ó"ð #'€L�(˜3‘-Ó&Ø#'€M�8˜C‘=Ó'Ø€J�Óð
  €M�4Óð €IˆsÓñ ¨TÑ2€J�Ó2Ø€K�ÓØ€HˆcÓØ€FˆCÓØ#'€M�8˜C‘=Ó'Ø€L�#ÓØ€J�ÓØ€N�CÓØÐ�cÓØ€K�Óà€Eˆ3ƒOà€O�SÖr�   rØ   c                   ót   • \ rS rSr% \\   \S'   \\   \S'   \\   \S'   \\   \S'   \\S'   \\S'   \\S'   S	rg
)ÚPricingi×  ré   rê   Ú
calc_glassÚcalc_cazanaÚgoverning_valueÚgoverning_sourceÚmax_bidrú   N)	rû   rü   rý   rþ   r   r  r   r­   r  rú   r�   r�   r  r  ×  s=   ‡ ð ˜3‘-ÓØ˜C‘=Ó Ø˜‘ÓØ˜#‘ÓØÓØÓØ†Lr�   r  c                   ój   • \ rS rSr% \\S'   \\S'   \" \S9r	\\S'   \" \S9r
\\S'   Sr\\   \S'   S	rg)
Ú
Assessmentiä  r£   Ústatusrî   ÚreasonsÚflagsNÚpricingrú   )rû   rü   rý   rþ   rØ   r   r­   r   r  r  r  r  r   r  r  rú   r�   r�   r  r  ä  s9   ‡ à	ƒHØƒKÙ¨$Ñ/€GˆTÓ/Ù¨Ñ-€Eˆ4Ó-Ø!%€GˆX�gÑÖ%r�   r  ró   Útodayc                 ó°  • U (       d  g [         R                  R                  [        U 5      R	                  5       5      nU=(       d    [         R                  R                  5       nUR                  UR                  -
  S-  UR                  UR                  -
  -   nUR                  UR                  :  a  US-  n[        SU5      $ ! [
         a     gf = f)z”Whole months the current owner has had the car, from an ISO date string.
None when the date is missing or unreadable, so missing data never rejects.Né   r   r   )ÚdatetimeÚdateÚfromisoformatr­   rŒ   Ú
ValueErrorr  rÛ   ÚmonthÚdayÚmax)ró   r  ÚstartÚmonthss       r�   Úmonths_ownedr  í  s¬   € ö ØðÜ—‘×+Ñ+¬C°Ó,=×,CÑ,CÓ,EÓFˆð ×*”X—]‘]×(Ñ(Ó*€EØ�j‰j˜5Ÿ:™:Ñ%¨Ñ+¨u¯{©{¸U¿[¹[Ñ/HÑI€FØ‡y�y�5—9‘9ÓØ�!‰ˆÜˆq�&‹>Ðøô ó Ùðús   Š6C Ã
CÃCrÛ   c                 óˆ   • U c  g U=(       d    [         R                  R                  5       nUR                  [	        U 5      -
  $ ©N)r  r  r  rÛ   r  )rÛ   r  s     r�   Úcar_ager!  ý  s4   € Ø�|ØØ×*”X—]‘]×(Ñ(Ó*€EØ�:‰:œ˜D›	Ñ!Ð!r�   c                 óŽ   • U c  g[         R                  " S[        U 5      5      nU(       a  [        UR	                  5       5      $ S$ )zCGrade may arrive as 1, '1', or '1, clean'. Take the leading number.Nz\d+)r«   Úsearchr­   r  Úgroup)rÞ   Úms     r�   Ú
_grade_intr&    s5   € à�}ØÜ
�	Š	�&œ#˜e›*Ó%€AÞŒ3ˆq�w‰w‹y‹>Ð( DÐ(r�   r£   c                 óV  • 0 [         EU=(       d    0 En[        U R                  5      n[        U R                   SU R                   35      nU[	        US   5      ;   a(  U R                  R                  5       R                  5       $ UR                  S5      (       d  SU;   d  SU;   a  gg )Nr’   rc   Úlandr   zrange roverz
Land Rover)r�   rŸ   r3   r4   rž   rŒ   Útitler¡   )r£   r˜   r¤   r3   Úcombineds        r�   Úbanned_maker+    s‘   € Ø0ÔÐ0 §¨BÐ0€AÜ�—‘‹?€DÜ˜Ÿ™�z  3§9¡9 +Ð.Ó/€HØŒs�1�^Ñ$Ó%Ó%Ø�x‰x�~‰~Ó×%Ñ%Ó'Ð'ð ‡��v×Ñ ,°(Ó":¸mÈxÓ>WØØr�   c                 ó"  ^• [        U R                  5      m[        U R                  5      n[         Hñ  nSU;   a
  XS   ;  a  M  SU;   a+  U R                  b  [        U R                  5      US   :  a  MD  SU;   a+  U R                  b  [        U R                  5      US   :”  a  Mu  SU;   a  [        U4S jUS    5       5      (       d  Mš  SU;   a  [        U4S jUS    5       5      (       d  M¿  S	U;   a'  US	   T;   d  [        U R                  5      US	   :X  d  Mì  US
   s  $    [        R                  " ST5      nU(       a  UR                  S5      OSnST;   =(       d    [        U R                  5      S:H  nU(       a�  U(       a†  [         H|  nXS   ;  d  XBS   :w  a  M  SU;   a+  U R                  b  [        U R                  5      US   :  a  MF  SU;   a+  U R                  b  [        U R                  5      US   :”  a  Mw  US
   s  $    g)zmReturn the name of the matching ban, or None. Year and make conditions
are applied where a rule defines them.r²   r³   Nr´   r°   c              3   ó,   >#   • U  H	  oT;   v •  M     g 7fr   rú   ©Ú.0Útokrâ   s     €r�   Ú	<genexpr>Ú banned_engine.<locals>.<genexpr>&  s   øé € Ð$Jºk°s¨F¦]ºkùó   ƒr¼   c              3   ó,   >#   • U  H	  oT;   v •  M     g 7fr   rú   r.  s     €r�   r1  r2  (  s   øé € Ð*VÒDU¸S°&®=ÒDUùr3  r¶   r¯   z\b(\d\.\d)\br   rµ   rÏ   )rŸ   râ   r3   ÚBANNED_ENGINESrÛ   r  r°   Úanyr¶   r«   r#  r$  Ú
LITRE_BANS)r£   r3   ÚruleÚlitres_mrÏ   Ú	is_petrolrâ   s         @r�   Úbanned_enginer;    sÇ  ø€ ô �3—:‘:Ó€FÜ�—‘‹?€DßˆØ�d‹?˜t°©=Ó8ÙØ˜$Ó C§H¡HÑ$4¼¸C¿H¹H»ÈÈ[ÑHYÓ8YÙØ˜Ó #§(¡(Ñ"2´c¸#¿(¹(³mÀdÈ9ÁoÓ6UÙØ�D‹=¤Ô$J¸dÀ5ºkÓ$J×!JÑ!JÙØ˜$Ó¤sÔ*VÀDÈÒDUÓ*V×'VÑ'VÙð �T‹> 4¨¡<°6Ó#9¼UÀ3Ç8Á8»_ÐPTÐU[ÑP\Ó=\ÙØ�F‰|Òñ ô$ �yŠy˜¨&Ó1€HÞ"*ˆX�^‰^˜AÔ°€Fð ˜FÑ"×A¤e¨C¯H©H£o¸Ñ&A€IÞ–)ßˆDØ ™=Ó(¨F¸8±nÓ,DÙØ˜dÓ"¨¯©Ñ(8¼CÀÇÁ»MÈDÐQ\ÑL]Ó<]ÙØ˜DÓ  c§h¡hÑ&6¼#¸c¿h¹h»-È$ÈyÉ/Ó:YÙØ˜‘<Òñ ð r�   c                 óâ  ^ ^• 0 [         EU=(       d    0 En[        T R                  5      n[        T R                  5      n[        T R                  5      n[        T R
                   ST R                   ST R                   35      mUS:X  d  ST;   a  gSnUS;   d  [        U4S jU 5       5      (       a  gUS;   d  [        U4S	 jUS
    5       5      (       a  gUS:X  a  g[        T R
                  5      n[        [        T R                  5      R                  SS5      R                  5       5      nUS    H/  u  pšXy:X  d  M  X¨;   d  M  T R
                   ST R                   S3s  $    US:X  a  US;   a  gT R                  nUb§  US    Hž  nX|S   :w  a  M  UR                  S5      (       a  US   U;  a  M.  [        U 4S jUR                  S/ 5       5       5      (       a  MZ  X¼S   :”  d  Md  US   =(       d    T R
                  R                  5       nU S[        US   5       S3s  $    T R                  b6  T R                  US   :”  a#  [!        T U5      (       a  S[        US   5       S3$ g)zÒWhole classes Steven does not buy, decided during the live review:
CVT gearboxes, electric and hybrid, and vans and commercials. Returns the
reason, or None. Normal automatics are allowed, only CVT is excluded.r’   ÚcvtzCVT gearbox, not bought.)ÚmhevÚphevÚhybridze-golfze-c4Ú500ez evzev Úelectriczplug inzplug-inzrange extenderz hev)r@  rB  c              3   ó,   >#   • U  H	  oT;   v •  M     g 7fr   rú   )r/  Útr*  s     €r�   r1  Ú"class_exclusion.<locals>.<genexpr>R  s   øé € Ð,PÂK¸q°(®]ÂKùr3  zElectric or hybrid, not bought.)z	panel vanÚvanc              3   ó,   >#   • U  H	  oT;   v •  M     g 7fr   rú   )r/  Úvr*  s     €r�   r1  rE  U  s   øé € Ð*RÂ/¸Q°®=Â/ùr3  rd   zVan or commercial, not bought.ÚconvertiblezConvertible, not bought.r›   re   z, not bought.r1   )Ú	automaticzsemi-automaticzsemi automaticzAutomatic Ford, not bought.Nrf   r3   r4   c              3   óR   >#   • U  H  o[        TR                  5      ;   v •  M     g 7fr   )rŸ   r4   )r/  Úexr£   s     €r�   r1  rE  k  s   øé € ÐKÒ4J¨bœ˜sŸy™yÓ)Ö)Ò4Jùs   ƒ$'r?   r5   z with CAP clean over rh   z#Small city car with CAP clean over )r�   rŸ   rã   r¶   rä   r3   r4   râ   r6  rž   r”   r    rà   Úgetr)  Úpoundsr¨   )r£   r˜   r¤   Útransr¶   ÚbodyÚelectrifiedr3   Ú
model_toksÚmkr0  r5   r8  Úlabelr*  s   `             @r�   Úclass_exclusionrU  C  s@  ù€ ð 	1ÔÐ0 §¨BÐ0€AÜ�#×"Ñ"Ó#€EÜ�—‘‹?€DÜ�—‘Ó€DÜ˜Ÿ™�z  3§9¡9 +¨Q¨s¯z©z¨lÐ;Ó<€Hà�ƒ~˜ (Ó*Ø)ðO€KàÐ%Ó%¬Ô,PÁKÓ,P×)PÑ)PØ0àÐ#Ó#¤sÔ*RÀ!ÀLÂ/Ó*R×'RÑ'RØ/àˆ}ÓØ)ä�—‘‹?€DÜ”U˜3Ÿ9™9Ó%×-Ñ-¨c°3Ó7×=Ñ=Ó?Ó@€JØ�_Ô%‰ˆØ�:˜#Õ+Ø—h‘h�Z˜q §¡ ¨=Ð9Ò9ñ &ð ˆvƒ~˜%Ð#TÓTØ,à
�-‰-€CØ
�Ø�l”OˆDØ˜F‘|Ó#ÙØ�x‰x˜× Ñ  T¨'¡]¸*Ó%DÙÜÔK°D·H±H¸XÀrÔ4JÓK×KÑKÙØ˜%‘[Õ Ø˜g™×2¨#¯(©(×9Ñ9Ó;�Ø˜Ð 5´f¸TÀ%¹[Ó6IÐ5JÈ-ÐXÒXñ $ð ‡}�}Ñ  S§]¡]°QÐ7LÑ5MÓ%MÔRcÐdgÐiq×RrÑRrØ4´V¸AÐ>SÑ<TÓ5UÐ4VÐVcÐdÐdð r�   Úassume_distance_okÚassume_grade_okc                 óÌ  ^• 0 [         EU=(       d    0 EnUR                  S5      =(       d    0 R                  [        U R                  5      5      =(       d    0 mU4S jn/ nU R                  c  UR                  S5        OJU R                  U" S[        5      :¼  a/  UR                  SU R                  S SU" S[        5      S S35        U R                  c  UR                  S	5        OZU R                  U" S
[        5      :¼  a?  UR                  S[        U R                  5       S[        U" S
[        5      5       S35        [        U R                  U5      nU" S[        5      U" S[        5      p©Uc  UR                  S5        O%X‰:  d  XŠ:”  a  UR                  SU SU	 SU
 S35        U(       a  OhU R                  c  UR                  S5        OIU R                  U" S[        5      :”  a.  UR                  SU R                  S SU" S[        5       S35        TR                  S5      nU(       aµ  [        U R                  5      nUS:X  a  [!        U R"                  5      OU R"                  nUS:X  a  SOSnU Vs1 s H  n[%        U5      iM     nnU(       d  UR                  SU S35        O7[%        U5      U;  a(  UR                  UR'                  5        SU S U S35        U(       a  O†[)        U R*                  5      n[-        U" S![/        [0        5      5      5      nUc  UR                  S"5        O=UU;  a7  UR                  S#U S$S%R3                  S& [/        U5       5       5       S'35        U R4                  c  UR                  S(5        U$ U R4                  U" S)[6        5      :”  a,  UR                  U R4                   S*U" S)[6        5       S'35        U$ s  snf )+a·  Every hard gate breach, in plain English with no hyphens or dashes.
assume_distance_ok is set when the car came through a source that already
enforces the distance limit (the Motorway brief export gives a location, not
exact miles), so the distance check is trusted to the filter. assume_grade_ok
is set when the source has no 1 to 5 condition grade at all (Auction4Cars),
so condition is judged by eye from the card rather than gated. settings
overrides the default thresholds, per platform (see DEFAULT_SETTINGS),
None uses them as they are. The hard gate itself is looked up per car
from settings['platforms'][<car's platform>], falling back to Motorway's
settings for an unrecognised source.r…   c                 ó&   >• TR                  X5      $ r   ©rM  )ÚkÚdefaultÚplats     €r�   Ú<lambda>Úgate_failures.<locals>.<lambda>‹  s   ø€ ˜dŸh™h qÔ2r�   z/Mileage is missing, so it cannot pass the gate.rZ   zMileage r‰   z is on or over the z limit.z5Reserve price is missing, so it cannot pass the gate.r[   zReserve r\   r]   z*Year is missing, so age cannot be checked.zAge z years is outside the z to z years window.zCDistance from your postcode is missing, so it cannot pass the gate.rv   z	Distance Úgz miles is over the z mile limit.rw   r{   ÚcountyÚdepotzALocation is missing, so it cannot be checked against the allowed zs.r’   z is not in the allowed r^   z7Condition grade is missing, so it cannot pass the gate.zCondition grade z is not z, c              3   ó8   #   • U  H  n[        U5      v •  M     g 7fr   )r­   )r/  r`  s     r�   r1  Ú gate_failures.<locals>.<genexpr>Ä  s   é € ÐDeÒUdÐPQÄSÈÇVÀVÒUdùs   ‚Ú.z=Previous owners count is missing, so it cannot pass the gate.r_   z& previous owners is over the limit of )r�   rM  r—   r�   rÜ   ÚappendÚMAX_MILEAGErß   ÚMAX_RESERVErN  r!  rÛ   ÚMIN_AGEÚMAX_AGErá   ÚMAX_DISTANCE_MILESrŽ   r†   rŸ   Ú
capitalizer&  rÞ   rž   ÚsortedÚALLOWED_GRADESÚjoinrÝ   Ú
MAX_OWNERS)r£   r  rV  rW  r˜   r¤   ÚpvalÚfailsÚager\   r]   rw   Úplat_keyÚsubjectÚnounÚlocÚallowed_normrÞ   Úallowedr]  s                      @r�   Úgate_failuresrz  |  sv  ø€ ð 	1ÔÐ0 §¨BÐ0€AØ�E‰E�+Ó×$ "×)Ñ)Ô*@ÀÇÁÓ*LÓM×SÐQS€DÜ2€DØ€Eà
‡{�{ÑØ�‰ÐFÕGØ	�‰™˜]¬KÓ8Ó	8Ø�‰�x §¡¨A˜Ð.AÁ$À}ÔVaÓBbÐcdÐAeÐelÐmÔnà
‡{�{ÑØ�‰ÐLÕMØ	�‰™˜]¬KÓ8Ó	8Ø�‰�x¤ s§{¡{Ó 3Ð4Ð4GÌÉtÐTaÔcnÓOoÓHpÐGqÐqxÐyÔzä
�#—(‘(˜EÓ
"€CÙ˜I¤wÓ/±°iÄÓ1IˆWØ
�{Ø�‰ÐAÕBØ	‹˜#›-Ø�‰�t˜C˜5Ð 6°w°i¸tÀGÀ9ÈNÐ[Ô\æØØ	×	Ñ	Ñ	#Ø�‰ÐZÕ[Ø	×	Ñ	™dÐ#7Ô9KÓLÓ	LØ�‰�y ×!3Ñ!3°AÐ 6Ð6IÙÐ1Ô3EÓFÐGÀ|ðUô 	Vð Ÿ™Ð!4Ó5ÐÞÜ)¨#¯*©*Ó5ˆØ9AÀ_Ó9TÔ'¨¯©Ô5ÐZ]×ZfÑZfˆØ# Ó6‰x¸Gˆñ /@Ó@Ò.? sœ˜cž
Ñ.?ˆÐ@ÞØ�L‰LÐ\Ð]aÐ\bÐbdÐeÕfÜ�7‹^ <Ó/Ø�L‰L˜DŸO™OÓ-Ð.¨a°¨yÐ8OÐPTÈvÐUWÐXÔYæØä˜3Ÿ9™9Ó%ˆÜ‘dÐ+¬V´NÓ-CÓDÓEˆØ‰=Ø�L‰LÐRÕSØ˜'Ó!Ø�L‰LÐ+¨E¨7°(¸4¿9¹9ÑDeÔU[Ð\cÔUdÓDeÓ;eÐ:fÐfgÐhÔià
‡z�zÑØ�‰ÐTÔUð €Lð 
�‰‘d˜<¬Ó4Ó	4Ø�‰˜Ÿ
™
�|Ð#IÉ$È|Ô]gÓJhÐIiÐijÐkÔlà€Lùò+ As   É?O!c           
      ó´  • 0 [         EU=(       d    0 EnUS   S-  nUS   nU R                  b  [        U R                  5      OSnU R                  b  [        U R                  5      OSnUc  Uc  gUb  [	        USU-   -  5      OSnUb  [	        USU-   -  5      OSnUb  Ub  U[
        :”  a  USp©OX‡:”  a  USp©OUSp©O
Ub  USp©OUSp©X”-
  n[        UUUUU	U
US9$ )	u¥  Apply section 3.1. Returns None only when BOTH valuations are missing, so
the car cannot be priced at all and the caller holds it back. If exactly one
valuation reads, the car is priced on that one (not a guess, a real read) and
the caller flags that the other could not be read. settings overrides the
retail uplift percentage and the flat spread (see DEFAULT_SETTINGS), None
uses the factory defaults (15% and Â£3,000).ri   rj   rk   Nr   zGlass'sÚCazana)ré   rê   r  r  r	  r
  r  )r�   ré   r  rê   ÚroundÚGOVERNING_THRESHOLDr  )r£   r˜   r¤   ÚupliftÚspreadÚglassÚcazanar  r  Ú	governingr
  r  s               r�   Ú	price_carr„  Î  s!  € ð 	1ÔÐ0 §¨BÐ0€AØˆÑ #Ñ%€FØˆ}Ñ€FØ%(×%5Ñ%5Ñ%AŒC�× Ñ Ô!Àt€EØ'*×'8Ñ'8Ñ'DŒS�×"Ñ"Ô#È$€Fà�}˜™Øà05Ñ0A”�u  F¡
Ñ+Ô,Àt€JØ28Ñ2D”%˜ ! f¡*Ñ-Ô.È$€KàÑ +Ñ"9ð Ô+Ó+Ø*4°iÑ'ØÓ%Ø*5°xÑ'à*4°iÑ'Ø	Ñ	à&0°)Ñ#ð '2°8Ð#àÑ €GäØØØØØ!Ø)Øñð r�   c                 óü   • [        U 5      nU(       d  g[        R                  " SU5       Vs/ s H)  o"R                  5       (       d  M  UR                  5       PM+     nnU(       d  g[	        S U 5       5      $ s  snf )zóTrue when every warning light listed is a minor, non mechanical one (tyre
pressure or a service reminder), so it is a card flag not a rejection. If any
light is something else, or cannot be read, return False so the car is
rejected. Play safe.Fz[,/]+c              3   óV   ^#   • U  H  m[        U4S  j[         5       5      v •  M      g7f)c              3   ó,   >#   • U  H	  oT;   v •  M     g 7fr   rú   )r/  r0  Úps     €r�   r1  Ú4_warning_lights_trivial.<locals>.<genexpr>.<genexpr>	  s   øé € Ð>Ò'= ˜!–8Ò'=ùr3  N)r6  ÚTRIVIAL_WARNING_LIGHTS)r/  rˆ  s    @r�   r1  Ú*_warning_lights_trivial.<locals>.<genexpr>	  s    øé € ÐNÊÀ1ŒsÔ>Õ'=Ó>×>Ð>Êùs   ƒ&))rŸ   r«   r    rŒ   r°   )r©   rD  rˆ  Úpartss       r�   Ú_warning_lights_trivialr�  þ  s_   € ô
 	ˆd‹€AÞØÜ "§¢¨°1Ô 5ÓCÒ 5˜1¿¹¿‹YˆQ�W‰WŽYÑ 5€EÐCÞØÜÑNÉÓNÓNÐNùò Ds   ­A9Á	A9c                 ó„   • [        U R                  5      nUS;   a  gUS;   a  gUS;   a  gUS;   a  gS	U R                   S
3$ )aM  Always returns something now (Mark 2026-08-20, for the card's traffic
light: full service history gets its own green confirmation rather than
staying silent, so a car with a real one is visibly rewarded, not just
the absence of a red or amber warning). Annotation only, this never
feeds the gate, still never blocks a car either way.)ÚfullÚfshzfull service historyzFull service history.)rm   Úunknownz<Service history not confirmed. Treat as a lower quality buy.)ÚnoneÚnozno service historyz&No service history. Lower quality buy.)ÚpartialÚpartz0Partial service history only. Lower quality buy.zService history: z. Lower quality buy.)rŸ   ræ   )r£   Úshs     r�   Ú_service_flagr—    sZ   € ô 
ˆs×"Ñ"Ó	#€BØ	Ð4Ó4Ø&Ø	ˆ_ÓØMØ	Ð1Ó1Ø7Ø	Ð Ó ØAØ˜s×2Ñ2Ð3Ð3GÐHÐHr�   c                 ó¾  • U=(       d    0 nUR                  S[        S   5      (       d  gUR                  S5      =(       d    /  Vs/ s H%  n[        U5      R                  5       (       d  M#  UPM'     nn[	        [
        R                  5      U Vs/ s H  n[        U5      PM     sn-   n[
        R                  " U R                  U5      =(       d    S$ s  snf s  snf )z™Why this car cannot be driven home, or None. Off when the dealership
has switched the rule off; never a reason when the platform gave no
location at all.r`   Nrb   )	rM  r�   r­   rŒ   r  r   ÚFERRY_PLACESÚferry_reasonr†   )r£   r˜   r¤   rˆ  ÚextraÚplacess         r�   Úferry_crossingr�    s©   € ð 	��B€AØ�5‰5Ð$Ô&6Ð7JÑ&K×LÑLØØŸ™˜~Ó.×4°"Ð4ÓHÒ4�1¼¸Q»¿¹¿�QÑ4€EÐHÜ”%×$Ñ$Ó%¹Ó(?º°A¬¨Q®¹Ñ(?Ñ?€FÜ×Ò˜cŸl™l¨FÓ3×;°tÐ;ùò IùÚ(?s   Á"CÁ-CÂCc                 óâ  • / n[        X5      nU(       a  UR                  U S35        [        U R                  5      (       d  UR                  S5        [	        U 5      nU(       a  UR                  SU S35        [        X5      nU(       a  UR                  U5        [        X5      nU(       a  UR                  U5        U R                  (       a  UR                  SU R                   S35        U R                  (       a9  [        U R                  5      (       d  UR                  SU R                   S35        [        U R                  U5      nUb  US:  a  UR                  SU S	35        U$ )
zÒThe list rules (bans, engine, class, known faults, keeper months) in
the order assess checks them. assess stops on the first one that bites;
a released car carries on past all of them, so this collects the set.z is a banned make.zAEngine could not be confirmed, so the car is excluded. Play safe.zBanned engine: re  z'Known mechanical issue on the listing: z(Warning lights reported on the listing: é   z.Current owner has had the car under 6 months (z	 months).)r+  rf  rŸ   râ   r;  rU  r�  rô   rõ   r�  r  ró   )	r£   r  r˜   r  ÚbmÚbeÚceÚfcÚmos	            r�   Ú_rule_reasonsr¥  *  s1  € ð
 €Gä	�SÓ	#€BÞ	Ø�‰˜"˜Ð/Ð0Ô1ä�—‘×ÑØ�‰ÐZÔ[ä	�sÓ	€BÞ	Ø�‰˜¨¨¨AÐ.Ô/ä	˜Ó	'€BÞ	Ø�‰�rÔä	˜Ó	&€BÞ	Ø�‰�rÔð ‡~‡~Ø�‰Ð@ÀÇÁÐ@PÐPQÐRÔSØ
××Ô"9¸#×:LÑ:L×"MÑ"MØ�‰ÐAÀ#×BTÑBTÐAUÐUVÐWÔXô 
�c×&Ñ&¨Ó	.€BØ	�~˜"˜q›&Ø�‰ÐGÈÀtÈ9ÐUÔVØ€Nr�   c           	      ó2   • [        XU5      [        XUX4S9-   $ )zyEvery reason the rules hold this car back (the list rules, then the
hard gate), or an empty list when it passes them all.©rV  rW  r˜   )r¥  rz  )r£   r  rV  rW  r˜   s        r�   Úheld_back_reasonsr¨  S  s(   € ô
 ˜ XÓ.´ØÐ'9Ø'ñ2<ñ <ð <r�   Úreleasec                 óÆ   • U =(       d    0 R                  S5      =(       d    SnU =(       d    0 R                  S5      =(       d    SnSU 3U(       a
  SU 3-   S-   $ S-   S-   $ )zBThe card line for a car Steven released from a hold: who, and why.Úwhoz	Dealer OSÚreasonrm   zReleased from hold by z: re  rZ  )r©  r«  Úwhys      r�   Úreleased_flagr®  ]  s`   € à�=�b×
Ñ
˜eÓ
$×
3¨€CØ�=�b×
Ñ
˜hÓ
'×
-¨2€CØ# C 5Ð)¾3¨r°#°¨ZÑGÈ#ÑMÐMÀBÑGÈ#ÑMÐMr�   c                 ó.  • [        XU5      nU(       a  U(       d  [        U SUS   /S9$ [        XUX4S9nU(       a  U(       d  [        U SUS9$ / n/ n	U(       a9  U	R                  [	        U5      5        Xg-    H  n
U	R                  SU
 35        M     [        U 5      nU(       a  U	R                  U5        U R                  (       a  U	R                  SU R                   S35        U R                  (       a  U	R                  SU R                   S	35        U R                  (       a  U	R                  S
5        U R                  (       a  U	R                  SU R                   35        [        X5      nUc  UR                  S5        [        U SX‰S9$ U R                  c  U	R                  S5        OU R                  c  U	R                  S5        U R                  (       a.  UR                  SU R                  -  :”  a  U	R                  S5        [        U SXœS9$ )a¯  Run the whole brain on one car and return a full assessment. settings
overrides the hard gate, the list bans, and the retail uplift and flat
spread (see DEFAULT_SETTINGS), None uses them as they are. The governing
threshold and the engine ban rules are not overridable, they stay code
only.

release (2026-09-10) is the row from db.released_cars when Steven has
released this car from a hold on Dealer OS: the rules that would have
dropped it are still checked, but they become flags on the card
("Held back by the rules: ...") under his own reason, and the car goes
on to be priced like any other. Hides still win over a release, they
are applied after assessment (daily_run._annotate).Úrejectedr   )r£   r  r  r§  zHeld back by the rules: zKnown electrical issue: z. Not mechanical, check it.z$Minor warning light on the listing: z. Check it, not a fault.z8VAT qualifying. Priced by the normal rule, just flagged.zSeller notes: ziHeld back. Neither Glass's retail nor Cazana retail could be read with confidence. Not priced on a guess.Úheld)r£   r  r  r  z;Glass's valuation could not be read. Priced on Cazana only.z;Cazana valuation could not be read. Priced on Glass's only.g      @zKValuation looks high against CAP. Check it is the right car before bidding.Ú	shortlist)r£   r  r  r  )r¥  r  rz  rf  r®  r—  rö   rõ   rç   rø   r„  ré   rê   rà   r	  )r£   r  rV  rW  r˜   r©  Úrulesrr  r  r  ÚrÚsfr  s                r�   Úassessr¶  d  sÌ  € ô ˜# hÓ/€EÞ–Wä˜c¨*¸uÀQ¹x¸jÑIÐIä˜#Ð9KØ*9ñN€Eæ–WÜ˜c¨*¸eÑDÐDð €GØ€EÞØ�‰”] 7Ó+Ô,Ø”ˆAØ�L‰LÐ3°A°3Ð7Ö8ñ ä	�sÓ	€BÞ	Ø�‰�RÔØ
××Ø�‰Ð/°×0DÑ0DÐ/EÐE`ÐaÔbØ
××Ø�‰Ð;¸C×<NÑ<NÐ;OÐOgÐhÔiØ
××Ø�‰ÐOÔPØ
‡y‡yØ�‰�~ c§i¡i [Ð1Ô2ô
 ˜Ó&€GØ�Ø�‰ð6ô	
ô ˜c¨&¸'ÑOÐOà
×ÑÑØ�‰ÐRÕSØ	×	Ñ	Ñ	"Ø�‰ÐRÔSð ‡}‡}˜×0Ñ0°3¸¿¹Ñ3FÓFØ�‰ÐbÔcä˜# k¸ÑPÐPr�   c                 óP   • U c  gSR                  [        [        U 5      5      5      $ )z5Format whole pounds as a clean string with no dashes.znot readu   Â£{:,})Úformatr  r}  )Úvalues    r�   rN  rN  ¨  s"   € à�}ØØ�?‰?œ3œu U›|Ó,Ó-Ð-r�   c                 óZ  • U  Vs/ s H  n[        X!5      PM     nnU Vs/ s H  oDR                  S:X  d  M  UPM     nnU Vs/ s H  oDR                  S:X  d  M  UPM     nnU Vs/ s H  oDR                  S:X  d  M  UPM     nnUR                  S S9  XVU4$ s  snf s  snf s  snf s  snf )zoAssess a list of cars and return the shortlist sorted cheapest reserve
first, plus the held and rejected lists.r²  r±  r°  c                 ó.   • U R                   R                  $ r   )r£   rß   )Úas    r�   r^  Úassess_all.<locals>.<lambda>º  s   €  §¡§¢r�   )r–   )r¶  r  Úsort)Úcarsr  ÚcÚassessmentsr¼  r²  r±  r°  s           r�   Ú
assess_allrÂ  ¯  sž   € ñ .2Ó2ªT¨”6˜!Ö#©T€KÐ2á'ÓCšK�q¯8©8°{Ñ+B—™K€IÐCÙ"Ó9’{�!§h¡h°&Ñ&8�A‘{€DÐ9Ù&ÓAš;�a¯(©(°jÑ*@—™;€HÐAð ‡N�NÑ.€NÑ/à˜HÐ$Ð$ùò 3ùâCùÚ9ùÚAs'   …B B·BÁB#ÁB#Á&B(Á=B(r   )NFFN)NN)NFFNN)Crÿ   Údataclassesr   r   Útypingr   r  r«   rm   r   Údealer_configÚ_dealer_configÚ	ExceptionÚFLAT_SPREADÚRETAIL_UPLIFTr~  rg  rh  ri  rj  rk  rn  rp  ÚBANNED_MAKESÚ
VAN_MODELSÚBANNED_MODELSÚ
VALUE_CAPSÚSMALL_CAR_TOKENSÚSMALL_CAR_CAP_LIMITrŠ  rm  Ú_HARD_GATE_DEFAULTSr¢   Úgetattrr  Údictr�   r•   r­   rŽ   r—   r¨   rŸ   r5  r7  rØ   r  r  r  r  r  r!  r&  r+  r;  rU  rz  r„  r�  r—  r�  r¥  r¨  r®  r¶  rN  rÂ  )Úxs   0r�   Ú<module>rÔ     s	  ðñ÷* )Ý Û Û 	å ðÛ*ð €ð €ð Ð ð €Ø€Ø
€Ø
€ØÐ Ú€Ø€
òD€ò"€
ò I€ð ˜h¨tÑ4Ø ¨dÑ3Ø˜g¨dÑ3Ø˜X¨dÑ3Ø˜t¨DÑ1Ø˜d¨4¸LÈ)Ð;TÑUð€
ò*Ð ð Ð ð5Ð ð: ¨{Ø 7Ù˜^Ó,¸JñÐ ðpð Ö^l™™g nÐ6QÐSXÓYÔZÐrwðpð �Bðpð ‘F˜<Ó(ðpð +7¹¸ZÓ8Hðpð  ¡}Ó5¢} !‘d˜1–g¡}Ñ5ð!pð" ¡JÓ/¢J˜q‘4˜–7¡JÑ/ð#pð$ ™Ð/Ó0ð%pð$ 3HÐI\ð%pð& �] SÑ(ð'pð& +8¸ð'pð: �rð;pðP ˜TðQpðZ �Xð[pðn ˜ðopð@ ˜cðApðB ˜bðCpðJ ˜ðKpðp ØØØØð ØØàUÐ*ÐUÐ,@ÐBTÑUØSÐ(ÐSÐ*>Ð@RÑSØHÐ.ÐHÐ0CÀRÑHØIÐ/ÐIÐ1DÀbÑIð
 WÐ+ÐVÐ-AÐCUÑVñ
òKpÐ ðl _Ð ð/ Cð /¨Cô /ðA 8¨C¡=ð A°Sô Añ

 X¨d¡^ð 
¸tõ 
ð:�˜‘ð : #ô :ð Ø�JÐñ!ð 8Ø�JÐ¨6¨(ÀÐRVñXð -ØˆG˜X°°ÀtÐX\ñ^à Ø�JÐ¨6¨(ñ4ð +Ø�JÐ¨6¨(¸tñEð .Ø�EˆNñð 3Ø�EˆN i°Ð%7ñ9à2Ø˜D�/¨5¨'¸YÈÐ<NñPð )Ø�EˆN h Zñ1à(ØˆKñð *Ø�EˆNñð %Ø�EˆNñà$ØˆHñð =Ø�GÐ¨
°FÐ';ñ=à<Ø�( j°&Ð%9ñ;à<Ø˜XÐ&ñ(ð )Ø�IÐñ à(ØˆKñð 9Ø�JÐñ!ð +Ø�FˆOñð +Ø�FˆOñð /Ø�JÐñ!ð 3Ø�GÐ¨
°FÐ';ñ=à2ØˆJñð +Ø�HÐ¨¨	ñ3ð ØˆG˜X°°ñ:ðYN€ðp Ò&VÐbgÑhØ"Ò-cÐotÑuØ#Ò.dÐpuÑvØ#Ò.dÐpuÑvØ)°V°HÈÐ\`ÐmqÑrØ¨&¨¸UÐQUÐbfÑgØ ¨F¨8¸uÑEØ*°f°XÈÐ[_Ñ`Ø%°¸EÐ0BÈeÑTØ¨8¨*ÀÑFØ/Ò:XÐdiÑjØ¨)¨ÀÑFØ)°ZÀÐ4HÐTYÑZØ/Ò:bÐnsÑtØ)°X°JÈ%ÑPð€
ð& ÷9ð 9ó ð9ð@ ÷	ð 	ó ð	ð ÷&ð &ó ð&ñ˜sð ¨8°H·M±MÑ+Bð ÈhÐWZÉmõ ñ "�(˜3‘-ð "¨°·±Ñ(?ð "È8ÐTWÉ=õ "ð)˜ #™ô )ñ�Sð  H¨T¡Nð ¸hÀs¹mõ ð&�sð &˜x¨™}ô &ñR6˜ð 6¨°©ð 6À(È3Á-õ 6ðr >BØLQØ-1ñO�sð O 8¨H¯M©MÑ#:ð OØ&*ðOØEIðOà$ T™NðOà6:õOñd-�3ð - (¨4¡.ð -¸HÀWÑ<Mõ -ð`O Tô OðI�sð I˜x¨™}ô Iñ$	<˜ð 	< x°¡~ð 	<ÀÈ#Áõ 	<ð >BØ-1ñ&�sð & 8¨H¯M©MÑ#:ð &Ø$ T™Nð&Ø6:õ&ðR BFØPUØ15ñ<˜3ð < x°·±Ñ'>ð <Ø*.ð<ØIMð<à (¨¡ð<à:>õ<ðN˜4ð N Cô Nð 7;ØEJØFJñAQ�ð AQ˜H X§]¡]Ñ3ð AQØ#ðAQØ>BðAQà˜d‘^ðAQà5=¸d±^ðAQàOYõAQðH.�Sô .ñ%˜H X§]¡]Ñ3ö %øðW ó ØƒNðüòh 6ùÚ/s    P4 Â5QÃQÐ4Q Ð?Q 