
    sojF                     ^   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c mc 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 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% 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l0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9m:Z: d dl;m<Z< d dl=m>Z> d dl?m@Z@ d dlAmBZB d d lCmDZD d d!lEmFZFmGZGmHZH d d"lEmIZI d d#lJmKZKmLZLmMZMmNZN d d$lOmPZP d d%lQmRZR  G d& d'e          ZS e	eSjT        d(eSjU        d)eSjV        d*eSjW        d+eSjX        d,eSjY        d-eSjZ        d.eSj[        d/eSj\        d0eSj]        d1eSj^        d2eSj_        d3eSj`        d4eSja        d5i          Zb G d6 d7e          Zc G d8 d9          Zd G d: d;ed          Ze G d< d=ed          Zf G d> d?ed          Zg G d@ dAed          Zh G dB dCed          Zi G dD dEed          Zj G dF dGed          Zk G dH dIed          Zl G dJ dKed          Zm G dL dMed          Zn G dN dOed          Zo G dP dQed          Zp G dR dSed          Zq G dT dUed          Zr G dV dWed          Zs G dX dYed          Zt G dZ d[ed          Zu G d\ d]ed          Zv G d^ d_ed          Zw G d` daed          Zx G db dced          Zy G dd deed          Zz G df dged          Z{ G dh died          Z| G dj dked          Z} G dl dmed          Z~ G dn doed          Z G dp dqed          Z G dr dsed          Z G dt dued          Z G dv dwed          Z G dx dyed          Z G dz d{ed          Z G d| d}ed          Z G d~ ded          Z G d ded          Z G d ded          Z G d ded          Z G d ded          Z G d ded          Z G d ded          Z G d ded          Z G d ded          Zg  ee             ef             eg             eh             ei             ej             ek             el             em             en             eo             ep             eq             er             es             et             eu             ev             ew             ex             ey             ez             e{             e|             e}             e~             e             e             e             e             e             e             e             e             e             e             e             e             e             e             e             e             e            ZdeSdeed         fdZdecdedfdZdS )    )datetime)IntEnumN)phrases)LazyPhraseDict)
BountyLoan)Crew)CrewAbility)DavyBackFight)DavyBackFightParticipant)
DevilFruit)DevilFruitTrade)Fight)Game)ImpelDownLog)Plunder)
Prediction)PredictionOption)PredictionOptionUser)User)Warlord)LegendaryPirate)Emoji)
GameStatus)Log)LogType)ReservedKeyboardKeysLogTypeReservedKeys)Screen)ImpelDownBountyAction)ImpelDownSentenceType)GameType)Keyboard)default_datetime_formatconvert_days_to_durationget_remaining_time_in_days)get_remaining_duration)get_image_previewescape_valid_markdown_charsmention_markdown_userget_message_url)format_percentage_valueget_belly_formattedc                   J    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdS )NotificationCategoryz.Enum for different categories of notifications                        	   
               N)__name__
__module____qualname____doc__CREWLOCATIONGAME
IMPEL_DOWN
PREDICTIONDELETED_MESSAGEBOUNTY_GIFTDEVIL_FRUITBOUNTY_LOANWARLORDDAVY_BACK_FIGHTFIGHTPLUNDERLEGENDARY_PIRATE     $/app/src/model/enums/Notification.pyr/   r/   3   s]        88DHDJJOKKKGOEGrQ   r/   NOTIFICATION_CATEGORY_CREWNOTIFICATION_CATEGORY_LOCATIONNOTIFICATION_CATEGORY_GAME NOTIFICATION_CATEGORY_IMPEL_DOWN NOTIFICATION_CATEGORY_PREDICTION%NOTIFICATION_CATEGORY_DELETED_MESSAGE!NOTIFICATION_CATEGORY_BOUNTY_GIFT!NOTIFICATION_CATEGORY_DEVIL_FRUIT!NOTIFICATION_CATEGORY_BOUNTY_LOANNOTIFICATION_CATEGORY_WARLORD%NOTIFICATION_CATEGORY_DAVY_BACK_FIGHTNOTIFICATION_CATEGORY_FIGHTNOTIFICATION_CATEGORY_PLUNDER&NOTIFICATION_CATEGORY_LEGENDARY_PIRATEc                       e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-S ).NotificationTypez.Enum for the different types of notifications.r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=                                                          !   "   #   $   %   &   '   (   )   *   +   N)/r>   r?   r@   rA   
CREW_LEAVELOCATION_UPDATECREW_DISBANDCREW_DISBAND_WARNING	GAME_TURNCREW_MEMBER_REMOVEIMPEL_DOWN_RESTRICTION_PLACEDIMPEL_DOWN_RESTRICTION_REMOVEDPREDICTION_RESULTPREDICTION_BET_INVALIDDELETED_MESSAGE_ARRESTDELETED_MESSAGE_MUTEDELETED_MESSAGE_LOCATIONBOUNTY_GIFT_RECEIVEDDEVIL_FRUIT_AWARDEDDEVIL_FRUIT_EXPIREDDEVIL_FRUIT_REVOKE_WARNINGDEVIL_FRUIT_REVOKEBOUNTY_LOAN_PAYMENTBOUNTY_LOAN_FORGIVENBOUNTY_LOAN_EXPIREDWARLORD_APPOINTMENTWARLORD_REVOCATIONCREW_ABILITY_ACTIVATEDCREW_FIRST_MATE_PROMOTIONCREW_FIRST_MATE_DEMOTIONCREW_JOIN_REQUEST_ACCEPTEDCREW_JOIN_REQUEST_REJECTEDIMPEL_DOWN_BAIL_POSTED DAVY_BACK_FIGHT_REQUEST_ACCEPTED DAVY_BACK_FIGHT_REQUEST_REJECTEDDAVY_BACK_FIGHT_STARTDAVY_BACK_FIGHT_ENDCREW_CONSCRIPTION_STARTCREW_CONSCRIPTION_START_CAPTAINCREW_CONSCRIPTION_ENDDEVIL_FRUIT_SOLDCREW_CAPTAIN_PROMOTIONFIGHT_ATTACKPLUNDER_ATTACKGAME_OUTCOMELEGENDARY_PIRATE_APPOINTMENTLEGENDARY_PIRATE_REVOCATIONrP   rQ   rR   rb   rb   Z   s       88JOLI$%!%&"!!# "!!#!#')$')$ &(#LNL#% "$rQ   rb   c                      e Zd ZdZ	 	 	 	 	 	 	 	 ddedededed	ed
ededede	dede
e         dede
e
e                  fdZededefd            Zedefd            Zej        deddfd            Zedefd            Zedefd            Zededz  fd            Zd Zde
e         fdZde
e
e                  fdZdS )NotificationzClass for notifications.TNFcategorynotification_typetextdescriptionbutton_textdisable_web_page_previewdisable_notificationitem_screen	item_infogo_to_item_button_textitem_previous_screensitem_button_is_deeplinkkeyboardc                     || _         || _        || _        || _        || _        || _        || _        || _        |	| _        |
| _	        |r|ng | _
        || _        |r|ng | _        dS )a  
        Constructor

        :param category: Category of the notification
        :param notification_type: The type of notification
        :param text: Base text that will be sent
        :param description: Description of the notification to be provided in settings
        :param button_text: Text for the button to change the notification settings
        :param disable_web_page_preview: True if the web page preview should be disabled
        :param disable_notification: True if telegram should not notify of the message
        :param item_screen: The screen of the item that is related to this notification
        :param item_info: The info of the item that is related to this notification
        :param go_to_item_button_text: The text for the button to go to the item
        :param item_previous_screens: The previous screens of the item
        :param item_button_is_deeplink: True if the item button is a deeplink
        :param keyboard: The keyboard
        N)r   type	_text_key_description_key_button_text_keyr   r   r   r   _go_to_item_button_text_keyr   r   r   )selfr   r   r   r   r   r   r   r   r   r   r   r   r   s                 rR   __init__zNotification.__init__   s    D !%	 + +(@%$8!&"+A(>S%[%:%:Y["'>$$,4"rQ   valuereturnc                     t          | t                    r*t          t          |           rt	          t          |           S | S )z
        Resolves a phrases.py constant name to its value in the currently active language.
        If the value isn't a known constant name (e.g. it's already resolved text, or an
        empty string), it's returned unchanged.
        )
isinstancestrhasattrr   getattr)r   s    rR   _resolvezNotification._resolve   s<     eS!! 	+ggu&=&= 	+7E***rQ   c                 6    |                      | j                  S )zFBase text that will be sent, resolved in the currently active language)r   r   r   s    rR   r   zNotification.text   s     }}T^,,,rQ   c                     || _         d S N)r   )r   r   s     rR   r   zNotification.text   s    rQ   c                 6    |                      | j                  S )zJDescription of the notification, resolved in the currently active language)r   r   r   s    rR   r   zNotification.description        }}T2333rQ   c                 6    |                      | j                  S )z7Text for the button to change the notification settings)r   r   r   s    rR   r   zNotification.button_text   r   rQ   c                 H    | j         dS |                     | j                   S )zPText for the button to go to the item, resolved in the currently active languageN)r   r   r   s    rR   r   z#Notification.go_to_item_button_text   s'     +34}}T=>>>rQ   c                     | j         S Builds the notification.r   r   s    rR   buildzNotification.build        yrQ   c                 ~    | j         | j        g S t          | j        | j         | j        | j        | j                  gS )zGets the go to item keyboard.N)screeninfoprevious_screen_listfrom_deeplink)r   r   r"   r   r   r   r   s    rR   get_go_to_item_keyboardz$Notification.get_go_to_item_keyboard   sU     #t'B'JI +'^%)%?":  
 	
rQ   c                 <    | j         |                                 gz   S )zGets the keyboard.)r   r   r   s    rR   get_keyboardzNotification.get_keyboard   s      } < < > >???rQ   )TTNNNNFN)r>   r?   r@   rA   r/   rb   r   boolr   dictlistr"   r   staticmethodr   propertyr   setterr   r   r   r   r   r   rP   rQ   rR   r   r      s2       "" *.%)"&*.2(-)-.5 .5&.5 ,.5 	.5
 .5 .5 #'.5 #.5 .5 .5 !$.5  $F|.5 "&.5 tH~&.5 .5 .5 .5` 
 
 
 
 
 \
 -c - - - X- 
[# $    [ 4S 4 4 4 X4 4S 4 4 4 X4 ?d
 ? ? ? X?  

h 
 
 
 
 @d4>2 @ @ @ @ @ @rQ   r   c                   6     e Zd ZdZddef fdZdefdZ xZS )CrewLeaveNotificationz#Class for crew leave notifications.Ncrew_memberc                     || _         t                                          t          j        t
          j        ddd           dS )zB
        :param crew_member: Member of the crew that left
        CREW_LEAVE_NOTIFICATION#CREW_LEAVE_NOTIFICATION_DESCRIPTIONCREW_LEAVE_NOTIFICATION_KEYN)r   superr   r/   rB   rb   r   r   r   	__class__s     rR   r   zCrewLeaveNotification.__init__  sH    
 ' %'%1)	
 	
 	
 	
 	
rQ   r   c                 Z    | j                             t          | j                            S r   r   formatr)   r   r   s    rR   r   zCrewLeaveNotification.build  &     y 5d6F G GHHHrQ   r   	r>   r?   r@   rA   r   r   r   r   __classcell__r   s   @rR   r   r      ss        --
 
D 
 
 
 
 
 
Is I I I I I I I IrQ   r   c                   :     e Zd ZdZddedef fdZdefdZ xZ	S )	LocationUpdateNotificationz(Class for location update notifications.Nuserlocationc                     || _         || _        t                                          t          j        t          j        dddd           dS )zM
        :param user: User
        :param location: The new location
        LOCATION_UPDATE_NOTIFICATION(LOCATION_UPDATE_NOTIFICATION_DESCRIPTION LOCATION_UPDATE_NOTIFICATION_KEYF)r   N)r   r   r   r   r/   rC   rb   r   )r   r   r   r   s      rR   r   z#LocationUpdateNotification.__init__  sV     	  ),*6.%* 	 	
 	
 	
 	
 	
rQ   r   c                 j   ddl m} | j        }d|j                                        v sd|j                                        v r4d}|j                                                            d          r|dz  }nd}	 t          j        |j        dz             }t          j
                             ||j                            }n# t          $ r t          j        }Y nw xY w| j                            t!          |j                  t%          | j                  |t)          |j                  |          S )	r   r   r,   islandarchipelagoonz theinr0   )src.utils.string_utilsr-   r   namelower
startswithLocationget_by_levellevelr   LOCATION_NEXT_LEVEL_REQUIREMENTr   required_bounty
ValueErrorLOCATION_CURRENT_LEVEL_MAXr   r'   	image_urlr)   r   r(   )r   r-   r   prepositionnext_locationtext_suffixs         rR   r   z LocationUpdateNotification.build+  sA    	?>>>>>!]x}**,,,,ATATAVAV0V0VK}""$$//99 &v%K	=$1(.12DEEM!AHH##M$ABB KK  	= 	= 	=!<KKK	= yh011!$),,'66
 
 	
s   ;A	C CCNN)
r>   r?   r@   rA   r   r  r   r   r   r   r   s   @rR   r   r     sq        22
 
T 
H 
 
 
 
 
 
"
s 
 
 
 
 
 
 
 
rQ   r   c                   .     e Zd ZdZ fdZdefdZ xZS )CrewDisbandNotificationz%Class for crew disband notifications.c                 z    t                                          t          j        t          j        ddd           dS )ConstructorCREW_DISBAND_NOTIFICATION%CREW_DISBAND_NOTIFICATION_DESCRIPTIONCREW_DISBAND_NOTIFICATION_KEYN)r   r   r/   rB   rb   r   r   r   s    rR   r   z CrewDisbandNotification.__init__N  s@     	 %)'3+	
 	
 	
 	
 	
rQ   r   c                     | j         S r   r   r   s    rR   r   zCrewDisbandNotification.buildY  r   rQ   r>   r?   r@   rA   r   r   r   r   r   s   @rR   r  r  K  sY        //	
 	
 	
 	
 	
s        rQ   r  c                   .     e Zd ZdZ fdZdefdZ xZS )CrewDisbandWarningNotification-Class for crew disband warning notifications.c                 z    t                                          t          j        t          j        ddd           dS )r  !CREW_DISBAND_WARNING_NOTIFICATION-CREW_DISBAND_WARNING_NOTIFICATION_DESCRIPTION%CREW_DISBAND_WARNING_NOTIFICATION_KEYN)r   r   r/   rB   rb   r   r  s    rR   r   z'CrewDisbandWarningNotification.__init__b  s@     	 %1/;3	
 	
 	
 	
 	
rQ   r   c                 R    ddl m} | j                             |                      S )r   r   )!get_duration_to_next_bounty_reset)src.service.bounty_servicer&  r   r   )r   r&  s     rR   r   z$CrewDisbandWarningNotification.buildm  s4    PPPPPPy A A C CDDDrQ   r  r   s   @rR   r  r  _  sb        77	
 	
 	
 	
 	
Es E E E E E E E ErQ   r  c                   :     e Zd ZdZddedef fdZdefdZ xZ	S )	GameTurnNotificationz"Class for game turn notifications.Ngameopponentc                     || _         || _        t                                          t          j        t          j        dddd           dS )zmConstructor

        :param game: The game
        :param opponent: The opponent whose turn it's not
        GAME_TURN_NOTIFICATION"GAME_TURN_NOTIFICATION_DESCRIPTIONGAME_TURN_NOTIFICATION_KEYFr   N)r*  r+  r   r   r/   rD   rb   r   )r   r*  r+  r   s      rR   r   zGameTurnNotification.__init__w  sV     	  %&$0(!& 	 	
 	
 	
 	
 	
rQ   r   c                    ddl m} | j                            t	          | j        j                                                  t          | j	                  t          | j        j        | j        j                   |                      S )r   r   )get_auto_move_warning)src.service.game_servicer2  r   r   r!   r*  r   get_namer)   r+  r*   
message_id
group_chat)r   r2  s     rR   r   zGameTurnNotification.build  sy    BBBBBByTY^$$--//!$-00DI0$)2FGG!!##	
 
 	
rQ   r  )
r>   r?   r@   rA   r   r   r   r   r   r   r   s   @rR   r)  r)  t  sq        ,,
 
T 
D 
 
 
 
 
 
$	
s 	
 	
 	
 	
 	
 	
 	
 	
rQ   r)  c                   6     e Zd ZdZddef fdZdefdZ xZS )CrewMemberRemoveNotificationz+Class for crew member remove notifications.Nr   c                     || _         t                                          t          j        t
          j        ddd           dS )zRConstructor

        :param crew_member: The crew member that was removed
        CREW_MEMBER_REMOVE_NOTIFICATION+CREW_MEMBER_REMOVE_NOTIFICATION_DESCRIPTION#CREW_MEMBER_REMOVE_NOTIFICATION_KEYN)r   r   r   r/   rB   rb   r   r   s     rR   r   z%CrewMemberRemoveNotification.__init__  sH     ' %/-91	
 	
 	
 	
 	
rQ   r   c                 Z    | j                             t          | j                            S )Builds the notificationr   r   s    rR   r   z"CrewMemberRemoveNotification.build  r   rQ   r   r   r   s   @rR   r8  r8    ss        55
 
D 
 
 
 
 
 
Is I I I I I I I IrQ   r8  c                   P     e Zd ZdZ	 	 	 	 	 ddededededef
 fdZ	d	efd
Z
 xZS )&ImpelDownNotificationRestrictionPlacedz5Class for impel down restriction place notifications.Nsentence_typerelease_date_timebounty_actionreasonimpel_down_logc                     ddl m} || _        || _        || _        || _        || _         ||          }||ggng }t                                          t          j
        t          j        ddd|           dS )a
  
        Constructor

        :param sentence_type: The sentence type
        :param release_date_time: The release date time
        :param bounty_action: The bounty action
        :param reason: The reason
        :param impel_down_log: The impel down log
        r   )get_post_bail_deeplink_buttonN*IMPEL_DOWN_RESTRICTION_PLACED_NOTIFICATION6IMPEL_DOWN_RESTRICTION_PLACED_NOTIFICATION_DESCRIPTION.IMPEL_DOWN_RESTRICTION_PLACED_NOTIFICATION_KEY)r   )src.service.impel_down_servicerG  rA  rB  rC  rD  rE  r   r   r/   rE   rb   r   )
r   rA  rB  rC  rD  rE  rG  post_bail_buttonr   r   s
            rR   r   z/ImpelDownNotificationRestrictionPlaced.__init__  s    $ 	QPPPPP*!2*,88HH+;+G%&''R +:8D< 	 	
 	
 	
 	
 	
rQ   r   c                    d}d}d}| j         t          j        u r|t          j        z  }n"| j         t          j        u r|t          j        z  }| j        t          j	        ur~|t          j
        z  }t          j                            | j        t          j        u rt          | j                  nt          j                  }| j        t          j        u rt          j        }| j                            t'          | j                  |||          S )r>   )rC  r   HALVEr   8IMPEL_DOWN_RESTRICTION_PLACED_NOTIFICATION_BOUNTY_HALVEDERASE8IMPEL_DOWN_RESTRICTION_PLACED_NOTIFICATION_BOUNTY_ERASEDrA  r    NONEIMPEL_DOWN_RESTRICTIONS3IMPEL_DOWN_RESTRICTION_PLACED_NOTIFICATION_DURATIONr   	TEMPORARYr&   rB  =IMPEL_DOWN_RESTRICTION_PLACED_NOTIFICATION_DURATION_PERMANENT!IMPEL_DOWN_RESTRICTION_BAIL_GUIDEr   r(   rD  )r   restriction_textduration_text	bail_texts       rR   r   z,ImpelDownNotificationRestrictionPlaced.build  s	    	 !6!<<< ``#8#>>> `` %:%??? ??#W^^%)>)HHH 't'=>>>Z M !%:%DDD#E	y'446FW`
 
 	
rQ   NNNNN)r>   r?   r@   rA   r    r   r   r   r   r   r   r   r   s   @rR   r@  r@    s        ?? 04&*/3'+$
 $
,$
 $$
 -	$

 $
 %$
 $
 $
 $
 $
 $
L
s 
 
 
 
 
 
 
 
rQ   r@  c                   "     e Zd ZdZ fdZ xZS )'ImpelDownNotificationRestrictionRemovedz6Class for impel down restriction remove notifications.c                 z    t                                          t          j        t          j        ddd           dS )r  +IMPEL_DOWN_RESTRICTION_REMOVED_NOTIFICATION7IMPEL_DOWN_RESTRICTION_REMOVED_NOTIFICATION_DESCRIPTION/IMPEL_DOWN_RESTRICTION_REMOVED_NOTIFICATION_KEYN)r   r   r/   rE   rb   r   r  s    rR   r   z0ImpelDownNotificationRestrictionRemoved.__init__  s@     	 +;9E=	
 	
 	
 	
 	
rQ   r>   r?   r@   rA   r   r   r   s   @rR   r^  r^    s>        @@	
 	
 	
 	
 	
 	
 	
 	
 	
rQ   r^  c                   h     e Zd ZdZ	 	 	 	 	 ddedee         dee         dedef
 fdZ	d	e
fd
Z xZS )PredictionResultNotificationz*Class for prediction result notifications.N
predictionprediction_optionscorrect_prediction_options	total_winr   c                     || _         || _        || _        || _        || _        t                                          t          j        t          j
        ddd           dS )a/  
        Constructor

        :param prediction: The prediction
        :param prediction_options: The prediction options that were chosen by the user
        :param correct_prediction_options: The correct prediction options
        :param total_win: The total win
        :param user: The user
        PREDICTION_RESULT_NOTIFICATION*PREDICTION_RESULT_NOTIFICATION_DESCRIPTION"PREDICTION_RESULT_NOTIFICATION_KEYN)rf  rg  rh  ri  r   r   r   r/   rF   rb   r   )r   rf  rg  rh  ri  r   r   s         rR   r   z%PredictionResultNotification.__init__  se    $ %"4*D'"	 +.,80	
 	
 	
 	
 	
rQ   r   c                 6   ddl m} ddlm} | j        dk    rt
          j        nt
          j        }d}| j        D ]V}|j	        rt          j        nt          j        }|t
          j                            |t          |j                            z  }Wt#          | j                  dk    rt
          j        nt
          j        }|                    |          }t#          | j                  dk    }	t#          | j                  dk    pt#          | j                  dk    }
t#          | j                  dk    o!t#          d | j        D                       dk    }d}|	rc|
ra|s_d}| j        D ]6}|t
          j                            t          |j                            z  }7t
          j                            |          }d}|	st
          j        }n{| j        j        ro || j        | j                  }| j        dk     rAt7          | j                  |k    r)t
          j                             ||                    }nt
          j        }| j                            | |t7          | j                            t          | j        j                  |||          S )r>  r   r,   )get_max_wager_refundrN  r0   c                      g | ]}|j         	|S rP   )
is_correct).0options     rR   
<listcomp>z6PredictionResultNotification.build.<locals>.<listcomp>E  s     WWWVEVWVWWWrQ   )rf  r   ) r  r-   src.service.prediction_servicero  ri  r   TEXT_WON	TEXT_LOSTrg  rq  r   LOG_POSITIVELOG_NEGATIVE%PREDICTION_RESULT_NOTIFICATION_OPTIONr   r(   rs  len*PREDICTION_RESULT_NOTIFICATION_YOUR_OPTION+PREDICTION_RESULT_NOTIFICATION_YOUR_OPTIONSrh  .PREDICTION_RESULT_NOTIFICATION_OPTION_NO_EMOJI.PREDICTION_RESULT_NOTIFICATION_CORRECT_OPTIONS@PREDICTION_RESULT_NOTIFICATION_WAGER_REFUNDED_NO_CORRECT_OPTIONSrf  refund_wagerr   abs5PREDICTION_RESULT_NOTIFICATION_WAGER_REFUNDED_PARTIAL-PREDICTION_RESULT_NOTIFICATION_WAGER_REFUNDEDr   question)r   r-   ro  result_textuser_prediction_options_listrs  option_emojiphrase_to_useuser_prediction_options_textprediction_has_correct_optionsprediction_has_multiple_options user_got_the_only_correct_optioncorrect_prediction_options_textcorrect_prediction_options_listwager_refunded_textmax_refund_wagers                   rR   r   z"PredictionResultNotification.build'  s    	?>>>>>GGGGGG +/.A*=*=g&&7CT (*$- 	 	F171BZ5--HZL(G,Y,`,`9&-HH- - ((
 4*++q00 >>D 	
 (5';';<X'Y'Y$),T-L)M)MPQ)Q& /0014XD<S8T8TWX8X 	( /00A5 ^WW$*AWWWXX\]] 	) +-') 	+	4T	 /1+9  /JQQ3FMBB // FMM3  , !- 	\X   _) 
	\33tUYU^___~!!c$.&9&9<L&L&LQXX++,<==  $# '.&[#yDN 3 344'(@AA(+
 
 	
rQ   r\  )r>   r?   r@   rA   r   r   r   intr   r   r   r   r   r   s   @rR   re  re    s        44 "&59=A
 

 !!12
 %))9$:	

 
 
 
 
 
 
 
@N
s N
 N
 N
 N
 N
 N
 N
 N
rQ   re  c                   P     e Zd ZdZ	 	 	 d	dedee         def fdZde	fdZ
 xZS )
 PredictionBetInvalidNotificationz/Class for invalid prediction bet notifications.Nrf  prediction_options_usertotal_refundc                     || _         || _        || _        t                                          t
          j        t          j        ddd           dS )z
        Constructor

        :param prediction: The prediction
        :param prediction_options_user: The invalid prediction options that were chosen by the user
        :param total_refund: The total refund
        #PREDICTION_BET_INVALID_NOTIFICATION/PREDICTION_BET_INVALID_NOTIFICATION_DESCRIPTION'PREDICTION_BET_INVALID_NOTIFICATION_KEYN)	rf  r  r  r   r   r/   rF   rb   r   )r   rf  r  r  r   s       rR   r   z)PredictionBetInvalidNotification.__init__{  sW     %'>$( +31=5	
 	
 	
 	
 	
rQ   r   c           
      
   ddl m} t          | j                  dk    rt          j        }t          j        }nt          j        }t          j        }d}| j        D ]P}|j	        }|t          j
                            t          |j                  t          |j                            z  }Q| j                            |t          | j        j                  |t          | j        j                  | || j                            S )Nr   r,   r0   rN  )r  r-   r{  r  r   PREDICTION_BET_INVALID_BET_HASTEXT_IT_WAS PREDICTION_BET_INVALID_BETS_HAVETEXT_THEY_WEREprediction_option*PREDICTION_BET_INVALID_NOTIFICATION_OPTIONr   r(   rs  r#   dater   rf  r  cut_off_dater  )r   r-   bet_hasit_wasinvalid_prediction_options_listprediction_option_userr  s          rR   r   z&PredictionBetInvalidNotification.build  s   >>>>>>t+,,11<G(FF>G+F*,'&*&B 	 	"2H2Z+BII/0A0HII+,B,GHH ++ y'(@AA#DO$@AA+ 122
 
 	
rQ   )NNN)r>   r?   r@   rA   r   r   r   r  r   r   r   r   r   s   @rR   r  r  x  s        99 "&>B 	
 

 "&&:!;
 	
 
 
 
 
 
4
s 
 
 
 
 
 
 
 
rQ   r  c                   "     e Zd ZdZ fdZ xZS ) DeletedMessageArrestNotificationzBClass for deleted messages because user is arrested notifications.c                 ~    t                                          t          j        t          j        dddd           dS )r  #DELETED_MESSAGE_ARREST_NOTIFICATION/DELETED_MESSAGE_ARREST_NOTIFICATION_DESCRIPTION'DELETED_MESSAGE_ARREST_NOTIFICATION_KEYFr0  N)r   r   r/   rG   rb   r   r  s    rR   r   z)DeletedMessageArrestNotification.__init__  sH     	 031=5!& 	 	
 	
 	
 	
 	
rQ   rc  r   s   @rR   r  r    s>        LL

 

 

 

 

 

 

 

 

rQ   r  c                   "     e Zd ZdZ fdZ xZS )DeletedMessageMuteNotificationz?Class for deleted messages because user is muted notifications.c                 ~    t                                          t          j        t          j        dddd           dS )r  !DELETED_MESSAGE_MUTE_NOTIFICATION-DELETED_MESSAGE_MUTE_NOTIFICATION_DESCRIPTION%DELETED_MESSAGE_MUTE_NOTIFICATION_KEYFr0  N)r   r   r/   rG   rb   r   r  s    rR   r   z'DeletedMessageMuteNotification.__init__  sH     	 01/;3!& 	 	
 	
 	
 	
 	
rQ   rc  r   s   @rR   r  r    s>        II

 

 

 

 

 

 

 

 

rQ   r  c                   :     e Zd ZdZddedef fdZdefdZ xZ	S )	"DeletedMessageLocationNotificationzf
    Class for deleted messages because user has not reached the required location notifications.
    Nr   required_location_levelc                     || _         || _        t                                          t          j        t          j        dddd           dS )z
        Constructor

        :param user: The user
        :param required_location_level: The required location level
        %DELETED_MESSAGE_LOCATION_NOTIFICATION1DELETED_MESSAGE_LOCATION_NOTIFICATION_DESCRIPTION)DELETED_MESSAGE_LOCATION_NOTIFICATION_KEYFr0  N)r   r  r   r   r/   rG   rb   r   )r   r   r  r   s      rR   r   z+DeletedMessageLocationNotification.__init__  sW     	'>$ 053?7!& 	 	
 	
 	
 	
 	
rQ   r   c                     t          j        | j        j                  }t          j        | j                  }| j                            t          |j                  t          |j                            S r   )	r  r	  r   location_levelr  r   r   r(   r  )r   current_locationrequired_locations      rR   r   z(DeletedMessageLocationNotification.build  sd    %-%:49;S%T%T&.&;D<X&Y&Yy'(8(=>>'(9(>??
 
 	
rQ   r  
r>   r?   r@   rA   r   r  r   r   r   r   r   s   @rR   r  r    su         
 
T 
3 
 
 
 
 
 
(
s 
 
 
 
 
 
 
 
rQ   r  c                   :     e Zd ZdZddedef fdZdefdZ xZ	S )	BountyGiftReceivedNotificationz-Class for bounty gift received notifications.Nsenderamountc                     || _         || _        t                                          t          j        t          j        ddd           dS )zb
        Constructor

        :param sender: The sender
        :param amount: The amount
        !BOUNTY_GIFT_RECEIVED_NOTIFICATION-BOUNTY_GIFT_RECEIVED_NOTIFICATION_DESCRIPTION%BOUNTY_GIFT_RECEIVED_NOTIFICATION_KEYN)r  r  r   r   r/   rH   rb   r   )r   r  r  r   s      rR   r   z'BountyGiftReceivedNotification.__init__  sN      ,1/;3	
 	
 	
 	
 	
rQ   r   c                     ddl m} | j                             || j                  | j                                                  S Nr   r,   )r  r-   r   r   r  r  get_markdown_mentionr   r-   s     rR   r   z$BountyGiftReceivedNotification.build  sN    >>>>>>y,,dk.N.N.P.P
 
 	
rQ   r  r  r   s   @rR   r  r    sq        77
 
t 
C 
 
 
 
 
 
&
s 
 
 
 
 
 
 
 
rQ   r  c                   :     e Zd ZdZddedef fdZdefdZ xZS )	DevilFruitAwardedNotificationz,Class for Devil Fruit awarded notifications.Ndevil_fruitrD  c           
          || _         || _        ||j        nd}t                                          t
          j        t          j        dddt          j
        t          j        |id           dS )zl
        Constructor

        :param devil_fruit: The Devil Fruit
        :param reason: The reason
        N DEVIL_FRUIT_AWARDED_NOTIFICATION,DEVIL_FRUIT_AWARDED_NOTIFICATION_DESCRIPTION$DEVIL_FRUIT_AWARDED_NOTIFICATION_KEYKEY_MANAGE_DEVIL_FRUITr   r   r   )r  rD  idr   r   r/   rI   rb   r   r   PVT_DEVIL_FRUIT_DETAILr   DEFAULT_PRIMARY_KEY)r   r  rD  item_idr   s       rR   r   z&DevilFruitAwardedNotification.__init__  sx     '$/$;+.. ,0.:25+?I#; 	 		
 		
 		
 		
 		
rQ   r   c                     | j                             t          | j                                                  t          | j                            S r   )r   r   r(   r  get_full_namerD  r   s    rR   r   z#DevilFruitAwardedNotification.build-  sC    y'(8(F(F(H(HII'44
 
 	
rQ   r  )	r>   r?   r@   rA   r   r   r   r   r   r   s   @rR   r  r    sq        66
 
J 
s 
 
 
 
 
 
.
s 
 
 
 
 
 
 
 
rQ   r  c                   6     e Zd ZdZddef fdZdefdZ xZS )DevilFruitExpiredNotificationz,Class for Devil Fruit expired notifications.Nr  c                     || _         t                                          t          j        t
          j        ddd           dS )J
        Constructor

        :param devil_fruit: The Devil Fruit
         DEVIL_FRUIT_EXPIRED_NOTIFICATION,DEVIL_FRUIT_EXPIRED_NOTIFICATION_DESCRIPTION$DEVIL_FRUIT_EXPIRED_NOTIFICATION_KEYN)r  r   r   r/   rI   rb   r   r   r  r   s     rR   r   z&DevilFruitExpiredNotification.__init__7  sH     ' ,0.:2	
 	
 	
 	
 	
rQ   r   c                 ~    | j                             t          | j                                                            S r   r   r   r(   r  r  r   s    rR   r   z#DevilFruitExpiredNotification.buildH  s0    y ;D<L<Z<Z<\<\ ] ]^^^rQ   r   	r>   r?   r@   rA   r   r   r   r   r   r   s   @rR   r  r  4  ss        66
 
J 
 
 
 
 
 
"_s _ _ _ _ _ _ _ _rQ   r  c                   6     e Zd ZdZddef fdZdefdZ xZS )DevilFruitRevokeNotificationz+Class for Devil Fruit revoke notifications.Nr  c                     || _         t                                          t          j        t
          j        ddd           dS )r  DEVIL_FRUIT_REVOKE_NOTIFICATION+DEVIL_FRUIT_REVOKE_NOTIFICATION_DESCRIPTION#DEVIL_FRUIT_REVOKE_NOTIFICATION_KEYN)r  r   r   r/   rI   rb   r   r  s     rR   r   z%DevilFruitRevokeNotification.__init__O  sH     ' ,/-91	
 	
 	
 	
 	
rQ   r   c                 ~    | j                             t          | j                                                            S r   r  r   s    rR   r   z"DevilFruitRevokeNotification.build`  s2     y ;D<L<Z<Z<\<\ ] ]^^^rQ   r   r  r   s   @rR   r  r  L  ss        55
 
J 
 
 
 
 
 
"_s _ _ _ _ _ _ _ _rQ   r  c                   6     e Zd ZdZddef fdZdefdZ xZS )#DevilFruitRevokeWarningNotificationr   Nr  c                     || _         t                                          t          j        t
          j        ddd           dS )r  'DEVIL_FRUIT_REVOKE_WARNING_NOTIFICATION3DEVIL_FRUIT_REVOKE_WARNING_NOTIFICATION_DESCRIPTION+DEVIL_FRUIT_REVOKE_WARNING_NOTIFICATION_KEYN)r  r   r   r/   rI   rb   r   r  s     rR   r   z,DevilFruitRevokeWarningNotification.__init__i  sH     ' ,75A9	
 	
 	
 	
 	
rQ   r   c                 p   ddl m} ddlm} d}|                    dd          }|rQ ||d         j        t          j                                        t          j	        
                                          }| j                            |t          | j                                                            S )	r   r   )Leaderboard)r*   rN  r0   N)group)r5  chat_idchat_username)src.model.Leaderboardr  src.service.message_servicer*   get_latest_nr5  EnvUPDATES_CHAT_IDgetUPDATES_CHAT_USERNAMEget_or_noner   r   r(   r  r  )r   r  r*   leaderboard_urllatest_global_leaderboardss        rR   r   z)DevilFruitRevokeWarningNotification.buildz  s     	655555??????%0%=%=at%=%L%L"% 	-o5a8C+//11!7CCEE  O y89I9W9W9Y9YZZ
 
 	
rQ   r   r  r   s   @rR   r  r  f  sj        77
 
J 
 
 
 
 
 
"
s 
 
 
 
 
 
 
 
rQ   r  c                   :     e Zd ZdZddedef fdZdefdZ xZ	S )	BountyLoanPaymentNotificationz,Class for bounty loan payment notifications.Nloanr  c           
          || _         || _        ||j        nd}t                                          t
          j        t          j        dddt          j
        t          j        |id           dS )z^
        Constructor

        :param loan: The loan
        :param amount: The amount
        N BOUNTY_LOAN_PAYMENT_NOTIFICATION,BOUNTY_LOAN_PAYMENT_NOTIFICATION_DESCRIPTION$BOUNTY_LOAN_PAYMENT_NOTIFICATION_KEY/BOUNTY_LOAN_NOTIFICATION_GO_TO_ITEM_BUTTON_TEXTr  )r  r  r  r   r   r/   rJ   rb   r   r   PVT_BOUNTY_LOAN_DETAILr   r  )r   r  r  r  r   s       rR   r   z&BountyLoanPaymentNotification.__init__  sw     	!-$''4 ,0.:25+?IA 	 	
 	
 	
 	
 	
rQ   r   c                     ddl m} | j        j        }| j                             || j                  |                                          S r  )r  r-   r  borrowerr   r   r  r  )r   r-   r  s      rR   r   z#BountyLoanPaymentNotification.build  sP    >>>>>>+y 3 3DK @ @(B_B_BaBabbbrQ   r  )
r>   r?   r@   rA   r   r  r   r   r   r   r   s   @rR   r  r    sz        66
 
Z 
 
 
 
 
 
 
2cs c c c c c c c crQ   r  c                   6     e Zd ZdZddef fdZdefdZ xZS )BountyLoanForgivenNotificationz-Class for bounty loan forgiven notifications.Nr  c           
          || _         ||j        nd}t                                          t          j        t          j        dddt          j	        t          j        |id           dS )<
        Constructor

        :param loan: The loan
        N!BOUNTY_LOAN_FORGIVEN_NOTIFICATION-BOUNTY_LOAN_FORGIVEN_NOTIFICATION_DESCRIPTION%BOUNTY_LOAN_FORGIVEN_NOTIFICATION_KEYr	  r  )r  r  r   r   r/   rJ   rb   r   r   r
  r   r  r   r  r  r   s      rR   r   z'BountyLoanForgivenNotification.__init__  sp     	!-$''4 ,1/;35+?IA 	 	
 	
 	
 	
 	
rQ   r   c                     ddl m} | j        j        }| j                             || j        j                  |                                          S r  )r  r-   r  loanerr   r   r  r  r   r-   r  s      rR   r   z$BountyLoanForgivenNotification.build  sY    >>>>>>y'y	 01163N3N3P3P
 
 	
rQ   r   	r>   r?   r@   rA   r   r   r   r   r   r   s   @rR   r  r    sj        77
 
Z 
 
 
 
 
 
.
s 
 
 
 
 
 
 
 
rQ   r  c                   6     e Zd ZdZddef fdZdefdZ xZS )BountyLoanExpiredNotificationz,Class for bounty loan expired notifications.Nr  c           
          || _         ||j        nd}t                                          t          j        t          j        dddt          j	        t          j        |id           dS )r  N BOUNTY_LOAN_EXPIRED_NOTIFICATION,BOUNTY_LOAN_EXPIRED_NOTIFICATION_DESCRIPTION$BOUNTY_LOAN_EXPIRED_NOTIFICATION_KEYr	  r  )r  r  r   r   r/   rJ   rb   r   r   r
  r   r  r  s      rR   r   z&BountyLoanExpiredNotification.__init__  sp     	!-$''4 ,0.:25+?IA 	 	
 	
 	
 	
 	
rQ   r   c                    ddl m} | j        j        }| j                             || j        j                  |                                t          j	        
                                |                                          S r  )r  r-   r  r  r   r   r  r  r  BOUNTY_LOAN_GARNISH_PERCENTAGEr  r  s      rR   r   z#BountyLoanExpiredNotification.build  s{    >>>>>>y'y	 011'')).2244''))	
 
 	
rQ   r   r  r   s   @rR   r  r    sj        66
 
Z 
 
 
 
 
 
.	
s 	
 	
 	
 	
 	
 	
 	
 	
rQ   r  c                   :     e Zd ZdZddedef fdZdefdZ xZ	S )	WarlordAppointmentNotificationz,Class for warlord appointment notifications.Nwarlorddaysc                     || _         || _        t                                          t          j        t          j        ddd           dS )B
        Constructor

        :param warlord: The warlord
         WARLORD_APPOINTMENT_NOTIFICATION,WARLORD_APPOINTMENT_NOTIFICATION_DESCRIPTION$WARLORD_APPOINTMENT_NOTIFICATION_KEYN)r#  r$  r   r   r/   rK   rb   r   )r   r#  r$  r   s      rR   r   z'WarlordAppointmentNotification.__init__  sN     	 (0.:2	
 	
 	
 	
 	
rQ   r   c                     | j                             t          | j        j                  t          | j                  t          | j        j                            S r   )r   r   r(   r#  epithetr$   r$  rD  r   s    rR   r   z$WarlordAppointmentNotification.build  sI    y'(<==$TY//'(;<<
 
 	
rQ   r  )
r>   r?   r@   rA   r   r  r   r   r   r   r   s   @rR   r"  r"    sq        66
 
 
c 
 
 
 
 
 
$
s 
 
 
 
 
 
 
 
rQ   r"  c                   6     e Zd ZdZddef fdZdefdZ xZS )WarlordRevocationNotificationz+Class for warlord revocation notifications.Nr#  c                     || _         t                                          t          j        t
          j        ddd           dS )r&  WARLORD_REVOCATION_NOTIFICATION+WARLORD_REVOCATION_NOTIFICATION_DESCRIPTION#WARLORD_REVOCATION_NOTIFICATION_KEYN)r#  r   r   r/   rK   rb   r   )r   r#  r   s     rR   r   z&WarlordRevocationNotification.__init__  sG      (/-91	
 	
 	
 	
 	
rQ   r   c                 d    | j                             t          | j        j                            S r   )r   r   r(   r#  revoke_reasonr   s    rR   r   z#WarlordRevocationNotification.build+  s&    y ;DL<V W WXXXrQ   r   )	r>   r?   r@   rA   r   r   r   r   r   r   s   @rR   r-  r-    ss        55
 
 
 
 
 
 
 
"Ys Y Y Y Y Y Y Y YrQ   r-  c                   D     e Zd ZdZ	 	 	 ddddedef fdZd	efd
Z xZ	S )&LegendaryPirateAppointmentNotificationz5Class for legendary pirate appointment notifications.NFlegendary_pirater   r$  is_permanentc                     || _         || _        |p
|duo|j        | _        t                                          t
          j        t          j        ddd           dS )z
        Constructor

        :param legendary_pirate: The legendary pirate
        :param days: The appointment duration in days
        :param is_permanent: Whether the appointment is permanent
        N)LEGENDARY_PIRATE_APPOINTMENT_NOTIFICATION5LEGENDARY_PIRATE_APPOINTMENT_NOTIFICATION_DESCRIPTION-LEGENDARY_PIRATE_APPOINTMENT_NOTIFICATION_KEY)	r6  r$  r7  r   r   r/   rO   rb   r   )r   r6  r$  r7  r   s       rR   r   z/LegendaryPirateAppointmentNotification.__init__2  sr     !1	( 
D(J-=-J 	 	 197C;	
 	
 	
 	
 	
rQ   r   c                    | j         s| j        j        d}n<| j        }|$t	          | j        j        | j        j                  }t          |          }| j                            t          | j        j
                  |t          | j        j                            }| j         s| j        j        |t          j        z  }|S )N	Permanent)r7  r6  end_dater$  r%   r  r$   r   r   r(   r+  rD  r   :LEGENDARY_PIRATE_APPOINTMENT_NOTIFICATION_PERMANENT_FOOTER)r   rZ  r$  r   s       rR   r   z,LegendaryPirateAppointmentNotification.buildN  s     	; 5 > F'MM9D|1)2D4I4N  5T::My'(=(EFF'(=(DEE
 
  	W 5 > FGVVDrQ   )NNF)
r>   r?   r@   rA   r  r   r   r   r   r   r   s   @rR   r5  r5  /  s        ?? /3"	
 
+
 
 	
 
 
 
 
 
8s        rQ   r5  c                   2     e Zd ZdZdd	 fdZdefdZ xZS )
%LegendaryPirateRevocationNotificationz4Class for legendary pirate revocation notifications.Nr6  r   c                     || _         t                                          t          j        t
          j        ddd           dS )zT
        Constructor

        :param legendary_pirate: The legendary pirate
        (LEGENDARY_PIRATE_REVOCATION_NOTIFICATION4LEGENDARY_PIRATE_REVOCATION_NOTIFICATION_DESCRIPTION,LEGENDARY_PIRATE_REVOCATION_NOTIFICATION_KEYN)r6  r   r   r/   rO   rb   r   )r   r6  r   s     rR   r   z.LegendaryPirateRevocationNotification.__init__h  sH     !1 186B:	
 	
 	
 	
 	
rQ   r   c                 d    | j                             t          | j        j                            S r   )r   r   r(   r6  r3  r   s    rR   r   z+LegendaryPirateRevocationNotification.buildy  s'    y ;D<Q<_ ` `aaarQ   r   )r6  r   r  r   s   @rR   rA  rA  e  sl        >>
 
 
 
 
 
 
"bs b b b b b b b brQ   rA  c                   6     e Zd ZdZddef fdZdefdZ xZS ) CrewAbilityActivatedNotificationz/Class for crew ability activated notifications.Ncrew_abilityc                     || _         t                                          t          j        t
          j        ddd           dS )zL
        Constructor

        :param crew_ability: The crew ability
        #CREW_ABILITY_ACTIVATED_NOTIFICATION/CREW_ABILITY_ACTIVATED_NOTIFICATION_DESCRIPTION'CREW_ABILITY_ACTIVATED_NOTIFICATION_KEYN)rI  r   r   r/   rB   rb   r   )r   rI  r   s     rR   r   z)CrewAbilityActivatedNotification.__init__  sH     ) %31=5	
 	
 	
 	
 	
rQ   r   c                     | j                             t          | j                                                  | j                                        t          | j        j        | j        j                            S r   )	r   r   r(   rI  get_descriptionget_value_with_signr&   expiration_dater  r   s    rR   r   z&CrewAbilityActivatedNotification.build  sa    y'(9(I(I(K(KLL1133"4#4#DdFWF\]]
 
 	
rQ   r   )	r>   r?   r@   rA   r	   r   r   r   r   r   s   @rR   rH  rH  }  sj        99
 
[ 
 
 
 
 
 
"
s 
 
 
 
 
 
 
 
rQ   rH  c                   "     e Zd ZdZ fdZ xZS )"CrewFirstMatePromotionNotificationz2Class for crew first mate promotion notifications.c                 z    t                                          t          j        t          j        ddd           dS )
        Constructor
        &CREW_FIRST_MATE_PROMOTION_NOTIFICATION2CREW_FIRST_MATE_PROMOTION_NOTIFICATION_DESCRIPTION*CREW_FIRST_MATE_PROMOTION_NOTIFICATION_KEYN)r   r   r/   rB   rb   r   r  s    rR   r   z+CrewFirstMatePromotionNotification.__init__  s@    
 	 %64@8	
 	
 	
 	
 	
rQ   rc  r   s   @rR   rS  rS    s>        <<
 
 
 
 
 
 
 
 
rQ   rS  c                   "     e Zd ZdZ fdZ xZS )!CrewFirstMateDemotionNotificationz1Class for crew first mate demotion notifications.c                 z    t                                          t          j        t          j        ddd           dS )rU  %CREW_FIRST_MATE_DEMOTION_NOTIFICATION1CREW_FIRST_MATE_DEMOTION_NOTIFICATION_DESCRIPTION)CREW_FIRST_MATE_DEMOTION_NOTIFICATION_KEYN)r   r   r/   rB   rb   r   r  s    rR   r   z*CrewFirstMateDemotionNotification.__init__  s@    
 	 %53?7	
 	
 	
 	
 	
rQ   rc  r   s   @rR   rZ  rZ    s>        ;;
 
 
 
 
 
 
 
 
rQ   rZ  c                   6     e Zd ZdZddef fdZdefdZ xZS )#CrewJoinRequestAcceptedNotificationz3Class for crew join request accepted notifications.Ncrewc           	          || _         t                                          t          j        t
          j        dddt          j        d           dS )rU  'CREW_JOIN_REQUEST_ACCEPTED_NOTIFICATION3CREW_JOIN_REQUEST_ACCEPTED_NOTIFICATION_DESCRIPTION+CREW_JOIN_REQUEST_ACCEPTED_NOTIFICATION_KEYKEY_VIEWr   r   N)	ra  r   r   r/   rB   rb   r   r   PVT_CREWr   ra  r   s     rR   r   z,CrewJoinRequestAcceptedNotification.__init__  sT    
 	 %75A9#- 	 	
 	
 	
 	
 	
rQ   r   c                 d    | j                             | j                                                  S r   r   r   ra  get_name_with_deeplinkr   s    rR   r   z)CrewJoinRequestAcceptedNotification.build  &    y	 @ @ B BCCCrQ   r   	r>   r?   r@   rA   r   r   r   r   r   r   s   @rR   r`  r`    ss        ==
 
T 
 
 
 
 
 
 Ds D D D D D D D DrQ   r`  c                   6     e Zd ZdZddef fdZdefdZ xZS )#CrewJoinRequestRejectedNotificationz3Class for crew join request rejected notifications.Nra  c                     || _         t                                          t          j        t
          j        ddd           dS )rU  'CREW_JOIN_REQUEST_REJECTED_NOTIFICATION3CREW_JOIN_REQUEST_REJECTED_NOTIFICATION_DESCRIPTION+CREW_JOIN_REQUEST_REJECTED_NOTIFICATION_KEYN)ra  r   r   r/   rB   rb   r   ri  s     rR   r   z,CrewJoinRequestRejectedNotification.__init__  sG    
 	 %75A9	
 	
 	
 	
 	
rQ   r   c                 d    | j                             | j                                                  S r   rk  r   s    rR   r   z)CrewJoinRequestRejectedNotification.build  rm  rQ   r   rn  r   s   @rR   rp  rp    ss        ==
 
T 
 
 
 
 
 
Ds D D D D D D D DrQ   rp  c                   6     e Zd ZdZddef fdZdefdZ xZS )!CrewConscriptionStartNotificationz0Class for crew conscription start notifications.Nr   c           	          || _         t                                          t          j        t
          j        dddt          j        d           dS )rU  $CREW_CONSCRIPTION_START_NOTIFICATION0CREW_CONSCRIPTION_START_NOTIFICATION_DESCRIPTION(CREW_CONSCRIPTION_START_NOTIFICATION_KEYrf  rg  N)	r   r   r   r/   rB   rb   r   r   rh  r   r   r   s     rR   r   z*CrewConscriptionStartNotification.__init__  sT    
 	 %42>6#- 	 	
 	
 	
 	
 	
rQ   r   c                     | j                             | j        j                                        | j                                                  S r   )r   r   r   ra  rl  get_conscription_remaining_timer   s    rR   r   z'CrewConscriptionStartNotification.build  s?    yIN1133TY5^5^5`5`
 
 	
rQ   r   r   r   s   @rR   rw  rw    sj        ::
 
T 
 
 
 
 
 
 
s 
 
 
 
 
 
 
 
rQ   rw  c                   6     e Zd ZdZddef fdZdefdZ xZS )(CrewConscriptionStartCaptainNotificationz8Class for crew conscription start captain notifications.Nr   c                     || _         t                                          t          j        t
          j        ddd           dS )rU  ,CREW_CONSCRIPTION_START_CAPTAIN_NOTIFICATION8CREW_CONSCRIPTION_START_CAPTAIN_NOTIFICATION_DESCRIPTION0CREW_CONSCRIPTION_START_CAPTAIN_NOTIFICATION_KEYN)r   r   r   r/   rB   rb   r   r|  s     rR   r   z1CrewConscriptionStartCaptainNotification.__init__  sG    
 	 %<:F>	
 	
 	
 	
 	
rQ   r   c                     | j                             | j                                        | j        j                                        | j                                                  S r   )r   r   r   r  ra  rl  r~  r   s    rR   r   z.CrewConscriptionStartCaptainNotification.build  sQ    yI**,,IN1133I5577
 
 	
rQ   r   r   r   s   @rR   r  r     sj        BB
 
T 
 
 
 
 
 

s 
 
 
 
 
 
 
 
rQ   r  c                   6     e Zd ZdZddef fdZdefdZ xZS )CrewConscriptionEndNotificationz.Class for crew conscription end notifications.Nr   c           	          || _         t                                          t          j        t
          j        dddt          j        d           dS )rU  "CREW_CONSCRIPTION_END_NOTIFICATION.CREW_CONSCRIPTION_END_NOTIFICATION_DESCRIPTION&CREW_CONSCRIPTION_END_NOTIFICATION_KEYrf  rg  N)	r   r   r   r/   rB   rb   r   r   rh  r|  s     rR   r   z(CrewConscriptionEndNotification.__init__  sT    
 	 %20<4#- 	 	
 	
 	
 	
 	
rQ   r   c                 n    | j                             | j        j                                                  S r   )r   r   r   ra  rl  r   s    rR   r   z%CrewConscriptionEndNotification.build,  s(    y	 E E G GHHHrQ   r   r   r   s   @rR   r  r    ss        88
 
T 
 
 
 
 
 
 Is I I I I I I I IrQ   r  c                   :     e Zd ZdZddedef fdZdefdZ xZ	S )	(DavyBackFightRequestAcceptedNotificationz9Class for davy back fight request accepted notifications.Nra  davy_back_fightc                    || _         ||j        nd}t                                          t          j        t          j        dddt          j	        t          j        |t          j        didt          j        g	  	         dS )rU  N-DAVY_BACK_FIGHT_REQUEST_ACCEPTED_NOTIFICATION9DAVY_BACK_FIGHT_REQUEST_ACCEPTED_NOTIFICATION_DESCRIPTION1DAVY_BACK_FIGHT_REQUEST_ACCEPTED_NOTIFICATION_KEYF
KEY_MANAGEr   r   r   r   )ra  r  r   r   r/   rL   rb   r   r   PVT_CREW_DAVY_BACK_FIGHT_DETAILr   r  DIRECT_ITEMrh  )r   ra  r  r  r   s       rR   r   z1DavyBackFightRequestAcceptedNotification.__init__3  s    
 	(7(C/$$ 0=;G?>$8'$0% $0#)?"3 	 	
 	
 	
 	
 	
rQ   r   c                 d    | j                             | j                                                  S r   rk  r   s    rR   r   z.DavyBackFightRequestAcceptedNotification.buildJ  rm  rQ   r  
r>   r?   r@   rA   r   r
   r   r   r   r   r   s   @rR   r  r  0  sz        CC
 
T 
= 
 
 
 
 
 
.Ds D D D D D D D DrQ   r  c                   6     e Zd ZdZddef fdZdefdZ xZS )(DavyBackFightRequestRejectedNotificationz9Class for davy back fight request rejected notifications.Nra  c                     || _         t                                          t          j        t
          j        ddd           dS )rU  2CREW_DAVY_BACK_FIGHT_REQUEST_REJECTED_NOTIFICATION9DAVY_BACK_FIGHT_REQUEST_REJECTED_NOTIFICATION_DESCRIPTION1DAVY_BACK_FIGHT_REQUEST_REJECTED_NOTIFICATION_KEYN)ra  r   r   r/   rL   rb   r   ri  s     rR   r   z1DavyBackFightRequestRejectedNotification.__init__Q  sG    
 	 0=@G?	
 	
 	
 	
 	
rQ   r   c                 d    | j                             | j                                                  S r   rk  r   s    rR   r   z.DavyBackFightRequestRejectedNotification.build_  rm  rQ   r   rn  r   s   @rR   r  r  N  ss        CC
 
T 
 
 
 
 
 
Ds D D D D D D D DrQ   r  c                   :     e Zd ZdZddedef fdZdefdZ xZ	S )	DavyBackFightStartNotificationz.Class for davy back fight start notifications.Nopponent_crewr  c                    || _         || _        ||j        nd}t                                          t
          j        t          j        dddt          j
        t          j        |t          j        didt          j        g	  	         dS )rU  N"DAVY_BACK_FIGHT_START_NOTIFICATION.DAVY_BACK_FIGHT_START_NOTIFICATION_DESCRIPTION&DAVY_BACK_FIGHT_START_NOTIFICATION_KEYFrf  r  )r  r  r  r   r   r/   rL   rb   r   r   r  r   r  r  rh  )r   r  r  r  r   s       rR   r   z'DavyBackFightStartNotification.__init__f  s    
 $1.=(7(C/$$ 020<4>$8'$0% $.#)?"3 	 	
 	
 	
 	
 	
rQ   r   c                     | j                             | j                                        | j                                                  S r   )r   r   r  rl  r  get_remaining_timer   s    rR   r   z$DavyBackFightStartNotification.build~  s@    y5577 3355
 
 	
rQ   r  r  r   s   @rR   r  r  c  sq        88
 
d 
M 
 
 
 
 
 
0
s 
 
 
 
 
 
 
 
rQ   r  c                   :     e Zd ZdZddedef fdZdefdZ xZ	S )	DavyBackFightEndNotificationz,Class for davy back fight end notifications.Nr  participantc                 D   || _         || _        |r|j        nd| _        | j        | j        j        nd}t	                                          t          j        t          j	        dddt          j        t          j        |t          j        didt          j        g	  	         dS )rU  N DAVY_BACK_FIGHT_END_NOTIFICATION,DAVY_BACK_FIGHT_END_NOTIFICATION_DESCRIPTION$DAVY_BACK_FIGHT_END_NOTIFICATION_KEYFrf  r  )r  r  r  r  r   r   r/   rL   rb   r   r   r  r   r  r  rh  )r   r  r  r  r   s       rR   r   z%DavyBackFightEndNotification.__init__  s    
 $15@MX.bk.I.I^b-1-A-M$&))SW 00.:2>$8'$0% $.#)?"3 	 	
 	
 	
 	
 	
rQ   r   c                    | j                                         rt          j                            | j                                        t          | j         j                  t          | j         
                                          t          | j        j                            S t          j                            | j                                        t          | j        j                            S r   )r  in_winner_crewr   $DAVY_BACK_FIGHT_END_NOTIFICATION_WONr   r  rl  r-   
win_amountr+   get_contribution_percentager&   r  penalty_end_date%DAVY_BACK_FIGHT_END_NOTIFICATION_LOSTr   s    rR   r   z"DavyBackFightEndNotification.build  s    **,, 	?FF"99;;#D$4$?@@'(8(T(T(V(VWW&t';'LMM	   <CC5577"4#7#HII
 
 	
rQ   r  )
r>   r?   r@   rA   r   r   r   r   r   r   r   s   @rR   r  r    sr        66
 
d 
@X 
 
 
 
 
 
2
s 
 
 
 
 
 
 
 
rQ   r  c                   6     e Zd ZdZddef fdZdefdZ xZS )ImpelDownBailPostedNotificationz/Class for impel down bail posted notifications.NrE  c                     || _         t                                          t          j        t
          j        ddd           dS )zP
        Constructor

        :param impel_down_log: The impel down log
        #IMPEL_DOWN_BAIL_POSTED_NOTIFICATION/IMPEL_DOWN_BAIL_POSTED_NOTIFICATION_DESCRIPTION'IMPEL_DOWN_BAIL_POSTED_NOTIFICATION_KEYN)rE  r   r   r/   rE   rb   r   )r   rE  r   s     rR   r   z(ImpelDownBailPostedNotification.__init__  sH     -; +31=5	
 	
 	
 	
 	
rQ   r   c                     ddl m} | j                            | j        j                                         || j        j                  t          | j        j	                            S r  )
r  r-   r   r   rE  
bail_payerr  bail_amountr&   rB  r  s     rR   r   z%ImpelDownBailPostedNotification.build  sh    >>>>>>y*??AA 3 ?@@"4#6#HII
 
 	
rQ   r   )	r>   r?   r@   rA   r   r   r   r   r   r   s   @rR   r  r    sj        99
 
| 
 
 
 
 
 
"
s 
 
 
 
 
 
 
 
rQ   r  c                   6     e Zd ZdZddef fdZdefdZ xZS )DevilFruitSoldNotificationz)Class for devil fruit sold notifications.Ndevil_fruit_tradec                     || _         t                                          t          j        t
          j        ddd           dS )zJ
        Constructor

        :param devil_fruit_trade: The trade
        DEVIL_FRUIT_SOLD_NOTIFICATION)DEVIL_FRUIT_SOLD_NOTIFICATION_DESCRIPTION!DEVIL_FRUIT_SOLD_NOTIFICATION_KEYN)trader   r   r/   rI   rb   r   )r   r  r   s     rR   r   z#DevilFruitSoldNotification.__init__  sG     '8
 ,-+7/	
 	
 	
 	
 	
rQ   r   c                     | j                             t          | j        j                                                  t          | j        j                  | j        j        	                                          S r   )
r   r   r(   r  r  r  r-   pricereceiverr  r   s    rR   r   z DevilFruitSoldNotification.build  s\    y'
(>(L(L(N(NOO
 011J4466
 
 	
rQ   r   )	r>   r?   r@   rA   r   r   r   r   r   r   s   @rR   r  r    sj        33
 
/ 
 
 
 
 
 
"
s 
 
 
 
 
 
 
 
rQ   r  c                   "     e Zd ZdZ fdZ xZS ) CrewCaptainPromotionNotificationz/Class for crew captain promotion notifications.c                 z    t                                          t          j        t          j        ddd           dS )rU  #CREW_CAPTAIN_PROMOTION_NOTIFICATION/CREW_CAPTAIN_PROMOTION_NOTIFICATION_DESCRIPTION'CREW_CAPTAIN_PROMOTION_NOTIFICATION_KEYN)r   r   r/   rB   rb   r   r  s    rR   r   z)CrewCaptainPromotionNotification.__init__  s@    
 	 %31=5	
 	
 	
 	
 	
rQ   rc  r   s   @rR   r  r    s>        99
 
 
 
 
 
 
 
 
rQ   r  c                   6     e Zd ZdZddef fdZdefdZ xZS )FightAttackNotificationz%Class for fight attack notifications.Nfightc                     || _         t                                          t          j        t
          j        dddt          j        t          j
        t          j        t          j        ||j        ndid           dS )z>
        Constructor

        :param fight: The fight
        FIGHT_ATTACK_NOTIFICATION%FIGHT_ATTACK_NOTIFICATION_DESCRIPTIONFIGHT_ATTACK_NOTIFICATION_KEYNKEY_VIEW_LOGr  )r  r   r   r/   rM   rb   r   r   PVT_LOGS_TYPE_DETAILr   TYPEr   ITEM_IDr  )r   r  r   s     rR   r   z FightAttackNotification.__init__  sz     
 &)'3+3#('-#+9JUXXPT $2 	 	
 	
 	
 	
 	
rQ   r   c           	         | j                                         t          j        u rt          j        }t          j        }nt          j        }t          j	        }| j
                            || j         j                                        ||t          | j         j                            }| j                                         r:|t          j                            | j                                                   z  }nN|t          j                            t)          j        t,          j        | j         j        j                            z  }|S r   )r  
get_statusr   LOSTr   rv  r   CONFETTIrw  LOSERr   r   
challengerr  r-   bellycan_revengeFIGHT_ATTACK_CAN_REVENGEget_revenge_remaining_durationFIGHT_ATTACK_CANNOT_REVENGEr   get_deeplink_by_typer   rM   in_revenge_to_fightr  )r   won_lost_textwon_lost_emojiot_texts       rR   r   zFightAttackNotification.build  s   :  ""jo55#,M"^NN#-M"[N)""J!6688
 011
 
 :!!## 	w7>>
99;;  GG w:AA(
8V8YZZ  G rQ   r   )	r>   r?   r@   rA   r   r   r   r   r   r   s   @rR   r  r    sj        //
 
e 
 
 
 
 
 
.s        rQ   r  c                   6     e Zd ZdZddef fdZdefdZ xZS )PlunderAttackNotificationz'Class for plunder attack notifications.Nplunderc                     || _         t                                          t          j        t
          j        dddt          j        t          j
        t          j        t          j        ||j        ndid           dS )zB
        Constructor

        :param plunder: The plunder
        PLUNDER_ATTACK_NOTIFICATION'PLUNDER_ATTACK_NOTIFICATION_DESCRIPTIONPLUNDER_ATTACK_NOTIFICATION_KEYNr  r  )r  r   r   r/   rN   rb   r   r   r  r   r  r   r  r  )r   r  r   s     rR   r   z"PlunderAttackNotification.__init__5  sz      (+)5-3#('/#+7;NWZZTX $2 	 	
 	
 	
 	
 	
rQ   r   c                 V   | j                                         t          j        u rt          j        }nt          j        }|                    | j         j        	                                t          | j         j                            }| j                                         r:|t          j                            | j                                                   z  }nN|t          j                            t!          j        t$          j        | j         j        j                            z  }|S r   )r  r  r   r  r   PLUNDER_ATTACK_NOTIFICATION_WON PLUNDER_ATTACK_NOTIFICATION_LOSTr   r  r  r-   r  r  PLUNDER_ATTACK_CAN_REVENGEr  PLUNDER_ATTACK_CANNOT_REVENGEr   r  r   rN   in_revenge_to_plunderr  )r   r   r  s      rR   r   zPlunderAttackNotification.buildL  s    <""$$
77:DD;D++L#88::<OPTP\Pb<c<c
 

 <##%% 	w9@@;;==  GG w<CC($,:\:_``  G rQ   r   )	r>   r?   r@   rA   r   r   r   r   r   r   s   @rR   r  r  2  sj        11
 
 
 
 
 
 
 
.s        rQ   r  c                   >     e Zd ZdZd
dededef fdZdefd	Z xZ	S )GameOutcomeNotificationz%Class for game outcome notifications.NrN  r*  r   footer_textc                    || _         || _        || _        t                                          t
          j        t          j        ddddt          j
        t          j        t          j        t          j        ||j        ndid	  	         dS )zConstructor

        :param game: The game
        :param user: The user to send the outcome to
        :param footer_text: Text to add as footer
        rN  %GAME_OUTCOME_NOTIFICATION_DESCRIPTIONGAME_OUTCOME_NOTIFICATION_KEYFNr  )r   r   r   r   )r*  r   r  r   r   r/   rD   rb   r   r   r  r   r  r   r  r  )r   r*  r   r  r   s       rR   r   z GameOutcomeNotification.__init__f  s     		& %)3+!&3#(',#+8HTWWd $2 	 	
 	
 	
 	
 	
rQ   r   c                 *   | j                                         t          j        t          j        t          j        fvr6t          dt          | j                                                   z             | j                                         t          j        ur| j        | j         	                                k    }|rt          j        }t          j        }nt          j        }t          j        }t          j                            ||| j                                         t'          | j         j                                                  t-          | j                             | j                                      | j        z   S t          j                            t'          | j         j                                                  t-          | j                             | j                            | j                                                   | j        z   S )r   z=send_outcome_to_user is not supported for this game outcome: )r*  r  r   WONr  DRAWr  r   r   
get_winnerr   rx  r   rv  ry  rw  GAME_OUTCOME_NOTIFICATIONr   get_half_wager_formattedr!   r   r4  r)   get_other_playerr  GAME_OUTCOME_NOTIFICATION_DRAW)r   wonemojitext_won_losts       rR   r   zGameOutcomeNotification.build  s    9!!*.*/:?)[[[Odi**,,--.  
 9!!88)ty33555C 2* ' 0* ' 1 188!I6688TY^,,5577)$)*D*DTY*O*OPP  "#	 299((1133%di&@&@&K&KLL	2244 
 	
rQ   )NNrN  )
r>   r?   r@   rA   r   r   r   r   r   r   r   s   @rR   r  r  c  sx        //
 
T 
 
# 
 
 
 
 
 
6$
s $
 $
 $
 $
 $
 $
 $
 $
rQ   r  notification_categoryr   c                 *      fdt           D             S )z~
    Get all notifications by category

    :param notification_category: The category
    :return: List of notifications
    c                 &    g | ]}|j         u |S rP   )r   )rr  notificationr  s     rR   rt  z1get_notifications_by_category.<locals>.<listcomp>  s2        $999 	999rQ   )NOTIFICATIONS)r  s   `rR   get_notifications_by_categoryr    s.       )   rQ   r   c                 p     t           fdt          D                       }|                                 |S )zj
    Get a notification by type

    :param notification_type: The type
    :return: The notification
    c              3   .   K   | ]}|j         u |V  d S r   )r   )rr  r  r   s     rR   	<genexpr>z+get_notification_by_type.<locals>.<genexpr>  s:        %,:KO`:`:`:`:`:`:` rQ   )nextr  r   )r   r  s   ` rR   get_notification_by_typer    sT         )6    L rQ   )r   enumr   resources.EnvironmentEnvironmentr  	resourcesr   src.utils.LazyPhraseDictr   src.model.enums.Locationmodelenumsr  src.model.BountyLoanr   src.model.Crewr   src.model.CrewAbilityr	   src.model.DavyBackFightr
   "src.model.DavyBackFightParticipantr   src.model.DevilFruitr   src.model.DevilFruitTrader   src.model.Fightr   src.model.Gamer   src.model.ImpelDownLogr   src.model.Plunderr   src.model.Predictionr   src.model.PredictionOptionr   src.model.PredictionOptionUserr   src.model.Userr   src.model.Warlordr   src.model.LegendaryPirater   src.model.enums.Emojir   src.model.enums.GameStatusr   src.model.enums.Logr   src.model.enums.LogTyper   $src.model.enums.ReservedKeyboardKeysr   r   src.model.enums.Screenr   0src.model.enums.impel_down.ImpelDownBountyActionr   0src.model.enums.impel_down.ImpelDownSentenceTyper    src.model.game.GameTyper!   src.model.pojo.Keyboardr"   src.service.date_servicer#   r$   r%   r&   r  r'   r(   r)   r*   src.utils.math_utilsr+   r  r-   r/   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   "NOTIFICATION_CATEGORY_DESCRIPTIONSrb   r   r   r   r  r  r)  r8  r@  r^  re  r  r  r  r  r  r  r  r  r  r  r  r  r"  r-  r5  rA  rH  rS  rZ  r`  rp  rw  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  rP   rQ   rR   <module>r<     s~               # # # # # #       3 3 3 3 3 3 + + + + + + + + + + + + + + + + + +       - - - - - - 1 1 1 1 1 1 G G G G G G + + + + + + 5 5 5 5 5 5 ! ! ! ! ! !       / / / / / / % % % % % % + + + + + + 7 7 7 7 7 7 ? ? ? ? ? ?       % % % % % % 5 5 5 5 5 5 ' ' ' ' ' ' 1 1 1 1 1 1 # # # # # # + + + + + + Z Z Z Z Z Z Z Z ) ) ) ) ) ) R R R R R R R R R R R R , , , , , , , , , , , ,         
 < ; ; ; ; ;            9 8 8 8 8 8 6 6 6 6 6 6    7   & &4^!#?%'G!#?')K')K,.U(*M(*M(*M$&E,.U"$A$&E-/W& & "(-% -% -% -% -%w -% -% -%`s@ s@ s@ s@ s@ s@ s@ s@lI I I I IL I I I.1
 1
 1
 1
 1
 1
 1
 1
h    l   (E E E E E\ E E E*
 
 
 
 
< 
 
 
BI I I I I< I I I0E
 E
 E
 E
 E
\ E
 E
 E
P
 
 
 
 
l 
 
 
q
 q
 q
 q
 q
< q
 q
 q
h8
 8
 8
 8
 8
| 8
 8
 8
v
 
 
 
 
| 
 
 
 
 
 
 
 
\ 
 
 
 
 
 
 
 
 
 
 
D
 
 
 
 
\ 
 
 
<
 
 
 
 
L 
 
 
B_ _ _ _ _L _ _ _0_ _ _ _ _< _ _ _4%
 %
 %
 %
 %
, %
 %
 %
P c  c  c  c  cL  c  c  cF 
  
  
  
  
\  
  
  
F#
 #
 #
 #
 #
L #
 #
 #
L
 
 
 
 
\ 
 
 
:Y Y Y Y YL Y Y Y03 3 3 3 3\ 3 3 3lb b b b bL b b b0
 
 
 
 
| 
 
 
8
 
 
 
 
 
 
 
"
 
 
 
 
 
 
 
"D D D D D, D D D.D D D D D, D D D*
 
 
 
 
 
 
 
2
 
 
 
 
| 
 
 
2I I I I Il I I I.D D D D D| D D D<D D D D D| D D D*
 
 
 
 
\ 
 
 
D(
 (
 (
 (
 (
< (
 (
 (
V
 
 
 
 
l 
 
 
<
 
 
 
 
 
 
 
8
 
 
 
 
| 
 
 
"4 4 4 4 4l 4 4 4n. . . . . . . .bB
 B
 B
 B
 B
l B
 B
 B
J,,  , , #"$$	,
 , ! "", +*,,, ,+--, ! "", %$&&, %$&&, #"$$, '&((, #"$$, "!##,  "!##!," ! ""#,$ ('))%,& "!##',( #"$$),* "!##+,, #"$$-,. "!##/,0 +*,,1,2 *)++3,4 %$&&5,6 '&((7,8 &%''9,: ('));,< ('))=,> &%''?,@ -,..A,B $#%%C,D $#%%E,F -,..G,H -,..I,J #"$$K,L ! ""M,N   O,P %$&&Q,R S,T U,V W,^/	,   "0@ \      rQ   