+
    KiO  c                   s   R t ^ RIt^ RIt^ RIHt ^ RIHt ^ RIHtH	t	H
t
 ^ RIHt ^ RIHtHt ^ RIHt ^ RIHt ^ R	IHt ^ R
IHtHtHtHt ^ RIHt ^ RIHtHt ^ RI H!t! ^ RI"H#t# ^ RI$H%t% ^ RI&H't' ^ RI(H)t)H*t* ^ RI+H,t, ^ RI-H.t. ^ RI/H0t0 ^ RI1H2t2 ^ RI3H4t4 ^ RI5H6t6 ^ RI7H8t8  ! R R]94      t: ! R R],4      t; ! R R];4      t< ! R R ],4      t= ! R! R"]=4      t>]'! 4       t?]'! 4       t@]'! 4       tA]'! 4       tB ! R# R$4      tC ! R% R&]C4      tDR# )'zGeneric service utilitiesN)gettextPath)AnyDictList)Gio)apisettings)get_game_installers)write_game_config)sql)add_gameget_game_by_fieldget_game_for_service	get_games)ServiceGameCollection)GAME_UPDATEDGame)NoticeDialog)WebConnectDialog)download_media)NotificationSource)BANNER_SIZE	ICON_SIZE)ServiceMedia)system)BusyAsyncCall)WebkitCookieJar)	AsyncCall)loggerslugifyc                   s    ] tR t^ tRtRtR# )AuthTokenExpiredErrorzException raised when a token is no longer valid; the sidebar will
log-out and log-in again in response to this rather than reporting it. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r"       9/usr/lib/python3.14/site-packages/lutris/services/base.pyr!   r!       s    Nr)   r!   c                   sB    ] tR t^%tRt]t]P                  t	RR.t
RtRtR# )LutrisBannerlutris%s.jpg%s.pngZbannerr"   N)r#   r$   r%   r&   servicer   sizer   ZBANNER_PATH	dest_pathfile_patterns	api_fieldr(   r"   r)   r*   r+   r+   %   s&    GD$$Ix(MIr)   r+   c                   sf   a  ] tR t^-t o ]t]P                  tR.t	Rt
Rt]R 4       tR tR tRtV tR# )	
LutrisIconzlutris_%s.pngiconFc                    R# )   )r7   r7   r"   self   &r*   custom_media_storage_sizeZ$LutrisIcon.custom_media_storage_size4   s    r)   c                s0    \         P                  ! 4        R # N)r   Zupdate_desktop_iconsr8   r:   r*   run_system_update_desktop_iconsZ*LutrisIcon.run_system_update_desktop_icons8   s    ##%r)   c                s    R # r<   r"   )r9   Zservices   &&r*   get_fallback_media_pathZ"LutrisIcon.get_fallback_media_path;   s    r)   r"   N)r#   r$   r%   r&   r   r0   r   Z	ICON_PATHr1   r2   r3   Zcan_be_fallbackpropertyr;   r=   r?   r(   __classdictcell____classdict__   @r*   r4   r4   -   sH     D""I$%MIO & r)   r4   c                   s\   a  ] tR t^?t o RtRtRR.t]P                  t	Rt
]R 4       tRtV tR# )	LutrisCoverartr,   r-   r.   Zcoverartc                r6   )B   )rF   iX   r"   r8   r:   r*   config_ui_sizeZLutrisCoverart.config_ui_sizeF   s    r)   r"   N)i  i`  )r#   r$   r%   r&   r/   r0   r2   r   ZCOVERART_PATHr1   r3   r@   rG   r(   rA   rB   rD   r*   rE   rE   ?   s;     GDx(M&&II r)   rE   c                   s    ] tR t^KtRtRtR# )LutrisCoverartMediumr"   N)i   i   )r#   r$   r%   r&   r0   r(   r"   r)   r*   rH   rH   K   s    Dr)   rH   c                   s~  a  ] tR t^Ut o Rt]tRtRt]t	Rt
]tRtRtRtRt/ t/ t/ tRtRt]R 4       tR tR tR	 tR
 tR tR tR tR tR tV 3R lR lt V 3R lR lt!R-R lt"R t#R t$R t%R.R lt&R t'R t(R t)R t*R.R lt+R t,R t-R  t.R! t/R" t0V 3R# lR$ lt1R% t2V 3R& lR' lt3V 3R( lR) lt4V 3R* lR+ lt5R,t6V t7R# )/BaseServicezBase class for local servicesNF r5   c                sV    V P                   '       d   V P                   # V P                  # r<   )_matcheridr8   r:   r*   matcherZBaseService.matcherh   s    ===== wwr)   c                s\    V P                  4       pV'       d   VP                  V4       R# R# )zLaunch the game clientN)get_launcherZlaunch)r9   Zlaunch_ui_delegatelauncher   && r*   runZBaseService.runn   s%    $$&OO./ r)   c                sh    V P                   '       d    \        \        V P                   R 4      4      # R# )slugF)client_installerboolr   r8   r:   r*   is_launchableZBaseService.is_launchablet   s*       )$*?*?HIIr)   c                s    V P                   '       g   R # \        V P                   R4      pV'       d   \        VR,          4      # R # )NrR   rL   )rS   r   r   )r9   Zdb_launcher   & r*   rN   ZBaseService.get_launchery   s;    $$$'(=(=vFD)** r)   c                sN    V P                  4       pV'       g   R # VP                  # F)rN   Zis_installed)r9   rO   rV   r*   is_launcher_installedZ!BaseService.is_launcher_installed   s"    $$&$$$r)   c                sd   a a V 3R lpVV 3R lp\         P                  S 4       \        W#4       R# )zRefresh the service's games, asynchronously. This raises signals, but
does so on the main thread- and runs the reload on a worker thread. It calls
reloaded_callback when done, passing any error (or None on success)c                  sj  < S P                   '       d$   \        P                  ! R S P                  4       R#  RS n         S P	                  4        S P                  4        S P                  4        S P                  4        \        P                  ! RS P                  4       RS n         R#   RS n         i ; i)z'%s' games are already loadingNTz'%s' games reloadedF)	
is_loadingr   warningnamewipe_game_cacheload
load_iconsadd_installed_gamesdebugr8   s   r*   	do_reloadZ+BaseService.start_reload.<locals>.do_reload   s{    ?K	("&$$&		!((*2DII>"'%s   A(B) )	B2c                 sn   < \         P                  ! R 4       \        P                  S4       S! V4       R# )zReload callbackN)r   r`   SERVICE_GAMES_LOADEDfire)Z_resulterrorreloaded_callbackr9   s   &&r*   	reload_cbZ+BaseService.start_reload.<locals>.reload_cb   s&    LL*+ %%d+e$r)   N)SERVICE_GAMES_LOADINGrc   r   )r9   re   ra   rf   s   ff  r*   start_reloadZBaseService.start_reload   s%    
	( 	%
 	""4()'r)   c                s2    \         P                  ! R 4       R# )zLoad method not implementedN)r   rZ   r8   r:   r*   r]   ZBaseService.load   s    45r)   c                sf   \         P                  ! R4       V P                  P                  4       pVP	                  V P
                  4       VP                  4        Uu. uF	  q"! 4       NK  	  ppV F  pVP                  4       p\        WT4       K   	  V F  pVP                  4        K  	  R# u upi )z(Download all game media from the servicezLoading icons...N)
r   r`   mediasZcopyupdateextra_mediasZvaluesZget_media_urlsr   Zrender)r9   Z
all_mediasZ
media_typeZservice_mediasZservice_mediaZ
media_urlss   &     r*   r^   ZBaseService.load_icons   s    '([[%%'
$++,9C9J9J9LM9L:*,9LM ,M&557J:5 ,
 ,M  " , Ns   B.c                s    \         P                  ! R V P                  4       \        P                  ! \
        P                  RRV P                  4       R# )z(Deleting games from service-games for %sservice_gamesr/   N)r   r`   rL   r   Z	db_deleter   DB_PATHr8   r:   r*   r\   ZBaseService.wipe_game_cache   s1    ?Ih&&DGGLr)   c                    . # r<   r"   r9   db_gamer>   r*   get_update_installersZ!BaseService.get_update_installers   s    	r)   c                sR   < V ^8  d   QhRS[ S[S[3,          RS[ S[S[3,          /#    rp   return)r   strr   ZformatrC      "r*   __annotate__BaseService.__annotate__   s+      $sCx. T#s(^ r)   c                s    / # )zFUsed to generate an installer from the data returned from the servicesr"   ro   r>   r*   generate_installerZBaseService.generate_installer   s    	r)   c                sL   < V ^8  d   QhRS[ S[S[3,          RS[S[,          /# rr   )r   ru   r   r   dictrv   rw   r*   rx   ry      s'     0 04S> 0d4j 0r)   c                s>    V P                  V4      pV'       d   V.# . # )a  Used to generate a list of installers to choose from, from the data returned from the services
By default this is just the installer from generate_installer(), and if overridden to return
more than one, then generate_installer must be overridden ti pick a default installer.)rz   )r9   rp   	installerrP   r*   generate_installersZBaseService.generate_installers   s#     ++G4	'	{/R/r)   c                sl   a aa S'       g
   SR,          oVVV 3R lp\        S P                  VS4       R# )zNInstall a game, using the API or generate_installer() to obtain the installer.appidc                 s   < V'       d   VhV '       g   SP                  S4      p \        P                  P                  4       pVP	                  V SSR 7       R# )r/   r~   N)r}   r   Applicationget_defaultshow_installer_window)service_installersrd   applicationr~   rp   r9   s   && r*   on_installers_readyZ9BaseService.install_from_api.<locals>.on_installers_ready   sH    %%)%=%=g%F"//557K--.@$V[-\r)   N)r   get_installers_from_api)r9   rp   r~   r   s   fff r*   install_from_apiZBaseService.install_from_api   s+    G$E	] 	d224GOr)   c                s
    . . 3# )a~  Used to obtains the content files from the service, when an 'N/A' file is left in
the installer. This handles 'extras', and must return a tuple; first a list of
InstallerFile or InstallerFileCollection objects that are for the files themselves,
and then a list of such objects for the extras. This separation allows us to generate
extra installer script steps to move the extras in.r"   )r9   r|   Zinstaller_file_idZselected_extrass   &&&&r*   get_installer_filesZBaseService.get_installer_files   s     2vr)   c           
     s   V'       g   R# \         P                  ! \        P                  RRVR,          /RVR,          RV P                  /R7       \        RV P                  /RVR,          /RV P                  /R	7      pV F`  p\        P                  ! R
V4       \         P                  ! \        P                  RRV P                  RVR,          /RVR,          /R7       Kb  	  R# )z<Match a service game to a lutris game referenced by its slugNrl   lutris_slugrR   r~   r/   )Z
conditionsinstaller_slug)searchesfiltersexcludeszUpdating unmatched game %sZgames
service_idrL   )	r   	db_updater   rm   rL   r   rM   r   r`   )r9   service_gamelutris_gameZunmatched_lutris_gamesgames   &&&  r*   
match_gameZBaseService.match_game   s    K/0g!6	477K		
 "+&5[01)"

 +DLL5t<MM  DGG\<3HI $t*-	 +r)   c                s   \         P                  ! V P                  4       Uu/ uF  p\        VR,          4      VbK  	  pp\        P
                  ! \        VP                  4       4      V P                  R7      pV FU  pVR,           FE  pVR,          V P                  8w  d   K  V P                  VP                  VR,          4      V4       KG  	  KW  	  \        RV P                  /RV P                  /R7      p\        P
                  ! V Uu. uF  qwR,          NK  	  upR7       FU  pVR,           FE  pVR,          V P                  8w  d   K  V P                  VP                  VR,          4      V4       KG  	  KW  	  R	# u upi u upi )
z)Matching of service games to lutris gamesr~   r/   Zprovider_gamesr/   rR   r   )r   r   )Z
game_slugsN)r   Zget_for_servicerL   ru   r   get_api_gamesZlistZkeysr   getr   rM   )r9   r   rl   lutris_gamesr   Zprovider_gameZunmatched_service_gamesZgs   &       r*   match_gamesZBaseService.match_games   sN   >S>c>cdhdkdk>lm>ldT']+T1>lm((m.@.@.B)CTWWU'K!,-=!>!> +tww6 1 1-2G H+V "? (
 #,6F5Uajlplsls`t"u,,Lc8dLcq6Lc8deK!,-=!>!> +tww6 1 1-2G H+V "? f n 9es   FFc           	     sz   V F  p\         P                  ! RW$4       \        VR,          4      pW%n        V P                  Vn        VP                  VR7       \        P                  ! V P                  V4      p\        P                  ! \        P                  RRVP                  /RVR,          /4       Vu # 	  R# )zDChecks if a game is already installed and populates the service infoz%Matching %s with existing install: %srL   	no_signalrl   r   N)r   r`   r   r~   rL   r/   Zsaver   get_gamer   r   r   rm   rR   )r9   Zdb_gamesr~   r   Z_gamer   r   s   &&&&   r*   match_existing_gameZBaseService.match_existing_game	  s    ELL@%Od$DJ77DLII	I*099$''5ILMM(**OmTYY=WZ^`lmq`rYstK r)   c                s   \         P                  ! V.V P                  R7      p. pV'       d^   V^ ,          p\        VR,          4      pV F<  pV P                  VR,          P                  4       9   g   K+  VP                  V4       K>  	  V# )zMQuery the lutris API for an appid and get existing installers for the servicer   rR   version)r   r   rL   r	   rM   ZlowerZappend)r9   r~   r   r   r   
installersr|   s   &&     r*   r   Z#BaseService.get_installers_from_api  su    ((%$''B&q/K,[-@AJ'	<<9Y#7#=#=#??&--i8 ( "!r)   c                s&    \        VR,          4      # )zReturns the slug the game will have after installation, by default. This
is Lutris's slug, not the one for the service. By default, we derive it from
the Game's name.r[   r   ro   r>   r*   get_installed_slugZBaseService.get_installed_slug!  s     wv''r)   c                r6   )zeReturns the name of the runner this game will have after installation, or
blank if this is not known.rJ   r"   ro   r>   r*   get_installed_runner_nameZ%BaseService.get_installed_runner_name'  s     r)   c           	     s   VR ,          pV'       d   V P                  V4      pMV P                  V4      pV FQ  pV P                  \        RVR,          RR/R7      VRR7      pV'       g   K6  \        P
                  ! R4       R	R	V3u # 	  V'       g   V P                  V4      M. pV'       d6   V'       d   V F  pVR
,          R,           VR
&   K  	  VP                  V4       V'       g   \        P                  ! RV4       WAR	3# )r~   r   rR   	installedZ1)r   Tr   z%Found existing game, aborting installNr   z (auto-generated)zNo installer found for %s)	rq   r   r   r   r   r`   r}   Zextendrd   )	r9   rp   rj   r~   r   Zservice_installerexisting_gamer   r|   s	   &&&      r*   get_service_installersZ"BaseService.get_service_installers,  s     !%!;!;G!D!%!=!=e!D!3 44#35Fv5NP[]`"ab 5 M
 }DET=00 "4 ?ET--g6"
!!+I+4Y+?BU+UIi( ",%%j1!LL4g>!D00r)   c                s    \         P                  ! RVR,          V P                  4       V P                  '       d   V P	                  V4      # \        V P                  V P                  W4       R# )a  Install a service game, or starts the installer of the game.

Args:
    db_game (dict or str): Database fields of the game to add, or (for Lutris service only
        the slug of the game.)

Returns:
    str: The slug of the game that was installed, to be run. None if the game should not be
        run now. Many installers start from here, but continue running after this returns;
        they return None.
zInstalling %s from service %sr~   N)r   r`   rL   localsimple_installr   r   on_service_installers_loaded)r9   rp   rj   s   &&&r*   installZBaseService.installF  sS     	4gg6FP :::&&w//d1143T3TV]fr)   c                s    \         P                  ! V P                  V4      pV'       g$   \        P                  ! RWP                  4       R# V P                  V4      # )z=Installs a game given the appid for the game on this service.zNo game %s found for %sN)r   r   rL   r   rd   r   r9   r~   rp   rP   r*   install_by_idZBaseService.install_by_idY  s@    '00%@LL2E77C||G$$r)   c                s    V'       d   VhVw  r4pV'       d   \         P                  ! V4       V'       dE   V'       d;   \        P                  P	                  4       pVP                  W0VR ,          R7       R# R# R# )r~   r   N)r   rc   r   r   r   r   )r9   Zresultrd   r   rp   r   r   s   &&&    r*   r   Z(BaseService.on_service_installers_loadeda  sb    K5;2] m,'//557K--.@V]^eVf-g #*r)   c                s    V P                  V4      p\        VR,          VR,          4      p\        VR,          VR,          VR,          V P                  V4      ^VR,          VV P                  VR,          R7	      pV# )zSA simplified version of the install method, used when a game doesn't need any setuprR   Zscriptr[   runner	game_slugr~   )	r[   r   rR   Z	directoryr   r   
configpathr/   r   )rz   r
   r   get_game_directoryrL   )r9   rp   r|   r   Zgame_ids   &&   r*   r   ZBaseService.simple_installp  s{    ++G4	&wv	(8KL
6"X&;'--i8$V,!GGw'

 r)   c                r6   )zServices can implement this method to scan for locally
installed games and add them to lutris.

This runs on a worker thread, and must no trigger UI actions -
so no emitting signals here.
Nr"   r8   r:   r*   r_   ZBaseService.add_installed_games      r)   c                r6   )z'Specific services should implement thisrJ   r"   )r9   Z
_installerr>   r*   r   ZBaseService.get_game_directory  s    r)   c                s6   < V ^8  d   QhRS[ RS[S[,          /# rr   )r{   r   ru   rv   rw   r*   rx   ry     s      $ 49 r)   c                rn   )zInterprets the database record for this game from this service
to extract its platform, or returns an empty list if this is not available.r"   ro   r>   r*   get_game_platformsZBaseService.get_game_platforms  s	     	r)   c                s    \        V P                  V4      pV'       d2   VP                  R 4      '       d   \        VP                  R 4      4      # R# )rL   N)r   rL   r   ru   r   rP   r*   resolve_game_idZBaseService.resolve_game_id  s:    &tww6w{{4((w{{4())r)   c                    < V ^8  d   QhRS[ /# )rs   r   )r   rv   rw   r*   rx   ry     s       r)   c                s    VP                   V P                  8X  d>   VP                  '       d,   \        P                  ! V P                  VP                  4      # R# )zaReturns the row dictionary for the service-game corresponding to the game given, if any, or None.N)r/   rL   r~   r   r   )r9   r   r>   r*   get_service_db_gameZBaseService.get_service_db_game  s8    <<477"tzzz(11$''4::FFr)   c                r   rs   rp   r{   rv   rw   r*   rx   ry     s     P PT Pr)   c                r6   )zServices can implement this method so games that are not in the
database can be sorted by release date (Year) based on service data.Nr"   ro   r>   r*   get_game_release_dateZ!BaseService.get_game_release_date  r   r)   c                r   r   r   rv   rw   r*   rx   ry     s     ( (T (r)   c                sJ    V P                  V4      pV'       d
   VR,          # R# )z}Returns game release year
Does not have to be rewritten if get_game_release_date returns
rfc/iso compatible date (YYYY-MM-DD):Ni   NrJ   )r   )r9   rp   ZdaterP   r*   get_game_release_yearZ!BaseService.get_game_release_year  s%     ))'2tBx'R'r)   )rY   r<   rW   )8r#   r$   r%   r&   r'   NotImplementedrL   rK   Z
has_extrasr[   Zdescriptionr5   onliner   Zdrm_freerS   Zscriptsri   rk   Zdefault_formatrY   r@   rM   rQ   rU   rN   rX   rh   r]   r^   r\   rq   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r_   r   r   r   r   r   r   r(   rA   rB   rD   r*   rI   rI   U   s&    '	BHJDKDFEHGFLNJ 
0
+%(:6#"M 0 0P 0W 

"(
14g&%h" 
 P P( (r)   rI   c                   s   a a ] tR tRt oRtRt]t]tRt	]t
RtRt]P                  t]t]R 4       tRR lt]V3R	 lR
 l4       t]P*                  V3R lR l4       tV3R lR ltR tV 3R ltR tR tRtVtV ;t# )OnlineServicei  z%Base class for online gaming servicesTFi  i  c                s    V P                   .# )z2Return a list of all files used for authentication)cookies_pathr8   r:   r*   credential_filesZOnlineService.credential_files  s     !!""r)   c                s   V P                   '       dx   V P                  4       '       gb   \        \        R 4      V P                  ,          4       \
        P                  P                  4       pVP                  V P                   R7       R# \        P                  ! RV P                  4       \        W4      pVP                  4        R# )z~This service requires a game launcher. The following steps will install it.
Once the client is installed, you can login to %s.)r   NzConnecting to %s)rS   rX   r   _r[   r   r   r   Zshow_lutris_installer_windowr   r`   r   rQ   )r9   Zparentr   Zdialogs   &&  r*   loginZOnlineService.login  s       )C)C)E)EI ))	 //557K44t?T?T4U'3!$/

r)   c                r   rs   rt   rT   rv   rw   r*   rx   OnlineService.__annotate__  s     ; ;d ;r)   c                s>    V P                  4       P                  4       # )a  Set to true if the login process is underway; the credential files may be created at this
time, but that does not count as 'authenticated' until the login process is over. This is used
by WebConnectDialog since it creates its cookies before the login is actually complete.

This is recorded with a file in ~/.cache/lutris so it will persist across Lutris
restarts, just as the credentials themselves do. For this reason, we need to allow
the user to login again even when a login is in progress.)_get_login_in_progress_pathZexistsr8   r:   r*   is_login_in_progress"OnlineService.is_login_in_progress  s     //188::r)   c                s$   < V ^8  d   QhRS[ RR/# )rs   in_progressrt   Nr   rv   rw   r*   rx   r     s     ) ) ) )r)   c                s~    V P                  4       pV'       d   VP                  4        R# VP                  R R7       R# )T)Z
missing_okN)r   ZtouchZunlink)r9   r   pathrP   r*   r   r     s*    //1JJLKK4K(r)   c                r   r   r   rv   rw   r*   rx   r     s     X XT Xr)   c                s    \        \        P                  P                  \        P
                  V P                   R 24      4      # )z-login-in-progress)r   osr   Zjoinr   Z	CACHE_DIRr[   r8   r:   r*   r   Z)OnlineService._get_login_in_progress_path  s.    BGGLL!3!3		{BT5UVWWr)   c                s    V P                   '       d   \        P                  ! R4       R# \        ;QJ d&    R V P                   4       F  '       d   K   R# 	  R# ! R V P                   4       4      # )z+Return whether the service is authenticatedz0Tried to get auth status while login in progressFc              3   sN   "   T F  p\         P                  ! V4      x  K  	  R # 5ir<   )r   path_exists)Z.0r   rV   r*   Z	<genexpr>Z1OnlineService.is_authenticated.<locals>.<genexpr>  s      N8M6%%d++8Ms   #%T)r   r   rZ   Zallr   r8   r:   r*   is_authenticatedZOnlineService.is_authenticated  sS    $$$NNMNsN8M8MNssNsNsN8M8MNNNr)   c                s  < V P                   '       d   \        P                  ! RV P                  V P                   4       \        P
                  P                  V P                   4      '       d"   \        P                  ! V P                   4       MF\        P                  ! V P                   4      '       d!   \        P                  ! V P                   4       \        SV `5  4        R# )z/Wipe the game cache, allowing it to be reloadedzDeleting %s cache %sN)
cache_pathr   r`   rL   r   r   ZisdirshutilZrmtreer   r   removeZsuperr\   )r9   	__class__s   &r*   r\   ZOnlineService.wipe_game_cache  s|    ???LL/$//Jww}}T__--doo.##DOO44		$//*!r)   c                s8   V P                  4        V P                   F  p \        P                  ! V4       K  	  \
        P                  ! RV P                  4       \        P                  V 4       R#   \         d    \
        P                  ! RT4        K{  i ; i)z7Disconnect from the service by removing all credentialszUnable to remove %szlogged out from %sN)r\   r   r   r   ZOSErrorr   rZ   r`   rL   SERVICE_LOGOUTrc   )r9   Z	auth_filerV   r*   logoutZOnlineService.logout  su    ..IA		)$ /
 	)4773D!  A4i@As   A33"BBc                s    \         P                  ! V P                  4      '       g$   \        P                  ! RV P                  4       R# \        V P                  4      pVP                  4        V# )zLoad cookies from diskz1No cookies found in %s, please authenticate firstN)r   r   r   r   rZ   r   r]   )r9   Z	cookiejarrV   r*   load_cookiesZOnlineService.load_cookies  sR    !!$"3"344NNNPTPaPab#D$5$56	r)   r"   r<   )r#   r$   r%   r&   r'   r   r   r   r   Zrequires_login_pageZ	login_urlZlogin_window_widthZlogin_window_heightr   ZDEFAULT_USER_AGENTZlogin_user_agentZredirect_urisr@   r   r   r   Zsetterr   r   r\   r   r   r(   rA   Z__classcell__)r   rC   s   @@r*   r   r     s     /F!LJI22"M# #  ; ;   ) !)X XO"	" r)   r   )Er'   r   r   r    r   Zpathlibr   Ztypingr   r   r   Zgi.repositoryr   r,   r   r   Z
lutris.apir	   Zlutris.configr
   Zlutris.databaser   Zlutris.database.gamesr   r   r   r   Zlutris.database.servicesr   Zlutris.gamer   r   Zlutris.gui.dialogsr   Z$lutris.gui.dialogs.webconnect_dialogr   Zlutris.gui.views.media_loaderr   Zlutris.gui.widgetsr   Zlutris.gui.widgets.utilsr   r   Zlutris.services.service_mediar   Zlutris.utilr   Zlutris.util.busyr   Zlutris.util.cookiesr   Zlutris.util.jobsr   Zlutris.util.logr   Zlutris.util.stringsr    Z	Exceptionr!   r+   r4   rE   rH   rg   rb   ZSERVICE_LOGINr   rI   r   r"   r)   r*   <module>r      s     	     " "    * +  ^ ^ : * + A 8 1 ; 6  * / & " 'NI N
<  $	\ 	>  +, )+ "$#%T( T(n
\K \r)   