JFIF$        dd7 

Viewing File: /usr/lib/python3.9/site-packages/certbot/_internal/tests/__pycache__/cli_test.cpython-39.pyc

a

}|�g`f�@s�dZddlZddlZddlmZddlZddlZddlZddl	m
Z
mZddlZddlm
Z
ddlZddlmZddlmZddlmZmZdd	lmZdd
lmZddlmZddlmZdd
lmZddlmZddl m!m"Z#ddl m$Z$ej%�&�Z'Gdd�de$�Z(Gdd�dej)�Z*e+e
d�dd�Z,e+e
ed�dd�Z-Gdd�dej)�Z.e/dk�r|e�0e�1ej2dd�e3g��dS)z Tests for certbot._internal.cli.�N)�reload)�Any�List)�mock)�
challenges)�errors)�ArgumentSource�NamespaceConfig)�cli)�	constants)�flag_default)�disco)�
filesystem)�os)�TempDirTestCasec@seZdZdZdd�ZdS)�TestReadFilezTest cli.read_filec	Cs�t��}z�t�|j�t�tj�|jd��}tj�|�}t	�
tj��t
�|�Wd�n1sd0Yd}t|d��}|�|�Wd�n1s�0Yt
�|�\}}|tj�|�ks�J�||ks�J�Wt�|�nt�|�0dS)N�foosbar
�wb)r�getcwd�chdirZtempdirr�realpath�path�join�relpath�pytest�raises�argparse�ArgumentTypeErrorr
Z	read_file�open�write�abspath)�selfZcurr_dirZ	real_path�
relative_pathZ
test_contents�fr�contents�r%�D/usr/lib/python3.9/site-packages/certbot/_internal/tests/cli_test.py�test_read_files((zTestReadFile.test_read_fileN)�__name__�
__module__�__qualname__�__doc__r'r%r%r%r&rsrc@seZdZdZdd�ZdS)�FlagDefaultTestzTests cli.flag_defaultcCs|tjdkrBt�d�dksJ�t�d�dks.J�t�d�dksxJ�n6t�d�dksTJ�t�d�d	ksfJ�t�d�d
ksxJ�dS)N�nt�
config_dirz/etc/letsencrypt�work_dirz/var/lib/letsencrypt�logs_dirz/var/log/letsencryptz
C:\CertbotzC:\Certbot\libzC:\Certbot\log)r�namer
r�r!r%r%r&�test_default_directories@s
z(FlagDefaultTest.test_default_directoriesN)r(r)r*r+r3r%r%r%r&r,=sr,)�attr�valuecCs$t||�|ksJ�|�|�s J�dS�N)�getattr�set_by_user)�	namespacer4r5r%r%r&�assert_set_by_user_with_valueKsr:)r4r5�sourcecCs(t||�|ksJ�|j||ks$J�dSr6)r7Zargument_sources)r9r4r5r;r%r%r&�assert_value_and_sourcePsr<c@s�eZdZdZeeeed�dd��Zeeeed�dd��Z	eed�dd	�Z
e�d
�dd��Z
d
d�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Ze�d/�d0d1��Ze�d2�d3d4��Z d5d6�Z!d7d8�Z"d9d:�Z#d;d<�Z$d=d>�Z%d?d@�Z&dAdB�Z'dCdD�Z(dEdF�Z)dGdH�Z*dIdJ�Z+dKdL�Z,dMdN�Z-dOdP�Z.dQdR�Z/dSdT�Z0dUdV�Z1dWdX�Z2dYdZ�Z3d[d\�Z4d]d^�Z5e�d/�d_d`��Z6dadb�Z7dcdd�Z8deS)f�	ParseTestzTest the cli args entrypoint)�args�returncCst�t|�S)z)Get result of cli.prepare_and_parse_args.)r
�prepare_and_parse_args�PLUGINS�r>r%r%r&�_unmocked_parseXszParseTest._unmocked_parsecCs6t���t�|�Wd�S1s(0YdS)zJMocks certbot._internal.display.obj.get_display and calls _unmocked_parse.N)�	test_util�patch_display_utilr=rCrBr%r%r&�parse]s
zParseTest.parserBcs�t����fdd�}tjd�d���t���x}||�j_t�d��Dt�	t
��|�|�Wd�n1sn0YWd�n1s�0YWd�n1s�0YWd�n1s�0Y���S)z8Run a command, and return the output string for scrutinycs��|�dSr6)r)�messager>�kwargs��outputr%r&�	write_msghsz)ParseTest._help_output.<locals>.write_msgz!certbot._internal.main.sys.stdout)�newz!certbot._internal.main.sys.stderrN)
�io�StringIOr�patchrDrEZnotification�side_effectrr�
SystemExitrC�getvalue)r!r>rKZmock_get_utilityr%rIr&�_help_outputcs

�zParseTest._help_outputz*certbot._internal.cli.helpful.flag_defaultc	s�t���������fdd�}||_|�dg�}t|dgtj�t�j	d��}|�
d�Wd�n1sl0Y|�dg�}t|ddgtj�|�dg�}t|dgtj�Wd�n1s�0YdS)	Ncs |dkrt�tj|�S�jgS)NZconfig_files)�copy�deepcopyrZCLI_DEFAULTSr1)�v��
tmp_configr%r&�<lambda>zs�z0ParseTest.test_cli_ini_domains.<locals>.<lambda>�certonly�domains�wzdomains = example.com�example.com�renew)
�tempfile�NamedTemporaryFile�closerPrFr<r�DEFAULTrr1r�CONFIG_FILE�RUNTIME)r!Zmock_flag_defaultZshimr9�file_hr%rWr&�test_cli_ini_domainsts

�(zParseTest.test_cli_ini_domainscCs>|�g�}dD]*}t||�t�|�ks*J�|�|�rJ�qdS)N)r.r0r/)rFr7r
rr8)r!r9�dr%r%r&�test_no_args�s
zParseTest.test_no_argscCs�d}d}d}d}t�d��,|�dd|ddd	dd
dg	�}Wd�n1sL0Y|jtj�|�kslJ�|jtj�|�ks�J�|jtj�|�ks�J�|j	tj�|�ks�J�dS)N�cert�key�chain�	fullchainzcertbot._internal.main.install�install�--cert-path�
--key-pathz--chain-pathz--fullchain-path)
rrOrFZ	cert_pathrrr Zkey_pathZ
chain_pathZfullchain_path)r!rirjrkrlr9r%r%r&�test_install_abspath�s
�$zParseTest.test_install_abspathcCsZ|�dg�|�ddg�}d|vs&J�d|vs2J�d|vs>J�d|vsJJ�d|vsVJ�d|vsbJ�d	|vsnJ�|�d
dg�}dtvr�d|vs�J�d|vs�J�d
|vs�J�|�d
g�}dtvr�d|vs�J�nd|vs�J�|�ddg�}d|vs�J�d|vs�J�d|v�s
J�|�d
dg�}d|v�s&J�|�d
dg�}d|v�sBJ�|�d
dg�}d|v�s^J�|�ddg�}d|v�szJ�d|v�s�J�|�ddg�}d|v�s�J�d|v�s�J�d|v�s�J�d|v�s�J�d|v�s�J�|�d
dg�}d|v�s�J�d|v�sJ�|�d
g�}tj|v�s"J�tjdd�|v�s:J�d|v�sHJ�d|v�sVJ�dS)N�--help�all�--configurator�how a certificate is deployed�--webroot-path�--text�%s�{0}�--renew-hook�-hZnginxz--nginx-ctlz
--checkpointszUse the Nginx pluginz (the certbot nginx plugin is not�pluginsz	--preparez"plugins" subcommandr^z--keepZ
automation�revokermrnro�--reason�--delete-after-revoke�--no-delete-after-revoke�register�d)rSrAr
ZSHORT_USAGEZCOMMAND_OVERVIEW�r!�outr%r%r&�	test_help�sZzParseTest.test_helpcCs�|�dg�|�ddg�}d|vs&J�d|vs2J�d|vs>J�d|vsJJ�d|vsVJ�d|vsbJ�|�dd	g�}d
|vs|J�d|vs�J�|�ddg�}d
|vs�J�d|vs�J�dS)
N�helprrrsrtrurvrwrxrmrnror|�rSr�r%r%r&�test_help_no_dashes�szParseTest.test_help_no_dashescCs�ddg}|�|�}t|ddg�ddg}|�|�}t|ddg�ddg}|�|�}t|dgd��ddg}|�|�}t|ddg�ddg}|�|�}t|ddg�dd	g}|�|�}t|ddd
g�dS)Nz-dr]r[ztrailing.period.com.ztrailing.period.comz-example.com,another.net,third.org,example.com)r]�another.netz	third.orgz	--domainsz#example.com,another.net,example.comr��rFr:)r!�
short_argsr9Z	long_argsr%r%r&�test_parse_domains�s(


�


zParseTest.test_parse_domainsc	Cs�ddg}|�|�}tjjtjjg}t|d|�ddg}t�d��Dt�	t
��|�|�Wd�n1sl0YWd�n1s�0YdS)Nz--preferred-challengesz	http, dns�pref_challszjumping-over-the-moonz
sys.stderr)rFr�HTTP01�typZDNS01r:rrOrrrQ)r!r�r9Zexpectedr%r%r&�test_preferred_challengess
z#ParseTest.test_preferred_challengescCs|�d���}t|dd�dS)N�--server example.com�serverr])rF�splitr:�r!r9r%r%r&�test_server_flagszParseTest.test_server_flagcCs,|�dg�}t|dd�t|ddtj�dS)N�
--must-staple�must_stapleT�staple)rFr:r<rrdr�r%r%r&�test_must_staple_flagszParseTest.test_must_staple_flagcCs*|�ddg�}t|dd�t|dd�dS)Nr�z
--staple-ocspr�Tr�r�r�r%r%r&�&test_must_staple_and_staple_ocsp_flagssz0ParseTest.test_must_staple_and_staple_ocsp_flagsc
Cszz$|�|�|�d�d�|���WnPtjyt}z6dt|�vsFJ�|D]}|t|�vsJJ�qJWYd}~n
d}~00dS)Nz6The following flags didn't conflict with --server: {0}z, �--server)rFZfail�formatrr�Error�str)r!Zparser_argsZconflicting_args�error�argr%r%r&�_check_server_conflict_message"s
��z(ParseTest._check_server_conflict_messagecCsFdg}|�|�}t|dd�t|dtj�|d��7}|�|d�dS)N�	--staging�stagingTr�r�)rFr:r�STAGING_URIr�r�)r!r�r9r%r%r&�test_staging_flag-s
zParseTest.test_staging_flagcCs�t|dd�t|ddtj�t|ddtj�t|dtjtj�|rdt|ddtj�t|ddtj�n t|ddtj�t|ddtj�dS)	N�dry_runTZbreak_my_certsr�r�ZtosZregister_unsafely_without_emailF)r:r<rrdrr�rb)r!r9Zexisting_accountr%r%r&�_assert_dry_run_flag_worked6sz%ParseTest._assert_dry_run_flag_workedcCs�t��}d�|���}t�tj��|�|�Wd�n1sB0Y|�	|�|dg�d�|�	|�|dg�d�|�	|�|dg�d�t
j�|t
j�}t�|�t�t
j�|d��|�	|�|dg�d�|�	|�|dg�d�|�	|�|dg�d�|dg7}|�|dd	g�}t|d
d	�|�|dt
jg�}t|d
t
j�|�|dt�d
�g�}t|d
t
jtj�dg}|�|gd�|�dS)
Nz--dry-run --config-dir {0}ZauthFrZr^Zfake_account_dirTr�r]r�r�)r�r]r�)r_Zmkdtempr�r�rrrr�rFr�rrrrZACCOUNTS_DIRr�mkdirr:r�r
rr<rrdr�)r!r.r�Zaccount_dir�config�	conflictsr%r%r&�test_dry_run_flagCs<(���

�zParseTest.test_dry_run_flagcCsTd}t�|�}|�d�|����}|�|�s0J�d}|�|�rBJ�|�d�rPJ�dS)NZrsa_key_sizez--rsa-key-size {0}r.�
authenticator�r
rrFr�r�r8)r!Zkey_size_optionZkey_size_valuer�Zconfig_dir_optionr%r%r&�test_user_set_rsa_key_sizeks
�z$ParseTest.test_user_set_rsa_key_sizecCsP|�d�}|�d�sJ�|�d�s&J�|�d�}|�d�s>J�|�d�rLJ�dS)Nz--apacheZ	installerr�z--installer webroot)rFr8)r!r�r%r%r&�)test_user_set_installer_and_authenticatorws

z3ParseTest.test_user_set_installer_and_authenticatorcCs4d}t�|�}|�d�|����}|�|�s0J�dS)NZelliptic_curvez--elliptic-curve {0}r�)r!Zelliptic_curve_optionZelliptic_curve_option_valuer�r%r%r&�test_user_set_ecdsa_key_option�s
z(ParseTest.test_user_set_ecdsa_key_optioncCshd}t�|�}|�d�|����}|�|�s0J�t�t��|�d�Wd�n1sZ0YdS)NZkey_typez--key-type {0}z--key-type foo)	r
rrFr�r�r8rrrQ)r!Zkey_type_optionZkey_type_valuer�r%r%r&�test_user_set_invalid_key_type�s
z(ParseTest.test_user_set_invalid_key_typez&certbot._internal.hooks.validate_hookscCs0d��}tj��}t�||�}|�d�s,J�dS)Nzrenew --deploy-hook foo�
renew_hook)r�r
�PluginsRegistry�find_allr
r@r8)r!Zunused_mock_validate_hooksr>r{r�r%r%r&�test_user_set_deploy_hook�s
z#ParseTest.test_user_set_deploy_hookz3certbot._internal.plugins.webroot._validate_webrootcCs6d��}d|_tj��}t�||�}|�d�s2J�dS)Nz%renew -w /var/www/html -d example.comz
/var/www/htmlZwebroot_map)r�Zreturn_valuer
r�r�r
r@r8)r!Zmock_validate_webrootr>r{r�r%r%r&�test_user_set_webroot_map�s

z#ParseTest.test_user_set_webroot_mapcCshtj��D]$\}}|�d|g�}|j|ks
J�q
tj��D](\}}|�d|��g�}|j|ks:J�q:dS)Nr})rZREVOCATION_REASONS�itemsrF�reason�upper)r!r��coder9r%r%r&�test_encode_revocation_reason�sz'ParseTest.test_encode_revocation_reasoncCsxt�tj��|�d���Wd�n1s00Yt�tj��|�d���Wd�n1sj0YdS)Nzrenew --force-interactivez-n --force-interactive�rrrr�rFr�r2r%r%r&�test_force_interactive�s,z ParseTest.test_force_interactivec	Csft�d��Ht�t��|�d���Wd�n1s:0YWd�n1sX0YdS)N� certbot._internal.cli.sys.stderrz"--renew-hook foo --deploy-hook bar�rrOrrrQrFr�r2r%r%r&�test_deploy_hook_conflict�sz#ParseTest.test_deploy_hook_conflictcCs4d}|�d|d|dg�}t|d|�t|d|�dS)Nrry�
--deploy-hook�--disable-hook-validation�deploy_hookr�r��r!r5r9r%r%r&�#test_deploy_hook_matches_renew_hook�s�z-ParseTest.test_deploy_hook_matches_renew_hookcCs0d}|�d|dg�}t|d|�t|d|�dS)Nrr�r�r�r�r�r�r%r%r&� test_deploy_hook_sets_renew_hook�s�z*ParseTest.test_deploy_hook_sets_renew_hookc	Csft�d��Ht�t��|�d���Wd�n1s:0YWd�n1sX0YdS)Nr�z"--deploy-hook foo --renew-hook barr�r2r%r%r&�test_renew_hook_conflict�sz"ParseTest.test_renew_hook_conflictcCs4d}|�d|d|dg�}t|d|�t|d|�dS)Nrr�ryr�r�r�r�r�r%r%r&�#test_renew_hook_matches_deploy_hook�s�z-ParseTest.test_renew_hook_matches_deploy_hookcCs2d}|�d|dg�}|jdus"J�t|d|�dS)Nrryr�r�)rFr�r:r�r%r%r&�'test_renew_hook_does_not_set_renew_hook�s�z1ParseTest.test_renew_hook_does_not_set_renew_hookc	Cs�t�d���t�t��|�d���Wd�n1s:0Yt�t��|�d���Wd�n1sr0YWd�n1s�0YdS)Nr�z--max-log-backups fooz--max-log-backups -42r�r2r%r%r&�test_max_log_backups_error�s
,z$ParseTest.test_max_log_backups_errorcCs&d}|�d|g�}t|dt|��dS)NZ42z--max-log-backupsZmax_log_backups)rFr:�intr�r%r%r&�test_max_log_backups_success�sz&ParseTest.test_max_log_backups_successcCsl|�g�}t|dgtj�t|dgtj�tjjg|_dg|_|�g�}t|dgtj�t|dgtj�dS)Nr[r�r])	rFr<rrbrr�r�r�r[r�r%r%r&�test_unchanging_defaults�s

z"ParseTest.test_unchanging_defaultscCs|�dg�}t|dd�dS)Nz--no-directory-hooks�directory_hooksFr�r�r%r%r&�test_no_directory_hooks_set�sz%ParseTest.test_no_directory_hooks_setcCs|�g�}t|ddtj�dS)Nr�T)rFr<rrbr�r%r%r&�test_no_directory_hooks_unset�s
z'ParseTest.test_no_directory_hooks_unsetcCs|�dg�}t|dd�dS)Nr~�delete_after_revokeTr�r�r%r%r&�test_delete_after_revoke�sz"ParseTest.test_delete_after_revokecCs*|�g�}|jdusJ�|�d�r&J�dS)Nr�)rFr�r8r�r%r%r&� test_delete_after_revoke_default�s
z*ParseTest.test_delete_after_revoke_defaultcCs|�dg�}t|dd�dS)Nrr�Fr�r�r%r%r&�test_no_delete_after_revoke�sz%ParseTest.test_no_delete_after_revokecCs>t�tj��|�d���Wd�n1s00YdS)Nz(--allow-subset-of-names -d *.example.orgr�r2r%r%r&�test_allow_subset_with_wildcardsz)ParseTest.test_allow_subset_with_wildcardcCs.dD]$}dD]}d|�||g�vsJ�qqdS)N)rzrq)rrr{zdns-route53zcertbot-route53:authr�)r!Z	help_flagZtopicr%r%r&�test_route53_no_revertsz ParseTest.test_route53_no_revertcCs>t�tj��|�ddg�Wd�n1s00YdS)Nz--hstsz--auto-hsts)rrrr�rFr2r%r%r&�$test_parse_args_hosts_and_auto_hosts
sz.ParseTest.test_parse_args_hosts_and_auto_hostsc	Cs�td�}d}d}|�dg�}t|d|tj�t����}|��t|j	d�� }|�
d|���Wd�n1sp0Y|�dd|j	g�}t|d|tj�|�dd|j	d|g�}t|d|tj�Wd�n1s�0YdS)	Nr�zconfigfile.bizzcommandline.edurZr\z	server = z-cr�)
rrFr<rrbr_r`rarr1rrcZCOMMAND_LINE)r!Z
DEFAULT_VALUEZCONFIG_FILE_VALUEZCOMMAND_LINE_VALUEr9rXrer%r%r&�)test_parse_with_multiple_argument_sourcess(
.��z3ParseTest.test_parse_with_multiple_argument_sourcesc	Cs�|�d�}t|ddg�t|dd�t���n}|��t|jd��}|�d�Wd�n1sb0Y|�dd	|jg�}t|ddg�Wd�n1s�0YdS)
Nz--preferred-chal dns --no-dirr�zdns-01r�Fr\zpreferred-chal = dnsrZz--config)rFr:r_r`rarr1r)r!r9rXrer%r%r&�test_abbreviated_arguments+s

(�z$ParseTest.test_abbreviated_argumentscCsB|�d�}t|ddg�tj��}t�|ddg�}t|dd�dS)Nz-d=example.comr[r]�runz--pre-hook="foo=bar"Zpre_hookz	"foo=bar")rFr:r
r�r�r
r@)r!Zunsused_mock_validate_hooksr9r{r%r%r&�test_argument_with_equals>s


z#ParseTest.test_argument_with_equalscCsv|�d�}t|dd�t|dd�|�d�}t|dd�t|dd�|�d�}t|dd�t|dd�t|d	d
�dS)Nz-tvZ	text_modeTZ
verbose_count�z-tvvv�z-tvm foo@example.comZemailzfoo@example.comr�r�r%r%r&�test_adjacent_short_argsHs


z"ParseTest.test_adjacent_short_argscCs |�ddg�}t|ddg�dS)NrZz
-d foo.comr[zfoo.comr�r�r%r%r&�test_arg_with_contained_spacesVsz(ParseTest.test_arg_with_contained_spacesN)9r(r)r*r+�staticmethodrr�r	rCrFrSrrOrfrhrpr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r%r%r%r&r=Usl
:	
(		


	r=�__main__r�)4r+rrT�	importlibrZ
reload_modulerM�sysr_�typingrrZunittestrrZacmerZcertbotrZcertbot.configurationrr	Zcertbot._internalr
rZcertbot._internal.cli.cli_utilsrZcertbot._internal.pluginsr
Zcertbot.compatrrZcertbot.tests.utilZtests�utilrDrr�r�rArZTestCaser,r�r:r<r=r(�exit�main�argv�__file__r%r%r%r&�<module>sB
 

Back to Directory  nL+D550H?Mx ,D"v]qv;6*Zqn)ZP0!1 A "#a$2Qr D8 a Ri[f\mIykIw0cuFcRı?lO7к_f˓[C$殷WF<_W ԣsKcëIzyQy/_LKℂ;C",pFA:/]=H  ~,ls/9ć:[=/#f;)x{ٛEQ )~ =𘙲r*2~ a _V=' kumFD}KYYC)({ *g&f`툪ry`=^cJ.I](*`wq1dđ#̩͑0;H]u搂@:~וKL Nsh}OIR*8:2 !lDJVo(3=M(zȰ+i*NAr6KnSl)!JJӁ* %݉?|D}d5:eP0R;{$X'xF@.ÊB {,WJuQɲRI;9QE琯62fT.DUJ;*cP A\ILNj!J۱+O\͔]ޒS߼Jȧc%ANolՎprULZԛerE2=XDXgVQeӓk yP7U*omQIs,K`)6\G3t?pgjrmۛجwluGtfh9uyP0D;Uڽ"OXlif$)&|ML0Zrm1[HXPlPR0'G=i2N+0e2]]9VTPO׮7h(F*癈'=QVZDF,d߬~TX G[`le69CR(!S2!P <0x<!1AQ "Raq02Br#SCTb ?Ζ"]mH5WR7k.ۛ!}Q~+yԏz|@T20S~Kek *zFf^2X*(@8r?CIuI|֓>^ExLgNUY+{.RѪ τV׸YTD I62'8Y27'\TP.6d&˦@Vqi|8-OΕ]ʔ U=TL8=;6c| !qfF3aů&~$l}'NWUs$Uk^SV:U# 6w++s&r+nڐ{@29 gL u"TÙM=6(^"7r}=6YݾlCuhquympǦ GjhsǜNlɻ}o7#S6aw4!OSrD57%|?x>L |/nD6?/8w#[)L7+6〼T ATg!%5MmZ/c-{1_Je"|^$'O&ޱմTrb$w)R$& N1EtdU3Uȉ1pM"N*(DNyd96.(jQ)X 5cQɎMyW?Q*!R>6=7)Xj5`J]e8%t!+'!1Q5 !1 AQaqё#2"0BRb?Gt^## .llQT $v,,m㵜5ubV =sY+@d{N! dnO<.-B;_wJt6;QJd.Qc%p{ 1,sNDdFHI0ГoXшe黅XۢF:)[FGXƹ/w_cMeD,ʡcc.WDtA$j@:) -# u c1<@ۗ9F)KJ-hpP]_x[qBlbpʖw q"LFGdƶ*s+ډ_Zc"?%t[IP 6J]#=ɺVvvCGsGh1 >)6|ey?Lӣm,4GWUi`]uJVoVDG< SB6ϏQ@ TiUlyOU0kfV~~}SZ@*WUUi##; s/[=!7}"WN]'(L! ~y5g9T̅JkbM' +s:S +B)v@Mj e Cf jE 0Y\QnzG1д~Wo{T9?`Rmyhsy3!HAD]mc1~2LSu7xT;j$`}4->L#vzŏILS ֭T{rjGKC;bpU=-`BsK.SFw4Mq]ZdHS0)tLg