§
    E«j™e  ã                  ó  — d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZ ddlmZmZ ddlmZmZ  ej        e¦  «        Z G d„ d	¦  «        Zd-d„Zd.d„Zd/d0d„Zddœd1d"„Zd2d#„Zd3d%„Zd3d&„Zd4d5d)„Zd3d*„Zd6d,„ZdS )7z1Code related to the config that lichess-bot uses.é    )ÚannotationsN)ÚAny)Ú	ItemsViewÚCallable)ÚCONFIG_DICT_TYPEÚ
FilterType)ÚminutesÚdaysc                  óZ   — e Zd ZdZdd„Zdd
„Zdd„Zdd„Zdd„Zdd„Z	dd„Z
dd„Zd d„ZdS )!ÚConfigurationz-The config or a sub-config that the bot uses.Ú
parametersr   ÚreturnÚNonec                ó   — || _         dS )z>:param parameters: A `dict` containing the config for the bot.N©Úconfig)Úselfr   s     ú%/app/lichess-bot-master/lib/config.pyÚ__init__zConfiguration.__init__   s   € à ˆŒˆˆó    ÚnameÚstrr   c                ó,   — |                       |¦  «        S )zŽ
        Enable the use of `config.key1.key2`.

        :param name: The key to get its value.
        :return: The value of the key.
        )Úlookup)r   r   s     r   Ú__getattr__zConfiguration.__getattr__   s   € ð �{Š{˜4Ñ Ô Ð r   c                ó‚   — | j                              |¦  «        }t          |t          ¦  «        rt	          |¦  «        n|S )z«
        Get the value of a key.

        :param name: The key to get its value.
        :return: `Configuration` if the value is a `dict` else returns the value.
        )r   ÚgetÚ
isinstanceÚdictr   )r   r   Údatas      r   r   zConfiguration.lookup   s9   € ð Œ{�Š˜tÑ$Ô$ˆÝ&0°µtÑ&<Ô&<ÐF�}˜TÑ"Ô"Ð"À$ÐFr   úItemsView[str, Any]c                ó4   — | j                              ¦   «         S )z0:return: All the key-value pairs in this config.)r   Úitems©r   s    r   r#   zConfiguration.items)   s   € àŒ{× Ò Ñ"Ô"Ð"r   ú	list[str]c                óN   — t          | j                             ¦   «         ¦  «        S )z(:return: All of the keys in this config.)Úlistr   Úkeysr$   s    r   r(   zConfiguration.keys-   s   € å�D”K×$Ò$Ñ&Ô&Ñ'Ô'Ð'r   Úotherú Configuration | CONFIG_DICT_TYPEc                ól   — t          |t          ¦  «        r|j        n|}t          | j        |z  ¦  «        S )zSCreate a copy of this configuration that is updated with values from the parameter.)r   r   r   )r   r)   Ú
other_dicts      r   Ú__or__zConfiguration.__or__1   s1   € å%/°µ}Ñ%EÔ%EÐP�U”\�\È5ˆ
Ý˜Tœ[¨:Ñ5Ñ6Ô6Ð6r   Úboolc                ó*   — t          | j        ¦  «        S )zWhether `self.config` is empty.)r.   r   r$   s    r   Ú__bool__zConfiguration.__bool__6   s   € å�D”KÑ Ô Ð r   c                ó   — | j         S )zGet `self.config`.r   r$   s    r   Ú__getstate__zConfiguration.__getstate__:   s
   € àŒ{Ðr   Údc                ó   — || _         dS )zSet `self.config`.Nr   )r   r3   s     r   Ú__setstate__zConfiguration.__setstate__>   s   € àˆŒˆˆr   N)r   r   r   r   )r   r   r   r   )r   r!   )r   r%   )r)   r*   r   r   )r   r.   )r   r   )r3   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r#   r(   r-   r0   r2   r5   © r   r   r   r      sÒ   € € € € € Ø7Ð7ð!ð !ð !ð !ð!ð !ð !ð !ðGð Gð Gð Gð#ð #ð #ð #ð(ð (ð (ð (ð7ð 7ð 7ð 7ð
!ð !ð !ð !ðð ð ð ðð ð ð ð ð r   r   Ú	assertionr.   Úerror_messager   r   r   c                ó(   — | st          |¦  «        ‚dS )z,Raise an exception if an assertion is false.N)Ú	Exception)r;   r<   s     r   Úconfig_assertr?   C   s"   € àð 'Ý˜Ñ&Ô&Ð&ð'ð 'r   Úwarning_messagec                óB   — | st                                |¦  «         dS dS )z1Print a warning message if an assertion is false.N)ÚloggerÚwarning)r;   r@   s     r   Úconfig_warnrD   I   s,   € àð (Ý�Š�Ñ'Ô'Ð'Ð'Ð'ð(ð (r   Ú r   r   Ú	data_nameÚ	data_typeÚtypeÚ
subsectionc                ó  — |r| |         n| }|rd|› d�nd}|r	d|› d|› d�nd|› d�}t           |› d�t          |› d�i}t          ||v d|› d	|› d
�¦  «         t          t          ||         |¦  «        ||         ¦  «         dS )zë
    Check the validity of a config section.

    :param config: The config section.
    :param data_name: The key to check its value.
    :param data_type: The expected data type.
    :param subsection: The subsection of the key.
    ú`z` subrE   z` subsection in `z	Section `z$ must be a string wrapped in quotes.z< must be a dictionary with indented keys followed by colons.z'Your config.yml does not have required z	section `z`.N)r   r   r?   r   )r   rF   rG   rI   Úconfig_partÚsubÚdata_locationÚtype_error_messages           r   Úcheck_config_sectionrP   O   sá   € ð )3Ð>�&˜Ô$Ð$¸€KØ#-Ð
5Ð
ˆjÐ
Ð
Ð
Ð
°2€CØEOÐmÐA˜	ÐAÐA°JÐAÐAÐAÐAÐUmÐajÐUmÐUmÐUm€Må�ÐCÐCÐCÝ�Ð\Ð\Ð\ð+^Ðõ �)˜{Ð*Ð,qÐVYÐ,qÐ,qÐdmÐ,qÐ,qÐ,qÑrÔrÐrÝ•*˜[¨Ô3°YÑ?Ô?ÐASÐT]ÔA^Ñ_Ô_Ð_Ð_Ð_r   F)Úforce_empty_valuesÚsectionsÚkeyÚdefaultr   rQ   c               ó   — | }|D ]C}|                      |i ¦  «        }t          |t          ¦  «        st          d|› d|› d�¦  «        ‚ŒD|r|                     |¦  «        dv r|||<   n|                      ||¦  «         |S )a˜  
    Fill a specific config key with the default value if it is missing.

    :param config: The bot's config.
    :param sections: The sections that the key is in.
    :param key: The key to set.
    :param default: The default value.
    :param force_empty_values: Whether an empty value should be replaced with the default value.
    :return: The new config with the default value inserted if needed.
    zThe z section in z3 should hold a set of key-value pairs, not a value.)NrE   )Ú
setdefaultr   r   r>   r   )r   rS   rT   rQ   rR   Ú	subconfigÚsections          r   Úset_config_defaultrY   b   s¯   € ð €IØð wð wˆØ×(Ò(¨°"Ñ5Ô5ˆ	Ý˜)¥TÑ*Ô*ð 	wÝÐu 7ÐuÐu¸ÐuÐuÐuÑvÔvÐvð	wàð +Ø�=Š=˜ÑÔ Ð+Ð+Ø$ˆI�c‰Nøà×Ò˜S 'Ñ*Ô*Ð*ØÐr   c               ó”   — t          | g|¢R |g dœŽ}||         €g ||<   t          ||         t          ¦  «        s||         g||<   dS dS )zæ
    Change a single value to a list. e.g. 60 becomes [60]. Used to maintain backwards compatibility.

    :param config: The bot's config.
    :param sections: The sections that the key is in.
    :param key: The key to set.
    ©rS   rT   N)rY   r   r'   )r   rS   rR   rW   s       r   Úchange_value_to_listr\   {   sj   € õ # 6ÐJ¨HÐJÐJ¸#ÀrÐJÐJÐJ€Ià�„~ÐØˆ	�#‰å�i ”n¥dÑ+Ô+ð *Ø# Cœ.Ð)ˆ	�#‰ˆˆð*ð *r   ÚCONFIGc           	     óÚ  — t          | dd¬¦  «         t          | dd¬¦  «         t          | dd¬¦  «         t          | dd	¬¦  «         t          | d
d¬¦  «         t          | ddd¬¦  «         t          | dd	d¬¦  «         t          | ddd¬¦  «         t          | ddg d¬¦  «         t          | dd¬¦  «         t          | ddt          j        ¦   «         d¬¦  «         t          | ddd¬¦  «         t          | dddd¬¦  «         t          | dddd¬¦  «         t          | dddd¬¦  «         t          | dddd¬¦  «         t          | dddd¬¦  «         t          | dddd¬¦  «         t          | ddd d!¬¦  «         t          | ddd"d	¬¦  «         t          | ddd#d$¬¦  «         t          | dd%d&d$¬¦  «         t          | dd%d'd(d¬¦  «         t          | dd%d)t          j        d¬¦  «         t          | dd%d*d+d¬¦  «         t          | dd%d*d,d-¬¦  «         t          | dd%d*d.d¬¦  «         t          | dd%d*d/d0¬¦  «         t          | dd%d*d1d2¬¦  «         t          | dd%d*d3d4¬¦  «         t          | dd%d5d+d¬¦  «         t          | dd%d5d.d¬¦  «         t          | dd%d5d/d0¬¦  «         t          | dd%d5d3d6¬¦  «         t          | dd%d5d7d¬¦  «         t          | dd%d8d+d¬¦  «         t          | dd%d8d.d¬¦  «         t          | dd%d8d/d0¬¦  «         t          | dd%d8d3d4¬¦  «         t          | dd%d8d7d¬¦  «         t          | dd%d8d9d	¬¦  «         t          | dd%d8d:d;¬¦  «         t          | dd%d<d+d¬¦  «         t          | dd%d<d.d¬¦  «         t          | dd%d<d/d0¬¦  «         t          | dd%d<d,d=¬¦  «         t          | dd%d<d>d?¬¦  «         t          | dd%d<d@dA¬¦  «         t          | dd%d<dBd$¬¦  «         t          | ddCdDd+d¬¦  «         t          | ddCdDd1d2¬¦  «         t          | ddCdDd3d4¬¦  «         t          | ddCdEd+d¬¦  «         t          | ddCdEd1d!¬¦  «         t          | ddCdEd3d4¬¦  «         t          | ddCdEdFdG¬¦  «         t          | ddHd+d¬¦  «         t          | ddHd)dI¬¦  «         t          | ddHdJdK¬¦  «         t          | ddHdLdM¬¦  «         t          | ddHdNdO¬¦  «         t          | dPdQdM¬¦  «         t          | dPdRd4¬¦  «         t          | dPdSdO¬¦  «         t          | dPdTd¬¦  «         t          | dPdUd¬¦  «         t          | dPdVdW¬¦  «         t          | dPdXd	¬¦  «         t          | dPdYt          j        ¬¦  «         t          | dPdZd	¬¦  «         t          | dPd[t          j        ¬¦  «         t          | dPd\dM¬¦  «         t          | dPd]g d¬¦  «         t          | dPd^g d¬¦  «         t          | dPd_g d¬¦  «         t          | dPd`d	d¬¦  «         t          | dPdadbd¬¦  «         t          | dPdcd¬¦  «         t          | dPddd!¬¦  «         t          | dedfdg¬¦  «         t          | dedhdid¬¦  «         t          | dedjdk¬¦  «         t          | dldmdnd¬¦  «         t          | dl         dm         dM¦  «        | dl         dm<   t          | dld]g d¬¦  «         t          | dld^g d¬¦  «         t          | dldodd¬¦  «         |                      dl¦  «        pi                      dp¦  «        pt          j	        j
        }t          | dldq|d¬¦  «         t          | dldrd¬¦  «         t          | dldsdgd¬¦  «         t          | dlds¬¦  «         t          | dldtdgd¬¦  «         t          | dldt¬¦  «         t          | dldudgd¬¦  «         t          | dldu¬¦  «         t          | dldvdgd¬¦  «         t          | dldwdbd¬¦  «         t          | dldxdO¬¦  «         t          | dldydz¬¦  «         t          | dld{dz¬¦  «         t          | dld|i d¬¦  «         | dl         d|                              ¦   «         D ]0}d}D ]+}||v r%t          ||dgd¬¦  «         t          ||¬¦  «         Œ,Œ1d~D ]}dD ]}t          | ||d¬¦  «         ŒŒd€D ]}d�D ]}t          | d‚||z   d?d¬¦  «         ŒŒdS )ƒzy
    Insert the default values of most keys to the config if they are missing.

    :param CONFIG: The bot's config.
    Ú
abort_timeé   r[   Úmove_overheadiè  Úquit_after_all_games_finishFÚrate_limiting_delayr   Úpgn_directoryNÚpgn_file_groupingÚgameT)rS   rT   rQ   Úmax_takebacks_acceptedÚengineÚinterpreterÚinterpreter_options)rS   Úworking_dirÚsilence_stderrÚdraw_or_resignÚoffer_draw_enabledÚoffer_draw_for_egtb_zeroÚresign_enabledÚresign_for_egtb_minus_twoÚresign_movesé   Úresign_scoreiüÿÿÚoffer_draw_movesé   Úoffer_draw_scoreÚoffer_draw_piecesé
   Úonline_movesÚmax_out_of_book_movesÚmax_retriesé   Ú	max_depthÚonline_egtbÚenabledÚsourceÚlichessÚmin_timeÚmax_timei0*  Ú
max_piecesé   Úmove_qualityÚbestÚchessdb_bookÚgoodÚ	min_depthÚlichess_cloud_analysisÚ
min_knodesÚmax_score_differenceé2   Úlichess_opening_explorerÚmastersÚplayer_namerE   ÚsortÚwinrateÚ	min_gamesÚlichess_bot_tbsÚsyzygyÚgaviotaÚmin_dtm_to_consider_as_wdl_1éx   Úpolygloté   Ú	selectionÚweighted_randomÚ
min_weighté   ÚnormalizationÚnoneÚ	challengeÚconcurrencyÚsort_byÚ
preferenceÚ
accept_botÚonly_botÚmax_incrementé´   Úmin_incrementÚmax_baseÚmin_baseÚmax_daysÚmin_daysÚ
block_listÚonline_block_listÚ
allow_listÚ
min_ratingÚ
max_ratingi   Úrating_differenceÚmax_simultaneous_games_per_userÚcorrespondenceÚcheckin_periodiX  Ú	move_timeé<   Údisconnect_timei,  ÚmatchmakingÚchallenge_timeouté   Úinclude_challenge_block_listÚdelay_after_declineÚchallenge_filterÚallow_matchmakingÚchallenge_initial_timeÚchallenge_incrementÚchallenge_daysÚopponent_min_ratingÚopponent_max_ratingÚrating_preferenceÚchallenge_variantÚrandomÚchallenge_modeÚ	overrides)rÃ   rÄ   rÅ   )rh   r·   )ÚponderÚ
uci_ponder)ÚhelloÚgoodbye)rE   Ú_spectatorsÚgreeting)rY   r\   ÚosÚgetcwdÚmathÚinfÚmaxr   r   ÚNONEÚvalueÚvalues)r]   Údefault_filterÚoverride_configÚ	parameterrX   rÍ   rÒ   Útargets           r   Úinsert_default_valuesrß   Œ   sÚ  € õ �v <¸Ð<Ñ<Ô<Ð<Ý�v ?¸DÐAÑAÔAÐAÝ�vÐ#@È%ÐPÑPÔPÐPÝ�vÐ#8À!ÐDÑDÔDÐDÝ�v ?¸DÐAÑAÔAÐAÝ�vÐ#6ÀÐ[_Ð`Ñ`Ô`Ð`Ý�vÐ#;ÀQÐ[_Ð`Ñ`Ô`Ð`Ý�v˜x¨]ÀDÐIÑIÔIÐIÝ�v˜xÐ-BÈBÐcgÐhÑhÔhÐhÝ˜ Ð/DÐEÑEÔEÐEÝ�v˜x¨]ÅBÄIÁKÄKÐdhÐiÑiÔiÐiÝ�v˜xÐ-=ÀuÐMÑMÔMÐMÝ�v˜xÐ)9Ð?SÐ]bÐcÑcÔcÐcÝ�v˜xÐ)9Ð?YÐcgÐhÑhÔhÐhÝ�v˜xÐ)9Ð?OÐY^Ð_Ñ_Ô_Ð_Ý�v˜xÐ)9Ð?ZÐdhÐiÑiÔiÐiÝ�v˜xÐ)9¸~ÐWXÐYÑYÔYÐYÝ�v˜xÐ)9¸~ÐW\Ð]Ñ]Ô]Ð]Ý�v˜xÐ)9Ð?QÐ[\Ð]Ñ]Ô]Ð]Ý�v˜xÐ)9Ð?QÐ[\Ð]Ñ]Ô]Ð]Ý�v˜xÐ)9Ð?RÐ\^Ð_Ñ_Ô_Ð_Ý�v˜x¨Ð=TÐ^`ÐaÑaÔaÐaÝ�v˜x¨¸]ÐTUÐjnÐoÑoÔoÐoÝ�v˜x¨¸[ÕRVÔRZÐosÐtÑtÔtÐtÝ�v˜x¨¸ÈIÐ_dÐeÑeÔeÐeÝ�v˜x¨¸ÈHÐ^gÐhÑhÔhÐhÝ�v˜x¨¸ÈJÐ`bÐcÑcÔcÐcÝ�v˜x¨¸ÈJÐ`eÐfÑfÔfÐfÝ�v˜x¨¸ÈLÐbcÐdÑdÔdÐdÝ�v˜x¨¸ÈNÐdjÐkÑkÔkÐkÝ�v˜x¨¸ÈYÐ`eÐfÑfÔfÐfÝ�v˜x¨¸ÈZÐacÐdÑdÔdÐdÝ�v˜x¨¸ÈZÐafÐgÑgÔgÐgÝ�v˜x¨¸È^ÐekÐlÑlÔlÐlÝ�v˜x¨¸È[ÐbdÐeÑeÔeÐeÝ�v˜x¨Ð9QÐW`ÐjoÐpÑpÔpÐpÝ�v˜x¨Ð9QÐWaÐkmÐnÑnÔnÐnÝ�v˜x¨Ð9QÐWaÐkpÐqÑqÔqÐqÝ�v˜x¨Ð9QÐWeÐouÐvÑvÔvÐvÝ�v˜x¨Ð9QÐWbÐlnÐoÑoÔoÐoÝ�v˜x¨Ð9QÐWcÐmnÐoÑoÔoÐoÝ�v˜x¨Ð9QÐWmÐwyÐzÑzÔzÐzÝ�v˜x¨Ð9SÐYbÐlqÐrÑrÔrÐrÝ�v˜x¨Ð9SÐYcÐmoÐpÑpÔpÐpÝ�v˜x¨Ð9SÐYcÐmrÐsÑsÔsÐsÝ�v˜x¨Ð9SÐYaÐktÐuÑuÔuÐuÝ�v˜x¨Ð9SÐYfÐprÐsÑsÔsÐsÝ�v˜x¨Ð9SÐY_ÐirÐsÑsÔsÐsÝ�v˜x¨Ð9SÐYdÐnpÐqÑqÔqÐqÝ�v˜xÐ):¸HÈ)Ð]bÐcÑcÔcÐcÝ�v˜xÐ):¸HÈ,Ð`aÐbÑbÔbÐbÝ�v˜xÐ):¸HÈ.ÐbhÐiÑiÔiÐiÝ�v˜xÐ):¸IÈ9Ð^cÐdÑdÔdÐdÝ�v˜xÐ):¸IÈ<ÐabÐcÑcÔcÐcÝ�v˜xÐ):¸IÈ>ÐciÐjÑjÔjÐjÝ�v˜xÐ):¸IÐKiÐsvÐwÑwÔwÐwÝ�v˜x¨¸ÈEÐRÑRÔRÐRÝ�v˜x¨¸ÈaÐPÑPÔPÐPÝ�v˜x¨¸ÐN_Ð`Ñ`Ô`Ð`Ý�v˜x¨¸ÈqÐQÑQÔQÐQÝ�v˜x¨¸ÐRXÐYÑYÔYÐYÝ�v˜{°ÀqÐIÑIÔIÐIÝ�v˜{°	À6ÐJÑJÔJÐJÝ�v˜{°ÀfÐMÑMÔMÐMÝ�v˜{°ÀeÐLÑLÔLÐLÝ�v˜{°
ÀEÐJÑJÔJÐJÝ�v˜{°ÈÐMÑMÔMÐMÝ�v˜{°ÈÐKÑKÔKÐKÝ�v˜{°
ÅDÄHÐMÑMÔMÐMÝ�v˜{°
ÀAÐFÑFÔFÐFÝ�v˜{°
ÅDÄHÐMÑMÔMÐMÝ�v˜{°
ÀAÐFÑFÔFÐFÝ�v˜{°ÀbÐ]aÐbÑbÔbÐbÝ�v˜{Ð0CÈRÐdhÐiÑiÔiÐiÝ�v˜{°ÀbÐ]aÐbÑbÔbÐbÝ�v˜{°ÀaÐ\`ÐaÑaÔaÐaÝ�v˜{°ÀdÐ_cÐdÑdÔdÐdÝ�v˜{Ð0CÈTÐRÑRÔRÐRÝ�v˜{Ð0QÐ[\Ð]Ñ]Ô]Ð]Ý�vÐ/Ð5EÈsÐSÑSÔSÐSÝ�vÐ/°[È"ÐaeÐfÑfÔfÐfÝ�vÐ/Ð5FÐPSÐTÑTÔTÐTÝ�v˜}Ð2EÈrÐfjÐkÑkÔkÐkÝ14°V¸MÔ5JÐK^Ô5_ÐabÑ1cÔ1c€Fˆ=ÔÐ-Ñ.Ý�v˜}°,ÈÐ_cÐdÑdÔdÐdÝ�v˜}Ð2EÈrÐfjÐkÑkÔkÐkÝ�v˜}Ð2PÐZ_ÐtxÐyÑyÔyÐyØ—j’j Ñ/Ô/Ð5°2×:Ò:Ð;PÑQÔQÐjÕU_ÔUdÔUj€NÝ�v˜}Ð2DÈnÐquÐvÑvÔvÐvÝ�v˜}Ð2EÈuÐUÑUÔUÐUÝ�v˜}Ð2JÐUYÐTZÐosÐtÑtÔtÐtÝ˜ Ð4LÐMÑMÔMÐMÝ�v˜}Ð2GÐRVÐQWÐlpÐqÑqÔqÐqÝ˜ Ð4IÐJÑJÔJÐJÝ�v˜}Ð2BÈTÈFÐgkÐlÑlÔlÐlÝ˜ Ð4DÐEÑEÔEÐEÝ�v˜}Ð2GÐQTÐimÐnÑnÔnÐnÝ�v˜}Ð2GÐQUÐjnÐoÑoÔoÐoÝ�v˜}Ð2EÈvÐVÑVÔVÐVÝ�v˜}Ð2EÈxÐXÑXÔXÐXÝ�v˜}Ð2BÈHÐUÑUÔUÐUÝ�v˜}°+ÀrÐ^bÐcÑcÔcÐcØ! -Ô0°Ô=×DÒDÑFÔFð Eð EˆØ\ð 	Eð 	EˆIØ˜OÐ+Ð+Ý" ?¸	ÈDÈ6ÐfjÐkÑkÔkÐkÝ$ _¸)ÐDÑDÔDÐDøð	Eð
 0ð Kð KˆØ.ð 	Kð 	KˆFÝ˜v w°FÀEÐJÑJÔJÐJÐJð	Kð )ð oð oˆØ)ð 	oð 	oˆFÝ˜v z°xÀ&Ñ7HÐRTÐimÐnÑnÔnÐnÐnð	oðoð or   c                ó€   — | d         d         r/| d         d                               | d         d         ¦  «         dS dS )z{
    Retrieve online block lists and copy over challenge blocklist if necessary.

    :param CONFIG: The bot's config.
    r¼   r¿   r°   r£   N)Úextend)r]   s    r   Úprocess_block_listrâ     sR   € ð ˆmÔÐ;Ô<ð VØˆ}Ô˜lÔ+×2Ò2°6¸+Ô3FÀ|Ô3TÑUÔUÐUÐUÐUðVð Vr   Úalternate_log_functionúCallable[[str], Any] | Nonec                ó®   — |                       ¦   «         }d|d<   |pt          j        } |dt          j        |d¬¦  «        › �¦  «          |d¦  «         dS )zX
    Log the config to make debugging easier.

    :param CONFIG: The bot's config.
    rB   ÚtokenzConfig:
F)Ú	sort_keysz====================N)ÚcopyrB   ÚdebugÚyamlÚdump)r]   rã   Úlogger_configÚdestinations       r   Ú
log_configrî     sf   € ð —K’K‘M”M€MØ%€M�'ÑØ(Ð8­F¬L€KØ€KÐG�DœI m¸uÐEÑEÔEÐGÐGÑHÔHÐHØ€KÐ&Ñ'Ô'Ð'Ð'Ð'r   c                óð  ‡&— t          | dt          ¦  «         t          | dt          ¦  «         t          | dt          ¦  «         t          | dt          ¦  «         t          | dt          d¦  «         t          | dt          d¦  «         t          t          j                             | d         d         ¦  «        d| d         d         › d�¦  «         | d                              d	¦  «        }t          | pt          j                             |¦  «        d
|› d�¦  «         t          j                             | d         d         | d         d         ¦  «        }t          t          j         	                    |¦  «        p| d         d         dk    d|› d�¦  «         t          t	          j
        |t          j        ¦  «        p| d         d         dk    d|› d|› �¦  «         | d         d         dk    r{dD ]x\  }}| d                              |¦  «        pi                      |¦  «        pi }t          |                     d¦  «        dk    p|                     d¦  «         d|› d�¦  «         Œyt          | d         d         dk    d¦  «         t          | d         d         dv d¦  «         t          | d         d         dv d¦  «         d }d!D ]S}|d"k    rd#nd$}t          | d         d%|› �         | d         d&|› �         k    |                     ||¬'¦  «        ¦  «         ŒTt          | d         d(         | d         d)         k    d*¦  «         t          | d                              d+¦  «        d,u p| d                              d+d¦  «        dk    d-¦  «         | d.         Š&‰&d/         }	|	r‡t          ‰&d0         ‰&d1         k    d2¦  «         t          ‰&                     d3d¦  «        dk    d4¦  «         d5}
t          ‰&d6         ¦  «        }t          ||
z  t          d7¦  «        k    d8|
› d9�¦  «         | d:         }t          j                             d;¦  «        }t          | p| d<|› d=�¦  «         g d>¢}| d?         }t          ||v d@|› dA|› d�¦  «         dlˆ&fdE„} |dF¦  «        r |dG¦  «        p
 |dH¦  «        }t          |	 p|dI¦  «         dJ}‰&                     |¦  «        }t          |d,u p|t"          j                             ¦   «         v |› dK|› dLdM                     t"          ¦  «        › d�¦  «         t          ‰&                     dN¦  «        dOv ‰&                     dN¦  «        › dP�¦  «         g dQ¢g dR¢dSdTgdTdgdUœ}|                     ¦   «         D ]‘\  }}|dVk    }|r| d                              dW¦  «        pi n| d         }|                     |¦  «        pi }|dVk    rdXnd}|                     |¦  «        }|rdYndZ› |› d[|› �}t          ||v d\|› d]|› d^|› d�¦  «         Œ’| d                              dV¦  «        pi }t          |                     d_¦  «        d`v d\|                     d_¦  «        › da�¦  «         | d                              db¦  «        pi }dTdg}dcD ]H} |                     | ¦  «        pi                      d¦  «        }t          ||v d\|› dd| › de|› d�¦  «         ŒIg df¢dgdhgdiœ}!| d                              dW¦  «        pi                      dj¦  «        }"|"rK|!                     ¦   «         D ]8\  }#}$|"                     |#¦  «        }%t          |%|$v d\|%› dk|#› d^|$› d�¦  «         Œ7d,S d,S )mzCheck if the config is valid.ræ   Úurlrh   r£   Údirr   zYour engine directory `z` is not a directory.rk   z!Your engine's working directory `ÚprotocolÚhomemadezThe engine z file does not exist.z4 doesn't have execute (x) permission. Try: chmod +x Úxboard))rz   r   )r–   r—   )r–   r˜   r‡   Úsuggestr€   zEXBoard engines can't be used with `move_quality` set to `suggest` in ú.r¤   r   zSWith challenge.concurrency set to 0, the bot won't accept or create any challenges.r¥   )rˆ   Úfirstz2challenge.sort_by can be either `first` or `best`.r¦   )r¢   ÚhumanÚbotz9challenge.preference should be `none`, `human`, or `bot`.zjchallenge.max_{setting} < challenge.min_{setting} will result in no {game_type} challenges being accepted.)Ú	incrementÚbaser
   r
   r·   z	real-timeÚmin_Úmax_)ÚsettingÚ	game_typer³   r´   zXchallenge.max_rating < challenge.min_rating will result in no challenges being accepted.rµ   NzLchallenge.rating_difference < 0 will result in no challenges being accepted.r¼   rÂ   rÆ   rÇ   zmmatchmaking.opponent_max_rating < matchmaking.opponent_min_rating will result in no challenges being created.Úopponent_rating_differencezVmatchmaking.opponent_rating_difference < 0 will result in no challenges being created.éd   r½   r    zA bot is only allowed to play zƒ games per day against other bots. Please check your config file to make sure your bot won't use up all its allotted games quickly.rd   ÚLICHESS_BOT_DOCKERzGames will be saved to 'z²', please ensure this folder is in a mounted volume; Using the Docker's container internal file system will prevent you accessing the saved files and can lead to disk saturation.)rf   ÚopponentÚallre   z#The `pgn_file_grouping` choice of `z#` is not valid. Please choose from r   r   r.   c                ól   •— ‰                      | ¦  «        }t          |t          ¦  «        o	|d         d uS )Nr   )r   r   r'   )r   Úentriesr¼   s     €r   Úhas_valid_listz'validate_config.<locals>.has_valid_listm  s2   ø€ Ø—/’/ $Ñ'Ô'ˆÝ˜'¥4Ñ(Ô(ÐC¨W°Q¬Z¸tÐ-CÐCr   rÃ   rÄ   rÅ   z¦The time control to challenge other bots is not set. Either lists of challenge_initial_time and challenge_increment is required, or a list of challenge_days, or both.rÁ   z is not a valid value for z8 (formerly delay_after_decline) parameter. Choices are: z, rÈ   )r¢   ÚhighÚlowzc is not a valid `matchmaking:rating_preference` option. Valid options are 'none', 'high', or 'low'.)rž   Úuniform_randomÚ	best_move)r  rŠ   rˆ   rŠ   rˆ   )r›   r‰   rŒ   r   r›   rz   r�   zonline_moves:rE   ú:rK   z` is not a valid `engine:z` value. Please choose from r¡   )r¢   r×   Úsumzg` is not a valid choice for `engine:polyglot:normalization`. Please choose from ['none', 'max', 'sum'].r–   )r—   r˜   z4` is not a valid choice for `engine:lichess_bot_tbs:z#:move_quality`. Please choose from )r‚   r‘   Úplayerr”   Úgames_played)r�   r“   r�   z?` is not a valid `engine:online_moves:lichess_opening_explorer:)r   r   r   r.   )rP   r   r   r?   rÓ   ÚpathÚisdirr   ÚjoinÚisfileÚaccessÚX_OKrD   Úformatr	   r
   Úenvironr   Ú__members__rÚ   r#   )'r]   rk   rh   rX   rI   Úonline_sectionÚmin_max_templaterþ   rÿ   Úmatchmaking_enabledÚmax_games_per_dayÚgame_timeoutrd   Ú	in_dockerÚvalid_pgn_grouping_optionsÚconfig_pgn_choicer  Úmatchmaking_has_valuesÚfilter_optionÚfilter_typeÚselection_choicesÚdb_nameÚvalid_selectionsÚ	is_onlineÚ
db_sectionÚ	db_configÚ
select_keyr�   ÚselectÚpolyglot_sectionÚlichess_tbs_configÚquality_selectionsÚtbÚexplorer_choicesÚexplorer_configrÝ   Úchoice_listÚexplorer_choicer¼   s'                                         @r   Úvalidate_configr4    sr
  ø€ å˜ ­#Ñ.Ô.Ð.Ý˜ ­Ñ,Ô,Ð,Ý˜ ­4Ñ0Ô0Ð0Ý˜ ­dÑ3Ô3Ð3Ý˜ ­¨XÑ6Ô6Ð6Ý˜ ­¨hÑ7Ô7Ð7å•"”'—-’-  xÔ 0°Ô 7Ñ8Ô8ØZ¨F°8Ô,<¸UÔ,CÐZÐZÐZñ\ô \ð \ð ˜Ô"×&Ò& }Ñ5Ô5€KÝ�k�/Ð?¥R¤W§]¢]°;Ñ%?Ô%?ØX°kÐXÐXÐXñZô Zð Zõ ŒW�\Š\˜& Ô*¨5Ô1°6¸(Ô3CÀFÔ3KÑLÔL€FÝ•"”'—.’. Ñ(Ô(ÐV¨F°8Ô,<¸ZÔ,HÈJÒ,VØ= Ð=Ð=Ð=ñ?ô ?ð ?å•"”)˜F¥B¤GÑ,Ô,ÐZ°°xÔ0@ÀÔ0LÐPZÒ0ZØd ÐdÐdÐ\bÐdÐdñfô fð fð ˆhÔ˜
Ô# xÒ/Ð/ð$Dð 	qð 	qÑˆG�Zð % XÔ.×2Ò2°7Ñ;Ô;ÐA¸r×FÒFÀzÑRÔRÐXÐVXˆNÝ˜.×,Ò,¨^Ñ<Ô<À	ÒIÐnÐQ_×QcÒQcÐdmÑQnÔQnÐMnØoÐblÐoÐoÐoñqô qð qð qõ ��{Ô# MÔ2°QÒ6ð 9Jñ Kô Kð Kõ �&˜Ô% iÔ0Ð4EÐEÐG{Ñ|Ô|Ð|Ý�&˜Ô% lÔ3Ð7OÐOØMñOô Oð OðGÐà0ð Sð SˆØ(/°6Ò(9Ð(9Ð$Ð$¸{ˆ	Ý�F˜;Ô'Ð(8¨wÐ(8Ð(8Ô9¸VÀKÔ=PÐQaÐX_ÐQaÐQaÔ=bÒbØ$×+Ò+°GÀyÐ+ÑQÔQñ	Sô 	Sð 	Sð 	Sõ ��{Ô# LÔ1°V¸KÔ5HÈÔ5VÒVØjñlô lð lå��{Ô#×'Ò'Ð(;Ñ<Ô<ÀÐDð HØ˜+Ô&×*Ò*Ð+>ÀÑBÔBÀaÒGØ^ñ`ô `ð `ð ˜Ô'€KØ%Ð&9Ô:Ðàð 
fÝ�KÐ 5Ô6¸+ÐF[Ô:\Ò\ð3ñ	4ô 	4ð 	4õ 	�K—O’OÐ$@À!ÑDÔDÈÒIØlñ	nô 	nð 	nàÐÝ˜{Ð+>Ô?Ñ@Ô@ˆÝ�LÐ!2Ñ2µd¸1±g´gÒ=ðeÐ5Fð eð eð eñ	fô 	fð 	fð ˜?Ô+€MÝ”
—’Ð3Ñ4Ô4€IÝ�MÐ!Ð2¨ ]ð¨=ð ð ð ñô ð ð "=Ð!<Ð!<ÐØÐ2Ô3ÐÝÐ#Ð'AÐAðFÐ8Ið Fð FØ(BðFð Fð FñGô Gð GðDð Dð Dð Dð Dð Dð -˜nÐ-EÑFÔFð HØ"0 .Ð1FÑ"GÔ"GðBà!/ Ð0@Ñ!AÔ!Að õ Ð)Ð)ÐCÐ-Cð[ñ\ô \ð \ð '€MØ—/’/ -Ñ0Ô0€KÝ�+ Ð%ÐW¨½
Ô8N×8UÒ8UÑ8WÔ8WÐ)WØ ð ;ð ;¸Mð ;ð ;Ø"&§)¢)­JÑ"7Ô"7ð;ð ;ð ;ñ<ô <ð <õ �+—/’/Ð"5Ñ6Ô6Ð:QÐQØ —_’_Ð%8Ñ9Ô9ð Að Að AñBô Bð Bð &XÐ%WÐ%WØ)@Ð)@Ð)@Ø4:¸FÐ3CØ)/°Ð(;ð=ð =Ðð &7×%<Ò%<Ñ%>Ô%>ð 	Að 	AÑ!ˆÐ!Ø˜zÒ)ˆ	ØENÐd�f˜XÔ&×*Ò*¨>Ñ:Ô:Ð@¸bøÐTZÐ[cÔTdˆ
Ø—N’N 7Ñ+Ô+Ð1¨rˆ	Ø$+¨zÒ$9Ð$9�[�[¸~ˆ
Ø—M’M *Ñ-Ô-ˆ	Ø'0Ð8�O�O°bÐP¸'ÐPÐPÀJÐPÐPˆÝ�iÐ#3Ð3ð@˜)ð @ð @¸fð @ð @Ø,<ð@ð @ð @ñ	Aô 	Að 	Að 	Að ˜hÔ'×+Ò+¨JÑ7Ô7Ð=¸2ÐÝÐ"×&Ò& Ñ7Ô7Ð;QÐQðaÐ&×*Ò*¨?Ñ;Ô;ð að að añbô bð bð   Ô)×-Ò-Ð.?Ñ@Ô@ÐFÀBÐØ  )Ð,ÐØ#ð Cð CˆØ'×+Ò+¨BÑ/Ô/Ð5°2×:Ò:¸>ÑJÔJˆ	Ý�iÐ#5Ð5ðB˜)ð Bð BÐY[ð Bð BØ,>ðBð Bð Bñ	Cô 	Cð 	Cð 	Cð #CÐ"BÐ"BØ!*¨NÐ ;ð=ð =Ðà˜hÔ'×+Ò+¨NÑ;Ô;ÐA¸r×FÒFÐGaÑbÔb€OØð HØ&6×&<Ò&<Ñ&>Ô&>ð 	Hð 	HÑ"ˆI�{Ø-×1Ò1°)Ñ<Ô<ˆOÝ˜/¨[Ð8ðG˜oð Gð GØLUðGð Gà8CðGð Gð GñHô Hð Hð HðHð Hð	Hð 	Hr   Úconfig_filec                óÊ  — t          | ¦  «        5 }	 t          j        |¦  «        }n)# t          $ r t                               d¦  «         ‚ w xY w	 ddd¦  «         n# 1 swxY w Y   t          |¦  «         dt          j        v rt          j        d         |d<   t          |¦  «         t          |¦  «         t          |¦  «         t          |¦  «         t          |¦  «        S )z£
    Read the config.

    :param config_file: The filename of the config (usually `config.yml`).
    :return: A `Configuration` object containing the config.
    z9There appears to be a syntax problem with your config.ymlNÚLICHESS_BOT_TOKENræ   )Úopenrê   Ú	safe_loadr>   rB   Ú	exceptionrî   rÓ   r  rß   râ   r4  r   )r5  Ústreamr]   s      r   Úload_configr<  ©  s&  € õ 
ˆkÑ	Ô	ð ˜fð	Ý”^ FÑ+Ô+ˆFˆFøÝð 	ð 	ð 	Ý×ÒÐXÑYÔYÐYØð	øøøð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð õ ˆvÑÔÐà�bœjÐ(Ð(Ýœ*Ð%8Ô9ˆˆw‰å˜&Ñ!Ô!Ð!Ý�vÑÔÐÝˆvÑÔÐÝ�FÑÔÐå˜Ñ Ô Ð s%   �A’'¦A§&AÁAÁA!Á$A!)r;   r.   r<   r   r   r   )r;   r.   r@   r   r   r   )rE   )
r   r   rF   r   rG   rH   rI   r   r   r   )r   r   rR   r   rS   r   rT   r   rQ   r.   r   r   )r   r   rR   r   rS   r   r   r   )r]   r   r   r   )N)r]   r   rã   rä   r   r   )r5  r   r   r   ) r9   Ú
__future__r   rê   rÓ   ÚloggingrÕ   Útypingr   Úcollections.abcr   r   Úlib.lichess_typesr   r   Ú	lib.timerr	   r
   Ú	getLoggerr6   rB   r   r?   rD   rP   rY   r\   rß   râ   rî   r4  r<  r:   r   r   ú<module>rD     sÜ  ðØ 7Ð 7Ø "Ð "Ð "Ð "Ð "Ð "Ø €€€Ø 	€	€	€	Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #à	ˆÔ	˜8Ñ	$Ô	$€ð1ð 1ð 1ð 1ð 1ñ 1ô 1ð 1ðh'ð 'ð 'ð 'ð(ð (ð (ð (ð`ð `ð `ð `ð `ð( 38ðð ð ð ð ð ð2*ð *ð *ð *ð"xoð xoð xoð xoðvVð Vð Vð Vð
(ð 
(ð 
(ð 
(ð 
(ðHHð HHð HHð HHðV!ð !ð !ð !ð !ð !r   