
    i                       d Z ddlmZ ddlZddlmZmZ ddlmZm	Z	m
Z
 ddl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mZmZ ddlmZmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z= ddl>m?Z? dZ@g dZAg dZBg dZCg dZDdZEdZFdZGdZHee G d  d!ee                    ZIy)"z0Phase 10 game implementation for PlayPalace v11.    )annotationsN)	dataclassfield   )GamePlayerGameOptions)register_game   )Action	ActionSet
Visibility)ActionGuardMixin)	BotHelper)CardDeckDeckFactory)
GameResultPlayerResult)PokerTurnTimer)Localization)KeybindState)Bot)User   )Phase10PlayerPhase10Options
TableGroupPhaseRequirementPHASESP10_RANK_WILDP10_RANK_SKIPEVEN_PHASES)is_wildis_skipp10_card_namep10_cards_namereq_descriptionphase_description
score_hand
score_cardvalidate_groupcan_hit_groupfind_phase_assignmentactive_phases
next_phasestarting_phase	bot_thinkzgame_ninetynine/mus.ogg)zgame_cards/shuffle1.oggzgame_cards/shuffle2.oggzgame_cards/shuffle3.ogg)zgame_cards/draw1.oggzgame_cards/draw2.oggzgame_cards/draw3.oggzgame_cards/draw4.ogg)zgame_cards/discard1.oggzgame_cards/discard2.oggzgame_cards/discard3.ogg)zgame_cards/play1.oggzgame_cards/play2.oggzgame_cards/play3.oggzgame_pig/roundstart.oggzgame_uno/winround.oggzgame_uno/wingame.oggzgame_pig/turn.oggc                  n    e Zd ZU dZ ee      Zded<    ee      Z	ded<    ee
      Zded<    ee      Zd	ed
<    ee      Zded<   dZded<   dZded<   dZded<    ee      Zded<    ee      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!<    ee      Zd"ed#<   dZded$<    ee      Zd"ed%<   d&Zded'<    ee      Zd(ed)<   dZ ded*<   dq fd+Z!e"drd,       Z#e"drd-       Z$e"drd.       Z%e"dsd/       Z&e"dsd0       Z'dtdud1Z(dvd2Z)dvd3Z*dwd4Z+dxd5Z,dyd6Z-dz fd7Z.dq fd8Z/d{ fd9Z0d|d} fd:Z1dq fd;Z2d{d<Z3d~d=Z4d~d>Z5dd?Z6dd@Z7ddAddBZ8ddAddCZ9ddDZ:ddEZ;dqdFZ<dq fdGZ=ddHZ>dqdIZ?dqdJZ@dqdKZAdqdLZBddMZCddNZDddOZEddPZFddQZGddRZHddSZIddTZJddUZKddVZLddWZMddXZNddYZOddZZPdd[ZQdd\ZRdd]ZSdd^ZTdd_ZUdd`ZVddaZWddbZXddcZYdddZZddeZ[ddfZ\ddgZ]ddhZ^ddiZ_ddjZ`ddkZaddlZbdqdmZcdqdnZddqdoZeddpZf xZgS )Phase10Gamez7Phase 10: complete all 10 phases before your opponents.)default_factorylist[Phase10Player]playersr   optionsr   deckz
list[Card]discard_pilezlist[TableGroup]table_groupsFboolturn_has_drawnlay_down_activer   intlay_down_group_indexzlist[list[int]]lay_down_stagedz	list[int]lay_down_current
hit_activeNz
int | Nonehit_card_idskip_discard_activeskip_pending_card_iddealer_indexnext_round_wait_ticksintro_wait_ticksz	list[str]skip_targets_this_handtiebreaker_modetiebreaker_player_ids
   fixed_hands_remainingr   timer_timer_warning_playedc                0    t         |           d| _        y )NF)super__post_init__rR   self	__class__s    games/phase10/game.pyrU   zPhase10Game.__post_init__x   s    %*"    c                     y)NzPhase 10 clss    rY   get_namezPhase10Game.get_name   s    rZ   c                     y)Nphase10r\   r]   s    rY   get_typezPhase10Game.get_type   s    rZ   c                     y)Nzcategory-card-gamesr\   r]   s    rY   get_categoryzPhase10Game.get_category   s    $rZ   c                     y)Nr   r\   r]   s    rY   get_min_playerszPhase10Game.get_min_players       rZ   c                     y)N   r\   r]   s    rY   get_max_playerszPhase10Game.get_max_players   rg   rZ   c                    t        |||      S )N)idnameis_bot)r   )rW   	player_idrm   rn   s       rY   create_playerzPhase10Game.create_player   s    	VDDrZ   c                *    t        |t              r|S d S N)
isinstancer   rW   players     rY   _get_p10_playerzPhase10Game._get_p10_player   s    #FM:vDDrZ   c                f    | j                  |      }|r|j                  ry | j                  |k7  ry |S rr   )rv   is_spectatorcurrent_player)rW   ru   ps      rY   _require_current_playerz#Phase10Game._require_current_player   s4      (ANN!#rZ   c                D    | j                  |      }|r|j                  S dS )Nen)get_userlocale)rW   ru   users      rY   _player_localezPhase10Game._player_locale   s!    }}V$"t{{,,rZ   c                |    | j                   D cg c]"  }t        |t              s|j                  r!|$ c}S c c}w rr   )r8   rs   r   rx   )rW   rz   s     rY   _active_playerszPhase10Game._active_players   s0    <<_<a:a+GPQP^P^<___s   999c                    t        d      }|S )Nturn)rm   )r   )rW   ru   
action_sets      rY   create_turn_action_setz"Phase10Game.create_turn_action_set   s    F+
 rZ   c                    t         |   |      }| j                  |      }t        dt	        j
                  |d      ddd      t        dt	        j
                  |d      d	ddd
      t        dt	        j
                  |d      dddd
      t        dt	        j
                  |d      ddd      t        dt	        j
                  |d      dddd
      t        dt	        j
                  |d      dddd
      g}t        |      D ]v  }|j                  |       |j                  |j                  v r%|j                  j                  |j                         |j                  j                  d|j                         x |S )N	read_handzphase10-read-hand-action_action_read_hand_is_playing_enabled_is_playing_hiddenrl   labelhandler
is_enabled	is_hiddenread_discardzphase10-read-discard-action_action_read_discardT)rl   r   r   r   r   include_spectators
read_tablezphase10-read-table-action_action_read_tablecheck_phasezphase10-check-phase-action_action_check_phaseread_countszphase10-read-counts-action_action_read_countscheck_turn_timerzphase10-turn-timer-action_action_check_turn_timerr   )rT   create_standard_action_setr   r   r   getreversedaddrl   _orderremoveinsert)rW   ru   r   r   local_actionsactionrX   s         rY   r   z&Phase10Game.create_standard_action_set   s   W7?
$$V,"&&v/IJ+0. !"&&v/LM.0.#' "&&v/JK,0.#'  "&&v/KL-0.  "&&v/KL-0.#' %"&&v/JK20.#'O/
` }-FNN6"yyJ---!!((3$$Q		2	 .
 rZ   c                   t         |           | j                  dddgt        j                         | j                  dddgt        j                         | j                  dd	d
gt        j                         | j                  ddg dt        j                         | j                  ddg dt        j                         | j                  dddgt        j                         | j                  dddgt        j                         | j                  dddgt        j                  d       | j                  dddgt        j                  d       | j                  dd d!gt        j                         | j                  d"d#d$gt        j                  d       | j                  d%d&d'gt        j                  d       y )(NspaceDraw	draw_deck)statedzDraw from discarddraw_discardlzLay down phaselay_down_phaseenterzConfirm group / select)confirm_groupselect_card_for_hitselect_hit_groupselect_skip_targetescapezCancel mode)cancel_lay_down
cancel_hitcancel_skiphHithitrz	Read handr   czRead discard topr   T)r   r   gzRead table groupsr   rz   zCheck phase statusr   ezRead card countsr   zshift+tz
Turn timerr   )rT   setup_keybindsdefine_keybindr   ACTIVErV   s    rY   r   zPhase10Game.setup_keybinds   s    GVk],BUBUVC!4~6FlNaNabC!14D3E\M`M`aG%=  @R  Zf  Zm  Zm  	nHm5emy  nA  nA  	BC|7J7JKC{m<CVCVWC!3n5E\M`M`uyzC!4|nLL_L_txyC!5lNaNabC!3m_LL_L_txyI|6H5IQ]QdQdy}~rZ   c                H    | j                  |       t        |   |fi | y rr   )_sync_turn_actionsrT   rebuild_player_menu)rW   ru   kwargsrX   s      rY   r   zPhase10Game.rebuild_player_menu  s#    '#F5f5rZ   c                L    | j                  |       t        |   |fd|i| y )Nselection_id)r   rT   update_player_menu)rW   ru   r   r   rX   s       rY   r   zPhase10Game.update_player_menu  s(    '"6OOOrZ   c                f    | j                   D ]  }| j                  |        t        |           y rr   )r8   r   rT   rebuild_all_menus)rW   ru   rX   s     rY   r   zPhase10Game.rebuild_all_menus  s*    llF##F+ #!#rZ   c                |	   | j                  |      }|sy | j                  |d      }|sy |j                  d       |j                  d       |j                  d       dD ]  }|j                  |        | j                  dk7  s|j
                  ry | j                  |k(  }| j                  |      }t        |j                  d       }|D ]0  }|j                  t        d|j                   d	d
dddd             2 |sy | j                  r| j                         D ]R  }	|	j                  |j                  k7  s|j                  t        d|	j                   |	j                  ddd             T |j                  t        dt!        j"                  |d      ddd             y | j$                  r| j&                  t)        | j*                        D ]S  \  }
}| j-                  |j.                        }|r|j                  nd}|j                  t        d|
 d	dddd             U |j                  t        dt!        j"                  |d      ddd             y | j$                  r@| j&                  4|j                  t        dt!        j"                  |d      ddd             y | j0                  r| j3                  |      }t5        |      }| j6                  dz   }|j                  t        dt!        j"                  |d ||!      d"dd             |j                  t        d#t!        j"                  |d$      d%dd             y | j8                  s|j                  t        d&t!        j"                  |d'      d(dd             | j:                  rht=        | j:                  d)         sOt?        | j:                  d)   |      }|j                  t        d*t!        j"                  |d+|,      d-dd             y y y |j@                  sf| j3                  |      }tC        |jD                  |      }|j                  t        d.t!        j"                  |d/|jD                  0      d1dd             |j@                  rA| j*                  r4|j                  t        d2t!        j"                  |d3      d4dd             y y y )5Nr   card_
hit_group_skip_target_)r   r   r   r   r   r   r   r   r   r   r   playingc                H    | j                   | j                  | j                  fS rr   )ranksuitrl   r   s    rY   <lambda>z0Phase10Game._sync_turn_actions.<locals>.<lambda>/  s    AFFAFFADD3IrZ   key _action_card_selected_is_card_enabled_is_card_hidden_get_card_labelF)rl   r   r   r   r   	get_labelshow_in_actions_menu_action_select_skip_target_is_turn_action_enabled_is_turn_action_hiddenr   r   phase10-skip-cancel-action_action_cancel_skip?_action_select_hit_group_get_hit_group_label)rl   r   r   r   r   r   r   zphase10-hit-cancel-action_action_cancel_hitr   r   zphase10-confirm-group-action)currenttotal_action_confirm_lay_down_groupr   zphase10-cancel-lay-down-action_action_cancel_lay_downr   zphase10-draw-deck-action_action_draw_deckrH   r   zphase10-draw-discard-actioncard_action_draw_discardr   zphase10-lay-down-actionphase_action_start_lay_downr   zphase10-hit-action_action_start_hit)#rv   get_action_setremove_by_prefixr   statusrx   ry   r   sortedhandr   r   rl   rF   r   rm   r   r   rD   rE   	enumerater<   get_player_by_idowner_idr?   _current_phase_reqslenrA   r>   r;   r%   r&   phase_laid_downr)   current_phase)rW   ru   rz   turn_set	action_id
is_currentr   sorted_handr   otherigroupowner
owner_namereqsr   r   top_namedescs                      rY   r   zPhase10Game._sync_turn_actions  s     (&&q&1 	!!'*!!,/!!.1
I OOI&
 ;;)#q~~((A-
$$Q' QVV)IJDLL477)$/-++%*     ##--/88qtt#LL)%((4#jj <#<":"  0 LL "&&v/KL-42  ??t//;%d&7&785--enn=+0UZZc
V#A3'6864  9 LL"&&v/JK,42  ??t//7LL"&&v/JK,42  ++A.DIE//!3GLL""&&:#5 942	 	 LL$"&&v/OP142   ""LL"&&v/IJ+42    1B1B21F)G():):2)>GV%&**63PW_`286  *H  $$//2(&AV'&**63LTUTcTcd486    T%6%6V&**63GH/86  &7 rZ   c                P   | j                  |      }| j                  |      }|s|S t        |j                  d      d         t	        fd|j
                  D        d       }|s|S t        ||      }| j                  r&| j                  v rt        j                  |d|      S |S )N_rH   c              3  B   K   | ]  }|j                   k(  s|  y wrr   rl   .0r   card_ids     rY   	<genexpr>z.Phase10Game._get_card_label.<locals>.<genexpr>       :1!$$'/Q   zphase10-card-label-selectedr   )rv   r   r@   splitnextr   r&   r?   rC   r   r   )rW   ru   r   rz   r   r   rm   r  s          @rY   r   zPhase10Game._get_card_label  s      ($$V,iooc*2./::DAT6*Gt/D/D$D##F,IPTUUrZ   c                   | j                  |      }t        |j                  d      d         }|t        | j                        k\  r|S | j                  |   }| j                  |j                        }|r|j                  nd}t        |j                  |      }t        |j                  |      }	t        j                  |d||j                  dz   |	|      S )Nr  rH   r   phase10-table-group-entryr   r  indexreqcards)r   r@   r  r   r<   r   r   rm   r'   r  r(   requirementr   r   group_index)
rW   ru   r   r   idxr  r  r  	cards_strreq_strs
             rY   r   z Phase10Game._get_hit_group_label  s    $$V,)//#&r*+#d''((!!#&%%enn5#(UZZc
"5;;7	!%"3"3V</##a'
 	
rZ   c                $    | j                   dk7  ryy Nr   zaction-not-playingr   rt   s     rY   r   zPhase10Game._is_playing_enabled      ;;)#'rZ   c                `    | j                   dk(  rt        j                  S t        j                  S Nr   r   r   VISIBLEHIDDENrt   s     rY   r   zPhase10Game._is_playing_hidden  $    %)[[I%=z!!T:CTCTTrZ   )r   c                   | j                  |      }|r| j                  dk7  ry|j                  ry| j                  |k(  ry yr#  )rv   r   rx   ry   )rW   ru   r   rz   s       rY   r   zPhase10Game._is_card_enabled  sA      (DKK9,'>>'!##rZ   c               "    t         j                  S rr   r   r)  )rW   ru   r   s      rY   r   zPhase10Game._is_card_hidden  s    !!!rZ   c                     y)uH   Always enabled — these actions are only added when the mode is active.Nr\   rt   s     rY   r   z#Phase10Game._is_turn_action_enabled  s    rZ   c                "    t         j                  S )uH   Always visible — these actions are only added when the mode is active.r.  rt   s     rY   r   z"Phase10Game._is_turn_action_hidden  s    !!!rZ   c                   d| _         | j                          d| _        d| _        d| _        g | _        d| _        | j                         }t        | j                  j                        }|D ]  }||_        d|_        d|_        d|_          d| j                  _        | j                  j#                  |D cg c]  }|j$                   c}       | j'                  t(               d| _        y c c}w )Nr   Tr   FrO   
individual   )r   _sync_table_statusgame_activeroundrM   rN   rP   r   r1   r9   even_phases_onlyr   r   scoreskipped_team_manager	team_modesetup_teamsrm   
play_musicSOUND_MUSICrK   )rW   activesprz   s       rY   on_startzPhase10Game.on_start  s    !
$%'"%'"%%'DLL99:A AO %AAGAI	  (4$&&'?1'?@$ & (@s   7C.c                   t         |           | j                  sy | j                  dkD  r5| xj                  dz  c_        | j                  dk(  r| j	                          y | j
                  dkD  r5| xj
                  dz  c_        | j
                  dk(  r| j	                          y | j                  j                         r| j                          | j                          t        j                  |        y )Nr   r   )rT   on_tickr5  rK   _start_new_handrJ   rQ   tick_handle_turn_timeout_maybe_play_timer_warningr   rV   s    rY   rC  zPhase10Game.on_tick  s      1$!!Q&!$$)$$&%%)&&!+&))Q.$$&::??%%'&&($rZ   c                    t        | |      S rr   r2   rt   s     rY   r3   zPhase10Game.bot_think+  s    v&&rZ   c                <   | xj                   dz  c_         g | _        g | _        d| _        d| _        g | _        g | _        d| _        d | _        d| _	        d | _
        t        j                         \  | _        }g | _        | j                  r7| j!                         D cg c]  }|j"                  | j$                  v s| }}n| j!                         }|D ]  }g |_        d|_        d|_         t-        d      D ]A  }|D ]:  }| j                  j/                         }|s |j&                  j1                  |       < C | j2                  r+| j4                  dz   t7        | j2                        z  | _        nd| _        | j9                  |d       | j2                  r*| j4                  dz   t7        | j2                        z  | _        | j                  j/                         }|r| j                  j1                  |       | j=                  t?        j@                  tB                     | jE                  t?        j@                  tF              d       | jI                  d| j                          |rxd}tK        ||      }tM        |      rL| jN                  }|r|jP                  nd	}	| jI                  d
|	       |r.| jS                  |      }
|
rd|
_        n| jI                  d|       | j=                  tT               | jW                          | jY                          y c c}w )Nr   FrO   r   )reset_indexzphase10-new-handr6  r}   r   zphase10-start-discard-skipru   Tzphase10-start-discardr   )-r6  r<   rL   r>   r?   rB   rC   rD   rE   rF   rG   r   phase10_deckr:   r;   rM   r   rl   rN   r   r   r9  rangedraw_oneappendturn_player_idsrI   r   set_turn_players
turn_index
play_soundrandomchoiceSOUND_SHUFFLEschedule_sound
SOUND_DRAWbroadcast_lr&   r%   ry   rm   rv   SOUND_ROUND_STARTr   _start_turn)rW   r  rz   r?  r   
start_cardr   	card_namefirst
first_name	p10_firsts              rY   rD  zPhase10Game._start_new_hand.  s   

a
&(# $$! "#( $(! #//1	1!%!5!5!7^!7A1444C]C];]a!7F^))+FAAF %AAI 
 rAyy))+FFMM$'   !%!2!2Q!6#d>R>R:S SD !Df%8#0014D<P<P8QQDO YY'')
$$Z0m45FMM*5r:+4::>F%j&9Iz"+++0UZZc
  !=j Q $ 4 4U ;I ,0	)  !8y I)* k _s   L;Lc                   | j                   }|r| j                  |      nd }|sy d| _        d| _        g | _        g | _        d| _        d | _        d| _        d | _	        d| _
        |j                  r>d|_        | j                  |      }|r|j                  dd       | j                          y | j                          | j!                  |dd       |j"                  r+t%        j&                  |t)        j*                  dd      	       | j-                  |d
       | j.                  D ]-  }|j0                  |j0                  k7  s| j-                  |       / y )NFzphase10-your-turn-skippedtablebufferzgame-your-turnzgame-turn-start   (   ticksr   position)ry   rv   r>   r?   rB   rC   rD   rE   rF   rG   rR   r9  r~   speak_l_advance_turn_start_turn_timerbroadcast_personal_lrn   r   jolt_botrU  randintr   r8   rl   )rW   ru   rz   r   r  s        rY   r\  zPhase10Game._start_turny  s2   $$,2D  ( $$! "#( $(!%*" 99AI==#D8I  !!!%57HI88qr2(>?  Q /\\Exx144((/ "rZ   c                H    | j                  d       | j                          y )NF)announce)advance_turnr\  )rW   s    rY   rm  zPhase10Game._advance_turn  s    5)rZ   c                t   | j                   j                         syt        | j                        dk  r#| j	                  d       | j                  d       y| j                  d   }| j                  dd }|g| _        t        |      | _         | j                   j                          | j	                  d       y)z2Reshuffle discard pile into deck if deck is empty.Nr   zphase10-deck-truly-emptyrH   )r  zphase10-deck-reshuffled)r:   is_emptyr   r;   rZ  
_end_roundr   shuffle)rW   toprests      rY   _ensure_deckzPhase10Game._ensure_deck  s    yy!!#t  !Q&78OOD!#  "% Et$			23rZ   c                (   d| _         |r4| j                  |dd| j                         | j                  t               | j                  d       | j                         }i }|D ]z  }||u rd}nt        |j                        }|xj                  |z  c_	        |||j                  <   ||u r| j                  |dd       [| j                  |d	d
||j                         | | j                  j                  }|D ]  }|j                  }| j                  j                  rGt        |j                   |      }t#        |d      |_        | j                  |dd|j                          l|r=t        |j                   |      }||_        | j                  |dd|j                          | j                  |dd|j                           |D ]K  }|j%                  |j                  d      }|dkD  s%| j&                  j)                  |j*                  |        M | j-                  |      ry d| _         d}	| j                  j                  rG| xj.                  dz  c_        | j.                  dk  r#| j                  d       | j1                  |       y |	| _        y )NFzphase10-you-go-outzphase10-player-goes-outrK  zphase10-round-scoring-headerr   zphase10-you-score-zerozphase10-player-scores-zerozphase10-you-scorezphase10-player-scores)pointsr      zphase10-you-fixed-hands-advancezphase10-fixed-hands-advance)r  zphase10-you-advancezphase10-player-advanceszphase10-you-stayzphase10-player-staysr   Td   r   zphase10-fixed-hands-over)r5  ro  r6  rT  SOUND_WIN_ROUNDrZ  r   r*   r   r8  rl   r9   r7  r   fixed_handsr0   r   minr   r:  add_to_team_scorerm   _check_game_endrP   _resolve_winnerrJ   )
rW   winnerr?  round_penaltiesrz   penalty	even_onlylaid	new_phaseri  s
             rY   rw  zPhase10Game._end_round  sp    %%f.BD]-1ZZ & 9OOO,78%%' +-AF{$QVV,GGwG$+OADD!F{))!-EGcd))!-@BY29 * J  LL11	A$$D||''&q	B	"%i"4))!-NPm01 * A&q	B	"+))!-BD]01 * A ))!-?AW12 * B $ A%))!$$2G{""44QVVgXF  '  <<##&&!+&))Q.  !;<$$V,%*"rZ   c                Z   | j                   j                  }| j                   j                  }t        |      }||vr|d   }|D cg c]  }|j                  |kD  s| }}|syt        |      dk(  r|d   }| j                  ||       yt        d |D              }|D cg c]  }|j                  |k(  s| }	}t        |	      dk(  r| j                  |	d   |       yt        j                  d|	D cg c]  }|j                   c}      }
| j                  d|
|	       |	D ]*  }| j                  |      }|s|j                  d
|d       , |	D ]  }||_        d|_         d| _        |	D cg c]  }|j"                   c}| _        d| _        d| _        yc c}w c c}w c c}w c c}w )zTCheck whether any player has completed the target phase. Returns True if game ended.rH   Fr   r   Tc              3  4   K   | ]  }|j                     y wrr   r8  r  rz   s     rY   r  z.Phase10Game._check_game_end.<locals>.<genexpr>  s     4A   r}   zphase10-tiebreaker)r8   r   zphase10-tiebreaker-yourc  )r   re  P   )r9   winning_phaser7  r/   r   r   _declare_winnerr  r8  r   format_list_andrm   rZ  r~   rl  r   rM   rl   rN   r5  rJ   )rW   r?  r  r  valid_phasesrz   
completersr  	min_scorery  
tied_namesr   s               rY   r  zPhase10Game._check_game_end  s   22LL11	 %Y/,(,M "(KA1??]+Ja
Kz?a]F  0 444	$=*Q9(<q*=s8q=  Q0 "11$8MA8MN
-zWA==#D5]SZ[  A+AO %A   $47%8CqaddC%8"%+"G L > 9N &9s$   FFF4F2F#
/F(c                    t        d |D              }|D cg c]  }|j                  |k(  s| }}| j                  |d   |       yc c}w )z8Resolve winner for fixed-hands mode (lowest score wins).c              3  4   K   | ]  }|j                     y wrr   r  r  s     rY   r  z.Phase10Game._resolve_winner.<locals>.<genexpr>.  s     0Ar  r   N)r  r8  r  )rW   r?  r  rz   winnerss        rY   r  zPhase10Game._resolve_winner,  sJ    000	$=f9(<1f=WQZ0 >s
   AAc                   | j                  t               | j                  |dd|j                         t	        |j
                  |D cg c]]  }t        |j                  |j
                  |j                   |j                  |j                  k(  |j                  |j                        _ c}      }| j                  |       y c c}w )Nzphase10-you-winzphase10-game-winnerr  )ro   player_namer8  	is_winnerrn   is_virtual_bot)winner_namer8   )rT  SOUND_WIN_GAMEro  r8  r   rm   r   rl   rn   r  finish_game)rW   r  r?  rz   results        rY   r  zPhase10Game._declare_winner2  s    '!!&*;=R)/ 	" 	7   
  A dd !77( ttvyy088#$#3#3  

 	 
s   	A"C
c                   | j                  |      }|sy | j                  ry | j                          | j                  sy | j                  j                         }|sy |j                  j                  |       d| _        | j                  |      }t        ||      }| j                  t        j                  t                     | j                  |dd|       | j                          |j                   r+t#        j$                  |t        j&                  dd             d|j(                   }| j+                  ||	       | j,                  D ]-  }|j(                  |j(                  k7  s| j/                  |       / y )
NTzphase10-you-draw-deckzphase10-player-draws-deckr      rf  rh  r   r   )r{   r>   r{  r5  r:   rO  r   rP  r   r&   rT  rU  rV  rY  ro  rn  rn   r   rp  rq  rl   r   r8   r   )	rW   ru   r   rz   r   r   r^  r   r  s	            rY   r   zPhase10Game._action_draw_deckK  s8   ((0yy!!#	d"$$Q'!$/	j12!!!%<>Y(1 	" 	3 88qr2(>?twwi(=\\Exx144((/ "rZ   c                T   | j                  |      }|sy | j                  ry | j                  sy | j                  d   }t        |      r%| j	                  |      }|r|j                  d       y | j                  j                         }|j                  j                  |       d| _        | j                  |      }t        ||      }| j                  t        j                  t                     | j                  |dd|       | j!                          |j"                  r+t%        j&                  |t        j(                  dd      	       d
|j*                   }	| j-                  ||	       | j.                  D ]-  }
|
j*                  |j*                  k7  s| j1                  |
       / y )NrH   zphase10-cannot-draw-skipTzphase10-you-draw-discardzphase10-player-draws-discardr   r  rf  rh  r   r  )r{   r>   r;   r%   r~   rl  popr   rP  r   r&   rT  rU  rV  rY  ro  rn  rn   r   rp  rq  rl   r   r8   r   )rW   ru   r   rz   ry  r   r   r   r^  r   r  s              rY   r   z Phase10Game._action_draw_discardg  s`   ((0  #3<==#D78  $$&	d"$$Q'!$/	j12!!!%?A_(1 	" 	3 88qr2(>?twwi(=\\Exx144((/ "rZ   c                   | j                  |      }|sy t        |j                  d      d         t        fd|j                  D        d       }|sy | j
                  s=| j                  s1| j                  s%| j                  |      }|r|j                  d       y | j                  r| j                  ||       y | j                  r| j                  | j                  ||       y | j                  r| j                  | j                  ||       y | j                  ry t        |      r| j                  ||       y | j!                  ||       y )Nr  rH   c              3  B   K   | ]  }|j                   k(  s|  y wrr   r  r  s     rY   r  z4Phase10Game._action_card_selected.<locals>.<genexpr>  r  r  phase10-must-draw-first)r{   r@   r  r  r   r>   r?   rD   r~   rl  _toggle_card_in_grouprE   _select_hit_cardrF   r%   _start_skip_discard_do_discard)rW   ru   r   rz   r   r   r  s         @rY   r   z!Phase10Game._action_card_selected  s   ((0iooc*2./::DA""4+?+?==#D67&&q$/__!1!1!9!!!T*__!1!1!=!!!T*%% t}((D1  D)rZ   c           	     X   | j                  |      }|sy | j                  s%| j                  |      }|r|j                  d       y |j                  r%| j                  |      }|r|j                  d       y d| _        d| _        g | _        g | _        | j                  |      }| j                  |      }t        |j                  |      }t        |d   |      }| j                  |      }|r+|j                  d|j                  |dt        |      |d       | j                  |d	       y )
Nr  zphase10-already-laid-downTr   zphase10-lay-down-startr   rc  )r   descriptionr   r   r  re  rj  )r{   r>   r~   rl  r   r?   rA   rB   rC   r   r   r)   r   r(   r   r   )	rW   ru   r   rz   r   r  r   r
  r  s	            rY   r   z"Phase10Game._action_start_lay_down  s   ((0""==#D67==#D89#$%!! "''*$$Q' &9d1gv.}}QLL(oo4T	   	  Q /rZ   c                   | j                  |      }t        ||      }| j                  |      }| j                  dz   }|j                  | j
                  v r(| j
                  j                  |j                         d}n'| j
                  j                  |j                         d}|j                  D cg c]  }|j                  | j
                  v s| }	}|	rt        |	|      nd}
| j                  |      }|r-|	r|j                  ||||
d       n|j                  d|d       | j                  |d	|j                   
       y c c}w )Nr   zphase10-lay-down-removezphase10-lay-down-addr   rc  )r   r   r  re  z phase10-lay-down-selection-empty)r   re  r   r  )r   r&   r   rA   rl   rC   r   rP  r   r'   r~   rl  r   )rW   rz   r   r   r^  r  current_nummsg_keyr   selected_cardsr   r   s               rY   r  z!Phase10Game._toggle_card_in_group  s2   $$Q'!$/	''*//!3 77d+++!!((1/G!!((1,G &'VVMVqttt7L7L/L!VM>LN>6:RT	}}QW9k$-g  ? ?]de%y0AB Ns   3EEc                .   | j                  |      }|r| j                  sy | j                  |      }|| j                     }| j	                  |      }| j                  |      }|j                  D cg c]  }|j                  | j                  v s| }	}t               }
| j                  D ]  }|
j                  |        t        |	|      \  }}|s:|r7|dk(  r|j                  ||j                  d       y |j                  |d       y | j                  j                  t!        | j                               | j                  dz   }t#        |	|      }|r|j                  d||d       | xj                  dz  c_        g | _        | j                  t%        |      k\  r| j'                  |       y || j                     }t)        ||      }| j                  dz   }|r |j                  d||t%        |      |d	       | j+                  |d
       y c c}w )Nzphase10-err-need-cardsrc  )countre  rd  r   z phase10-lay-down-confirmed-group)r   r  re  zphase10-lay-down-next-group)prevr   r   r  re  rj  )r{   r?   r   rA   r   r~   r   rl   rC   setrB   updater,   rl  r  rP  listr'   r   _commit_lay_downr(   r   )rW   ru   r   rz   r  r  r   r   r   selected
staged_ids	group_idsokerr_keyr  r   next_reqr!  next_nums                      rY   r   z*Phase10Game._action_confirm_lay_down_group  s   ((0,,''*4,,-$$Q'}}Q  !vvGv!1F1F)FAvG  #u
--Ii( . %Xs3G66LL		'LJ  LLL9 	##D)>)>$?@//!3"8V4	LL;[XajqLr!!Q&! "$$D	1!!!$ D556H%h7G0014H1$hd)"	   $$Q$3U Hs   1HHc                D   t               }| j                  D ]  }|j                  |        | j                        }t	        fd| j
                  D              }t        | j                        D ]i  \  }}j                  D cg c]  }|j                  |v s| }}||   }	t        j                  ||z   |	|      }
| j
                  j                  |
       k j                  D cg c]  }|j                  |vs| c}_        d_        d| _        g | _        g | _        d| _        | j                        }t!        j"                  |      }| j%                  t'        j(                  t*                     | j-                  ddj"                  |       t/        j                        dk(  r| j1                         y	| j3                  d
       | j4                  D ]-  }|j                  j                  k7  s| j3                  |       / y	c c}w c c}w )z:Remove staged cards from hand and add groups to the table.c              3  V   K   | ]   }|j                   j                  k(  sd  " yw)r   N)r   rl   )r  r   rz   s     rY   r  z/Phase10Game._commit_lay_down.<locals>.<genexpr>*  s#     J"3QqzzQTT7Iq"3   )))r   r  r  r  TFr   zphase10-lay-down-successzphase10-player-lays-downr   r  Nr   rj  )r  rB   r  r   sumr<   r   r   rl   r   rP  r   r?   rC   rA   r   r)   r   rT  rU  rV  SOUND_LAY_DOWNro  r   rw  r   r8   )rW   rz   all_staged_idsr  r  existing	group_idxr   r  r  tgr   r
  r  s    `            rY   r  zPhase10Game._commit_lay_down"  s   #&5--I!!), . ''*J$"3"3JJ$-d.B.B$C Iy !<1!$$)*;QE<y/C$y0	B $$R( %D VVBVqtt>'A!VB $! "$%!$$Q' &9n56!!!%?A[)*d 	" 	L qvv;!OOA  Q /\\Exx144((/ "= = Cs   HH,H Hc                   | j                  |      }|r| j                  sy d| _        g | _        g | _        d| _        | j                  |      }| j                  |      }|r|j                  dd       | j                  |d       y )NFr   zphase10-lay-down-cancelrc  rd  r   rj  )	r{   r?   rB   rC   rA   r   r~   rl  r   )rW   ru   r   rz   r   r   s         rY   r   z#Phase10Game._action_cancel_lay_downO  s    ((0,,$! "$%!$$Q'}}QLL27LC  Q /rZ   c                   | j                  |      }|sy | j                  s%| j                  |      }|r|j                  d       y |j                  s%| j                  |      }|r|j                  d       y | j
                  s%| j                  |      }|r|j                  d       y d| _        d | _        | j                  |      }|r|j                  dd       | j                  |d	       y )
Nr  zphase10-hit-no-phasezphase10-hit-no-groupsTzphase10-hit-mode-startrc  rd  r   rj  )	r{   r>   r~   rl  r   r<   rD   rE   r   rW   ru   r   rz   r   s        rY   r   zPhase10Game._action_start_hita  s    ((0""==#D67  ==#D34  ==#D45}}QLL1'LB  Q /rZ   c                    |j                   | _        | j                  |      }t        ||      }| j	                  |      }|r|j                  d|d       | j                  |d       y )Nzphase10-hit-choose-grouprc  )r   re  r   rj  )rl   rE   r   r&   r~   rl  r   )rW   rz   r   r   r^  r   s         rY   r  zPhase10Game._select_hit_card|  sa    77$$Q'!$/	}}QLL3)GLT  Q /rZ   c           
     p     j                  |      }|r j                  r j                  y t        |j	                  d      d         }|t         j                        k\  ry t         fd|j                  D        d       }|sd  _        y  j                  |   }t        ||      \  }} j                  |      }	 j                  |      }
|s8t        j                  |	|      }|
r|
j                  dt        ||	      |d       y |j                   j#                  |       |j                  j%                  |        j'                  |j(                        }|r|j*                  nd} j-                  t/        j0                  t2                      j5                  |dd	|t        ||	      
       d _        d  _        t        |j                        dk(  r j7                  |       y  j9                  |d        j:                  D ]-  }|j<                  |j<                  k7  s j9                  |       / y )Nr  rH   c              3  V   K   | ]   }|j                   j                  k(  s| " y wrr   )rl   rE   r  r   rW   s     rY   r  z7Phase10Game._action_select_hit_group.<locals>.<genexpr>  s#     C1!$$$2B2B*BQr  zphase10-hit-invalidrc  )r   reasonre  r   zphase10-hit-successzphase10-player-hits)targetr   Fr   r   rj  )r{   rD   rE   r@   r  r   r<   r  r   r-   r   r~   r   r   rl  r&   r  rP  r   r   r   rm   rT  rU  rV  SOUND_DISCARDro  rw  r   r8   rl   )rW   ru   r   rz   r  r   r  r  
reason_keyr   r   r  r  r  r  s   `              rY   r   z$Phase10Game._action_select_hit_group  s   ((04+;+;+C	,R01	D--..CCTJ#D!!),&ud3J$$Q'}}Q!%%fj9F2tV9T%+G  = 	4 	d%%enn5#(UZZc
m45!!!%:<Q*4(5dF(C 	" 	E  qvv;!OOA  Q /\\Exx144((/ "rZ   c                    | j                  |      }|sy d| _        d | _        | j                  |      }|r|j	                  dd       | j                  |d       y )NFzphase10-hit-cancelledrc  rd  r   rj  )r{   rD   rE   r~   rl  r   r  s        rY   r   zPhase10Game._action_cancel_hit  s\    ((0}}QLL0LA  Q /rZ   c           	        |j                   j                  |       | j                  j                  |       | j	                  |      }| j                  t        j                  t                     | j                  |ddt        ||             t        |j                         dk(  r| j                  |       y| j                          y)z)Discard a non-Skip card and end the turn.zphase10-you-discardzphase10-player-discardsr   r   N)r   r   r;   rP  r   rT  rU  rV  r  ro  r&   r   rw  rm  )rW   rz   r   r   s       rY   r  zPhase10Game._do_discard  s    	d  &$$Q'm45!!!%:<U(5dF(C 	" 	E qvv;!OOArZ   c                    d| _         |j                  | _        | j                  |      }|r|j	                  dd       | j                  |d       y )NTzphase10-skip-choose-targetrc  rd  r   rj  )rF   rl   rG   r~   rl  r   )rW   rz   r   r   s       rY   r  zPhase10Game._start_skip_discard  sK    #' $(GG!}}QLL5gLF  Q /rZ   c                     j                  |      }|r j                  sy |j                  dd      d   } j                   j	                  |            }|r|j
                  |j
                  k(  r% j                  |      }|r|j                  d       y |j
                   j                  v r1 j                  |      }|r|j                  d|j                         y t         fd|j                  D        d       }|sd _        d  _        y d	|_         j                  j                  |j
                         |j                  j                  |        j                   j                  |        j#                  |      } j%                  t'        j(                  t*                      j-                  |d
d|j                          j                  |      }	|	r|	j                  d|j                  d       d _        d  _        t/        |j                        dk(  r j1                  |       y  j3                          y )Nr  r   rH   zphase10-skip-selfzphase10-skip-already-usedrL  c              3  V   K   | ]   }|j                   j                  k(  s| " y wrr   )rl   rG   r  s     rY   r  z9Phase10Game._action_select_skip_target.<locals>.<genexpr>  s#     QVqttt7P7P/P!Vr  FTzphase10-skip-playedzphase10-player-skips)r  zphase10-you-are-skippedrc  )skipping_playerre  r   )r{   rF   r  rv   r   rl   r~   rl  rL   rm   r  r   rG   r9  rP  r   r;   r   rT  rU  rV  r  ro  r   rw  rm  )
rW   ru   r   rz   	target_idr  r   	skip_cardr   target_users
   `         rY   r   z&Phase10Game._action_select_skip_target  s   ((000OOC+B/	%%d&;&;I&FGadd*==#D0199333==#D8M QQVVQSWX	',D$(,D% ##**6995	i   +$$Q'm45!!!%:<R*0++ 	" 	7 mmF+ 9166Zab#( $(!qvv;!OOArZ   c                    | j                  |      }|r| j                  sy d| _        d | _        | j                  |      }|r|j	                  dd       | j                  |d       y )NFr   rc  rd  r   rj  )r{   rF   rG   r~   rl  r   r  s        rY   r   zPhase10Game._action_cancel_skip  se    ((000#( $(!}}QLL5gLF  Q /rZ   c                   | j                  |      }|r|j                  ry | j                  |      }|sy |j                  }t	        t        |j                  d       |      }|j                  dt        |j                        |       y )Nc                2    | j                   | j                  fS rr   )r   r   r   s    rY   r   z/Phase10Game._action_read_hand.<locals>.<lambda>)  s    @PrZ   r   zphase10-hand-contents)r  r  )	rv   rx   r~   r   r'   r   r   rl  r   )rW   ru   r   rz   r   r   r   s          rY   r   zPhase10Game._action_read_hand!  so      (ANN}}Q"6!&&6P#QSYZ	,CKyQrZ   c                    | j                  |      }|sy |j                  }| j                  s|j                  d       y t	        | j                  d   |      }|j                  d|       y )Nzphase10-no-discardrH   zphase10-top-discardr   )r~   r   r;   rl  r&   )rW   ru   r   r   r   r^  s         rY   r   z Phase10Game._action_read_discard,  s]    }}V$  LL-.%d&7&7&;VDILL.YL?rZ   c                   | j                  |      }|sy |j                  }| j                  s|j                  d       y t	        j
                  |d      g}| j                  D ]  }| j                  |j                        }|r|j                  nd}t        |j                  |      }	t        |j                  |      }
|j                  t	        j
                  |d||j                  dz   |
|	              | j                  ||       y )Nzphase10-no-table-groupszphase10-table-group-headerr   r  r   r  )r~   r   r<   rl  r   r   r   r   rm   r'   r  r(   r  rP  r  
status_box)rW   ru   r   r   r   linesr  r  r  r   r!  s              rY   r   zPhase10Game._action_read_table7  s    }}V$  LL23(,,V5QRS&&E))%..9E',#J&u{{F;I%e&7&7@GLL))3 (9(9A(=9  ' 	&rZ   c                @   | j                  |      }|r|j                  ry | j                  |      }|sy |j                  }|j                  r|j                  d|j                         y t        |j                  |      }|j                  d|j                  |       y )Nzphase10-your-phase-laid-downr   zphase10-your-phaser  )rv   rx   r~   r   r   rl  r   r)   )rW   ru   r   rz   r   r   r
  s          rY   r   zPhase10Game._action_check_phaseL  s      (ANN}}QLL7qLO$Q__f=DLL-Q__RVLWrZ   c                    | j                  |      }|sy |j                  }g }| j                         D ]G  }|j                  t	        j
                  |d|j                  t        |j                                     I | j                  ||       y )Nzphase10-player-hand-count)ru   r  )
r~   r   r   rP  r   r   rm   r   r   r  rW   ru   r   r   r   r  rz   s          rY   r   zPhase10Game._action_read_countsZ  sx    }}V$%%'ALL))&2M23&&AFFM N ( 	&rZ   c                    | j                  |      }|sy | j                  j                         }|dkD  r|j                  d|       y |j                  d       y )Nr   zpoker-timer-remaining)secondszpoker-timer-unlimited)r~   rQ   seconds_remainingrl  )rW   ru   r   r   	remainings        rY   r   z$Phase10Game._action_check_turn_timere  sM    }}V$JJ002	q=LL0)LDLL01rZ   c           
        | j                  |      }|sy |j                  }t        j                  |d      g}t	        | j                         d       D ]_  }t        |j                  |      }|j                  t        j                  |d|j                  |j                  |j                               a |j                  dj                  |             y )Nphase10-score-headerc                    | j                   S rr   r  xs    rY   r   z2Phase10Game._action_check_scores.<locals>.<lambda>y      aggrZ   r   phase10-score-entryru   r   r8  z; )r~   r   r   r   r   r   r)   r   rP  rm   r8  speakjoin)rW   ru   r   r   r   r  rz   r
  s           rY   _action_check_scoresz Phase10Game._action_check_scoress  s    }}V$!!&*@AB,,.4EFA$Q__f=DLL))-vvQ__AGG  G 	

499U#$rZ   c           
     f   | j                  |      }|sy |j                  }t        j                  |d      g}t	        | j                         d       D ]I  }|j                  t        j                  |d|j                  |j                  |j                               K | j                  ||       y )Nr  c                    | j                   S rr   r  r  s    rY   r   z;Phase10Game._action_check_scores_detailed.<locals>.<lambda>  r  rZ   r   r  r  )r~   r   r   r   r   r   rP  rm   r   r8  r  r  s          rY   _action_check_scores_detailedz)Phase10Game._action_check_scores_detailed  s    }}V$!!&*@AB,,.4EFALL))-vvQ__AGG  G
 	&rZ   c                $    | j                   dk7  ryy r#  r$  rt   s     rY   _is_check_scores_enabledz$Phase10Game._is_check_scores_enabled  r%  rZ   c                `    | j                   dk(  rt        j                  S t        j                  S r'  r(  rt   s     rY   _is_check_scores_hiddenz#Phase10Game._is_check_scores_hidden  r+  rZ   c                $    | j                   dk7  ryy r#  r$  rt   s     rY   !_is_check_scores_detailed_enabledz-Phase10Game._is_check_scores_detailed_enabled  r%  rZ   c                `    | j                   dk(  rt        j                  S t        j                  S r'  r(  rt   s     rY    _is_check_scores_detailed_hiddenz,Phase10Game._is_check_scores_detailed_hidden  r+  rZ   c                    	 t        | j                  j                        }|dk  r| j                  j                          y | j                  j                  |       d| _        y # t        $ r d}Y Pw xY w)Nr   F)r@   r9   
turn_timer
ValueErrorrQ   clearstartrR   rW   r  s     rY   rn  zPhase10Game._start_turn_timer  sg    	$,,112G a<JJ

!%*"  	G	s   A$ $A21A2c                    	 t        | j                  j                        }|dk  s| j                  ry | j
                  j                         dk(  rd| _        | j                  d       y y # t        $ r d}Y Vw xY w)Nr         Tzgame_crazyeights/fivesec.ogg)r@   r9   r  r  rR   rQ   r  rT  r  s     rY   rG  z%Phase10Game._maybe_play_timer_warning  st    	$,,112G R<455::'')Q.)-D&OO:; /	  	G	s   A* *A87A8c                    | j                   }|r| j                  |      nd }|sy t        | |      }|r| j                  ||       y y rr   )ry   rv   r3   execute_action)rW   ru   rz   r   s       rY   rF  z Phase10Game._handle_turn_timeout  sK    $$,2D  (dA&	9- rZ   c                l    |j                   dz
  }d|cxk  rt        t              k  rt        |   S  g S g S )z;Return the requirement list for the player's current phase.r   r   )r   r   r    )rW   rz   r  s      rY   r   zPhase10Game._current_phase_reqs  s9    oo!!c&k!#; "	r	rZ   )returnNone)r  str)r  r@   )F)ro   r  rm   r  rn   r=   r  r   )ru   r   r  Phase10Player | None)ru   r   r  r  )r  r7   )ru   r   r  r   )ru   r   r  r   )ru   r   r  r  rr   )ru   r   r   
str | Noner  r  )ru   r   r   r  r  r  )ru   r   r  r  )ru   r   r  r   )ru   r   r   r  r  r  )ru   r   r   r  r  r   )ru   r   r  r  )r  r  r  r  )r?  r7   r  r=   )r?  r7   r  r  )r  r   r?  r7   r  r  )ru   r   r   r  r  r  )rz   r   r   r   r  r  )rz   r   r  r  )rz   r   r  zlist[PhaseRequirement])h__name__
__module____qualname____doc__r   r  r8   __annotations__r   r9   r   r:   r;   r<   r>   r?   rA   rB   rC   rD   rE   rF   rG   rI   rJ   rK   rL   rM   rN   rP   r   rQ   rR   rU   classmethodr_   rb   rd   rf   rj   rp   rv   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rA  rC  r3   rD  r\  rm  r{  rw  r  r  r  r   r   r   r   r  r   r  r   r   r  r   r   r  r  r   r   r   r   r   r   r   r   r  r  r  r  r  r  rn  rG  rF  r   __classcell__)rX   s   @rY   r5   r5   E   s    B#(#>G >#NCG^C t,D$,$T:L*: &+4%@L"@ !ND  "OT! !#!',T'BO_B"'"=i= J"K" !&%'+*+ L#!"3"c ).d(CIC "OT!',T'B9B "$3# ".AE>A"'4'+     % %    EE-`8t,6P$
_J
,
U KO $ JN ""'. ,'IV$0L4&C+J/b1!2080F*H 0DC654n+0Z0$060.0`	0&01f	0	R	@'*X	'2%'
U
U	+	<.rZ   r5   )Jr  
__future__r   rU  dataclassesr   r   baser   r   r	   registryr
   game_utils.actionsr   r   r   game_utils.action_guard_mixinr   game_utils.bot_helperr   game_utils.cardsr   r   r   game_utils.game_resultr   r   game_utils.poker_timerr   messages.localizationr   server.core.ui.keybindsr   server.core.users.botr   server.core.users.baser   r   r   r   r   r   r    r!   r"   r#   	evaluatorr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   botr3   r>  rW  rY  r  r  r[  r  r  
SOUND_TURNr5   r\   rZ   rY   <module>r/     s    6 "  ( , , $ ? ? = . 7 7 > 4 1 0 % '	 	 	      (am
aY- )' 
 
C$( C  CrZ   