}L iA0ddlmZddlZddlZddlmZmZddlm Z ddl Z ddl ZddlmZddlmZmZddlmZdd lmZdd lmZmZdd lmZdd lmZdd lm Z ddl!m"Z"ddl#m$Z$m%Z%ddl&m'Z'ddl(m)Z)ddlm*Z*m+Z+m,Z,m-Z-ddl.m/Z/ddl0m1Z1da2GddZ3y))print_functionN)OptionalUnion)quote)requests)utilscache)_MIC_TO_YAHOO_SUFFIX)YfData)YFEarningsDateMissingYFRateLimitError) WebSocket)Analysis) Fundamentals)Holders)QuoteFastInfo) PriceHistory) FundsData) _BASE_URL_ _ROOT_URL_ _QUERY1_URL_ _SENTINEL_)StringIO) BeautifulSoupc6eZdZdefdZej dejfdZ dZ dZ ej dZ edfd Z edfd Zedfd Zefdefd Zefdefd ZedfdZedfdZedfdZedfdZedfdZedfdZefdefdZefdZedfdZefdefdZedfdZedfdZedfdZedfdZ edfdZ!edfdZ"eddfdZ#edddfd Z$edddfd!Z%edddfd"Z&edddfd#Z'edddfd$Z(edddfde)ejeffd%Z*edddfd&Z+ed'fdejXfd(Z-ed'fdejXfd)Z.ed'fdejXfd*Z/ed'fdejXfd+Z0edfde)ejeffd,Z1ej ddefd-Z2efde3e4fd.Z5d/d0efde6fd1Z7d9de3ejfd3Z8ej d9de3ejfd4Z9ej d2efde3ejfd5Z:efdefd6Z;efde3e<fd7Z=d:d8Z>y); TickerBaseNct|trt|dk7r td|\}}|j dr|dd}|j t vrtd|dt |j }|dk7r|d|}n|}|j |_|xstjd |_ d|_ d|_ g|_ d|_i|_d|_d|_|jdk(r td t%| |_|t(ur7t+j,d t.d|j&j1|t3j4|jr|j}t7j8}|j;||_|jst3j<||_|jdk(rtd||jr|j?||jd|_ tC|j&|j|_"tG|j&|j|_$tK|j&|j|_&tO|j&|j|_(d|_)d|_*d|_+d|_,y)as Initialize a Yahoo Finance Ticker object. Args: ticker (str | tuple[str, str]): Yahoo Finance symbol (e.g. "AAPL") or a tuple of (symbol, MIC) e.g. ('OR','XPAR') (MIC = market identifier code) session (requests.Session, optional): Custom requests session. z'Ticker tuple must be (symbol, mic_code).rNzUnknown MIC code: ''chrome) impersonatezEmpty ticker name)session=Set proxy via new config function: yf.set_config(proxy=proxy) stacklevelzInvalid ISIN number: )- isinstancetuplelen ValueError startswithupperr tickerrSessionr&_tz_isin_news_shares_earnings_dates _earnings _financialsr _datarwarningswarnDeprecationWarning _set_proxyr is_isinr get_isin_cachelookupget_ticker_by_isinstore_price_historyr _analysisr_holdersr_quoter _fundamentals _funds_data _fast_info_message_handlerws) selfr0r&proxy base_symbolmic_codesfxisincs S/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/yfinance/base.py__init__zTickerBase.__init__7sO fe $6{a !JKK$* !K""3'#AB<~~';; #6xj!BCC&x~~'78Cby'=#/$lln H("2"2x"H    ! ;;" 01 1#G4  " MMY[mz{ | JJ ! !% ( == %;;D$$&A((4.DK;;#66t< {{b  #8!?@@{{dkk*#!$**dkk: DKK8 DJJ 4 )$**dkkB $returncB|jj|i|SN)_lazy_load_price_historyhistory)rLargskwargss rSrZzTickerBase.historys#6t,,.66GGGrUc|j6t|j|j|j d|_|jS)N timeout)rCrr9r0_get_ticker_tz)rLs rSrYz#TickerBase._lazy_load_price_historysB    &".tzz4;;H[H[dfH[Hg"hD """rUc|j |jStj}|j|j}|r3t j |s|j|jdd}||j|}|8tdkr/tdz a dD]!}||jvs|j|}nt j |r|j|j|nd}||_|S)Nr r)exchangeTimezoneNametimeZoneFullName) r2r get_tz_cacher@r0r is_valid_timezonerB_fetch_ticker_tz_tz_info_fetch_ctrinfo)rLr`rRtzks rSrazTickerBase._get_ticker_tzs 88 88O     XXdkk " e--b1 GGDKK &B :&&w/Bz&)'!+&I" >!%1B!"&&r* R( rUctj}ddd}td|j} |jj |||}|j }|jdijdd}|r"|jd|jd|y |dd d d d S#t$rr}|jd |jd||jd|jd|jd||jdYd}~yd}~wwxYw#t$rt$r+}|jd|jd|Yd}~yd}~wwxYw)N1d)rangeintervalz/v8/finance/chart/)urlparamsr`charterrorz$Got error from yahoo api for ticker z , Error: resultrmetarcz/Could not get exchangeTimezoneName for ticker 'z ' reason: zGot response: z ------------- zFailed to get ticker ') r get_yf_loggerrr0r9 cache_getjsongetdebug Exceptionrsr) rLr`loggerrqrpdatarserres rSrgzTickerBase._fetch_ticker_tzsy$$&T2 .t{{m< 2::''C'PD99;DHHWb)--gtTUU 2LL#RSWS^S^R__ijmin!opLL!12LL1LL1TF,LL11 2     LL1$++jL M s0.D4%B66 D1?A(D,,D14E1!E,,E1Fc|tur7tjdtd|jj ||j j}|r|jS|S)z~ Returns a DataFrame with the recommendations Columns: period strongBuy buy hold sell strongSell r'r r() rr:r;r<r9r=rFrecommendationsto_dictrLrMas_dictr~s rSget_recommendationszTickerBase.get_recommendationssT  " MMY[mz{ | JJ ! !% ({{** <<> ! rUc|tur7tjdtd|jj ||j |S)Nr'r r()r)rr:r;r<r9r=r)rLrMrs rSget_recommendations_summaryz&TickerBase.get_recommendations_summarysC  " MMY[mz{ | JJ ! !% ('''88rUc|tur7tjdtd|jj ||j j}|r|jS|S)z Returns a DataFrame with the recommendations changes (upgrades/downgrades) Index: date of grade Columns: firm toGrade fromGrade action r'r r() rr:r;r<r9r=rFupgrades_downgradesrrs rSget_upgrades_downgradesz"TickerBase.get_upgrades_downgradessT  " MMY[mz{ | JJ ! !% ({{.. <<> ! rUc|tur7tjdtd|jj ||j jSNr'r r()rr:r;r<r9r=rFcalendarrLrMs rS get_calendarzTickerBase.get_calendars?  " MMY[mz{ | JJ ! !% ({{###rUc|tur7tjdtd|jj ||j jSr)rr:r;r<r9r=rF sec_filingsrs rSget_sec_filingszTickerBase.get_sec_filingss?  " MMY[mz{ | JJ ! !% ({{&&&rUc|tur7tjdtd|jj ||j j}|r|jS|Sr) rr:r;r<r9r=rEmajorrrs rSget_major_holderszTickerBase.get_major_holderssR  " MMY[mz{ | JJ ! !% (}}"" <<> ! rUc|tur7tjdtd|jj ||j j}||r|jS|Syr) rr:r;r<r9r=rE institutionalrrs rSget_institutional_holdersz$TickerBase.get_institutional_holders s]  " MMY[mz{ | JJ ! !% (}}**  ||~%K rUc|tur7tjdtd|jj ||j j}||r|jS|Syr) rr:r;r<r9r=rE mutualfundrrs rSget_mutualfund_holdersz!TickerBase.get_mutualfund_holderss]  " MMY[mz{ | JJ ! !% (}}''  ||~%K rUc|tur7tjdtd|jj ||j j}||r|jS|Syr) rr:r;r<r9r=rEinsider_purchasesrrs rSget_insider_purchasesz TickerBase.get_insider_purchases#s]  " MMY[mz{ | JJ ! !% (}}..  ||~%K rUc|tur7tjdtd|jj ||j j}||r|jS|Syr) rr:r;r<r9r=rEinsider_transactionsrrs rSget_insider_transactionsz#TickerBase.get_insider_transactions.s]  " MMY[mz{ | JJ ! !% (}}11  ||~%K rUc|tur7tjdtd|jj ||j j}||r|jS|Syr) rr:r;r<r9r=rEinsider_rosterrrs rSget_insider_roster_holdersz%TickerBase.get_insider_roster_holders9s]  " MMY[mz{ | JJ ! !% (}}++  ||~%K rUc|tur7tjdtd|jj ||j j}|Sr)rr:r;r<r9r=rFrirLrMr~s rSget_infozTickerBase.get_infoDsC  " MMY[mz{ | JJ ! !% ({{ rUc|tur7tjdtd|jj ||j t||_|j Sr)rr:r;r<r9r=rIrrs rS get_fast_infozTickerBase.get_fast_infoLsN  " MMY[mz{ | JJ ! !% ( ?? "&tnDOrUc|tur7tjdtd|jj ||j j}|r|jS|Sr) rr:r;r<r9r=rFsustainabilityrrs rSget_sustainabilityzTickerBase.get_sustainabilityUsR  " MMY[mz{ | JJ ! !% ({{)) <<> ! rUc|tur7tjdtd|jj | |j j}|Sr)rr:r;r<r9r=rDanalyst_price_targetsrs rSget_analyst_price_targetsz$TickerBase.get_analyst_price_targets_sJ  " MMY[mz{ | JJ ! !% ( ~~33 rUc|tur7tjdtd|jj | |j j}|r|jS|Sr) rr:r;r<r9r=rDearnings_estimaterrs rSget_earnings_estimatez TickerBase.get_earnings_estimatejsX  " MMY[mz{ | JJ ! !% ( ~~//!(t||~2d2rUc|tur7tjdtd|jj | |j j}|r|jS|Sr) rr:r;r<r9r=rDrevenue_estimaterrs rSget_revenue_estimatezTickerBase.get_revenue_estimatevX  " MMY[mz{ | JJ ! !% ( ~~..!(t||~2d2rUc|tur7tjdtd|jj | |j j}|r|jS|Sr) rr:r;r<r9r=rDearnings_historyrrs rSget_earnings_historyzTickerBase.get_earnings_historyrrUc|tur7tjdtd|jj ||j j}|r|jS|S)zu Index: 0q +1q 0y +1y Columns: current 7daysAgo 30daysAgo 60daysAgo 90daysAgo r'r r() rr:r;r<r9r=rD eps_trendrrs rS get_eps_trendzTickerBase.get_eps_trendsS  " MMY[mz{ | JJ ! !% (~~''!(t||~2d2rUc|tur7tjdtd|jj ||j j}|r|jS|S)z{ Index: 0q +1q 0y +1y Columns: upLast7days upLast30days downLast7days downLast30days r'r r() rr:r;r<r9r=rD eps_revisionsrrs rSget_eps_revisionszTickerBase.get_eps_revisionssS  " MMY[mz{ | JJ ! !% (~~++!(t||~2d2rUc|tur7tjdtd|jj ||j j}|r|jS|S)zi Index: 0q +1q 0y +1y +5y -5y Columns: stock industry sector index r'r r() rr:r;r<r9r=rDgrowth_estimatesrrs rSget_growth_estimateszTickerBase.get_growth_estimatessS  " MMY[mz{ | JJ ! !% (~~..!(t||~2d2rUyearlycP|tur7tjdtd|jj ||j jy|j j|}|r4|j}d|jvrdn|jd|d<|S|S)z :Parameters: as_dict: bool Return table as Python dict Default is False freq: str "yearly" or "quarterly" or "trailing" Default is "yearly" r'r r(NfinancialCurrencyUSD) rr:r;r<r9r=rGearningsrr7)rLrMrfreqr~ dict_datas rS get_earningszTickerBase.get_earningss  " MMY[mz{ | JJ ! !% (    & & .!!**40  I6IQUQ_Q_6_Ueieses#f%I) *  rUcj|tur7tjdtd|jj ||j jj|}|r9|j}tj|jdgd|_ |r|jS|S)ag :Parameters: as_dict: bool Return table as Python dict Default is False pretty: bool Format row names nicely for readability Default is False freq: str "yearly" or "quarterly" or "trailing" Default is "yearly" r'r r(rrv)EBITEBITDAEPSNIsepacronyms)rr:r;r<r9r=rG financialsget_income_time_seriescopyr camel2titleindexrrLrMrprettyrr~s rSget_income_stmtzTickerBase.get_income_stmts  " MMY[mz{ | JJ ! !% (!!,,CCCN 99;D**4::3IhiDJ <<> ! rUc|tur7tjdtd|jj ||j ||||Srrr:r;r<r9r=rrLrMrrrs rSget_incomestmtzTickerBase.get_incomestmtF  " MMY[mz{ | JJ ! !% (##E7FDAArUc|tur7tjdtd|jj ||j ||||Srrrs rSget_financialszTickerBase.get_financialsrrUch|tur7tjdtd|jj ||j jj|}|r8|j}tj|jddg|_ |r|jS|SaY :Parameters: as_dict: bool Return table as Python dict Default is False pretty: bool Format row names nicely for readability Default is False freq: str "yearly" or "quarterly" Default is "yearly" r'r r(rrvPPEr)rr:r;r<r9r=rGrget_balance_sheet_time_seriesrr rrrrs rSget_balance_sheetzTickerBase.get_balance_sheets  " MMY[mz{ | JJ ! !% (!!,,JJPTJU 99;D**4::3%QDJ <<> ! rUc|tur7tjdtd|jj ||j ||||Sr)rr:r;r<r9r=rrs rSget_balancesheetzTickerBase.get_balancesheet sF  " MMY[mz{ | JJ ! !% (%%eWfdCCrUch|tur7tjdtd|jj ||j jj|}|r8|j}tj|jddg|_ |r|jS|Sr)rr:r;r<r9r=rGrget_cash_flow_time_seriesrr rrrrs rS get_cash_flowzTickerBase.get_cash_flows  " MMY[mz{ | JJ ! !% (!!,,FFDFQ 99;D**4::3%QDJ <<> ! rUc|tur7tjdtd|jj ||j ||||Sr)rr:r;r<r9r=rrs rS get_cashflowzTickerBase.get_cashflow/sF  " MMY[mz{ | JJ ! !% (!!%&$??rUmaxc|tur7tjdtd|jj ||j j|SNr'r r()period)rr:r;r<r9r=rY get_dividendsrLrMrs rSrzTickerBase.get_dividends5sL  " MMY[mz{ | JJ ! !% (,,.< ! rUctj}|tur7tjdt d|j j||jd}tjjj|}|tj||}|tj||}||}||tjdz }||k\r|jdy|j!d }|j#d }d |j$d |j$}|d t'|j)d t'|j)} |j j+|} | j-} | ddddk(} | r|j|j$dy| dd} d| dvry tj:| ddtj<| ddd} | j@jC|| _ | jE} | S#t.j0t2j4j6f$r!|j|j$dYywxYw#t8$rd} YwxYw#t>$r*} |j|j$d| Yd} ~ yd} ~ wwxYw)Nr'r r(r^r_i$)dayszStart date must be before endDzRhttps://query2.finance.yahoo.com/ws/fundamentals-timeseries/v1/finance/timeseries/z?symbol=z &period1=z &period2=rpz*: Yahoo web request for share count failedfinancerscodez Bad RequestF timeseriesrt shares_outr timestamps)unit)rz%: Failed to parse shares count data: )#r rwrr:r;r<r9r=rapd Timestamputcnow tz_convert_parse_user_dt Timedeltarsfloorceilr0intrrxry_jsonJSONDecodeErrorr exceptionsRequestExceptionKeyErrorSeries to_datetimer|r tz_localize sort_index)rLstartendrMr}rjdt_now ts_url_base shares_url json_datafail shares_datadfrs rSget_shares_fullzTickerBase.get_shares_fullWs$$&  " MMY[mz{ | JJ ! !% (  ,$$&11"5  ((3E ?&&sB/C ;C =",,C00E C< LL8 9 C hhsmkkokvkvjwwAEALAL@MN #}Ic%//2C.D-EYsSVS`S`SbOcNde   ,,,,7r~~kZ[n]hNips?tuB 88''+ ]]_ -%%x':':'K'KL  LLDKK=(RS T   D   LLDKK=(MaSQ R s=0,IJ8J)A JJ J&%J&) K2 KKcT|tur7tjdtd|jj ||j |j S|jj}d|vsd|vrd|_|j S|}|jjyd|jjvr|jjd}dt|}|jj|j}d |d }||vrL|j|jvrd }||vr&d|_|j Sd|_|j S|j|d jd d jd d |_|j S)Nr'r r(-^ shortNamezWhttps://markets.businessinsider.com/ajax/SearchController_Suggest?max_results=25&query=r"|z"|rr)rr:r;r<r9r=r3r0r/rFri urlencoderxtextlowersplit)rLrMr0qrpr~ search_strs rSget_isinzTickerBase.get_isins{  " MMY[mz{ | JJ ! !% ( :: !:: ""$ &=C6MDJ::   ;;   # $++** *   -Aghqrshtguvzz###,11] T !wwyDJJL(! T)!$DJ::%  zz!ZZ +A.44S9!<BB3GJ zzrUr^newsc |jr |jStj}|tur7t j dt d|jj|dddd}|j|j}|s.td|d d j|jtd |d }d ||jgdi}|jj!||} | d| j"vr t%d | j'} | jdijdijdg} | D cgc]} | jdgr| c} |_|jS#t(j*$r#|j-|jdi} YwxYwcc} w)z7Allowed options for tab: "news", "all", "press releasesr'r r(newsAll latestNews pressRelease)allr3zpress releaseszInvalid tab name 'z'. Choose from: z, z/xhr/ncp?queryRef=z&serviceKey=ncp_fin serviceConfig) snippetCountr)bodyzWill be right backz~*** YAHOO! FINANCE IS CURRENTLY DOWN! *** Our engineers are working quickly to resolve the issue. Thank you for your patience.zC: Failed to retrieve the news and received faulty response instead.r~ tickerStreamstreamad)r4r rwrr:r;r<r9r=rzr.r-joinkeysrr0postr- RuntimeErrorryrrrs) rLcounttabrMr} tab_queryrefs query_refrppayloadr~r3articles rSget_newszTickerBase.get_newss :::: $$&  " MMY[mz{ | JJ ! !% ( , "%%ciik2 1#6FtyyQ^QcQcQeGfFghi i .yk9LM  %kk] zzs1 </499< IJ J 99;D xx#'';??"M-1O'T29NgO zz$$  LLDKK=(kl mD  PsFG6G3GG c&|j||SrX) _get_earnings_dates_using_scrape)rLlimitoffsets rSget_earnings_dateszTickerBase.get_earnings_datess44UFCCrUc D|dkDr|dkrd}n%|dkDr|dkrd}n|dkDr|dkrd}n tddj|j||}|jj |}t |j d}|jd}|rPt|}t|} tj| d g d} | jd d gd } | jddid| jd} | djjdd| d<| djjdd| d<| djj!dd d} | d} | d } tj"| d| d<tj$t'| d| Dcgc]\}}|j)|c}}| d<| j+d} | Sd}t-j.}|j1|jd|ycc}}w)a Uses YfData.cache_get() to scrape earnings data from YahooFinance. (https://finance.yahoo.com/calendar/earnings?symbol=INTC) Args: limit (int): Number of rows to extract (max=100) offset (int): if 0, search from future EPS estimates. if 1, search from the most recent EPS. if x, search from x'th recent EPS. Returns: pd.DataFrame in the following format. EPS Estimate Reported EPS Surprise(%) Date 2025-10-30 2.97 - - 2025-07-22 1.73 1.54 -10.88 2025-05-06 2.63 2.7 2.57 2025-02-06 2.09 2.42 16.06 2024-10-31 1.92 1.55 -19.36 ... ... ... ... 2014-07-31 0.61 0.65 7.38 2014-05-01 0.55 0.68 22.92 2014-02-13 0.55 0.58 6.36 2013-10-31 0.51 0.54 6.86 2013-08-01 0.46 0.5 7.86 r2dzPlease use limit <= 100zGhttps://finance.yahoo.com/calendar/earnings?symbol={}&offset={}&size={}z html.parsertabler') na_valuesSymbolCompanyr)axis Surprise (%) Surprise(%)Tcolumnsinplace Earnings Date)subsetEDTzAmerica/New_YorkESTrv)nexpandz%B %d, %Y at %I %p)formatz/No earnings dates found, symbol may be delisted: N)r-rdr0r9rxrr-findstrrr  read_htmldroprenamedropnareplacersplitrrzipr set_indexr rwrs)rLrMrNsizerpresponsesouprT table_html html_stringior$dt_partsdtstzsdtrjerr_msgr}s rSrLz+TickerBase._get_earnings_dates_using_scrapes'@ 19"D RZERKD RZESLD67 7X^^ KK  ::'', X]]M: '" UJ%Z0Mmu=a@B(I.Q7B II~}=tI L/2B#%_"5"9"9"A"A%I["\B "$_"5"9"9"A"A%I["\B /*..55cQt5LH1+C1+C"$..=Q"RB "$))cRTUdRegjNk,lFBR^^B-?,l"mB o.B HG((*F LLDKK=7)4 5-ms,H ctj}|tur7tjdt d|j j|t|d}|jr||jvr|j|Std}ddd}|d d |jgd d d dgdd}|j j|||}|j} | ddddddD cgc]} | d } } | dddddd} tj| | } | j rAt#|j}t%|}|j'|jd|y| dj)ddd | d<| dj)d!d"d | d<| dj)d#d$d | d<tj*| d%| d&<|j-d'(}| d&j.j0"| d&j.j3|| d&<n!| d&j.j5|| d&<gd)}| |j7d*j)d+t8j:| |<| j=d%d,gd-d.| j?d&d/| jAd0d1id2| |j|<| Scc} w)3a Get earning dates (future and historic) In Summer 2025, Yahoo stopped updating the data at this endpoint. So reverting to scraping HTML. Args: limit (int): max amount of upcoming and recent earnings dates to return. Default value 12 should return next 4 quarters and last 8 quarters. Increase if more history is needed. Returns: pd.DataFrame r'r r(rSz/v1/finance/visualizationzen-USUS)langregioneqr0)operatoroperands startdatetimeDESCr)rtimeZoneShortName epsestimate epsactualepssurprisepct eventtype)rpquery sortFieldsortType entityIdType includeFields)rqr;rrtr documentsr\labelrows)r\reNz Event Typez^1$CallT)regexz^2$Earningsz^11$MeetingzEvent Start Dater^r_)rYz EPS Estimatez Reported EPSfloat64gzTimezone short namer)rXr])r]rYrZr[)!r rwrr:r;r<r9r=minr6rr0rAryr  DataFrameemptyr rgrsrlrrarxrjrr astypenpnanrirorj)rLrMrMr} clamped_limitrprqr;rqr!rowr\rr$ _exceptionryrjcolumns_to_updates rS"_get_earnings_dates_using_screenerz-TickerBase._get_earnings_dates_using_screenerEs$$&  " MMY[mz{ | JJ ! !% (E3   MT5I5I$I'' 6 678!T2!#'h 5LN(&~  ::??3vD?AMMO ,5Y+?+I!+L[+YZ[+\]f+ghC3w<hh#H-a0=a@H \\$ 0 88.t{{;J*oG LLDKK=7)4 5 l+33E63N<l+33E:T3R<l+33FIT3R<!nnR0B-CD?   , o  ! ! $ $ ,"$_"5"8"8"D"DR"HB "$_"5"8"8"C"CB"GB M "#4 5 < =94 H.0]+ Iis5 Kc|tur7tjdtd|jj ||j j|Sr)rr:r;r<r9r=rYget_history_metadatars rSrzTickerBase.get_history_metadatasI  " MMY[mz{ | JJ ! !% (,,.CCEJJrUc|tur7tjdtd|jj ||j s%t|j|j|_|j Sr) rr:r;r<r9r=rHrr0rs rSget_funds_datazTickerBase.get_funds_datas[  " MMY[mz{ | JJ ! !% ((T[[AD rUc||_t||_|jj|j|jj |jy)N)verbose)rJrrK subscriber0listen)rLmessage_handlerrs rSlivezTickerBase.livesB /G, $++& t,,-rU)rJr)NT)?__name__ __module__ __qualname__rrTr log_indent_decoratorr rrZrYrargrrrdictrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr%rrgr2listrIrOrLrrrrrrUrSrr6s'+:IV H",,H H # B    D)3E 1;E9-7 ",$$%/'4''1%/9% ,6u +5e .8 0:5 (D#-(25/9 T +5e 3*4U 3*4U 3#-e 3'1% 3*4U 3",U0%/eRZ4$.uUQYB$.uUQYB'1%T\6&0uS[D#-eEPX]bcecocoqucu]v6",U5x@ #-ULryyL '1P299P *%IBIII !+5JRYYJ *5U2<rsb,&"+'?'/%+*%CCt .t .rU