From 68b367a09088bf42d56e9b76191e1a84914ddc0e Mon Sep 17 00:00:00 2001 From: Scott Beddall <45376673+scbedd@users.noreply.github.com> Date: Tue, 1 Sep 2020 14:32:02 -0700 Subject: [PATCH] Add Document w/ Eng Sys Checks (#13492) * adding additional documentation around engsys --- CONTRIBUTING.md | 4 + doc/README.md | 4 +- doc/eng_sys_checks.md | 196 ++++++++++++++++++++++++++++++++++++++++ doc/res/full_matrix.png | Bin 0 -> 19726 bytes doc/res/job_snippet.png | Bin 0 -> 14353 bytes doc/res/regression.png | Bin 0 -> 5203 bytes 6 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 doc/eng_sys_checks.md create mode 100644 doc/res/full_matrix.png create mode 100644 doc/res/job_snippet.png create mode 100644 doc/res/regression.png diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 07730d27fdbb..057ab8c913b1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -111,6 +111,10 @@ Mypy install and run. **Example: Invoke tox, breaking into the debugger on failure** `tox -e whl -c ../../../eng/tox/tox.ini -- --pdb` +### More Reading + +We maintain an [additional document](doc/eng_sys_checks.md) that has a ton of detail as to what is actually _happening_ in these executions. + ### Dev Feed Daily dev build version of Azure sdk packages for python are available and are uploaded to Azure devops feed daily. We have also created a tox environment to test a package against dev built version of dependent packages. Below is the link to Azure devops feed. [`https://dev.azure.com/azure-sdk/public/_packaging?_a=feed&feed=azure-sdk-for-python`](https://dev.azure.com/azure-sdk/public/_packaging?_a=feed&feed=azure-sdk-for-python) diff --git a/doc/README.md b/doc/README.md index 0756c6aecdfe..b4ecf81e6fd9 100644 --- a/doc/README.md +++ b/doc/README.md @@ -2,4 +2,6 @@ This folder contains some documentations for this repository: The folder structure is the following - [sphinx](./sphinx) : contains the documentation source code for https://azure.github.io/azure-sdk-for-python/ -- [dev](./dev) : contains advanced documentation for _developers_ of SDK (not _consumers_ of SDK) \ No newline at end of file +- [dev](./dev) : contains advanced documentation for _developers_ of SDK (not _consumers_ of SDK) + +The file [eng_sys_checks](eng_sys_checks.md) is a read up as to what a standard `ci.yml` will actually execute. \ No newline at end of file diff --git a/doc/eng_sys_checks.md b/doc/eng_sys_checks.md new file mode 100644 index 000000000000..81d8e861af2d --- /dev/null +++ b/doc/eng_sys_checks.md @@ -0,0 +1,196 @@ +# Azure SDK for Python - Engineering System + +There are various tests currently enabled in Azure pipeline for Python SDK and some of them are enabled only for nightly CI checks. We also run some static analysis tool to verify code completeness, security and lint check. + +Check the [contributing guide](../CONTRIBUTING.md#building-and-testing) for an intro to `tox`. + +As a contributor, you will see the build jobs run in two modes: `Nightly Scheduled` and `Pull Request`. + +These utilize the _same build definition_, except that the `nightly` builds run additional, deeper checks that run for a bit longer. + +Example PR build: + +![res/job_snippet.png](res/job_snippet.png) + + - `Analyze` tox envs run during the `Analyze job. + - `Test _` runs PR/Nightly tox envs, depending on context. + +## Analyze Checks +Analyze job in both nightly CI and pull request validation pipeline runs a set of static analysis using external and internal tools. Following are the list of these static analysis. + +#### MyPy +`Mypy` is a static analysis tool that runs type checking of python package. Following are the steps to run `MyPy` locally for a specific package +1. Go to root of the package +2. Execute following command + ```tox -e mypy -c ../../../eng/tox/tox.ini ``` + +#### Pylint +`Pylint` is a static analysis tool to run lint checking. Following are the steps to run `pylint` locally for a specific package. + +1. Go to root of the package. +2. Execute following command + ```tox -e pylint -c ../../../eng/tox/tox.ini``` + + +#### Bandit +`Bandit` is static security analysis tool. This check is triggered for all Azure SDK package as part of analyze job. Following are the steps to `Bandit` tool locally for a specific package. + +1. Got to package root directory. +2. Execute following command + ```tox -e bandit -c ../../../eng/tox/tox.ini``` + + +#### ApiStubGen +`ApiStubGen` is an internal tool used to create API stub to help reviewing public APIs in our SDK package using [`APIViewTool`.](https://apiview.dev/) This tool also has some built in lint checks available and purpose of having this step in analyze job is to ensure any change in code is not impacting stubbing process and also to have more and more custom lint checks added in future. + +#### Change log verification + +Change log verification is added to ensure package has valid change log for current version. Guidelines to properly maintain the change log is documented [here]() + +## PR Validation Checks +Each pull request runs various tests using `pytest` in addition to all the tests mentioned above in analyze check. Pull request validation performs 3 different types of test: `whl, sdist and depends`. Following section explains the purpose of each of these tests and how to execute them locally. All pull requests are validated on multiple python versions across different platforms and below is the test matrix for pull request. + + +|`Python Version`|`Platform` | +|--|--| +|2.7|Linux| +|3.5|Windows| +|3.8|Linux| + +### PR validation tox test environments +Tests are executed using tox environment and following are the tox test names that are part of pull request validation +#### whl +This test installs wheel of the package being tested and runs all tests cases in the package using `pytest`. Following is the command to run this test environment locally. + +1. Go to package root folder on a command line +2. Run following command + ``tox -e whl -c ../../../eng/tox/tox.ini`` + +#### sdist +This test installs sdist of the package being tested and runs all tests cases in the package using `pytest`. Following is the command to run this test environment locally. + +1. Go to package root folder on a command line +2. Run following command + ``tox -e sdist -c ../../../eng/tox/tox.ini`` + +####depends +This test is to ensure all modules in the package being tested can be successfully imported. This is to ensure all package requirement is properly set in setup.py as well as to ensure modules are imported using valid namespace. This test install the package and it's required packages and executes `from import *`. For e.g. `from azure.core import *`. + +Following is the command to run this test environment locally. + +1. Go to package root folder on a command line +2. Run following command + ``tox -e sdist -c ../../../eng/tox/tox.ini`` + + +## Nightly CI Checks + +Nightly continuous integration checks run all tests mentioned above in Analyze and Pull request checks in addition to multiple other tests. Nightly CI checks run on all python versions that are supported by Azure SDK packages across multiple platforms. + +![res/full_matrix.png](res/full_matrix.png) + +Regression also executes: +![res/regression.png](res/regression.png) + +Nightly CI check runs following additional tests to ensure the dependency between a package being developed against released packages to ensure backward compatibility. Following is the explanation of why we need dependency tests to ensure backward compatibility. + +Imagine a situation where package `XYZ` requires another package `ABC` and as per the package requirement of `XYZ`, It should work with any version between 1.0 and 2.0 of package `ABC`. + +Package `XYZ` requires package `ABC` + +As a developer of package `XYZ`, we need to ensure that our package works fine with all versions of ABC as long as it is within package requirement specification. + +Another scenario where regression test( reverse dependency) is required. Let's take same example above and assume we are developers of package `ABC` which is taken as required package by another package `XYZ` + +Package `ABC is required by package `XYZ` + + +As a developer of `ABC`, we need to ensure that any new change in `ABC` is not breaking the use of `XYZ` and hence ensures backward compatibility. + +Let's take few Azure SDK packages instead of dummy names to explain this in a context we are more familiar of. + +Most of the Azure SDK packages require `azure-core` and this requirement is within a range for e.g. `azure-storage-blob` that requires `azure-core >1.0.0, <2.0.0`. So any new change in azure-storage-blob needs to make sure it works fine with all versions of azure-core between 1.0.0 and 2.0.0(Both included). +Similarly any new version of azure-core needs to ensure that it is still compatible with all released package versions which takes azure-core as required package. + +It is lot of combinations if we need to run tests for all released versions within the range of requirement specification. In order to reduce the test matrix and at the same time ensures the quality, we currently run the test using oldest released and latest released packages and skips any version in between. + +Following are the additional tests we run during nightly CI checks. + +####Latest Dependency Test + +This test makes sure that a package being developed works absolutely fine using latest released version of required Azure SDK package as long as there is a released version which satisfies the requirement specification. Workflow of this test is as follows: + +1. Identify if any azure SDK package is marked as required package in setup.py of current package being tested. +Note: Any dependency mentioned only in dev_requirements are not considered to identify dependency. +2. Identify latest released version of required azure sdk package on PyPI +3. Install latest released version of required package instead of dev dependency to package in code repo +4. Install current package that is being tested +5. Run pytest of all test cases in current package + +Tox name of this test is `latestdependency` and steps to manually run this test locally is as follows. +1. Go to package root. For e.g azure-storage-blob or azure-identity +2. Run following command + `Tox –e latestdependency –c ../../../tox/tox.ini` + + +####Oldest Dependency Test + +This test makes sure that a package being developed works absolutely fine using oldest released version of required Azure SDK package as long as there is a released version which satisfies the requirement specification. Workflow of this test is as follows: + +1. Identify if any azure SDK package is marked as required package in setup.py of current package being tested. +Note: Any dependency mentioned only in dev_requirements are not considered to identify dependency. +2. Identify oldest released version of required azure sdk package on PyPI +3. Install oldest released version of required package instead of dev dependency to package in code repo +4. Install current package that is being tested +5. Run pytest of all test cases in current package + +Tox name of this test is `mindependency` and steps to manually run this test locally is as follows. +1. Go to package root. For e.g azure-storage-blob or azure-identity +2. Run following command +`Tox –e mindependency –c ../../../tox/tox.ini` + + +####Regression Test + +As mentioned earlier, regression test or reverse dependency test is added to avoid a regression scenario for customers when any new change is made in a package that is required by other packages. Currently we have only very few Azure SDK packages that are added as required package by other Azure SDK package. As of now, list of these required packages are: +`azure-core` +`azure-eventhub` +`azure-storage-blob` + +Our regression framework automatically finds any such package that is added as required package so this list is not hardcoded. + +We have two different set of regression tests to verify regression scenarios against oldest and latest released dependent packages. +• Regression using latest released dependent package +• Regression using oldest released dependent package + +One main difference between regression tests and forward dependency test( latest and mindependency) is in terms of what test cases are executed as part of the tests. While forward dependency tests executes the test cases in current code repo, regression tests execute the tests that were part of repo at the time of dependent package release. To make it more clear, let's look at an example here. + +Let's assume that we are testing regression for azure-core and this test is for regression against latest released dependent packages. Test will identify all packages that takes azure-core as required package and finds latest released version of those packages. Test framework install currently being developed azure-core and latest released dependent package and runs the test cases in dependent package, for e.g. azure-identity, that were part of repo at the time of releasing depending package. + +Workflow of this test is as follows when running regression for an SDK package. +1. Identify any packages that takes currently being tested package as required package +2. Find latest and oldest released versions of dependent package from PyPI +3. Install currently being developed version of package we are testing regression for. E.g. azure-core +4. Checkout the release tag of dependent package from github +5. Install latest/oldest version of dependent package. For e.g. azure-identity +6. Run test cases within dependent package from checked out branch. + + +Steps to manually run regression test locally: +1. Run below command from your git code repo to generate the wheel of package being developed. Currently we have restricted to have prebuilt wheel. +`./scripts/devops_tasks/build_packages.py --service= -d ` +2. Run below command to start regression test locally +`./scripts/devops_tasks/test_regression.py azure-* --service= --whl-dir=` + + +How to run these additional tests on azure pipelines manually + +Following variables can be set at queueing time in order to run these additional tests which are by default run only for scheduled runs. + +• Latest and oldest dependency test in addition to basic testing +Variable name: `Run.DependencyTest` +Value: true + +• Regression test +Variable name: `Run.Regression` +Value: true diff --git a/doc/res/full_matrix.png b/doc/res/full_matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..7decc5e8cd01568d412e2f055ba577eb798a30cf GIT binary patch literal 19726 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 N%7faWy;>zV#a$KZAshjc(n1vERh?%ygAC zXfj|voFh2wB5qX}Xre~E(rU82j=l#Ht-C$?vDFoau1P*ZxnsJg(9E9luR3XvK?!Ox zxA+0(m_(r*A8!A|d%Na~^WJuJgI+20R1DqhXpe(2jDDFSO=pK!Os6~@8QJ0eZ5wr9 zeS}#C}z3=d)Y4x%< z#kck4N$1ikcdxnYx0kyIEj0~?^O*scn{=5~nf8}!+`b)NUP?~*h7|vq&Hf9${XY-b zWPs>;kz9-!C{=!N)JOrj=qi`}8ljFOIwvg>pnJ`uCAz_AW0Fz=eZ%=s-*3NP{;xoB zjqocw+d33L>)RN3%T>)GC5y#I&G2~#gBGNZznCGORc5XOWZ{Q)GMk zq!a4#bvcF_2)k;bKSMUo;B!2w<(k|AuS?2l(F2p+G$lh6YZG9Pgakb9nq~Q8k(EM` zZW4=4Z}~yxQ@dwVh-sAic}`1-yzhm_jkubT4Y z``9I1yh)>qCn-&9UMxNAZ?4N-SY;#-qJ9cCZPh=Q7m+6cbMv8yIWyv4uQ$5%bg4cH ze;yqSck}wvm}-j~ddM8w5MyaQ)1HF%bJQLz8UWb_s z{F@Dii*PY@NP6%1{Rt6QH<8gHiGq}qg@%)Hb9O<3E;Y(2`MN9p_Jpgzw2uB_ON8Lg zHyqTZ3i%}X=vPC|&8Fc8<=Z(N%f-YNYKt!Bzp{s5ck|H#y zWIh+TTf|T^f~C*Gb%)`%Qu@I9EAQc*H-hoI#omQIBKN#R-h&TyLZpS?|Gs_!+zt1I z&)S2WK$553T`5{Mxj&66c-_|`Xq%pJ>+zH_wyso6f%VvU`P&4^w|n$#Ft<$aDoE0k zO@ir4(s>1bzBrUmZ7M8q%1X=BBZK5*bCO_4$0RYj1T!OklC_G$-*pL4VL#^aAzyIJ ze*}Soj#rIsI;aC)mK*m@D@$UHLn}kRSV1IdHq#J zAE9V)Qn;rhR@x~K%abtiJQ3otHjIf|TJR(@vC6c1+ERZ2?5CTy_T=j1KdJci#qE@v zba(V2#_7gWz#b{LxR};4lr#jjxJh4B=Q&)sGHO>1*Y!9$a^jtzCSe+UohQ;&g0P<* zCwl>8h1*AP>?HXI`%?pFuiDe}ygQK3>-n>A@{DHvtCd7G8A~k<>Oey`B0(VgEG3jj zO}+EXD1lh1OAz95!_tft`!>_7eoyu2hlWL6Ezv$jm#iKU$j*3nDie`y{nMHdUJ+Q9 zPi<932J9hZE$jC4g}!CBDxRlz^H`wwvwrL!{H0BVdCT$fqy7Cf>iJ4g9dT6aWJ&ck>Xl#<=*zC z+39ehmx7p`95-@So($rH`r!3tNt=Dr=4l~%G@So>9raGU==dc?$=b{MXirq=P2RW9 z9(dZtB@l9DvXG7$W3+_0CHG(g6`XoTAiX9TR5-a5(f~abQtCJhxLK(`I`Ut=qBsGv(7r>eo&x?{V+GJ1LPYMSbn8&-u4?c;j>RrS?&Mvnm2$2LDTVp&rL3)=2_XY`mn7Ql zmbeX26!z|$3tCG7-q7U}WDRf*u~FGtxgBuH^r7XZ(pTB{*kD_Fs-Bc=SHW^ugKNyW zRkyLaWGhQJZ1A?I=jdZtL@Oh7b+*h?Q#GL(r^GleC0ePI&#qB6{>lqJ5I>bW?~~vl z1B9lpZT8*9ckbAhTaF>%+#0Hin{mMfk%)W5vrQM2BRoE(fY0z-#wyFB2 zv2KK`?mdj1w`f>G=BN)DDl#0lVWJtFa1?*18lzhniJ}x8v8Fg!e#$MdzYoh;3XdJ) zj})Vz)i0r9r0nf@6I8^C8%z}S4Y;|aD0TlY$ylbe`_pZwQSU)0b0lp;&GHA-cO5G|`K>CSj459`I|9inkLs=nJ2W-J4S2pI>3 zNKo~I1!vooQnOOZ(O*zjaNV*HIjHEh}zw%rsitTL1{`yJb=jh;@ zq-DKSCQEv zb#)CvN?-1Yzwy(&S?4+x9r#NbPIM#4kd0 zT8E!YRCRxHZO{Wf`uG9%RPE|}+tx5g0^GYYZ4&B3@ZhlPQGCHhH-=2sUWHp+DQj$fG zIN`f<8r&byM<%g(I%lyLhec`D0-FMks#1W7t3M#dSy8R^RNKLo6JMSsP_*4A4=Q-x zp=%k3B?-;;I~J)=;%#UfpBxB;IyZ4(Y#=~49>42+pl|0*Zw8$3Q~;`v!e)3*l&W*VPP&; zm{lnX(A5{Z(+7A(uQ9TEO;X~*qxbFx3k{xYrW;3tJ}vZ~U-zqQ>+O1qH}YS`Dh|$- zb(D~v`)6wz=>%Yk)8-)$34dQQKl7*?Z~NRCDSbNd;T(Tm0ErL8EZSgZyXb>ocoOJ> zPO>V4K@ZB!%AKW)gb=qwk8m-D306CzXXA0Z_FltiSe)`6KD7upwpw}NOJYR1(OX>blMtwL^yr2tmqb=)&`8}%KtiGcwg*3|Y+~0Pw z>npD`yqi0$NAvrsrZ3$CU=Fa>g{xM75R5ouqfPII;f&u$(bh4E?gOtUlY9E?;nyq< zCn*#klvYgk$7}L(QiXe}43W*oVkFy>@qFoF`&Zr1J-}Hy?d<%c5FOjCTslA?Asp}f zU!xR&cQQc0Cmamm@&EBa_Kw%tmKuymX5tubWNaJ?0tiw6#)4o(i{ItxQj6Cn2O!Yq zc+Yy_d~tD6fyG}g^G{?HZlte&2Q@T2oH)2C;dR(o4ggTD%pCQ^Fr1y8B`9yMbw_WH zWEQq_J;cAyng{BVK`!A52WI-6_J@(sNu!T{JhdKfy*g|;;!?!{h~TOLpP;G9R_g3$ z`ef+wqpXe>o7}8NGSYDX4veb6H}`k8MFNFzAL130wfZ2ql@v#9j-!6`0s>>cPmDMM zx^KPy%Nv98up<3&i&X$;t-PzW{tET-#BYr005=m-zWU z4Gw@oF%X2$Kp;+aJ2Z-a;~~I2-3CRR7aSEDq$q#`uxFP6%A$HHsc-=zY33OGaUeiO zXmWxAaOctQ5y?6u4t#P9BLKX^hjG^Zh$aHCzMN3ED~#ZTR?oCr(*cR_0QwX-sNyyM zlWw|;TmgVwXkq4vl-=5WX22I#gw|3n{|*{0$rqmr0OWK|fMd?nfWiR>^TI;@06DS= zbw^auf)ZPoy7Z-71rb2*V*!h>e;x}$(%Ra3(+419p@@;2;PlCuftcM~tb_lAE)cmH z+l)6nGp@ZdvQvf1JJ3yIYk90SFpNhX1j{goIg!6l#B{4sZh<=a% zD7>Zfrh*@imnHT;oNeVf(0J|uHU6C7fn=uA1m7$tn8fQI_YJ0Xq+)=1?npX zy;D=0_~s;|su(-N$Chut=h8XSy}7TUbqkQ1sB4GuLsivX(}Iy2_5(QPZdApfeV6>) zsGOV^m?|?FuXxJWBmaG$R^250m#9_xcImMWZs%DDikaf)!a9$R4w zl}1T&VaKKGIJ9k{%)ND6-%hDYkBHhcVn7km|MkWD-y_1%!&N}G*)h|fDb8y;WoOt!DUm_9ciA#2!4kNb&BR|!Pv8oKIWTfKb0%&_@v3gSC zRskXMU~VQg)j+>l_)J~O*C#fhwYBy5`q+#jO4t3+jQr?w%J!T%Q0)~Q^~K>vycL4H zP;kotsU#p{J3x&cH+SrD%-%4ZOoN@<{NC**NJ+W=?7Q7>V%+{jN|AwkC%O(JMeg|62(4+OuwY5U1sh2FiG zG$N}5{VYH0CAyqQ+4co*SuMWBnf)nO$O14Y`1b=zwd1G5yWCDbu~Bvk;H(3zTU?~LSsZJ`C+cY03`R9J%s}H>(voFPD6H4+?9-n zhL~nIDd|l=YRCJc1S`vIvY6dk-`(02kxD_d_b*G|*4&#~zM0Uf*RTLTFP~sXU08Pd zI6;;1=D_ixz5`NGei(O@H)kCD(NlV8SCtHm*94--ucp34%ZXsV(L}R9rQ2vWudrC) zEA@{rCcwy)QYL^9sqO3A%Z3+zC%y^+TviNDfF=-_LPdjPqUu{h2JKTGyuTf%ezQJe zJm*K`G5_WujJ>sbk%>ewCyCr5Z$IL%W!qz&70s>(xi-u!kp;yE+;4R z>RGwAQj=f;aZ<8b`d^x;o$`%h>nMepj8~h2BkX1Rl2Ru5G^G>H;*Q;AllTi?Tpq*) zg1+Mq!ThX%-dg-*uHb??cj@{4kaDf~DRKWP0?3tad7&nvU-cKE(8{Fo{&>kH56 z@D$i4f7mcFeigSvJx5~*q>qMtn3>T*dq!7%>PxlbK}yTE@2d3h;-7+h=249#yqprkA%0bpBlFkZ z;sM2)^eWx&s_N-3ttRkH6mDBCRHXIS#yxZW39AQ{eV=`5u*$;oQ@M)qgrq)8a=DIe zI#GN`Q$I@ zk}zfL@)zj1z?gmmTlVvkHVB^xw<%j3-ll0!@52><*Qm@TwTLq-Kh!V$a=h1IJXFZL zd}9&0(zX>ZrmD7>drz!=!*Q)pI6*(2Tj zIt;QOhoD++@5X8l{8vGUZgktpw**xd9vz#9VsQ+x!SeNPHozCG#tcBNyo%}Y=wqo} ztSC^)4v&A!)=)WY{h^iT1F*PWYA$Ys`SzH)&{tP{#Y!t(g?&ppl=xa%?Kgx>^_iju zgalBEMcIg^CuloY!Xva*?y&)w~> zyC?%PY^6q*1Li-Rk;~LzQ63N|^RF`vn|4QccXufukn8#0f2wi+@2KQ=6+HJIstyjl z#Q)Ctn>#MA8|x&-xSJ>e$cJOQ4If-30p@|X5Tz4`#aio*_f-tFe;j^6a9*BTO1#zP zyz&BO3=f7Xj6Lor=V<~ikHzstTEJtz--uklOp{Ot&QA=xL2E)01}@uQRB9i|<+G3- z_@zuG(=!t37Rc)k1(8REu~0;irgrnhSg~`1Jr84%_Ft87;iaGIjdXo=3wWXlE6jS| zc+xhpnGo|>oydi~u|YteVYt~2B3URbIHS8GRjnmCsHgRK3xzX*2Zl7)#Wg4mmEKgDpOLT{&2ow$Zc^_3WnDpLyNO3wOR{mtmiGH=Xg$&FUFnSVA*rpYoI@Bp*zWv z`PadT_VCu6hzYuYpbn&5{fZLVl&nf5F>t;Sl%^jG1|3`9i%ZZYxWEVe%*nvB!l4HVHeu$2Pi(h!iir^)H?jc zH+Ld(%n-`_^5fERb@CY|=Rut%oiCtf0Tr2+?3(ZLPgN5STH?IulLmk6v$|VxC?}|d z{W6_SRaLLK9hx52oBzhpj%ifBbW2N@_d}kpP9=`e3*gt7=9CSiEMKAW7r?~kwsJ5L zb7x#fVWAYJM8%aXdm(2$0_3#3BReqnOcfYqkVqh%@rtE#mu!1dLBOKNOKVLDEY(9V z33@hd(_&r7^a{2;ncQI5T0h|~H3>&bs)&ek@AKkMC6l@x6@NN9p@68WdEIrm^Pec( zOZvlI)XG7m32a^ctc>YEfG!NMHz6QX^Bx1c5JTZcbbn12ryKW$YjWwtbA*dNE4%3* zt{56>GAhlKV0N=Ny5~6Kc;dP^Q(W#JoTAR-!ew@**6HPy^0snSXlG1CzlF2FL(=C> zxf!|}7tv?jO6%OuPhNfGK1T1*2LiSe3qr~W5Nt6`?ez|uv2a;IE{eel{ShJ0hMZ;;Ku5cDR363z;D!A>hr#& zW}bNi=Q!Gc%V=C!^XqEBqZx$BGK>G%JsxH6pxbw+V_*vJDi(1rSDyH@@)&i5;rbr4 zvY5{{S(ncaYi9>>W{RV6K8b3t7a=I7z_AAO(x2VUaw!7t6OfCMV3HsAmQ&G5Z<^Xv zuF4g$1hI%4@%%>K>pN5qVmVXbq6xx^_N9d~?Vc7Y3ie4`bHj>~e8WeZK5_drQD>tB z4my8_VIk0J5v4a|+$U?v--NvWF;=hu?%evi4d4#D&A%?EemiXJ(miiBQV*oRxkEU5XbPTPxR`K5j zeJmc&1S`&x3{hBUTr9*pe~edVb8L9&5-aSbcr-obLz9+7G9|_nD&Ham zHLi9$f>3G{NHC3Zf~yN}dM&*6w94DAOuH#w9Y`O2pc>A3o8Y$)+7sgnD$B{EHQa_3DAdB9;^6@(izKDqZCA zp%cnZUeFDW6i-C%ZdbwSa=#uB^Lzjqa6WQB>GuA$J0SYmv<6MjRP|Kv*TZ5Z_qh3C%i`jrza;h` z9ivBeZ`&2Nko%eL^95m=^}SL^a#1bKS%XGx$VRiLVGFpg``o*bW?{&6LO`c_q}tEA zJumM!*Fb-S0N?xDvs@OZ>WV+^mvH1gw<8@&JXMqkd--oFt)FYv;LAdD&tSdDFtVVC z!l3Tpp8@gC`zkCDPy7L51JFXn-;tOl3>1}T$pp-p(LKO1EcUA_xHbk3D!<;Yl#H{y z8qh73{KX%v$ZyiOZ`q$eF;Ry5#(K4kmFggbSG4j)-K+wc;C6?n#S8=G{Xi?2LbZlo zoF9ohxWEIZr)pGHFTL%XoG;ffK9K>MVsH95>ZoBW2NWG~d(QFYoUVwr>*;Xs#15Wr z+iDsL7WV7HNm+8Is#iaxm!g;65xHOcgBX)0eiq9EIS?|TNFL14+K1kYK2e={W8JA= zd7#oQ$#Ufg<>C3&K2v7l6YL+hNnSlc{OSwY^z*0UnR67&@hTyUxwZ%C>dax%-o9_? zQ1b>LH+zMvL3v8`e?aE4Gun?xSpMshqViYLmM7Po5-lR4y^iIex~3(b+ykdNvDO*P z#bZZ3NIm(YUzNm_X*ARLt3rSGknof&C9rANywsEO^)Zs@uUJ93`=!a7Z~3bUW1eZE z1DS|%$6En;o20k^6GwILJ*18Gc5YSui`5YlL{+A86@>5Hp~Cy&PV9romv9mXj2s)* zTV4=0gBY&!h_G_wAUgbqbH{Ehz<+`}0H8+3#0;BM5dU{r{_77cYeM?}0hS+SY&ZRZ z@Myq#y7F)PRI3k~m;D57^ zIwJm|B`nV|s+UMKW)eB0xgY15BSOm?t=^s}V+A zl|%x5jopSZfAIOZs5ln1_7C`M!Q_0+<$ZyNxK#dbpdA~z-BSm-ULq+?z!UlWH&1FG zwqwoYE?#dQO;rw(OBZ>MI9RsI7hF#8=E{DBH{q(oH>Lb&MrBE6&KBS3TOWeW#zvt) zD#q-Y9sY7@Ewhc6SyBj}>i=ivwfIEj^`P@%5k8O2IC!Zdh# zk)R+!J!0WE*T0*+{UC}wV^y(hT(ZqrzuT+``d!(yzc4ehCSJYj;KUk5;^b4HT%SIp z)-~ae%gT+hvDuy|8=hQwRw>ALdPL?v%I7|QLIV*>A&A(RV>F+f%*VA3tV?I-{{E0Yy%7wcMX;UwSCBm?@|BqUA1we*ezub(L%}s}@1?z1{8y z-pppwYNbtnN4EdfPjeFmwWC2XIh>7J=1sisOgQBfvE2O55zMjhmN;3hI^`&5l-WJ* zSH;JI-EB|^Rvp04TL}*|<+S>{9^{iJ%|4J7yth2@Pr!TvVn|O(%xXZ}msZwj;%Bh6 zxX7%&>9G96{iM{${9dx}hobj$%{|p{$R|aPLeeH74CT7;F0C&_s8lM{W>2Mtv=K4xLSUzCTF;Dpd(sjUg|V9hiJ}> z5MxM^AJ&OEffk#15%l6c!zh8UzY##e?So8r`ogBJ?={K=!}pqujl&mJ3qnlJ5Bl-M zph;Q?3%r?z^Dmjrw)uE*trNek!YG^vTx(SIcb8sO z=AB0gUKi2qsvo>u);=F_ovL>uvK7@FtH(51(GY!eNUtTU3wnE@2Xbs!phWChvp2tt z!fI+9asGwqM2V(!&cTFaW7HGcCRt#H%e?ZrRdf<}{yS58Yg3&!keZwFT%rch@?zf0V{{FIUz(%D9lIuf9stUHMw26H!wphvn>y{(_?G zoGB_>9~Kqsk!Ra)>n0K&UU*bejgZmtY<3O0*XnOK#-~Akvxzci`u52t>|K{{#y`+V z-pA;0`tbgD`G42)ee2=j0%zedc$XnK%w@Gz+YeS}Mwk}TtRnLbRD_4-HNGfkbY`x- z$6NqTHRc8=&;JsZZ+*TJLv@7GWLx}lZ~rchdGcarK7AAFL#Htbq@(xTT98#i2pHA( zdT2fXDQlY~3)=>zi?OW^*t8^$q|a!%cU>Mjt?dQ>D&f=5f<(T}0AuQpJmzmgpt`?6*dN4SSJ0Zm-NS+St5 zxC&~^C=Ib+?^KFL`ce4@xz+tAd)qx}arx=tWi!OuA9eQayB0Ezsal>s(T7iX5k>ZX zRD#RD9+un?dSvJ9Y1mUkQIY8l*W_J@Dw^^eSi`96QqP5P*dg3}`&zj?Z~qE7aQ#qN zW~PMEeD?kZFv z`|mJ#aYDy6gX<=fOf;wy$k`GmE+1_n11%hV(dlS_#xN_y{+v{Z;MwanVxW&A&wP|L zLR!dd?*@N|c_SXkc%?>K=}a))uu+-ld3AoZL?o%ZmL2*|g?&NvbyiTO$uN_7VYMOV zLQh7LSudmWf?qxYH0UO#`%dh9u;!$EDtVo0_%S9bT!OHt=rTco`R7U^UjUz!UzvWp z_T6;#qn}6Eq#(HH=CCtecMeY34l&xb9tcm{k2#|hS^E!0gwpr75y3LuEg#Mv7LT77 z?^U{pJ}+lQ=obO-$S2oEHw#`K1sP(KS6Z1?!bt9Ln z;Vk1+nGUr$e0edO=-cnry?5PWGj#k8# zeOX0LwwJ?Q!81Tj9C$y#!%<)G%{z>%I z##(}aA&j8ZPet&nXl#-*R{=b5k6=bdJW5|Sb*${7l}fnn=apsiIt{#r%7m?ZARl+| zGvi*Fk|U#`!-u@3sBW#^0ne~PUGN!x?W^g{Mb&)Ck20nE#s$uVnjPV7<_nvC&fF@?+^9%daqxypg6rxn3B%ST%j1O0ABTkx-Zlxw zsg2!crx2OFi|xyuE>)kxhJ z)z^r2=^B0i9R}}z`36d;x(-sJznI%R;jdSmaBjL_WjKt)%Kp%FLt{zW;6Km8mg949 z=+o6}GAR;)e0R4+>HPS;Z#8G8iNc-&SGQ)vYw5UJW<^it)e%X3mb#8~sgcDD$;Zax zFD(FU+%Ql60v#k0cP0fqoIzJ(8d+@hb~slXa8BVPl%F#Upc zbjqW=e0e&%zL#psJMUR(?XA@x`qr87l(Q##}R8L7Z_+^M5qckDF0Y3xegva$Vu#2wT`PCgfjQGM4<6Ko;uqfn%*x=x*=D&$zr4P$ z?f!rh2e2nMp?;r6`yr{E4>3TW2M0wt4vhVL2T-|+zsLFc8V8WGa(-|_L30qDi0GB? S$Nr5Epd|lFu0qy4_mZ|bJbE@R8EwS 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 HbBq2b*SbU6 literal 0 HcmV?d00001