+?ڔdZddlmZddlZddlZddlZddlmZddlm Z ddl m Z ddl Z ddl mZddlmZddlZdd lmZdd lmZdd lmZmZmZdd lmZmZdd lmZddlm Z m!Z!ddl"m#Z#m$Z$ddl%m&Z&m'Z'e e(j)Z*dZ+dZ,dZ-e j./de'e*e+z e j.0de j.j1dZ2dZ3dZ4dZ5dZ6dZ7de3fdZ8dZ9e j./d gd!d"Z:d#Z;d$Zd*d+,d-.fd/Z?e j./d0e j=e6d1dd2d3d4e j.0d5g6e j=e7dd7d8d9d:(fd;Z@d<ZAd=ZBGd>d?ZCGd@dAZDGdBdCZEGdDdEZFGdFdGZGGdHdIZHGdJdKZIGdLdMZJdQdPZKdS)RzMake sure that applying the configuration from pyproject.toml is equivalent to applying a similar configuration from setup.cfg To run these tests offline, please have a look on ``./downloads/preload.py`` ) annotationsN)cleandoc)Path)Mock)LiteTranslator)Metadata) is_static)write_requirements)expand pyprojecttomlsetupcfg)_MissingDynamic_some_attrgetter Distribution)InvalidConfigErrorRemovedConfigError)InformationOnlySetuptoolsDeprecationWarning) retrieve_fileurls_from_filezsetupcfg_examples.txtc (td|i|S)Nsrc_rootr)pathattrss /builddir/build/BUILD/cloudlinux-venv-1.0.10/venv/lib/python3.11/site-packages/setuptools/tests/config/test_apply_pyprojecttoml.pymakedistr#s T3U3 4 44cd|DS)z Allow comparing the given patterns for 2 dist objects. We need to strip special chars to avoid errors when validating. cVg|]&}tjdd|tjpd'S)z [^a-z0-9]+)flagsempty)resubI).0ps r z)_mock_expand_patterns..,s2 Q Q Q1BF<Qbd 3 3 3 >w Q Q Qr)patterns___s r_mock_expand_patternsr/'s R Q Q Q QQrurlignorecz|tdtd|tdttt |}t |d}|d}t |d }| |dtj t||}tj t||}t|} t|} | | ksJt!d ||fDr,t#|jt#|jksJt!d ||fDrbt'|jd |jD} d |jD} | | ksJt!d||fDrNd|jD} d|jD}| |ksJt!d||fDr*d|jD}d|jD}||ksJt#|jt#|jksJt!d||fDrNd|jD}d|jD}||ksJdSdS)N read_attrz0.0.1) return_value_expand_patterns) side_effectpyproject.tomlutf-8encodingz setup.cfgc38K|]}t|ddVdS) license_filesNgetattrr(ds r z>test_apply_pyproject_equivalent_to_setupcfg..Ds. L L71ot , , L L L L L Lrc38K|]}t|ddVdS) entry_pointsNr=r?s rrAz>test_apply_pyproject_equivalent_to_setupcfg..G. K K71nd + + K K K K K KrcNh|]"\}}|gtd|DR#S)c3BK|]}|ddVdS r"Nreplacer(is rrAzHtest_apply_pyproject_equivalent_to_setupcfg...J066q #r**666666rsortedr(kvs r z>test_apply_pyproject_equivalent_to_setupcfg..IsN   1 766A66666 7 7   rcNh|]"\}}|gtd|DR#S)c3BK|]}|ddVdSrGrIrKs rrAzHtest_apply_pyproject_equivalent_to_setupcfg...NrMrrNrPs rrSz>test_apply_pyproject_equivalent_to_setupcfg..MsN   1 766A66666 7 7   rc38K|]}t|ddVdS) package_dataNr=r?s rrAz>test_apply_pyproject_equivalent_to_setupcfg..SrDrc:h|]\}}|gt|RSr+rNrPs rrSz>test_apply_pyproject_equivalent_to_setupcfg..Ts*TTTTQ!fQiiTTTrc:h|]\}}|gt|RSr+rNrPs rrSz>test_apply_pyproject_equivalent_to_setupcfg..Us*RRRDAqVAYYRRRrc38K|]}t|ddVdS) data_filesNr=r?s rrAz>test_apply_pyproject_equivalent_to_setupcfg..Xs. I Ia71lD ) ) I I I I I Irc:h|]\}}|gt|RSr+rNrPs rrSz>test_apply_pyproject_equivalent_to_setupcfg..Ys*LLLtq!A?q ??LLLrc:h|]\}}|gt|RSr+rNrPs rrSz>test_apply_pyproject_equivalent_to_setupcfg..Zs*JJJda1/vayy//JJJrc38K|]}t|ddVdS)extras_requireNr=r?s rrAz>test_apply_pyproject_equivalent_to_setupcfg..^s/ M M!71& - - M M M M M Mrc:h|]\}}|gt|RSr+rNrPs rrSz>test_apply_pyproject_equivalent_to_setupcfg.._s*WWWda1/vayy//WWWrc:h|]\}}|gt|RSr+rNrPs rrSz>test_apply_pyproject_equivalent_to_setupcfg..`s*UUUTQ!fQiiUUUr)setattrr rrr/rr read_textr translate write_textr apply_configurationrr core_metadataanysetr<printrCitemsrWr[install_requiresr_)r0 monkeypatchtmp_pathsetupcfg_examplepyproject_example setupcfg_text toml_config dist_tomldist_cfg pkg_info_toml pkg_info_cfgep_tomlep_cfg pkg_data_toml pkg_data_cfgdata_files_tomldata_files_cfgextra_req_toml extra_req_cfgs r+test_apply_pyproject_equivalent_to_setupcfgr/s Tw-G-G-GHHH($;P*Q*Q*Q%S))X'788$...@@M "",,]KHHK  w ???1(82D2DFWXXI+HX,>,>@PQQH!),,M **L L ( ( ( ( L Ly(6K L L LLLK9*++s83I/J/JJJJJ K Ki5J K K KKK ! h#$$$  !.4466      -3355   &     K Ki5J K K KKK-TTY5K5Q5Q5S5STTT RRH4I4O4O4Q4QRRR  ,,,, I IIx3H I I III1LLy7KLLLJJh6IJJJ.0000 y) * *c(2K.L.L L L L L M M 87L M M MMM/WWi6N6T6T6V6VWWWUUX5L5R5R5T5TUUU ....///.ru[project] name = "spam" version = "2020.0.0" description = "Lovely Spam! Wonderful Spam!" readme = "README.rst" requires-python = ">=3.8" license-files = ["LICENSE.txt"] # Updated to be PEP 639 compliant keywords = ["egg", "bacon", "sausage", "tomatoes", "Lobster Thermidor"] authors = [ {email = "hi@pradyunsg.me"}, {name = "Tzu-Ping Chung"} ] maintainers = [ {name = "Brett Cannon", email = "brett@python.org"}, {name = "John X. Ãørçeč", email = "john@utf8.org"}, {name = "Γαμα קּ 東", email = "gama@utf8.org"}, ] classifiers = [ "Development Status :: 4 - Beta", "Programming Language :: Python" ] dependencies = [ "httpx", "gidgethub[httpx]>4.0.0", "django>2.1; os_name != 'nt'", "django>2.0; os_name == 'nt'" ] [project.optional-dependencies] test = [ "pytest < 5.0.0", "pytest-cov[all]" ] [project.urls] homepage = "http://example.com" documentation = "http://readthedocs.org" repository = "http://github.com" changelog = "http://github.com/me/spam/blob/master/CHANGELOG.md" [project.scripts] spam-cli = "spam:main_cli" [project.gui-scripts] spam-gui = "spam:main_gui" [project.entry-points."spam.magical"] tomatoes = "spam:main_tomatoes" u[project] name = "spam" version = "2020.0.0" authors = [ {email = "hi@pradyunsg.me"}, {name = "Tzu-Ping Chung"} ] maintainers = [ {name = "Степан Бандера", email = "криївка@оун-упа.укр"}, ] zE def main_cli(): pass def main_gui(): pass def main_tomatoes(): pass z[project] name = "spam" version = "2020.0.0" authors = [ {email = "hi@pradyunsg.me"}, {name = "Tzu-Ping Chung"} ] license = {text = "MIT"} a#[project] name = "spam" version = "2020.0.0" authors = [ {email = "hi@pradyunsg.me"}, {name = "Tzu-Ping Chung"} ] license = "mit or apache-2.0" # should be normalized in metadata classifiers = [ "Development Status :: 5 - Production/Stable", "Programming Language :: Python", ] z README.rstcX|dz }|}dd|di}|D]\}}|||}||d||z dd|dz d d|d z td|S) Nr7zreadme = "README.rst"z readme = ""r8r9z hello world LICENSE.txt--- LICENSE stub ---zspam.py)rkrJrePEP621_EXAMPLE_SCRIPT)rnreadmepyproject_text pyprojecttext replacementsorigsubsts r_pep621_example_projectrs ++I D+-C&-C-C-CDL#))++)) e||D%(( 000 ""=7"CCC ))*@7)SSS %%&;g%NNN rct|}tjt||}t |jjdhksJdS)z&Make sure the example in PEP 621 worksrN)rr rfrrimetadatar<rnrdists rtest_pep621_examplersO'11I  ,Xh-?-? K KD t}* + +  > > > > > >r)rctype))z Readme.txtz text/plain)z readme.mdz text/markdown)ztext.rstz text/x-rstct||}tjt||}|jj|ksJdSNrr rfrrlong_description_content_type)rnrrrrs rtest_readme_content_typersI(&99I  ,Xh-?-? K KD = 6% ? ? ? ? ? ?rct|d}tjtd5t jt ||ddddS#1swxYwYdS)Nz README.texz%Undefined content type for README.texmatch)rpytestraises ValueErrorr rfr)rnrs rtest_undefined_content_typers',??I z)P Q Q QII)(8*<* > > > >r)rexpected_maintainers_meta_valueugBrett Cannon , "John X. Ãørçeč" , Γαμα קּ 東 znon-international-emails)iduAСтепан Бандера <криївка@оун-упа.укр>zlCPython's `email.headerregistry.Address` only supports RFC 5322, as of Nov 10, 2022 and latest Python 3.11.0T)reasonstrictzinternational-email)marksrcbt|d|}tjt||}|jj|ksJ|dz }t |dd5}|j|dddn #1swxYwY|d}d||vsJdS)NrrPKG-FILEwr8r9zMaintainer-email: ) rr rfrrmaintainer_emailopenwrite_pkg_filerc)rrrnrrpkg_filefhcontents r test_utf8_maintainer_in_metadatars8(%I  ,Xh-?-? K KD = )-L L L L L*$H hg . . .)" $$R((()))))))))))))))  ' 22G A ? A AW L L L L L LsBB  B )rlicenselicense_expression content_strnot_content_strMITz License: MITzLicense-Expression: z license-textz6ignore:.project.license. as a TOML table is deprecated)rrzMIT OR Apache-2.0z%License-Expression: MIT OR Apache-2.0z License: zlicense-expressionct|d|}tjt||}|jj|ksJ|jj|ksJ|dz }t|dd5} |j| dddn #1swxYwY| d} d| vsJ|| vsJ|| vsJdS)Nrrrrr8r9zMetadata-Version: 2.4) rr rfrrrrrrrc) rrrrrrnrrrrrs rtest_license_in_metadatar#sAP(%I  ,Xh-?-? K KD = G + + + + = +/A A A A A*$H hg . . .)" $$R((()))))))))))))))  ' 22G "g - - - - ' ! ! ! ! ' ) ) ) ) ) )s0BBBcNtddd}t|d|d}d}tjt |5}t jt||dddn #1swxYwYdt|j vsJdS) N rrz/ "License :: OSI Approved :: MIT License" ]z?License classifiers have been superseded by license expressionsr&License :: OSI Approved :: MIT License) PEP639_LICENSE_EXPRESSIONrsplitrrrrr rfrstrvalue)rnrrmsgexcs r/test_license_classifier_with_license_expressionr\s $ + +D! 4 4Q 7D' DDDI LC ) 5 5 5I)(8*<*>>PP 1>>>PP0(1C1CYOO PPPPPPPPPPPPPPPPPPPPPPPPPPPPPP = ( ( * */W.X X X X X X Xs5B#A>2 B>B BB BBBcFeZdZ d dZd dZdZdZdZdZd Z d Z d S)TestLicenseFilesr"!license = {file = "LICENSE.txt"} ct}d|vsJd|vsJd|vsJtjd||d}||vsJ|d|d}t|d| }|S) Nzlicense = "mit or apache-2.0"z license-filesz[tool.setuptools]z(license = .*)\nr)countrrr)rr%r&r)selfrnadditional_text license_tomlrrs rbase_pyprojectzTestLicenseFiles.base_pyprojects )/$6666d****"$....v        t####--/---+HhtTTT rc2|||dS)Nz>license = "licenseref-Proprietary" license-files = ["_FILE*"] )rr)r)rrnrs rbase_pyproject_license_pep639z.TestLicenseFiles.base_pyproject_license_pep639s*"" +-#   rcHd}|||}|dz |dz |dz }|ddd}d }tjt | 5tjt | 5t jt||}dddn #1swxYwYdddn #1swxYwYt|j j ddhksJ|j j dksJdS) N,[tool.setuptools] license-files = ["_FILE*"] _FILE.txt _FILE.rstrzLicenseRef-Proprietary r8r9zQ'tool.setuptools.license-files' is deprecated in favor of 'project.license-files'rr) rtouchrerrrr rfrrirr<r)rrnsetuptools_configrrrrrs r+test_both_license_and_license_files_definedzQ L5T B B B M M L 5 5 5 M M  -hx.@.@) L L L  M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M M Ms6C9#B( C(B, ,C/B, 0CCCcdtvsJtdd}t||}d}tjt |5t jt||}dddn #1swxYwY|j j dksJt|j j dhksJdS) z?Make sure the old example with ``license = {text = ...}`` workszlicense-files = ["LICENSE.txt"]z license = {file = "LICENSE.txt"}rrrNrr) PEP621_EXAMPLErJrrrrr rfrrrrir<)rrnrrrrs r$test_deprecated_file_expands_to_textz5TestLicenseFiles.test_deprecated_file_expands_to_texts1NBBBB%% - .  ,HTJJJ ? \6c B B B T T 4Xh5G5GSSD T T T T T T T T T T T T T T T}$(>>>>>4=.//M?BBBBBBs#BB BN)r"rr") __name__ __module__ __qualname__rrrrrrrrr+rrrrs9 0    CCC, L L LMMM S S S M M MCCCCCrrceZdZdZejdddgdZejdgddZdS) TestPyModulescd|d}td}|t|dtjt i|S)Nzr [project] name = "test" version = "42.0" [tool.setuptools] py-modules = [z ] r7r8r9)rrerr rfr)rnamerrrs rrzTestPyModules.distsi     )** Xk22WEEE0b1A1A9MMMrmodulezpip-runuabc-d.λ-xyz-ecl|||||jvsJdSr)chdirr py_modulesrrnrmrs rtest_valid_module_namez$TestPyModules.test_valid_module_name s<(###6**5555555r)zpip runz-pip-runz pip-run-stubsc||tjtd5||jddddS#1swxYwYdS)Nz py-modulesr)rrrrrrrs rtest_invalid_module_namez&TestPyModules.test_invalid_module_names(### ]:\ : : : ) ) IIf   ( ( ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )sAA AN) rrrrrmark parametrizerrr+rrrrs N N N [X 3C'DEE66FE6 [X'O'O'OPP))QP)))rrceZdZdZdS)TestExtModulesc||td}d}|t|dt jt j5t jti|}dddn #1swxYwYt|j dksJ|j dj dksJt|j djdd hksJdS) Nr7z [project] name = "test" version = "42.0" [tool.setuptools] ext-modules = [ {name = "my.ext", sources = ["hello.c", "world.c"]} ] r8r9rrzmy.extzhello.czworld.c)rrrerrrr _ExperimentalConfigurationrfrlen ext_modulesrrisources)rrnrmrrrrs rtest_pyproject_sets_attributez,TestExtModules.test_pyproject_sets_attributesH(###)**   Xk22WEEE \-B C C R R 4\"5E5EyQQD R R R R R R R R R R R R R R R4#$$))))"'833334#A&.//Iy3IIIIIIIs)#BBBN)rrrrr+rrrrs(JJJJJrrceZdZdZdS)TestDeprecatedFieldsc|dz }d}|t|dtjtd5t jt||ddddS#1swxYwYdS)Nr7z [project] name = "myproj" version = "42" [tool.setuptools] namespace-packages = ["myproj.pkg"] r8r9znamespace-packagesr)rerrrrr rfr)rrnrconfigs rtest_namespace_packagesz,TestDeprecatedFields.test_namespace_packages-s//   Xf--@@@ ]-5I J J J M M  -hx.@.@) L L L M M M M M M M M M M M M M M M M M Ms#A77A;>A;N)rrrr r+rrrr,s( M M M M Mrrc.eZdZd"dZejddejddejdgiddd gfd d d d gifd dddgifejdddgfdejdgigdZ ejddddgfddifdddgfddd gfgdZ dZ dZ dZ ejdddgejdd Zd!S)#TestPresetFieldr"cbd|d}d|vr|dz }|dz }|||zd|S)Nz"[project] name = 'proj' dynamic = rversionzversion = '42' r7r8r9)re)rrndynamic extra_contentrfiles rrzTestPresetField.pyproject<sSFFFF G # # ) )G** -/'BBB r)attrfieldr)rrr)rrzNot SPDXrzignore:.*license. overwritten classifierszPrivate :: ClassifierrCscriptsconsole_scriptsfoobar=foobar:main gui-scripts gui_scriptszbazquux=bazquux:mainrl dependenciessixz&ignore:.*install_requires. overwrittencd||g}t|fi||i}tjd|tj}t jt|5tj ||}dddn #1swxYwYtd|||}|rJdS)z:Setuptools cannot set a field if not listed in ``dynamic``z&defined outside of `pyproject.toml`:.*rN metadata.) rrr%compileSrrrr rfr) rrnrrrrrr dist_values rtest_not_listed_in_dynamicz*TestPresetField.test_not_listed_in_dynamicDs*NN8R00 22T5M22jI%II24PP \/ 5 5 5 F F 4T9EED F F F F F F F F F F F F F F F@%&8$&8&8$??EE ~s#BB  B r_zoptional-dependenciesc|||g}t|fi||i}tj||}t d|||}||ksJdS)Nr)rrr rfr)rrnrrrrrr!s rtest_listed_in_dynamicz&TestPresetField.test_listed_in_dynamicbs~NN8eW55 22T5M220yAA?%&8$&8&8$??EE U""""""rc||||g}t|dg}|dz ddt j||}|jjdgksJdS)ap license-file is currently not considered in the context of dynamic. As per 2025-02-19, https://packaging.python.org/en/latest/specifications/pyproject-toml/#license-files allows setuptools to fill-in `license-files` the way it sees fit: > If the license-files key is not defined, tools can decide how to handle license files. > For example they can choose not to include any files or use their own > logic to discover the appropriate files in the distribution. Using license_files from setup.py to fill-in the value is in accordance with this rule. zLIC*)r<LIC142r8r9N)rrrrer rfrr<)rrmrnrrs r&test_license_files_exempt_from_dynamicz6TestPresetField.test_license_files_exempt_from_dynamicss (###NN8R00 999 F &&tg&>>>0yAA}*vh666666rcd}|dz }||dt|dg}tjd5t j||}dddn #1swxYwYd|jvsJdS) Nz:[project] name='pkg' version='0.1' dependencies=['click'] r7r8r9wheelrlz`install_requires` overwrittenr)rerrrr rfrl)rrnsrcrrs r%test_warning_overwritten_dependenciesz5TestPresetField.test_warning_overwritten_dependenciessN// S7333G9=== \ @ A A A F F 4T9EED F F F F F F F F F F F F F F Fd3333333sA((A,/A,cJd}||dg|}dg}t||}tj||}d|jvsJ|d}t |||dz |dz d }d |vsJd |vsJd |vsJd S)a# Internally setuptools converts dependencies with markers to "extras". If ``install_requires`` is given by ``setup.py``, we have to ensure that applying ``optional-dependencies`` does not overwrite the mandatory dependencies with markers (see #3204). z1 [project.optional-dependencies] foo = ['bar>1'] rz6importlib-resources (>=3.0.0) ; python_version < "3.7"r+fooegg_infoz requires.txtr8r9zimportlib-resourcesbarz:python_version < "3.7"N)rrr rfr_get_command_objr rc)rrnextrar install_reqrr0reqss r2test_optional_dependencies_dont_remove_env_markerszBTestPresetField.test_optional_dependencies_dont_remove_env_markerssGNN8n-=uEE OP ;???0yAA+++++'' 338Xx./HIII>)44g4FF$,,,,}}}}(D000000r)rgroup)rr)rrerrorc|||g}t||dgi}tj||}||jvsJdS)Nr)rC)rrr rfrC)rrnrr7rrs r.test_scripts_dont_require_dynamic_entry_pointsz>TestPresetField.test_scripts_dont_require_dynamic_entry_pointss`NN8eW55 8L7M/NOOO0yAA)))))))rNr)rrrrrrrparamfilterwarningsr"r$r(r-r6r:r+rrr r ;s [" 4 FL3 {112QRRS  M,C+D E Y):=Q K../WXX   &  '&  [" 4  4 6 ; % 9 M,C+D E    ##  #777(444111, [ ')GH [((**)(  ***rr ceZdZdZdS)TestMetactj|5}td|DsJ ddddS#1swxYwYdS)z,Meta test to ensure tests can run from sdistc3JK|]}|tVdSr)endswith EXAMPLES_FILE)r(rs rrAz6TestMeta.test_example_file_in_sdist..s.OOt}}]33OOOOOOrN)tarfilerrhgetnames)rsetuptools_sdisttars rtest_example_file_in_sdistz#TestMeta.test_example_file_in_sdists \* + + PsOO OOOOO O OO O P P P P P P P P P P P P P P P P P Ps.AAAN)rrrrGr+rrr>r>s(PPPPPrr>ceZdZdZdS)TestInteropCommandLineParsingcP||d}t|d}|t|dddgi}t jt ||}||}d|j vsJdS)NzJ [project] name = "test" version = "42.0" r7r8r9 script_argsz --versionz42.0) rrrerr rfrparse_command_line readouterrout) rrnrmcapsysrrroptsrcaptureds r test_versionz*TestInteropCommandLineParsing.test_versions (### #344 Xk22WEEE }-0d1C1CYOO !!!$$&&%%%%%%rN)rrrrRr+rrrIrIs#&&&&&rrIceZdZdZdS)TestStaticConfigc||d}t|d}|t|dt jt i|}t|jsJt|j j sJt|j j sJt|j j sJt|j j sJt|j jsJdS)Na) [project] name = "test" version = "42.0" dependencies = ["hello"] keywords = ["world"] classifiers = ["private :: hello world"] [tool.setuptools] obsoletes = ["abcd"] provides = ["abcd"] platforms = ["abcd"] r7r8r9)rrrerr rfrr rlrkeywordsr obsoletesprovides platforms)rrnrmrrrrs rtest_mark_static_fieldsz(TestStaticConfig.test_mark_static_fieldss(###  #344 Xk22WEEE0b1A1A9MM.//////00000233333011111/0000001111111rN)rrrrZr+rrrTrTs#22222rrTreturnrctj5}|j||}dddn #1swxYwYt j|dd}t}|dz }|dz }|dz }|dg}| D]4}| |s||vr| |dz5d |S) NT)validater+)zAuthor:z Author-email:z Maintainer:zMaintainer-email:)zProject-URL: Homepage,z Home-page:)zDescription-Content-Type:r"r) ioStringIOrrgetvaluer from_emailriadd splitlines startswithappendjoin)rbuffer pkg_file_txt skip_prefixes skip_linesresultlines rrgrgsJ )& $$V,,,(( )))))))))))))))   t4444%'MJUUM==M33MNN2 F''))## ??= ) ) TZ-?-?  dTk"""" 776??s/AAA)r[r)L__doc__ __future__rr^r%rCinspectrpathlibr unittest.mockrr ini2toml.apirpackaging.metadatar setuptoolssetuptools._staticr setuptools.command.egg_infor setuptools.configr r r &setuptools.config._apply_pyprojecttomlrrsetuptools.distrsetuptools.errorsrrsetuptools.warningsrr downloadsrr__file__parentHERErBrr/rrr< uses_networkrr"PEP621_INTERNATIONAL_EMAIL_EXAMPLErPEP639_LICENSE_TEXTrrrrrrr;xfailrrrrrrrrr r>rIrTrgr+rrrs #"""""  ''''''''''''((((((::::::==========TTTTTTTT((((((DDDDDDDDMMMMMMMM44444444 tH~~' 555RRRtm/C D DEEH%%////&%FE//d2h &"  $ !$???@@@ III ??? 9 3*      . O+##H$ % .MM/.M&      " **L   %   3 #    @**A@*2 F F FYYY,yCyCyCyCyCyCyCyCx))))))))6JJJJJJJJ* M M M M M M M Mu*u*u*u*u*u*u*u*pPPPPPPPP&&&&&&&&&22222222:r