From 6e964b19ad0365358ae55158d0259747f1ec54dd Mon Sep 17 00:00:00 2001 From: Marc Garcia Date: Tue, 31 Mar 2020 13:27:57 +0100 Subject: [PATCH 1/3] WEB: Moving pandas blog to the website --- web/pandas/community/blog/2019-user-survey.md | 172 ++++++++++++++ web/pandas/community/blog/extension-arrays.md | 218 ++++++++++++++++++ .../community/{blog.html => blog/index.html} | 0 web/pandas/community/blog/pandas-1.0.md | 31 +++ web/pandas/config.yml | 11 +- .../img/blog/2019-user-survey/2019_13_0.png | Bin 0 -> 7549 bytes .../img/blog/2019-user-survey/2019_18_0.png | Bin 0 -> 10459 bytes .../img/blog/2019-user-survey/2019_20_0.png | Bin 0 -> 6926 bytes .../img/blog/2019-user-survey/2019_22_0.png | Bin 0 -> 10205 bytes .../img/blog/2019-user-survey/2019_24_0.png | Bin 0 -> 9829 bytes .../img/blog/2019-user-survey/2019_26_0.png | Bin 0 -> 34497 bytes .../img/blog/2019-user-survey/2019_31_0.png | Bin 0 -> 6053 bytes .../img/blog/2019-user-survey/2019_33_0.png | Bin 0 -> 5547 bytes .../img/blog/2019-user-survey/2019_4_0.png | Bin 0 -> 8545 bytes .../img/blog/2019-user-survey/2019_5_0.png | Bin 0 -> 7388 bytes web/pandas_web.py | 32 +++ 16 files changed, 460 insertions(+), 4 deletions(-) create mode 100644 web/pandas/community/blog/2019-user-survey.md create mode 100644 web/pandas/community/blog/extension-arrays.md rename web/pandas/community/{blog.html => blog/index.html} (100%) create mode 100644 web/pandas/community/blog/pandas-1.0.md create mode 100644 web/pandas/static/img/blog/2019-user-survey/2019_13_0.png create mode 100644 web/pandas/static/img/blog/2019-user-survey/2019_18_0.png create mode 100644 web/pandas/static/img/blog/2019-user-survey/2019_20_0.png create mode 100644 web/pandas/static/img/blog/2019-user-survey/2019_22_0.png create mode 100644 web/pandas/static/img/blog/2019-user-survey/2019_24_0.png create mode 100644 web/pandas/static/img/blog/2019-user-survey/2019_26_0.png create mode 100644 web/pandas/static/img/blog/2019-user-survey/2019_31_0.png create mode 100644 web/pandas/static/img/blog/2019-user-survey/2019_33_0.png create mode 100644 web/pandas/static/img/blog/2019-user-survey/2019_4_0.png create mode 100644 web/pandas/static/img/blog/2019-user-survey/2019_5_0.png diff --git a/web/pandas/community/blog/2019-user-survey.md b/web/pandas/community/blog/2019-user-survey.md new file mode 100644 index 0000000000000..1d9508034244f --- /dev/null +++ b/web/pandas/community/blog/2019-user-survey.md @@ -0,0 +1,172 @@ +Title: 2019 pandas user survey +Date: 2019-08-22 + + + +# 2019 pandas user survey + +Pandas recently conducted a user survey to help guide future development. +Thanks to everyone who participated! This post presents the high-level results. + +This analysis and the raw data can be found [on GitHub](https://github.com/pandas-dev/pandas-user-surveys) and run on Binder + +[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/pandas-dev/pandas-user-surveys/master?filepath=2019.ipynb) + + +We had about 1250 repsonses over the 15 days we ran the survey in the summer of 2019. + +## About the Respondents + +There was a fair amount of representation across pandas experience and frequeny of use, though the majority of respondents are on the more experienced side. + + + +![png]({{ base_url }}/static/img/blog/2019-user-survey/2019_4_0.png) + + + + +![png]({{ base_url }}/static/img/blog/2019-user-survey/2019_5_0.png) + + +We included a few questions that were also asked in the [Python Developers Survey](https://www.jetbrains.com/research/python-developers-survey-2018/) so we could compare Pandas' population to Python's. + +90% of our respondents use Python as a primary language (compared with 84% from the PSF survey). + + + + + + Yes 90.67% + No 9.33% + Name: Is Python your main language?, dtype: object + + + +Windows users are well represented (see [Steve Dower's talk](https://www.youtube.com/watch?v=uoI57uMdDD4) on this topic). + + + + + + Linux 61.57% + Windows 60.21% + MacOS 42.75% + Name: What Operating Systems do you use?, dtype: object + + + +For environment isolation, [conda](https://conda.io/en/latest/) was the most popular. + + + + +![png]({{ base_url }}/static/img/blog/2019-user-survey/2019_13_0.png) + + +Most repondents are Python 3 only. + + + + + + 3 92.39% + 2 & 3 6.80% + 2 0.81% + Name: Python 2 or 3?, dtype: object + + + +## Pandas APIs + +It can be hard for open source projects to know what features are actually used. We asked a few questions to get an idea. + +CSV and Excel are (for better or worse) the most popular formats. + + + +![png]({{ base_url }}/static/img/blog/2019-user-survey/2019_18_0.png) + + +In preperation for a possible refactor of pandas internals, we wanted to get a sense for +how common wide (100s of columns or more) DataFrames are. + + + +![png]({{ base_url }}/static/img/blog/2019-user-survey/2019_20_0.png) + + +Pandas is slowly growing new exentension types. Categoricals are the most popular, +and the nullable integer type is already almost as popular as datetime with timezone. + + + +![png]({{ base_url }}/static/img/blog/2019-user-survey/2019_22_0.png) + + +More and better examples seem to be a high-priority development item. +Pandas recently received a NumFOCUS grant to improve our documentation, +which we're using to write tutorial-style documentation, which should help +meet this need. + + + +![png]({{ base_url }}/static/img/blog/2019-user-survey/2019_24_0.png) + + +We also asked about specific, commonly-requested features. + + + +![png]({{ base_url }}/static/img/blog/2019-user-survey/2019_26_0.png) + + +Of these, the clear standout is "scaling" to large datasets. A couple observations: + +1. Perhaps pandas' documentation should do a better job of promoting libraries that provide scalable dataframes (like [Dask](https://dask.org), [vaex](https://dask.org), and [modin](https://modin.readthedocs.io/en/latest/)) +2. Memory efficiency (perhaps from a native string data type, fewer internal copies, etc.) is a valuable goal. + +After that, the next-most critical improvement is integer missing values. Those were actually added in [Pandas 0.24](https://pandas.pydata.org/pandas-docs/stable/whatsnew/v0.24.0.html#optional-integer-na-support), but they're not the default, and there's still some incompatibilites with the rest of pandas API. + +Pandas is a less conservative library than, say, NumPy. We're approaching 1.0, but on the way we've made many deprecations and some outright API breaking changes. Fortunately, most people are OK with the tradeoff. + + + + + + Yes 94.89% + No 5.11% + Name: Is Pandas stable enough for you?, dtype: object + + + +There's a perception (which is shared by many of the pandas maintainers) that the pandas API is too large. To measure that, we asked whether users thought that pandas' API was too large, too small, or just right. + + + +![png]({{ base_url }}/static/img/blog/2019-user-survey/2019_31_0.png) + + +Finally, we asked for an overall satisfaction with the library, from 1 (not very unsatisfied) to 5 (very satisfied). + + + +![png]({{ base_url }}/static/img/blog/2019-user-survey/2019_33_0.png) + + +Most people are very satisfied. The average response is 4.39. I look forward to tracking this number over time. + +If you're analyzing the raw data, be sure to share the results with us [@pandas_dev](https://twitter.com/pandas_dev). diff --git a/web/pandas/community/blog/extension-arrays.md b/web/pandas/community/blog/extension-arrays.md new file mode 100644 index 0000000000000..48354394c9a0a --- /dev/null +++ b/web/pandas/community/blog/extension-arrays.md @@ -0,0 +1,218 @@ +Title: pandas extension arrays +Date: 2019-01-04 + +# pandas extension arrays + +Extensibility was a major theme in pandas development over the last couple of +releases. This post introduces the pandas extension array interface: the +motivation behind it and how it might affect you as a pandas user. Finally, we +look at how extension arrays may shape the future of pandas. + +Extension Arrays are just one of the changes in pandas 0.24.0. See the +[whatsnew][whatsnew] for a full changelog. + +## The Motivation + +Pandas is built on top of NumPy. You could roughly define a Series as a wrapper +around a NumPy array, and a DataFrame as a collection of Series with a shared +index. That's not entirely correct for several reasons, but I want to focus on +the "wrapper around a NumPy array" part. It'd be more correct to say "wrapper +around an array-like object". + +Pandas mostly uses NumPy's builtin data representation; we've restricted it in +places and extended it in others. For example, pandas' early users cared greatly +about timezone-aware datetimes, which NumPy doesn't support. So pandas +internally defined a `DatetimeTZ` dtype (which mimics a NumPy dtype), and +allowed you to use that dtype in `Index`, `Series`, and as a column in a +`DataFrame`. That dtype carried around the tzinfo, but wasn't itself a valid +NumPy dtype. + +As another example, consider `Categorical`. This actually composes *two* arrays: +one for the `categories` and one for the `codes`. But it can be stored in a +`DataFrame` like any other column. + +Each of these extension types pandas added is useful on its own, but carries a +high maintenance cost. Large sections of the codebase need to be aware of how to +handle a NumPy array or one of these other kinds of special arrays. This made +adding new extension types to pandas very difficult. + +Anaconda, Inc. had a client who regularly dealt with datasets with IP addresses. +They wondered if it made sense to add an [IPArray][IPArray] to pandas. In the +end, we didn't think it passed the cost-benefit test for inclusion in pandas +*itself*, but we were interested in defining an interface for third-party +extensions to pandas. Any object implementing this interface would be allowed in +pandas. I was able to write [cyberpandas][cyberpandas] outside of pandas, but it +feels like using any other dtype built into pandas. + +## The Current State + +As of pandas 0.24.0, all of pandas' internal extension arrays (Categorical, +Datetime with Timezone, Period, Interval, and Sparse) are now built on top of +the ExtensionArray interface. Users shouldn't notice many changes. The main +thing you'll notice is that things are cast to `object` dtype in fewer places, +meaning your code will run faster and your types will be more stable. This +includes storing `Period` and `Interval` data in `Series` (which were previously +cast to object dtype). + +Additionally, we'll be able to add *new* extension arrays with relative ease. +For example, 0.24.0 (optionally) solved one of pandas longest-standing pain +points: missing values casting integer-dtype values to float. + + +```python +>>> int_ser = pd.Series([1, 2], index=[0, 2]) +>>> int_ser +0 1 +2 2 +dtype: int64 + +>>> int_ser.reindex([0, 1, 2]) +0 1.0 +1 NaN +2 2.0 +dtype: float64 +``` + +With the new [IntegerArray][IntegerArray] and nullable integer dtypes, we can +natively represent integer data with missing values. + +```python +>>> int_ser = pd.Series([1, 2], index=[0, 2], dtype=pd.Int64Dtype()) +>>> int_ser +0 1 +2 2 +dtype: Int64 + +>>> int_ser.reindex([0, 1, 2]) +0 1 +1 NaN +2 2 +dtype: Int64 +``` + +One thing it does slightly change how you should access the raw (unlabeled) +arrays stored inside a Series or Index, which is occasionally useful. Perhaps +the method you're calling only works with NumPy arrays, or perhaps you want to +disable automatic alignment. + +In the past, you'd hear things like "Use `.values` to extract the NumPy array +from a Series or DataFrame." If it were a good resource, they'd tell you that's +not *entirely* true, since there are some exceptions. I'd like to delve into +those exceptions. + +The fundamental problem with `.values` is that it serves two purposes: + +1. Extracting the array backing a Series, Index, or DataFrame +2. Converting the Series, Index, or DataFrame to a NumPy array + +As we saw above, the "array" backing a Series or Index might not be a NumPy +array, it may instead be an extension array (from pandas or a third-party +library). For example, consider `Categorical`, + +```python +>>> cat = pd.Categorical(['a', 'b', 'a'], categories=['a', 'b', 'c']) +>>> ser = pd.Series(cat) +>>> ser +0 a +1 b +2 a +dtype: category +Categories (3, object): [a, b, c] + +>>> ser.values +[a, b, a] +Categories (3, object): [a, b, c] +``` + +In this case `.values` is a Categorical, not a NumPy array. For period-dtype +data, `.values` returns a NumPy array of `Period` objects, which is expensive to +create. For timezone-aware data, `.values` converts to UTC and *drops* the +timezone info. These kind of surprises (different types, or expensive or lossy +conversions) stem from trying to shoehorn these extension arrays into a NumPy +array. But the entire point of an extension array is for representing data NumPy +*can't* natively represent. + +To solve the `.values` problem, we've split its roles into two dedicated methods: + +1. Use `.array` to get a zero-copy reference to the underlying data +2. Use `.to_numpy()` to get a (potentially expensive, lossy) NumPy array of the + data. + +So with our Categorical example, + +```python +>>> ser.array +[a, b, a] +Categories (3, object): [a, b, c] + +>>> ser.to_numpy() +array(['a', 'b', 'a'], dtype=object) +``` + +To summarize: + +- `.array` will *always* be a an ExtensionArray, and is always a zero-copy + reference back to the data. +- `.to_numpy()` is *always* a NumPy array, so you can reliably call + ndarray-specific methods on it. + +You shouldn't ever need `.values` anymore. + +## Possible Future Paths + +Extension Arrays open up quite a few exciting opportunities. Currently, pandas +represents string data using Python objects in a NumPy array, which is slow. +Libraries like [Apache Arrow][arrow] provide native support for variable-length +strings, and the [Fletcher][fletcher] library provides pandas extension arrays +for Arrow arrays. It will allow [GeoPandas][geopandas] to store geometry data +more efficiently. Pandas (or third-party libraries) will be able to support +nested data, data with units, geo data, GPU arrays. Keep an eye on the +[pandas ecosystem][eco] page, which will keep track of third-party extension +arrays. It's an exciting time for pandas development. + +## Other Thoughts + +I'd like to emphasize that this is an *interface*, and not a concrete array +implementation. We are *not* reimplementing NumPy here in pandas. Rather, this +is a way to take any array-like data structure (one or more NumPy arrays, an +Apache Arrow array, a CuPy array) and place it inside a DataFrame. I think +getting pandas out of the array business, and instead thinking about +higher-level tabular data things, is a healthy development for the project. + +This works perfectly with NumPy's [`__array_ufunc__`][ufunc] protocol and +[NEP-18][nep18]. You'll be able to use the familiar NumPy API on objects that +aren't backed by NumPy memory. + +## Upgrade + +These new goodies are all available in the recently released pandas 0.24. + +conda: + + conda install -c conda-forge pandas + +pip: + + pip install --upgrade pandas + +As always, we're happy to hear feedback on the [mailing list][ml], +[@pandas-dev][twitter], or [issue tracker][tracker]. + +Thanks to the many contributors, maintainers, and [institutional +partners][partners] involved in the pandas community. + + +[IPArray]: https://github.com/pandas-dev/pandas/issues/18767 +[cyberpandas]: https://cyberpandas.readthedocs.io +[IntegerArray]: http://pandas.pydata.org/pandas-docs/version/0.24/reference/api/pandas.arrays.IntegerArray.html +[fletcher]: https://github.com/xhochy/fletcher +[arrow]: https://arrow.apache.org +[ufunc]: https://docs.scipy.org/doc/numpy-1.13.0/neps/ufunc-overrides.html +[nep18]: https://www.numpy.org/neps/nep-0018-array-function-protocol.html +[ml]: https://mail.python.org/mailman/listinfo/pandas-dev +[twitter]: https://twitter.com/pandas_dev +[tracker]: https://github.com/pandas-dev/pandas/issues +[partners]: https://github.com/pandas-dev/pandas-governance/blob/master/people.md +[eco]: http://pandas.pydata.org/pandas-docs/stable/ecosystem.html#extension-data-types +[whatsnew]: http://pandas.pydata.org/pandas-docs/version/0.24/whatsnew/v0.24.0.html +[geopandas]: https://github.com/geopandas/geopandas diff --git a/web/pandas/community/blog.html b/web/pandas/community/blog/index.html similarity index 100% rename from web/pandas/community/blog.html rename to web/pandas/community/blog/index.html diff --git a/web/pandas/community/blog/pandas-1.0.md b/web/pandas/community/blog/pandas-1.0.md new file mode 100644 index 0000000000000..23e5cd6f5b4ed --- /dev/null +++ b/web/pandas/community/blog/pandas-1.0.md @@ -0,0 +1,31 @@ +Title: pandas 1.0 +Date: 2020-01-29 + +# pandas 1.0 + +Today pandas celebrates its 1.0.0 release. In many ways this is just a normal release with a host of new features, performance improvements, and bug fixes, which are documented in our [release notes](https://pandas.pydata.org/pandas-docs/version/1.0.0/whatsnew/v1.0.0.html). But it’s also something a bit more — a milestone for the project beyond just the commits. We wanted to take some time to reflect on where we've been and where we're going. + +## Reflections + +The world of scientific Python has changed a lot since pandas was started. In 2011, [the ecosystem was fragmented](https://wesmckinney.com/blog/a-roadmap-for-rich-scientific-data-structures-in-python/): a standard *rich* data structure for statistics and data science had yet to emerge. This echos a similar story for NumPy, which consolidated array efforts that were [previously fragmented](https://numpy.org/old_array_packages.html). + +Over the subsequent years, pandas emerged as a *de facto* standard. It’s used by data scientists and analysts and as a data structure for other libraries to build on top of. StackOverflow [cited pandas](https://stackoverflow.blog/2017/09/14/python-growing-quickly/) as one of the reasons for Python being the fastest growing major programming language. + +![Growth of pandas](https://149351115.v2.pressablecdn.com/wp-content/uploads/2017/09/related_tags_over_time-1-1000x1000.png) + +Today, the ecosystem is in another phase of exploration. +Several new DataFrame implementations are cropping up to fill needs not met by pandas. +We're [working with those projects](https://datapythonista.me/blog/dataframe-summit-at-euroscipy.html) to establish shared standards and semantics for rich data structures. + +## Community and Project Health + +This release cycle is the first to involve any kind of grant funding for pandas. [Pandas received funding](https://chanzuckerberg.com/eoss/proposals/) as part of the CZI’s [*Essential Open Source Software for Science*](https://medium.com/@cziscience/the-invisible-foundations-of-biomedicine-4ab7f8d4f5dd) [program](https://medium.com/@cziscience/the-invisible-foundations-of-biomedicine-4ab7f8d4f5dd). The pandas project relies overwhelmingly on volunteer contributors. These volunteer contributions are shepherded and augmented by some maintainers who are given time from their employers — our [institutional partners](https://github.com/pandas-dev/pandas-governance/blob/master/people.md#institutional-partners). The largest work item in our grant award was library maintenance, which specifically includes working with community members to address our large backlog of open issues and pull requests. + +While a “1.0.0” version might seem arbitrary or anti-climactic (given that pandas as a codebase is nearly 12 years old), we see it as a symbolic milestone celebrating the growth of our core developer team and depth of our contributor base. Few open source projects are ever truly “done” and pandas is no different. We recognize the essential role that pandas now occupies, and we intend to continue to evolve the project and adapt to the needs of the world’s data wranglers. + +## Going Forward + +Our [roadmap](https://pandas.pydata.org/pandas-docs/version/1.0.0/development/roadmap.html) contains an up-to-date listing of where we see the project heading over the next few years. +Needless to say, there's still plenty to do. + +Check out the [release notes](https://pandas.pydata.org/pandas-docs/version/1.0.0/whatsnew/v1.0.0.html) and visit the [installation page](https://pandas.pydata.org/pandas-docs/version/1.0.0/getting_started/install.html) for instructions on updating to pandas 1.0. diff --git a/web/pandas/config.yml b/web/pandas/config.yml index d943ad3833b52..23575cc123050 100644 --- a/web/pandas/config.yml +++ b/web/pandas/config.yml @@ -15,6 +15,7 @@ main: - toc - tables - fenced_code + - meta static: logo: /static/img/pandas_white.svg css: @@ -23,7 +24,7 @@ navbar: - name: "About us" target: - name: "About pandas" - target: /about/index.html + target: /about/ - name: "Project roadmap" target: /about/roadmap.html - name: "Team" @@ -39,7 +40,7 @@ navbar: - name: "Community" target: - name: "Blog" - target: /community/blog.html + target: /community/blog/ - name: "Ask a question (StackOverflow)" target: https://stackoverflow.com/questions/tagged/pandas - name: "Code of conduct" @@ -49,9 +50,11 @@ navbar: - name: "Contribute" target: /contribute.html blog: - num_posts: 8 + num_posts: 50 + posts_path: community/blog + author: "pandas team" + feed_name: "pandas blog" feed: - - https://dev.pandas.io/pandas-blog/feeds/all.atom.xml - https://wesmckinney.com/feeds/pandas.atom.xml - https://tomaugspurger.github.io/feed - https://jorisvandenbossche.github.io/feeds/pandas.atom.xml diff --git a/web/pandas/static/img/blog/2019-user-survey/2019_13_0.png b/web/pandas/static/img/blog/2019-user-survey/2019_13_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce2ff483f2c2ea9066d424ef16c4fa5b51173b8 GIT binary patch literal 7549 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 literal 0 HcmV?d00001 diff --git a/web/pandas/static/img/blog/2019-user-survey/2019_18_0.png b/web/pandas/static/img/blog/2019-user-survey/2019_18_0.png new file mode 100644 index 0000000000000000000000000000000000000000..63b2c93b0573d85285eaa62f2c6ee7180b4e56f3 GIT binary patch literal 10459 zcmZ{K2UHW=yKh1$N;N7)q=tlErAS91Kn4U5$_eh$1cYZW#_DASgw| z06EGL5R~H}MG%MzhZB+BYu@0w>)!S5dXKe|EM}55v%kH+U)yu%ti81WuQ)FPfe-)) z`11$^k_Nv-4sgRq&OAcvz#p8U=77@y_%G(b6)ODy!61TbC<4KEc>jfj#^QG1gZg2X z7sDI_Nny7xh4>F4-E4s`^bd*hJ=y>1GLq()U{M)u7!mK8ER|t5*c5&YJ@Sx10QwN@Ny7~%W@1D!3qf%w=2Xh`nqESDn zOie-lUMk-l2gh?mRh$3RHOst{Kh$*E{DA9$LkHv!@$+WJrksjfwsy|S`g^T4wm*7n z*SIe>q{Y4@^vTwju(2nGyDFBPBofK?dVz~5qqo`qj*{G4V@~+Pew7^Y zyOwb0+=bfN)`XcTLc74m*{`bvX0Ug~bDf0f8K+!gqeb8EC;_fEL^bygZ}a2wa zjv3*1OM^i)Fe`LVdwDyCBs@QAN&AqyVhw1ZUJ*uYA=JyO8yA4iH76wih27Pkm~Tf& ztBkg%fmO>luL4`YTZPrVQyNp@G)~o*!^lq&zs{ZtZ08%pVRq`X*>K4&FRc|YE-|`& z$)ZP>c!C7#lq)Yqh!1PekBV(*)=AXKvn-YxUOx*>7>icwxyHOhZ{=SI_Li;lw0A$4 z&le*ocEF#fm#0ZlqWz|6_;KbuBQA16gkcM|@8zNFk>iRvJR8ajSG~vRY!4CsciaA7O=Vol8x2!t;v(47=8!?FaO8R%G{__6`|6&sbBf3;i(a=xRgG z5vLI+Uc~HrWzWVN$3I>h))!eCa8D@d_v|m@psmPH#DQdyGqQ&^h?u z*GhA(DNpVm&{PPNw%HY@NzJQNCO<=5e2@_?6J+b!W`?+sGnW|u+QQxQo1S;4@x6Ky z-q?IAeT7ooBpg^Kz3F~wTi9DO0c^y2=Dyn1K;$9({xVy}_&7rn-7K*EgRLGSyvstc z4~P=fKXB2=E1m~>PhjlO=*)!pwSnuYV$%x`Vkon5%Kp_LnK=3)w|Hxyp=rWAbL@d>4g+t zyC7+Ah!M%yGaqw<;tV3ygZ%K-ZX3rW&|baU@mwAP)uQMs#PrdpY%ELT3Ibbmpqkh` z=>gT*EPm;+?(m9Mj>prb&=dElY6(J!XcW(d$M(7c-A&+T;%Ml|J&*BpGZPyDaw-o`k>$+EID2~8~w626fmLb^3H!X!ua&Oj!fd{n=<264Yh!{ zFyEZL4=?D7#8OXhrEK`E%#&+!faODdwo#%B(!SelLHaBBLt)_vRCg47`J3G`xOsnP znF!1)d9Vwp5q7M_p1z~@w{UeYKuMgMt$3)$URoKdSe1-I0Dd+jFV26)&SJ0qisrgW^dH2YIyqvHM&>8b>)ua8z zfZ8hweH*BS=7LI7`Q)cwd274X_)e?9Lge|rM>H>lm%?gCoF}3EsJ_-jo-U#NNcr*^ zuBL1q4`>N|@MQc9Qm||O4Z-`&gE^D&p)cAk$c;PTEk%>!XPICL-*jt=4*LpM0HLL` z25dJ@acKKe+P}3dyJqJd4Ry>)U);HkfHpSnL|(h!S&Mem?M0 zoxAIf#y_<5kI{kPq#lG_DoJd>z2wRGal#6!r`gwji=FAdN->C}E)k%!7acw*2yoeP z$uF-($H|ZduS$`hZyiT3RuG?VA79eE{Ml=5LU#8LZGrsK+EvK}YDE4@@*iah))#ly zn-$ms{`f7)4SCkBhv19tD9t)m)`Ntrp=}QmFW-9nZN$?$a;d8~Hv=@|xM~%Z{rQOu z>m1a7wpCYuQ1*+QR@E3MB=^jP3n;_BANum;$McJ^&DK67J2^53YuglVoEdiyiK-(f zu_Thq5uqCe1+I22C-_%Nqvwtdc@8=Ho514ZR8Dx9Z~B$Joy{8c-wHmTf21-^z~1yK ze_vfS@U?#21QsZM_nNK~ur(zp4pU_ovApq!UQSpGxQ(;x^W*VXWSIlj*^=#L?_Bn@ zwd>zrFX|2lFp2if`WV43@+j@~^i~0SfRO(eqQNsJ2+&j4B^6`?Re}3xiEd)!%X*K^`YQ28`Y+EeW zE_3AwFp9*x%`GWIh1`g3#F3DQF!)Ys;nxXKN6`+5qRgacA{-}y5w-cYY@K4RSbjf1 zT!l;nfmGGn0@oMhqR#lx?+dBajkD65XSX&AA}1 z$ADV9fM-rl?SY%~mm}+h-s(}E=hl#m08rm7t5qM+-<1U3XtRdS z$XVUE2EPcmXe^;`uW`a?@i&63MetG79^r=At`l8`U=z z%jVm`Vf50dsf4d*^6uE_fmwY{h9*eIES^;UPWk`mO7mS6;#8 z*GtZP@g(f~{G9@|x0fd2wXAhLfPif+cvJL6gT)J|3_kL8r<+Gneio& zgg@2Dc27956*Wy1Bt_723GjeuE`2N&M0so-q|ezoDF@ z+{S#}rBtLVSklM(sOR5vpG9 z8yW%RAp%#4%EPIj{`n$z(3=b5xX}8p^kbM#$#%PCB*5y zN#AZ%p0*tKUX*fVMIc43I~I49uHcJ#it~D=k@4E~hU8D*+p7?Le_LG%W$p?unQ-!} zR7XU3Uz(8cjwYagqX>j<*)ha``QGg$!ida#v?p|b%lS=j?-ukpY0}X9KFC9vN5#)6 zIpXP7;sIN?!ERMk{7qp^JjBnONJw7R63TepJt0FD50WFlBoa*0$ff=#wf#z)wn))Z zhmG_wYXJ*4M=Bu6hb3_iz16r8m94-kgDn^~b{m{64x^7G98^HHw$!=ewjL8R2NIL@1jUmOd;+W5!_rLGL1A<=7+8E(*L{MCHHf0 zby4GhqdUzC8I2mX?%)9Y5Ir0dTrS*tDb$m=Siy}F5RHCTmuRV{JrgxMD0hsvH=W9b zKx;`y2yRFOol&y7fcH2+$KRcXXI|}7fIznZBZ?-K87a@hsyeXUd?imUg`exeD&b_t+cf3F3mioa)^6nL0AlMq&{H&Gnn*I@D0xpYKBa91&Kv!*T)4{tHDUm|1SbQl^FT4 zVn7R^UnLEOz>Nem(6yo@(D=7n&;nOd@WO$%G9)3efd<-h8!Tn#IRWkEJtf*(omV>~ z(%6$R717|xq1Vs;dB3tY1r?b1OrjE}JrRs zh{;XZR9vDvTsp%aT@PyfjhKI2*EYIGFL1pacEtk2%3??{%4^h9U}EyCcu>70r)Pv!fzdcm4e~YZ zA6G~uKs&if5B1?LbseFB@KT=5Xpj#wUFfC`i)=V8o&wn1KLvh@qH9GU9^_TTWsDDJ z5HcvlK{QXt1;PTvop-&}X@v$2x+gJny`y;uYvHw4>1H(y35D;_PK@P2g#xKvGrrSb z_=kC$&mCqUnBAr7Qs`;qG)0=Nt6fz=(!)+kj}OGXIvI(GUV(dE78gaqat>R~~HbvKVI!A{94N&8KHK$`*~!tKt0OGtWvq#rL!@!-$&gdcx6CM7456i9#{?mr77U5h zL~t|*3F6!yN6_xNJ3h_}5$%XbYGH-kR6$T@eyRPl(n_p z-{}wL78DG0z)Vt28rv{{5+$t0dwaznu>|gbCvkR4I}#T{>ruC6QwN{&aM& zwdz<9@fd=?bzd#130s39{|>%inz6;j$_BQpDc6BHSWg-9LpaBo9euY{RB*H2Wrg69 zp;NxF6^+(1wccnYKn|1v%(oqLC#H~P$4~QrvX3Mb$$irVsyL3|b}L^FXu`bv=s^v& z`5aV{P=*}+d(!3{WgTHkyl4^}>AgFyu1r={;!lC^{M=|vy(e^n5uI>>@T|G?A2lQL zEUmzI`eGG?6qE~u*WnErmOuL=gLkDFPyWISSv z{1-I$OWgTyWpt!3)9J6&dAOl8_N7R#_!|NEnKp46`bcxB{xU5ICNQS&D{7ek+P4|N*A08bh;yP<1+;%L4!nhz0j zTa)`DPqQVYhJX_x9i?@Twu1h&C-P-5_&caXVQ*865`-yc$nSFB2A4{cKw0$SJrK#T zW1K^4)r`cLc)SqXy@mIh3QONa zr&6e}f4_piSN)6^?)SfFhm_EZ@|wte8M0vzAviv5En0P9oEqT*S%SLO7ilqYne^@E zGYKPSAo)b_E8{XFh4Ic{R+7=fSdL81Ocz-)kcv_BZfBJX@TnXr%4D9Q}> zeG1hRJH}(o*~>MjDiKf2*@VI6paiD;w}2S0-rlH>rdhMI-W^ml9$#w)-%ZI=|9$w0 z`;q}`Ry$*B=xxj5c)siC(*BI-zCFCpfwVCH@x5GdY`ZHy6V$Q|slln`!6&WXPrw6b zS6ZLmvV|Dbh)2J4mgSQlnFK@qTFDd6kVem1>%eG+jx{8Nv&+*t2fa^m&Rc-_?nNB86P80yb*fx6emLJj%`bUzizDs`x)$HT#~8@r#gYBz z&~`uS-@-L*wCWhStK1YF+R3lrB9NW zjx?9#h72d^O*7Ap^{3`r6<9SnvK(`aafTVrydN`eM_CQsQf6eKpB>sz)x7_@F#xre z)$kjbLy3LzIDNl?%S>q0d|B2NrV9{A6Uiv-?~$zn3b|EfELYSbCGrWpyKz@a+4_9? zMnacbkrIVN!Df8T%6;`7)`>&{{!FfpRK88&g_jkzTkr~q9at@zo$6sWRoNdKSvooT zzB(1=FUtWu`$n?#{!I^cuTjNZ`j+9g+n#wRwcnZPkJ#bO0rYs%;Nem^m?z%`{c=9! z>o7Z(KOaiAG1TTE7SrO#RsE%NEZ$gaAwcj^=t$R2R2ryT=qkD|S{_;-Mk`o%EKtP+ z>24!w)c(+17RbDZE8`&PwBCogS?|Wj45zOz7;OlHj(5wa+~Zjvd#l}bFxM^z{({D+ z1FiU_MhwrY6*UX%mnE^zjXKq$FGH_U%6x1p+eg`645;13lGcE@ON1xmD&^a z*~AWdO^=Pl$J8A2J)u1lE|>{@ZCTtaaJALP+nlTTPv))1k=iqyo}c%7Y8N(&+VzDI zY2d+@MH9XH^0evwhTC@??;ftg>dXJ&hi6Yf4PoLwOVs%88}X{nb%F?A^z;9?aJ6w3 zJ0~y6kiGHrbLpXQ)#t@eG~mbyp!9zHtpiw3uKYm@py{|mVZip^7HvZQ+0i;?@5r}t zo=PlP;5$~S?DBs=ci5P)q5zA~El!{UDCCT3M6ben>qV7yIwRyh8rP>fWBDP~-S zY{0Y!P9j1nyK>(W>4yf&aGnAZJpRrI4;Y{1*whk zaZ0>QeCi~VoCz!cdsZfU(IyL)z-D!*@)-# z8Nm`^Rimw-z`5$239T$E>7o2Iuv9_WO$cVpo$5lk?Xl(UiR_#4{?Un$MhZrglr6J zomaKAXIxUZ%zbK?PWG>JH^H{SAmRJ-$o11`Ev3%4TbZB(&Af=Nfhp}eEt5P&uRv8; zb<8hCz6iK(39l_*6WRmD4)r495PBKjmT@f|O-KbEIC68ayCOyL9lft3OBE##q5F?} z2Eh`>qe`51JYf}UqRLVQjMg)*N_$7)jZq!~#`3K501u#?v+cwr0Yf&1R?w3ibwzSD z2t>B-Z+>Ovn(V2N5p_rE_<}geb~Fp1_1*=F0eIkbXy{%IWsGv0Qi%?}X79x_d}LU3 zn18tGQ$K5JByI-|7~+*p_eMn~}M8~FM&2BWp`)T?M7Zd5Xm+#&Q>`@{2nLplYqzq8n^}xSi&U}<>+{gu6m#$Fp zKtw&EN|gB7f{66W3sWbxaoQYh-S;Dx@;7SZNl}5YU8j9(sHrRJdGPdO~SV_Sc$&FjgcH2!Pw#LN} z2=IT(4Y%U)ZC4F=1(@&NAdvC~cQSNP%}VjZ4hp&=dB_TaIM0ru2EI`)$P%y0xhK!c zeI815+gSfZZ&lYMLT91hF4Tu^%`uSWD7kN+=>`Xy?|h<;jX3_XZ0>q_+to{3d&VMu znsE2)XHgNN1}C>w$2zPLg%gZ$H;8{4JW8I`PS6hR`+mTC)AYk4caX+H=3UV{`WhH3 ztBx+^cd$2celm0A6_|?giNeEC@JgdWkitT@@rCCink_%;97Ok8RRU{YKU8c>KDso1 zAm(LIEA*F3M$)KW-b&fcCuwk}KNxqoA*sfS1Nsw&D1MYGLeE!Iga^kN?othjdbba3 zXJ&qJ_~D>LFq*QNNT2B5oX^wAX;2hF!163ermhOq77!P&_| zc$WpzT?*dk<(aayg8#`N%rJjX#q!WFh<25eG8qpKwjZEpFSmcXAO|n!)q#Jrh{)Eg zdTdUV)C|%>&Ic1@kn%0mj%!b__rpx~Pe)bbBo2=Ie(xChkqnDtnhQ?NMVGJnc)m;Syt21(kk-Ow zU?wAXHC9}IKOZk_k{Y>wbU$EUb-&7gL)SJ^Y;#E(1~=mWf&kX(lWhvHgZmc*tlV|5 zv_aa63J{+eRtvtu&T5bw!0FJVOfqc`%PL9yzShGMn(Au5?B*&2rw^Z&lCa78n`%Ms zc)AhB3c-UYXWVth}(KhYlv<@2Mu1!RvSHT5{4P362A^1G?`DFU=h=E_@Ns zFQGveJGHldjcJ{#2*UNOR%^>pBr66f*P)bto9|&5fCEDDJiYR<$Nr9FE>I)%rPmKK zix?pcP47HvbN$_!O};xY4)+)ExvwUJ^I75#(_u#5?wWyHqdGo!F9|fWN|QL2B_H_# zZa8T;_1!nxD$#I`&Pi%&k+|8wt=T@1_*i?WQoGr{sl(1-AW{ z88mq{yH(^+rQ`njk2ja#g$SGXfBmKVaoVz*XM&;o$Pd(0$BLj5Lko+UPdQn$Fans3 zjqEF1!{A@amh}Wqt4nDln?f9`*(I;SjW(DSmICs?=5%GC*c1;x)F9Q(ewy2lW371f zk!elyySz2Bux8uFdS-bADzfH0<`!wW?^!)lL-k90muggR1!8NIS?}mO%eQG(YFz8A z{GI4q?Vv4AZGyaR198zxX<_lQH52QWkgNe)jwVR9^yKwrRoa`qYme^7?!wHR7~45* z_&$3j(>!XnECu~h*o=WVKgqm>>fvytsJVGQRqio8I&2zP%Wr(fjWLtV2sYT&XYxcw zYcSo;6K=1gZoOy`6#lWQ%e=tQ-CUhwAS1UWm?@FlwhV*FZG?ABRnNF>iMl+O2##G^ zGt#|&FhW%6+7I5u=&)-QV=BOXiDsO&YWYbspu>6wW<~A zhm&`T2hS~?{Ue+)#&AO~UKw9K>0Lt~J9yJXV8gIZvz;gzp^h2vs!j2Yt1^vbFB`V&BYr2RVXf~wBMV&LBO0=ar`hwiqZ73!k~5=R{$d*5bhLmL zu>#yrInvUoqIb73y9OW8eId3Z$0L+6b2o0f{_vL}KmPiYI-J(<^n=gk4<%t`h$Z?T zZJa z=w1HjAEobDv&11G4(U7{p5}Wx^i@Z1XP|r|@Xr(N&Sms?VW#wZ)u5bG1iWYWYI#Nl z5U{NnS4bG6d`2&Z;pu`qg<)*N-Cv_n__Cje{uGeNK2Eq6R03c3CC@Od$DXT_F$+IL z@+y^SoI4r|-thLw@J-#bQ6ZCupf7;ZE^}w4dz&)N=eYrINq?8~8Ka6>wFsTG?l=uU zGL&CjLpLptO6%SnovZDnZXDOV0FeyHCz(jY6;t1I)O=op&z_0uK;@%(=fR2X5RD}glen9^66Rn%p#X&p3L)1~?O2n|{&VZR&DlDg%Z8QH8=JV7 z8en9y>*jRmjf)kopg}q`-C>ZpqcCasp3~HgP`erWQT9A6&E>~*8sM~FfccB=zx}`7 zt5JZV8+5luJ^5HfBECK?`w_>zdsKLfH>DsNOA^4am~{0HC!jrB=M41TU{)TOnT`jt*L9ej|=ySh<6rKKN%+Vy|k|@6j4?L6`*!HD7~#fLudM zk^ANYBqJ+O+pED(W)svXk&F@skKDH~zzY=~oZc})fiIZ)OeM&Yb=wqEDqFL=P(^3w zfq$KhEf7OH;5*FEccoksP^@ybgLQi2`0+`03N2T*#_7WI`*pkWQkHdklSv)bS^?aq zIPy)x%xx6g`tDQSphH2?b#%WDg_D5C}w&H7qyh)T#fTzv`TGZ{0d|>vq*wUH$dfZ*_OQ z&-*;j`&~Wl;vm0u-&PC;BM&;BIE%qx?@7kqEwYlC7I@iMa*~ex20XV#axk{||0ubZ z3wQL0#9+4V`pdv}3?{EhCM}}Ab&vXv9vBr%i3q^ZC{f{5dK5L}{DGK&h{zCnn2ElT zzLD;M;HaqZqXq{5d0(F%5oE9vipgtH837ce2 z57aw{zBcUWsK5cye3tXpNre8-5eI zg6>SpeKJnCx8MbP!;C|`R8Ze#ZjHF{j>tKlYkQbitP;aFhhI2;PE*}-r7Djx``E2&_)a|8ruSKMbRI7isSBsdR8HRr6Yl%<+; z%w~=4tkoUoS|3;Lh8rjWNntHbH%D)2%$uaiK3p{?#w=|y=Y7o74GsFe2Z--^l^_OI zJVTphz^v9P@{7f`QlE+TWT5v^qkWI&ij64maYBvD+|P@vYlb{B&>Id3m7&Wzh@cE@ zM~AO>F;BpIXtsHoqr5T(lb>EYp;UkO7Plc42m|NVfr=bwmAFUidNgspw=y3zuBl_!5%54>+s1e?uC{tTr7q;#95&7xhz`H2Rs=+Btykn zJ*Xb@qxEXA`&mI%bwdMvO`l8`tki0EeYpFU-ovSH)?HoG~KA%}4x^Y}`ds zvaF~J;JzET9UNDGEwZoo%@LL%t+!6@;-BWrL(z87AZ|@F{N1Yyw)l+(B-sZdONRx- zeN5|F*x^g(yOszRkyT^6N6stJd~%84CbDWN+Mc42OIEEYL0WNPxFY>M`=uGhNV!L+ zOz-4!pdZ8ru*v1W~taOcdZ|(dy44G>f>C>ky*EHXOwI7{SLy* zReXsc7m5y&Um6VyvM8FNuJ;|`*+bP0NRxRr+pO;B)e)uSVb#U4Oa4k_;_bg8v?4XM z#39Rihx-{QHudJZcC&{WLH(?gvi%q2Kns)P3yF+?>G&sQkq`%OhHq7td$*gka&u~m zITX2SkYaedT+g-~>3`8@T(>r}@_u}ePRNuIL4CEV@MT)p6Ro6zYj#TZQNv(F3_QV^ z%V#O3=EqHMv+~^=UA{PFWo%nVjy8r-ntNjV5SUWbqI0xQ!Tcm2P);$`duo+ z&MR3y`(Sj-e>dNRpfS9^Z4s#Q+PJYZ>A|g7!YQw(v^Bi<0u*Z?0^=hwf5&rha7IieE@s=KF0)xy&{}1c50g z4dj4vh2mT9EmK2T`yYn=$uWO_2CdH=P(Q%C46n_39dm;=dEvzZ8ffNHNe^wg`H?jN ztULfzj0O^G_b>Mm7QC@}ZwLF$5G(7nO2u5Q6`zQxLmDxm(b2aLoWn- zfcFgK(8ZH4hzv!$(>4Y?gP`SzXGO|QgvTFs7dr(FtuL_^PL+Nzjcu!1JbO5$#dr2p zL?NJ3rLz1nyOMbLGG24VgnvttZHCunXE4dqx+mv|DJ@sOE646l&r_wod8ELU9>^H= zKusn(vW!SrbEz7wcvDe*=;@v_=qwQb&D88(VfFA~-aUA_=eN%f2^HjgtIl;U3iIuNbVzp1ZAQ9%2=x+_ayT-&)5uJNMG7 zS`KWso}9s#{zf+(P;J64oAA{g`VtN`<3(amQX$@|Vu7Od5|chs;1u;_a=xA|3Gb*T z#b6Y@?zjHI&4iISeTAU$pq<_$RPf3hC8ku&t98xzm12^A7?Bb?5P}A{ZPUXaBNOtK zZBDqJuPuzy7xg|KGoWl?)1_B?zWcL(-nO*RyFU)%ScEK}A{rNaMrE$otW0*^>Y`XlX2wN;Ri9{v1Bh%iLU_`hBV z?FEN2Mt=bmwc_=@h8r^(dOR7h^<*UkKL;fOZeVfwIcG)+W?1r8$_lh==EguyXeYNP z%lqc&BO=FwrwOK=jJODAW>Vj0t;fJm`WJ08{par-&GzR4g(`QL_V7oyprDg5v5op$ zusJ`k{Ss2Ayo?o{^fh{v2wCr4j;m)Zf&2w%!Gb@Dy0SvqLFc*)&C?BTOPf~DnSI(#F$7@)6Vd7FdbWni=jp5$v0T>Mo>RQ zkoA~0y-k%2)j-{4glt0LK-RhgK5+T5~zDhAJ8>iq{8LQKe=ndykeveWVkwv^5kU}P>HDFc*De&LJ8Szz9mK_8K8JJl0V+wC(6(desp1J^>0uAl zoPDoE&;Xf=UHj|EGEGkq8#8r0@m#m&6E8As>T2wt3OA@*R3J8{*P;jihO9dm*%WE8 zm7-K^eGdsMe7-tk3Qp~B4rUu&2g=fC-Wtx)JO65X{!N(rmk1sFWk~+^38ySwN^fOA zW9~t4is10Cip0MR_E+Pk4|Uhe@7BJ0jK=1)gLjf2Okp>E!;Xyf^3xszlQDDcC*i$z>b8_Uw-=)33HiCN2gfr zkK&F#3WbYT#6a(^Wk5vaYoNzz$pKSRd4_5yX#Ebx*WWmvoqvA_?C}5L%)A=kD}{BZ z68p#%T91l)4v_I`8UBfU4BvqG*aoF7ovqgdO>W;$wEt@vxQHIqc&;r~k)H!rCX#Ac zAK9_k>~q}fm@dUNshrM4pAAG_4TGkf;P;h;%lNlH zEM4ELmhKnwrGJr3=1~ddl-d0=Ci$<^U>>ZgOX8HqngAjBBma)9 zItw-S8(xHKJ54_^W=k%=sX{aUX&2(Z^`0jGBf^~DWe?7rir9GN_lePUtPobs@}JLG zk+9EHuNK&G0ID9p1=J9`vvfR~enn>7KgyS}ffjZnBB+}jpK$NVnKdnbvJyAz6nXQ` z-ht5UNw`6mCkMJnxzGZ*g`?Ad;k*7oGUog^_qLrzrw81d)p3}dV6#; zy=ws>HdR?qbb?KpqaT$Uw#OX^Pk=jL_N`2S+a=7F2=@$=B=!C?S1;#bf|*l9a_&Yt zl5jkCXm=bH8oV)j2W>?^DtCPP9&p8mNo~i)(1n(Y7D0RZk4e`SBa1GTa-wcPyCxtJ zQ;&7Sk!1?bL9@G!ER&Mav3VA9z&UV)agV*>@%Fy83rirX15@R0j2;JP6d1}D2Y7)X z2UlP|mp6vOW=VW^Z*H#tJz|eWCiU@8!eNP`%WeIHZlFVDVPJ=66g~a=3=z`S?v+_i z*u^5TFP8`gfI?|~Ou0;}T72Iz*2g~0O6LAUwmBnn{ZEw-i+6^jhjYS#@bj=vi6F#} zCiW1YZ%&1xCoaUEg{wTr$4Un04@o$^3|dI5u6--7)MWAL7o?85cgmnNU#l$ThsB|u z1d5PZop=`L-BYV-5p8xH0CSkz!u(C;RFy-#`HAHH77|eFdHn-r_?y$ZBwJyrO-MY@1b zQRe?^D-zo>8dVGxv>N}vB}&QcFMfku5RV!B~?cg!6>DK5P(Bj#9Le=g&n3_5I zS5(4)YhIPjn-q#EUZRO?Fjm_>?1{Swdy6?2?A2vnFrQ8@E-bz&L9cr%B!+G!EuzoCbc z5^6##OrU! z?XR_-Z-=6x+@^gWes(taGr79OIuSGMe`)odK0RN-Yg-^965sQc}`mc0q;h@che%cn$risQHE=bCDR1>3wx(8TAkmVF;;kVXGm z#zGF@s_b3+F8yH2&hY|t*sWU)r42-a+i(A9^X4atskyDRnw2rvPbc>aNe345wK$%p zL%y+ovT~>0j-&>}rvE2xL;(XuYlI(d)-0pJr`DZcwVMqMZg3c({MG7#u8Xd?f7fEn}gznHa<+O!PL|}gBh7HjBC6D-BCu+jJcKe3k zmb*x~ED?x5r?aZb?>}`~J+N%axdcqaw8=KLgs*R=C)NaM3fHvxhxrqPAh#=qUR>Kf zwS?tZeiLobkl`dsL~B@$d%qSh1=M~HKNy~zXq9+&6=Sv6qM~~9OMY3|8U^)0$Iyo? zXU~-)+QuAbjnYWI{CGoGrpXXY3Kllpwbn04;JUmvGVMqoWCsY{S5+Sg?=Miy6gE|F zNVXXa{<*^Tbk(%f<&8J?A7pP%LZ0+$Zs{X8$h)Ur57y8K!8*;si_8#x#|Wy#GrEKZ zJk*MJB+cFfx2whvl?f+00P?;SriD74o4Xvjw6`KnoPliDiLyu|2;u~jWmWWVKYeHgABFQ*?7t0jvNsI^t_7* z{s8FsR>uhKW-^wk*UVgBOG??qtj=*(&!7{TUYNXBBG(VZF-QLIfE%&9bDWFsm|p1) llk^q-zP|or!8FK}0>&es5mBiEQl#gO``_oD``>fc{r7*@$y!kZ{^6G;e-9yxH2ik+sxo>npwQW&_G$f?W=OT5Zz#_t*V~^EcWx zJt1*g)aN484Dp_-YP@n!_x>L2a)!s})0PL=mpHty1T6b9&z?qCGTG4uA0z@~^JND| zgtEdb<+iq>o(+2Ss(i^huNhEL_akC3>-;>8LhtVGesp|x;1r;&tnApJ-l(XoT=VNM z|8G;{k#Yd4FRS*YQn`9O&&N}Bge07O@FA^3*3cK?rg!bBV3r0h=1cnoMy^Q_Dv_NC9c;<=( zt+|ZK0ZLK7=3~dDrj0>PBnu^altiOu(@Yh>=;T^+#xfL@L!|11O|}dL+%suX0rmRT zEAh}u<$+~QP_k_9M*&n!4Aa^fQ*Q8usD)JZOv9Wbq*U&$F|l>2w`wn2tt?zYKX63d z*3TAH0B4|yCuWS7w1swTb6ydcTH_{Zt>T4Vwm*6)5gH>8U1F%pBvv?Y+r3HZ3{1=7JezHJc+?h zb54iKf(wOm{by8rC3t zk$cFMK&Ij0<$@ZSOG=~%gCe4hVrr>OI zfmUGmu5kzx!@NtG;+o^aTTvR+{E4Mcl@?`~84hO3vr6;d6MTut> z+7tq!9CHTsm6cF}P1@GM#XX7*Q|sDuc}`hDPN^G5Qr_K?ZOpQ;QEl|j4Zuv)QPy>; zQxZ=<@>O5_m5?WaULdqVl&l=bXg|W(VYCdntizO$zL)chL7Rl+#4}2$@Vbn@x-Ov` z5yicoKZlJByd0ncsdDmhm?l!xB;C>e2>a(2-;D`Q86(05!S17)<&Io)SkiThoiIAx z^q4D95Kk$yXdXf)AzZr$HqH|?(P%$Z^u6y(Wgeo_H}dqw60sUlxHvM8r2933lUc^` z$a{yjT14M*PvyE)hSR*+6tywmz`~K}tVCj`A+sI*_&CM|`36HIl+JghSg3wapGjZ4 zi1pVabQ|vEam*d1xt`~|#QO+nLZGlgw<#Owr9g)tyv!9!sQgPs4&k$^?%yM;Z%igr z>~8<*RP90hRUw;!Pe}w#t}!!Jp$BSJ0%b`~&B=~YJX2@yjVGl<{#H@koUpnaT^mr3 z47LpB`l13>rsRk2%Gq9WDh=_v)0$J>A&-*lt_wObyyyAlD|&5?q{jw_LG|C}Zq%4F z9}g&$ZJtTM3kizEGQplpMr$V-Rve2QJp=J5UI{5mw+3?Y?@ zx7O-t8*EJ1u;LLh<`DMi_v8 zob2uL`v#;99h>u!A+;9&mR#FNJ<|vJ9;!;SR^Ut<%bD1LGd)fWvDa|x4+{mP2yw>R zW>>0uN9)EwYFrOlpzq2l(RJ)F#q`0J{Iow<)F@C17r0&(z8=}gp`IrFI@L?2O;^7pUI1U6eSK_6oX30AP=c5K zI}}FTRIC1jgAuiGgv9D^*PxF!?(Ay$*Hgmqo%dK z(Z;2hpS_Ak6FY9sw;Bc?VuEh(4%Y_&!((K2T6sW>FQm=qv?oFZlL5cp3%42Uq-7CC zZzitCu*(&fOW4>m46f)`3lJ;^C5iQdKxMMY_brcWMU>EN?}Co#RNha~62ju>ILE5d zqIz*jjm}*e-ku*OpMRv}1D6Pd4O|vYH`-0fUsVzFk}Y9jYoA*wwdg|TG1EJgXln{d zeo?NPtDeVFV}tc_$+CLLO;AxJE9G_R{HGe4X)@7Qa>BHFLp0iC$GfXE;Cv#d=~0bW z8j$nrvMI9J3kw^4j3(Dqu{bU$1K@{DvUcKk{!yAa z1w#j|)IcGB6M|ELj0pR-?coX5+vGs@;m-{NE!OT5zUjx#W@p=LU`czbWX!b*tb3^~ zJ4*`}TodYo;uYeuvLp8x9yVBGoiR1djMuKk?yzN{@)~ZY-Ym~wzKDhaiA8>{&ImL>$FE#G!`AO1M`9KM$O^Iyg<&hC~} zXDge>;Ku|0yFc=H;PJdfV2A!W-v7Uui-dMf7(q}$#!52P5$EGt^i3bybrpHJ$_u(W zzwpTv6idp^R(bP7Pzk_tJ&_O=LbsY-M8zZ#+S0gJw-BEs-Ail|%K`|^4T7Tz2^4XY z{w0N&>>%})21;G*Ir?`Ccf>xla?CB9NgDnP!yCL+Jn$75HM*P}C{CtYVofsfM23A) zFm}hB@d^5t9#~FYDEfXH5;tCD9h-hYi-4#+xB-+DcsO;`Ljw#k%E@*gv9U;!R?5k? z=MAg~0tS8O*fg!~ZHqC9=%t%f6EY`md~Y82+yV4;04oNpaB7=m^t_iPxiWp2U3A^M zJc^P-y@g}}jC(az0;PjAHJxqJZ)5haWjSfuqP`N^K48nuGLE!5o_OVnmCM8*79RiY z(|He%p2^AQIT+@p6KCzXyb<0m_ueC>m;A%tUzZ)8;@XzPyhprGS!o5JFocL++oV;r zsQ;OYXS23Egc&YxG&&k(=!2mV(}i6h)?1>L1ch_!f51LbgZ!nj3TmWNxIatAn8Y+u z?Bq$>RZ+2F$S84iW`)J^e5ZT90nNj|HT5L?(cL{l{_14c>8#rj*a!fi2Fei;#{k3a z!uYCgcw60{3})JaT8w%}!;!sD_}A}KSNobi0_devi>1^^#+m^tl|&%OA_`Ii?Peb2 zQh8%stlja-HHQ~FV&OG9I!&ag zAphvaaz|`-5Mfu!!NbF2?cVS`U|i*E1yk10RHMJ6rv zUmL$hU$Fwe#`kzuzG4k`L|4%NOq~4{rjJYvPdUR-y#}jdI8r{S1gDePDW_S$dt8dd z@1|bmMUYLc<$4<=H##SZUO2e_Zg%#;*OEemf}21bjBs@cvWXP-pQI#~It&$qBYe6H zA)HD2N)=TD=Tq>y-LT1s5lOd(f{jO2sOXek+WWJO--)=O(t*TW_+6UHKaw*Bw2w`5 zftiLQ3Ju>@DeDLPmHf|1KNWhXg$YJfpjrycbbxhlf+$x6YCVXs7s-L@1vjz&Y*n_> zu84S9enW;QxC+h0jaw@#!)eVc2>sZ~Lad5kaqkls292~@*H|b-{VZphuYDoY?91nz zr@vs{n|AR7CB%{aPflP8(pC=L<;#-iaznYDjm>(6JdeQYDTQD5@L*0pA2B360*)b4 zu{|7#C(2*j5_O_c+tL`{4EzD%)UsudiXJbl3404LCOth%CSO5caqybE1*fN;Oua_~ z;K)6^1m+N%W@<)K$4^v#xgYSgH>>TCYuyu0zg`xlP{#<`$iLhV!xRNX*K% zuL*_k`YS(E4N^tEM-?FTQzNfWK7c$BU1Uki9VI$19r&7oZCQ*< zN+5^gX+{|RD$_9{xf>ov#`1=Onxl_l4*%Xn%1f2R7p-h2iyyd@%X9~9)~hMme=Xz3 zYm@g$yBg;_4#KyEU1H?s-|$G*nUbK;prD}sp{*|uJv{W5;IQ~PUgy6yA$oOuy&-xk zjtv`{Lzg3Lt^P-y831KqH_nkE6;oLm{Zo%q`pp>8st@L^XTZa<)AunGzFgof!&549 z630lozT;T%y2$XF<@7q z)9c+}*8}X1GehiWSk_Y)jKb^~*P*bIu+ie3@ZKm9{>-J`Zdh`7dqskgRfmss+_89gJu_ZVm50v)8+&s zXuF=w_}Vevhn)2l<_kMt>B3AGxR~t=DPfbc9uJFX{Z_S4=x=bkr4tl@~BQGBBO#>a^GoKM9o%lG;ha+)+S82}Oc%ryA^E$`^y zjDFNRfhR}j`7dxG0caET74d>`WmshWq%L6$M>-EmfCGNFDHrJ{!MG0S_g)}~zS6(T zLBId~h@`u$qU!1)ug9$(9yYH!_1K~MqeQGALI>%B6|uMD4=ow-pmU+Ggxfow$({0r zlkKClTFr@_xa%^VE)s|UN%y2r(G}-7%kt=IUH5lv*m8@d+p-4 zYozEwluI1t^k9vu(_C19ImmVPh+HmB+y4Eo6#u1Si znEuMdJm}Qt12U3%S(#&e5z1<2?&09LOurYcJ;nq#pE5F!A+>X_7N;cac@$3xA#*Ti zFMtM(bqS;dy*3fLCU^@)y@o;c&B%~-^aUT%Iv5W8jU^tUMwy1uwA9w&)>U$o|NDZD3#l$V4Rp$_%!4Vy8Bk zIpmc>2^A7XhklwPRzGy zKs=DxV=^OZtlDtjlp$N)`M4cF=ugl@<{^v?N5>E=BySP89%r=Pxhz%yrhM_=0>U zCI+vSeR3ow(>xFv=BoI+r&rN2t=-?t~{i6F-oSnAXUR9K8_00 z!WFe-D=AVn^%izqo@RFWyrD0F**xZHT(Z)9plir-!yL54j_=jP(4JBqu{~*c1B)Vo z@ywXf(zzEF;H8pzi8PpxYsH))FIzZ`>bHqB_B5ejc>BYkt&FyP+O6wV;&9Fye}sU# z6ego6O6c>5dc16B_Gq`ZZMa-%v&R`mxMwky1cljnep{e-WX#oMXO}066tYbls1@2CqGT?`}aMcf41i6f`VM-Qr>z|?c{u?Z5| z=#+Q2UxRHf^fT5I3w)ZwXjDu%`IF>C6w`y5MiD-MHY@oQP*1(oX z(rYPMnXfOQz7kIf2}__YrB^<1hSH3-7a->^$6vAZ>bgcc=vk5R&oLH;&xry}4C@^RffP&fiIHIIU?u6|p zkIEZjR?AjuG%-f)=h%C~pH*=9;&4JxFo!%RpES--4qlQ%l&?`x3FyG(jhy3%H&^{V zK+>&<8iKh$G3i{|Ea*iOSu~BAhlzkd&W?3IC6s-gXIP2}ZRk2XXy33lz(`NCYZhi0 zq?d2yQQt$VM{*TIU57VEW6t-PYe4nMwe|s@6l&OxJ3ojPeP_iGr;W=)!SR$KG7btR zuC`bRcB%C#YD4vz{m+^OE`IP0mBH-p%`*t@q>eqH2YaD)NZ5yy=G9$hhMVgC0{(#n z&9j1|1kkaz>cgF#)E*z^cI28N|`dq$lHCCW@k0sI^lKpUT=Ghc4L=< zmi0Mgd39$s%uzNDe=C6_CMILIFmAb1J0-)3V@`^6tctVIY~Fesx!y>VV1lvn8hg_teu2VGTYv5z~*7jd&*ad(z%nPw6{E~qYLBAl-m-1&uSwP5Ua zo(bX6)#C3ZE{^bp7RBz^%(A%Masy>6P>G!hp^u6kSkofn11@ng_Nyuy$aRy_5YDQW zpWw7d<(K%mb(q46SV(>)^O;#B!9r?=8T%%o4K(qtKejW*v)AkauH2MiN`H)A8n2(K zwAm?X)F{bF8nJr#)fHJ&$6PkNWgT=fKQ&JO_}0u6>B58ky}$#^{gKJ8y6H=5%y~+d zb>OI2I<10ii z#h*;LWw|Na{;cLz7z233Uj5hRyWCLui)Fc?(E`@Dta5?>F(UlP1avq`JIxRU)eJ|f zVni8=LmDy zjACFEVR*`jQHw9VLZh0}B52fQTo2n?G9F|wYrh$SHGRiB8jJLCktPfQs2CAG;MUsR zeF`rnWFr8bLUAH$aFP4fk?&+M90(b53hi=;+hxMucuIJ{=nwWc>}#AHh%;ERV>Et$ zL3@kGYUWG(?@<5Dl?`vibFzb+^1Z~!LFyugmkqlt$vVJ;m{V>|STZkJkM@R}S$S~e z5YqS#B@@6p^UmcCe(tK|tXKG;j)A$ZrPv47X!j#scoOB$^7W@(cY@muY7g8l%&4^%7&S(%rPhKug;%hOhq7{Bt7Y`Ft2e8l)Rb!m zu1!9_ERPZYKNu-pIl&w5CD7>OWU?b>LIS2c06$QP;2ju&nbzRFJ+8j>i9G@GBmY=g zE1%e(+U39HSpV#T+Y7DbFUrcw9<;mQ0ap;?A5P$LtnR*EFP41UW@68OXpdO;1fQmnlEJ%@p z9keYOfnWeOA>C@#H`2pnuqn^U&TACr2kt->Zw&@{=QZYT5W%NgBno50(?_`s*6Ty`|c$*w$} z-8Z%NNY7JYb|;eMhzh~`)%r2ABIzCqP0TG?1!_} z3#gxKUCw`>BA{-;Agj*o8r|J4?9Jmgj)$>s+e+R6SJsL!?{>w(PhtG)3lw2sjxRz+ zEY;yv{oZ#v7!KrhG72}(m&fC@4?T*gM79@gwj(Nwzw=l;8w}jP==tqh_-!vc!rs?A zIyW3zTcdc#1kr^62P9UL^XdRPspLF<&qLIEoiSL2jS!pEr_cYvF%n+^gm*b%h-k70*EWCDjfs zHyu$5h-l-?WO*34y;4fw;`aA(sIYfJFKI3knJjYbg@x2xo)QaX9syU+4f5%&DN#K> z2xRu7;4b`CLUW3%ZQMJIyWWK}LypKo4(&fOc5E>u^{V3-@zNmKgL7i&rx4thBQjbx z(p5rvHBe8Ht#K4*vf2jI;!L@Fm}^d}{~rG{8%_0zGCd3GX|hLWc>*u35+BYNr1H#m z6mV*1gtuIjE=w1}ts)F{go?haCRkbsRkuydP@d4VUJ9Zs5h1C(JbqYOU^F$Nb)h|N z@CVYxH`ad*$(Mqcc#=5B=%^e$?NnseN@&AW|H4*STwnPyfF6KWQqgKnksbCFT9B#6 zdg~LKvkHbzR`ep5F%v};JH9c(noHTnRw)iniUz7;Q-vPqLU1C2&l+zojqMeMrQf5u z3+B?S%Q>_bjm0qEj(T&5Z5t7a$3zW?yQkLDs0obk92Wv~;hy(NeXHBF1G9UW6)V#< z=CGJd@IHjz>3FXZqSw~p(2j!{WPEJJhabI!(F#DX(a6z*ksP7a45jp6Ab$DV zX`7YSPAtwjdD4rOExS`TDv_>rcI8r$>mLo|B1uhINn)$)OjC)$pls9KNe&xat zD1|gbh9I9=I;TXIeI~i74$FQYyyN9peUxdhdnQcOsp}oAQ{S>Q4j?OAZm81n%oEig z=X_}qJ3j+DDpxgB>lX6U=ou#(D|=e0VWp*Fbt`TzS9^6jXj^0P4~O=&%^A}*u+_HW z(O~1N-a#EjO^R=5*?*^g|4s?4vC+}KLF)4OV zvv%D-tMs5gHqsi_Rh4nhI9eg~sl_k>lrUSZNW)_q#u+OC52+yJo3@fgE$fSp(@dGu zJ`h4|da4?JX)WfBiLH`yO&yM8z})KwlQvnJnj#;Jgg#-#c%0Zo2MLx>0SzP%d5ioE zGl2m=u-}C9!pPu?#DUh z2Y;$D^S$BJ)?R23)%0ahu1l_xF8Owl@8@6*5A zW(Gf^3IAXRr`vn~Hx);bH=#Y?esK}@7f0~-fc+u%C;HG2B=-K{K+`M1Fxb%(-!?dX zB6gR3P&>rPIm9ji7ZQH$)^(WQwUEG@0UUT4Fu-wMVD_^Tz#2gJK%d%16)JCgfBvPG=s zxrJG;?aS|UOS<)j&KKy#PxSP7UvZhdsI~?QpzUmqU%ogaRgdM-FzVGsFgc@R<9ez? zn%sP+wDPLA+B_;Z#)6a2f6VU7_FdTMQT;d;C5u*3Q>%%7_I41Sos)BAUi)@lPR{kN z-^Y7;6x6IHaX4H~(5j}I+N;F$diHr-eoL=T4mp)(S>R^^G_`X29m`t3mz+}Jhv7+E z|Ka4giRm^_;P(PEG0`<$ciRIAv}diiD?W4GJWs2bo$(tw0=6l$0vxXM4a@32Zv28~ zmXfrqo=nrahTe7B>7#<8vAYd-yq-qcG(9KZAL9g115HMBsjFxDUe2&b>zpK{n7f?3 zK*vEY&})b5+0QTMYkmzu-i75MDv>Xmzst_}{rB-_p^H@0A!PryJEZLy>o97F zW|q)ncc^c-UV*Q(FcC}YRb)}gq_p+Nb0C7AUgxmwdrVWtIaVocS^=ZQV`B#Me~El0FR+V%yV z{r4Klh8FY*OTE4r$t1JN4HHa^L`HZP&4O->-{S@|&0Uns51i?hFf@}!+Va7+a9KPu zWtMSD2h=!{NLqv)LaW`|NeIhWEPXy_vq>dhCBh*AVqBTOtF1DFm*MzOx%1QBYuk)V z1Vi{d@(E#T=y0%J=Z`;!^!S)n#~jNRM=6_)oo*1)J~JZNz`1pwTsyzfo@sv|#V~uw z7bqI&tkxX!fccY;1VaF#*alrhCc-l9*5iB_7Z~%Fv``rp!4b|ah2`40BdC>QfdZY4 zm0L%asicULf|+7FFmXhr?ZIwchXAo(W_wdd<#2Z4P$l<1U&4KPhBCAONkQ?D189&x z*2uqw!>%I?5Q#}73M5UWq96N2K2YX=)yA>Q|H)`YC?=15hhRt8lYPCBDzqaG&xhZH z>49Ttv|J^%fWA^$61-bnIBN*Ewrv@@hcHa11(^zKz z;-9={Csyrb#3XPx$_BF(?{Iy(?912N*cK7g0a>twZ>H6NNADzR7Te*As@6s?%KNqJ zqW$AZr}*PELCMPeKRWgZ!T2Tm8GCEN*`-~K!S}^VbHyJ9?Iqf}cng5HUsHnAP9vYF475m_c3??@3DV|K5#j5{8XoO#`h z7KZ)o=JfkqZ86ga?DsAQl7!yk+gBiI`d4vSe%4U4om*;KOi;f2Y&gvDKFOv$QQ4J^ zLFHQT5xdTTwJy|(N}zIQ>#_mA1bHrPQ;qV$Np`ZT%RuLP? z^7=VE&gDSMQ){xZDk1@W1(8~;R?l&|_^}glGh-||uE1O0QuVo0$!DZr;?Cg&{Kq7; z*WS9bGCJ(0SCL{_vTN{>^GSM@6v3FdU&4(iE{7`F>b{Z%7j4aE&n1m%`3I%se&MgW zJ{Ysjms)s-)L@7L`fDorLMYs zh2Ji9jUKbzEVC$VD1_>x=nNx@K$=I>=5`T({MsZfMrv6S@GahXQuMG6;E!J6z&wQy^iwREtcJJA5z^@_A?;hm#|ClbtG?LWvv-k|#7%cO{6i{7*g#6Z<8Y$@DKP{PmZM9}GpUOiop%%beJ{VYJj{ zc^#L@2f)`;NG2}Tea?&&R1h$0lqr5HPD-2GS-MwyM6O37K+V<9bS#5;>9VC|d8H;s zG}r&_O;|qXZfCqMAN&5*xumLtOzQ-zitPt$bD#5|8veKsRfsLe;k(|7AMn9!+R_s- zpa5$dMzu+_n_B}dR zx0Ri7Lq}o*GD^pVmZ^@8h z^bB-8KmEDCoU%}9fm*T09$WYn<}|qP$m0HXf#qlyT|WcV2-gLAmZT*hF?ZDNu`&Gw zFl!nK+cH=-VswKQw(mcyClo2NmT7&*fs>L+h>w)C$vdF2X{5|Tb2~W-qpyIkr%m~T zQb6uGmOCJB^?}Xe&a#H=4+JuJO?6D^ApoCglUhc(JnQ*D(HYRdbz+6TKi_so3lNfE zsRGibI+6>zS8R*ymz02ZrCv9CrkE1T4A_J@nawG&Rzs|Creo5Bc?$S$+hgH?kel+P zV@GYMj#fYY_LNdaN@|F^PS#P3gOXz`@8^u|6;VJpvvB7MxLv;*`U4KPfI?Xs5F}YX zS_~Y+75V~s5Nhdl?AN&e7R*Co!4M&so5_dlg83ry5CEqpY}`C8 zkV;RsyjJ@VT9n9n_ym1*A1dl!Rq=$s5&p!h$9wbe&0~5tI#xyNYd%m`|LQh$32Jhf zeI%|z9oUz+P&x1s&Df$XxG`pE(E@=%E|bl)gXICL7=F)?_=>(7#%c-SZbRm$z0^W} z)H)R)&ulvRsVLL%NTQ;?(=a8t4Y_P8Cyq!|D!4xdGogH_mEU`+zCMFevvYy z-}5;B-8)crTnxk&e~5=D`~f|82s@JSby%Tgs3R<{qJO9m8bnniwz9}8Pz59pJs?HU z>^I+%vU$$pl>&XRKa)rK|U2p{fO)74WFe&STI`&kH4!gDmHhm~v_Sp1pzGWMfj5w9)q%wAh1n z?JC7U#X#Laoz7#%9}1&dBl42WZLJy8P$;Vr=}hHcvP7+%?mYHeap<~(Hz`-P7-uhy1Y_h_#L{<-P8UXtLrTU<}iGjH04b>||-U9&Nc3%25b z_|0EqPZD29mdoP36G~=e{Sx5`X`BB+(|g9bA&rbOA3KuJVE5Gzif29M0Cejmif?4> zY)2vP%hkXgq->+B_<(WS#K-dSUxgS^7nVrbgOd>w%u@^-z{7OMjBeHYxh~sFu8`Ju zkHCov66-8~0N)5xSF1@LE}juZtr7YOjgL$+vDW z>BV2b=>KjF{~8L5B|Q$`7*e{!#p5+MFt|O{oRzaVrelWCwT1ltvuP7yU_Vl=vNEG)5zzs4oQ#dLrZl(^H&@Dk6kgI^dASeD` z;OSyV9|ae!L))*+UjW+_@Mc09?%7{<9+K}#`eE=qY%mwio}0qpbIFZhvV3g~Ml_&; ztczKYV)v>?F{0qyvGkB&xj1J!E7WV-Uv^Q=cC-oHmt(^b?jQ6gU7<$|8ox~J?#(nAijgv0)b-KactND`8o{S$Du3(qLYZJS@k}(f3RvzC* z)+JcpC=gIno5!Nwe&nv=5QMq$g>d5#mk4k1I{}3L{?#_9ho&cz&9!bi-wmfyK7sEas=H)9;dCcZ)xC6HfN8wj;9!o*EvD;P}LO z^Oyo6*?Rmnr*%!uQFoQS9A^=e#7Iz zg}3mzw#vHjv3ydtWQlm^)1A!H-Y8qlcWAF?WFE=#th%HGuTs$jvg*T-C7RY7@d(<$ zP%Lzo5er<#4EWfMXPIsz0`*j?Xng?4Yx&BxSknVG3G=u7P(vJ+U|Iq-#8}E+H@4#_ z4D>hM%W)Zt^^EK>o!9SIl|sy#>fC33k3;u1pWDkfPCM&+MgVo6*a@DtaqF?)RynKa zfrxgX%R=uVe?{%E;Juv7r8QcCq1b1zLQuWV@e;mxy1|8=7SCeF3R==_AZ1zO3E{fH zA`0cYP2%wY-^Xo)G}Ox8=FQYe?we_j>}l1XgZ80rG}8eHx9Q=9wVc759%|ui;XRHD z0OX3&855<$ocU)^0z)Lc0K=0Z4K5~<#5LY($*IERpB}WdxVyxb(e@qjMTST!(wm6S zxSw*mbi8ONfplNSc*V5TAOMFO;uYPXdS$_VupOUESK}cYm~4)LII41B+wr zG;ZcnU;4TLx(wuzbz(3vDt@|08;)$93k;H*=V^IxVlxa{^!qdnXKCxp7|euPCpEN7 zmG~s!gMmELxuY#Ys5sbbt}y(I>TwL(-8^WIx1lAYdH6H?86Sq;v(~us;5#%eoSK?% z0q>dHCLQU}Z4FHxZl!efqY*#(UAAztc2bqz7cqLSAnsjA{sz+QvT`_D*K%~} z$Y&Hv9wREnDucv{(~^6l*?boMmxhZkC;m_m+dq!_ARCNkh5_Tqbh`ci3C1f(6B-34 z&4Oafc)I;l$_STa7eCZHpWM4$XTM;a(5Kvk+&^qFM@)X>FE(lHJKb@>8)zk4BGf4 zx9qj|{@aN9C*u7ldp!sUo)7sGq)U38*v0Df%D<1U#;CW0s?K-PX9TXO?MD5G(|9_` z_5T6&|8QY{!Nf-;1AucZKFWqaSeULJDJc@wK(^D}(H6Z(R{>&NU9IVoVA!X3pV(QT z|J-~MvSmnsk>m{|;g@p!1>1VwlpBL;$9~kj?KFI!RLSmKtrC9k>Cw56{JSvYG{X-6 z)s!*!k_(8zOknVt6iTqV3OaOtHQ@*7GzyTn@1*=5}kCQzYD1|7y3#@Tib zU$%M?!-GhMaUr;=k*Azs2N}s~!rJ;79-R5&C|$TXccK5qxcxIIBrzU3e#&t#&sX;9Jh{!1vQo`%Z@;GTk18smJ^7h&68=||YkrKpK$qj^N3Q4$s z#p6E7$@LAzhBbSW(MEC>LG{5a&0P#TBhRWJvw3eiC2X*1a!w|dvS$0r09;I0&qJSE z8nLiwMuZ!61f#0+nUBf0eqH9eoC7?)-9u`SL35dOFmTD^n1KnyBW+w#9Cd%sC3uD_HTq>T0KOt?f$5yqZlVcq=oGvGpmXr>QHoyc$ zP}ZhG?h<#0BGk~2LwfQ(OmMi--*3$nxN+s9P&H*Qr4c4@Qz3+2k#X;!Ke9~{Uv3}n z3d}nW=D?zrCXOz0MsuA-pN1;~WAcMLM^p^Zr;*l<#aV0}g%tx$L%jHy7|(XcFB_T+ zUof&bOe>29sO>0lMN&SPJ&rY~Ri#JD6$reCXH0E-0M$Ix8NV4ccj@M*_}Qx|ya@yEgBQs=kw`4C0xkwC7%GS`_Himc39>^A!~P_e08{n{>E*1HoPNJZ67S!}rJ1`d``N#s7dd zz!o|F4|^q?JCz@NEn8kBhmYVEpT5bqA_^w%#&DbIG)PRVs?}6X&rGPga~mk*pIGU2 z1wjPTmcQ^9(L*%3+hvU5dpV1ALK&2;MApwFN^rdI{yrtm#~q*qY>3 zcn`epL5Sy#;3o1sX2W7<*Nv_R)L{0Wt67!iiEb9@|Cj>1i=5m*bWSItOW*e2P#oW}xj z8eR#{G85uStnkOugZSZ5bcF=jwFMa^4rA)`W}=p*)W3hU zE&ugkf7{N6%+J9-w_?g+IJ@X4Jx3TnlN##pjI{}kpc+I*VA;n};UU;@9Io!xmi$Gh zi(n=e+eh0CfDW)7(mD?(Hj&{b9hwV%Wf|QYPCw=5)E2g%Q1_mPE3?rbjSsnghdgB_ zl$ptwx&Dxh2Vct%%QuRSxX~?uC_v~O{waA9{Aj)%cw_zsFlG9R+bkD@|CW*tN^-GE z_(Jj(Fm|+&3ib57)bne*!R8TCZ$w9qjntRC1e=foh$xeeC-@sJne3(vrK++Ju5baX z0EQq`zNc3bdC*KRKp6f<>e&JZocU;0G~=>oGwBd8KTKk2Ga5A4**SYQCJL!QR6Be%M*R>-5fF2D0J6yJ)Jn-m>^H%MQ#5J5&Ccjjo}a+71N zL1h|a&3~5Gp)M~R&T{Rys8a%{bo!wPZ_o2fZH&1|o9;9kSCzgIdJ+}^GGkw5leC{3 z?@bW)2#=t{>T0^4IGkv=#F9fkd4b)t2@tx8qL}jZ;?hkvgFuRd1Ip#%lXox0aBt}@ zOEPW&zVLLSKE^NI>xvV-j@1^vL~4*+sJF}0@xkHznC!`v-0Blfc)O&^*3}}ur`JLv z3>!}__KitjUxLcPOvGmWM^DzB8y?(Y_eq_g6pU)r!D1nUoXlOM9SnJ#kG;!ZtUant z(J#ne>aBKu8MY;G21kyHbVzjqOl_OzL)AVMB~ddKe94Y(C@Id{2J5g8Sv0p~($Q-IJ*{_DoOLpJcD{CFV zcUx(bzr{>Qqq#Eo3!Bfmzp$Dd$_Yb?#gjNuD_qOcjGC(=cFouh4n}7wvkxKBziP?| zrmV_8RypJBLC48U)4#-%s1jb0F76g9#_i{mMu$lxNqlJe`XNsb#?_|VjLF6tn;ygN&D)(W(Wn!2XgQ|M}GO6KeEN3)dgnW5`>GT&3cGGK_ z9^xkF%Z_}YUwVZ*fs{I+5*H_1BE9Uxm?1?_^gi7nw;6XF@q9?$APN%~nzYGQ=UDwv z4NBFLo?4OYBRQhRmT1Q~1SMF%u6E^nyb!zX>f>_g<`tJIbcRN5oI~+2z0b$)_RwAy z?X(fIO%CmE+Q~CIoIr{=Bgh?{=ruRx?x&bFH@|Fye34Q z?Q<(!DU_YuEJR!i=|JA^Mn{`}zVSQLIk?D$pp-Zf6?KQQMc)r1$2hx;r4AP4&~4%< zS1i^rVXC_t6~xao;snf_%{g4*;^p}GMyB#Ti7gaaMZvg{d^Ybc?Ot^1?uYL+3PlJ- zq%#Xgs`)ozOB`Zci?D5S)8j4Lo*~=yWmF`$pW1tu&WwGp;E9VAdG|0z6xL%JQ-Iu6 z$%s3YjnG55aX(9c*-YIqp?~2E4HX|7Svm)OGG6eV>qoLw>sR;tWh$>7MA`r0eT}{Q z`!zcMS?q=opjGC28{1hrwp^6J*5I+*l|S5(V1BJg?)>J!`3i!`R#Tn31hTy3M!LFY z#)K>jSu)AiGtGAt0mFNyP3H6sQ0zg7!*+_RG(3hF1a^g5F7-^lSC&$(xqB9G!cb>S zqgGnT2K*jhwZB6fn{5jPiY-NR{-Cdm)J0gsH(^oOj@zKsqb>g*Q(DSjv0)FFNI2nbkzea3&y1zbCT*G(h}bG%s4XDSLAO=Dw8E0@D3z|rirlOz; zO-cfx#X-dgf`TDHNKtwV5d;DW@H;qnd&~3O&s(nR_s^@BS2#)B`<%VkUi-V&`fP5T zakiJ+qOt`90?8pxoj3;qL9ieY^n$b$@Qy3fn*qE?T>Tm0Dh>QemJa+KxR!}N<#81R zlHIZS58T5}6$5XYqfcHypN|SgV=l%7flwFG(GgMTh|o)W;(}tXhDJpi8yFcF>Fv3U zMn@krH2ml122n8~hTDP_l|i6AAjFBET;ua+*hx+5u_<#KOfSeU`+jveeebxfxCBw|}};yW90uqAR4Qr0`4gxyewMli{ROyI#v?{Q=23xMknl&-SlDe|Wz-v1jPS zzMpZwoH+5rEln{U54^%c>RKc@M(mtAWu&=cm zKSar&G$x2gxAi4O<8@pXW1jwG72X{JUnwP*yOZ0w@{VcGGJOam9f-oafzJ4FJN@yu z@HtQR*YL1hP{l(yxCN42M~st*lQ4x?A9+n0)Qo@f@)@zUk{IRq^;pTtW9Qd74%ODt zmV$X=;%-3%?@y#pB+?3l%>Fn7DLVtHe~j-`8k=u7+L<#ivCUlR5ct!FZ&g-lHf*EC zTf{-hcyQG^?VF!F!vML6=9$s*O7_~7Yinb5BMo`$#8tK9NGpjZsQHidH|5MPJNIW2 z@(TjHO~pO%Z0!|aQC!^>-3|Zga?kvcB7&u&a3^nK2{m&7;p`Z5oYab$9;F_mhuF82 zlYL3c6G${WP)txc^<;RI`G%cm&j$6uT{1NH&+etcZ*qF|YBKm^pM~v?bO*skQ!~QJ4wopr)<>#Mz=| zY`3xtZDk3A7AgH`quRf-e}{0l;Fa5YBySFh3B7YVQE)>$5X%SRImuzysoiAb5tJx3~lChoj z(sH%=>lL0AD!%ewig{R}m3@|E1f=tFo1v7m<^?_q%8CI+JKy|D!6kVPtkSe-Wo~mO zw2<}-;~x7(yUio~MIoTP+Ryqpt>c5?N$+XmVMfv}K_zt2wBSc=jWv$yg8A3a0Z5H+ z&#YjDGTtxp*No!Jie$udAKNi`sc=Dsso0M;45KjH2fyar={=cJ2V)<=-t;Q{D20}J z)l6HX$&@oMCoq$&esm(2G`*b_q(%8`Mr%L`!+1F2 z>Kxp?*JQ{3E)ua3j8Fc}0I_;7+5zd)Hzl@?zKGOEEjojJFChJ#n8o$5=>1hYqpz^u zu(5OGHOh9M$7YG5bv?TA#EvHzu;HWdSIZFjuvm@9tT|AW)BGQ%P5SHu4;yv*VcG5s zl>V45D~<~raz)yN#kPQM4dj`>TbRV}BTk9oUhsh@#8hkNH76VaKXWSkmO>%*XeBZA zSk;iBJEM(OfH1f`>H;m4&u1=uPDImJFL$fnkQG`+yQ<0yToAsevOA-o5hibd@oZEP zMpHSQ8q(BbxJyx>qi$mUskYia$~ZzE%(2U^wWbgwB~8O-RnS&g9Z<$mheOq?OHDZy zrRya0Y*XJ3z=QCQQKKR=PF2hJxOB*&HG{8}_L-?Yw*y9U@T06_wM7-ii=Q`%&&*sr zo|O8#kuNuHQ1I!>7`uj;YWlKzqmgJQzk1!i4~bM5|Hv%7-SYC=TcM%OmSmbD4vL$D zhPWc1h6lM2iLD--PGqb}bS%CbYV+6uq*+|>F2P8UPh3UfWj&S>Z;#_}pN*EkZd-#! z|AcJbM_1EGNf{1YLSe&6Q%4EUEc%@O^s{H$HhMXTqk?DFOoE$wL_rLy-lxm|1#_=bGOKpI*~JIa>a`QBV}9<>&y9G?hMOFt0vsbatMy z&lk^MCEuQKp7yo0E9k)4I93O-u2%*P#N~r$nD6W=4tRjn?v7AEgY#)2(YV z;=qy0IU8w|#A&U8`xW-Hg<0a+6U*hPK|>&Mq{F+17PpUPeXN{3iKh3QI=o7dN!+;n zmBUF_D169yO(P8^Me9<}yY0Wyb$ULZ+_gv$bIcbuLRC}Q&lb51JXI0AUzGMO?zV>^ z+b}T=iQJGn$g(eaJu!UNFhR!wsWVT{G%>LJ18XVllz4Ql2E z{7+QM04Bv>weI)QCiq+ZubdDn^Qs>g5sP-+ojpD zM;hy9SN0r=I!apICcwen4_)aVo$-6@FFu z{$d2a4@XSp)~%}0QkDivyR4RnM&0i}c}~d8r7xZCIig(i-jkFBN}DGXIbx*oM-GtP z@qKVxClI02F~*ac*W*_-a&%T9x!WNoAc<4PaKZ-=^bnZylRnp#^WcbcesYa4K>)1* zS+|pI^VrX2dAwDY7-mmRyJ+*6k)q5_xqx}nm@#$5_Kp)E2D8(%Kx8je^Id+Qu`45L z(B{`U`{nN8+VM4(AeBaEG;Gbu4Q$Fgh6vI-V5}a5U6%20T%IUL6!!hGBvk?Jf{fKwC(v?HLOtHYrEs1VHVNju zYxCa!*ec3+$c5zN1ED-^-Ztu!1qXz@WF%NVBDNd6B$)+j4T}X-@sZc*4?u2=Oxlo< z_N6BE};EF=(~`ZM3BRe9&X z%<=!hMXnJWe3?yVeb#ZoNQY;hwAVbs-g^q4Nc+o_{<5LJwg26&1P?|tKgV{2S3X(- zX#-lEfv9k-uF6Cejx@o|$m8!l6Yy$zfe8F-M4WnX1n@*Db;q2+t)Yq-rDS(fszuc-ZKlR67r2X(4XYtP>WoBs=xS0UJh{(Tn{s^&D7j7)cY_$c zTvH8yLtd@hDBOR;w8>Ak)QQ{3$c7_&eo%>1;MwC^r8FXky+Af3B8(+O(M(bCsysKW z=^Dpv<1D_@rTP&4&!-OA^2TupPpwU-Crs7AD^(&wUguSNI6|=z;s(4+}Qvpn+dw$4ign$ zEgoeSfg(P>R(R*vzm*6+ylD% zFD~F*gccUD+p)wEu(9wKnGNY<^mN)ztUe(^>WR~!M1Szx%??AQvoJb$TR|LoOXUl% zswD*DG@W!MV0iKAfqzO=5v`??_2^#2sbSIq!2aNJAD{3gy^)$O^WOelJWFKk{M|1= z`#pCZ4}u-%6L<$`nKaw-deC==Q`h-q$8mpys;fxGp=-dM_XwPp(m<8q)TA67@I0Z5 zIS~rHELtqW0H&dIpp0mve0tMOt304aq*pVc#TmsS zKblC#h?|IB-o^n7;R0J;2y)S%6r)<@wCRan=6V8OI0$*O%*-Hfj- zc`#FnRq)8nbY*noy+M|+?*=QG4;U-KX8)zi( z;WZJDsmA})pcyvc{>PcEJIybhG(7?IMKB%+2ZbOR{(oXF;VCXhY?1m>g;sVePBcE? z!xWkl@td|Cs^vt63Hb0zmulanCXLE&U|o6YI+=o#_ebxE)`^C(O%h=We>1^A7jUaW zjyrN01RqcnhEQJt`6ER5J^B*J`YL<{`ixj~_|0Mp@Sf+wW((f<_jY!k3cSE11z<0& zmCB9Sv3!x&1NVy@u9RB8Vh&`Z;GsF%Nji541U-qRu#=T##OZX!tj#qL)KhxJ>(7uL zU<7Kj@@7o1o2}aa$KLPXebTwPE3mX1_RwPy6;AVHx0VF_0)D8!&@6lu5fg#eLhRNV zh`q46G8YF9C4n?0)``S8sU?uSL$z_VMAbte<+Qu@3N{;TL2ggx)&J|RaEG|+tGX^3 zZB->#r5SyW6t|-)O_ify-f%1%Y)pu-D%;#0SHtSOp*ex_Kt{@f=7x;5&qM!Xb0hmv3qY!dUZi;+AK-JbaPre#on&Fn*awP068ihzFkE zziOP`Ab?NzYNeIBGTc4CW)LELkeJ%@O_;iQ77hgqE@Hm}Ji)QZf8BX9$27+(vCw>w zw;xhdIS0M_P^DZqv`g(roBw{NoB=0m2&8yZaCdU`1~hq_@EqP2=Y@r`YOi8ba9XrV ztZll|rrwN_(+8IkqoB$m^PGTBhP>%ex}FT}y^7e2fJ`%2C9Yb@Y~ zzx(8Km47`I*hU@M1Wd82wM>87L-ELzw^XNN^KuaQcKH zsV10kkKif%I)nm(k*CH%B8UUl4}9G*NUu>nb>7t=vVih8xr#q>;=8=58+IH_x# zGcCISv{!rU|CdSgCKD!-&5(>JtRY0?baivzoz8bhTKcPTc_ePe4I1ma-G;a#Z8Bfkx8^oF3g%K>B$Mm2dY%sfmk08!X>YV*N&GHVbu{Ma!b~d>qlBmq!PmG4 zDeKm^Y#6_+b=PUIrc07^3va+zSa7DcNB+n=c-o=&Uxz5aEG|3F4_$oS+xOx;%gh~~ z@J?dUIbtK@C}VnK7VhUb-v+;l&nJvLAO6(*#Ht%H-zxQPT>EI87BlT4zFqwEXFNqG z;m>z^S5f{+K}jYz;v*_G8ogPhy&j~U$9Z60CW7pZOIRvxWDNa^FEg^a3x0z-gR{li zR1y`Pf`4ios(^Qc*OmI~h=npuO7*c9rd9D)xJRbX&~q<)iBki}#kReb(`WG#=FoaT zKb%80g42LR9FemXOH>(9yo$9~`9$=*fQ%~mBH+lEG32IV`h5p{o$9P!G*>r!dLZli ztg)gA&eo0oH(W`zf%I|EIP@k?k`{-Cy>r27g54o5%5_aUaV}6U*cxKFU8om*G+MIC zk3`Xlj#JgB>Ilc_T6wmc{3f~NDb`%gD<%kuY|>*O?{`GD3@8E{8!i1$Y$ zlbpz5qlQtH3%h7$6Ds$Q(hATUHVImSU(T|kfh;cWYxtn0i^RI0SGx%zLmL?=d3;7nJJw6i91mNBzUhX7X)6sG5m$r|#PN=4k)9^lpjRKFbJ; zk|-6vzoJ=%U_H;flW3eOm%~iwN+-uAMD>`?M))_IuDj5tSpr9@)cB2Jj^i*R0oEZe zF2|`33bbjrOvRUY-%OJaMW1Kgkps3C6pZ_6_?7r=-cF$|wY3}EFC*+GmtDiLuVtvF1krWfrV9-ztMtgwcZV~QV5mZqU|;PuCuih_Al@m}8CpdeUJv`btB z){JbkKm6hHoxv7+rvQ&@s|R_0uy1z2_&n04)Z(~3X3iQWTs9Ra@Ky-kBiW>>N2cO) zyx-yOJ2+PFZBIFq*91{SOqjS1aFiP zZ!L%dAs17qb_pY%Hx`IfrNf=e#Y8HVs8J$Xs(DDod|{wr;uEZu--*-=zSl^y|AFW* z{Iy9wZnYT51d|eX_*^r;G@{U2Db;cw31khP(x8Z7a%}5;K5K4y!dfrxNw^r}P%Xor ztaF%5)b~Bkr2V|Cj~ZDmJqcwQs|quK;y?;ZC0X6=6NBb}SIZocM8-z3#!8{%bty|2 zR6#hkgEVEYYuhSf7D=J@UG=Z(-?DRs1Oo?2@GT>XU!!9XdEMRpC#j-eAuK<$_{%y;9FBfm$ z39|EAh7qUy?7DMC?9oxX0$hAH63UsLhrzjB2j@4zlF|N7==h~w6JFF+#4}TN|_TVF2m=*#NGS&sZQ<+09 z|0W7~(C-T*4l`$W0T#jVZsi!G{cQ&;G!6mgmLliP9HksRm5CP=TjE`?D+F zGD&hee~Z|pDio<78I)H&qtOm?Iecfsxq2Nw<#U2kUh9WI*<+gDyI$b8oSLtNU*o#Q zJrcR4K@aKB<;%r#Xy${mw^VLU;4rxmg%`W!#cgNfMCGPpZQdU^JGAAs%C;ul{0)w# zS+7scPvOTYQEe_#sX%7i4uk5gK(j1KK9`;Gi-cQ?y7W&^w{BXef6-MOt_qubU$_8yjZLyLdP^yMQyoxq&W{^1z0iW!xR;6zm6x?fWBC zG8a?QXg!h&WCqV808{N<`4;Hzjr1$Eu!;-K+c=V?9K_$4qat)A`!zv&E}l08S9E2l)3&1(3;iVZh(u$ZhTM$m{N--+=Gp+pPM$^j zOm^pN0iyHgA$?Cb6Nqr9U;bU%>feP|f6IH7)c~sG-v9%u@RiGWEmTss+G7=GR#@pk%G8$@BQYw)8s zbZuymNas1+;&$E8M^WN0LETOjOu)A_Y{5eCEItjzBh7^~? zKE5xY!f8Tahzvpsk0REY&l21w;#ET$Tu#ND#*+x%gb^0PRD->qVLYcrqOM=bO1g+| z=y<-c1b4aca#SOKgihLB;I9tk-X(-v1PmZj=-=KiE&T99Wmp>TUivfQdJD0|==F5Y ztu#oXgk?Eu&K*}-yLM=2P8ImVc0{lvqZ;djefcENg?Dc=#p8q2arwO3w@U4u$ z?|fyG8?7>ezO`taN9vamDR&HtzA#gO)Itk#v1YH{Y7NaRy=usJ;$ow$zzg9^hAfVQ zGT_)@^(fuXC|U+-N_mr6IKykreYmE1w1hO(5a8tJ1n8qP5NWloIUwiXh@RsbG!Bho zmx+Q5K_eWOrB+|jYHM&-EP(^g0XGNslQNAQ)s(1!?uKqSWs=4f3Lv3xbG@lutM&Rlvr=d>;_kawgK8HoRuUg*yj)B+2Ee)lQB>X zghKhMSR2$Dz9+pH+kw*r87lR!8`d$$wgU0QRfW{$ z#_t&e>T#YcDYFS3$@sdB|=j!h7VuUsB1*!D)yvY6vn9*$$FbdJ9>ZWTejjgl#37ZIJ-p_b{r`G2th1=Ax|*c5R%vrt;ZG#vo|0L*ut-isu0DzK3CVa- zaeHvJBE;2etD61t$`$>N!S+qm|TopceE;+O=o9eBpS9owli>i!{Rk9wz)+;;Z$RSH&zJdc5eU`g?$RV4{5@2c z=V%KoK^$!{;8nG3w4zVadg`E}{hP>*G(dHpG0g$p0diN>ew3)i7Fxdy&%&dx%Z7j> zEA=;7RWg@Y#xUP(eOQ)JaPy0$BvpBzOUJ_f{hFKP6gvicT1%UkC-5)ttu4T4E4?W* zj?94DN6Tx{`>*jo{rQ?bu+{XTg*0E14|BfE?AD)Cp_YPeh(yiWuLNw{MB>MX7ETcM z^=V!EZf~U72lWqaF$qYv)ZLNORJ$)BXqit5C>9gSSIQaxB$I^+My{y{WAU;RiP;ru zIqS*PSLwvnRJ_+jBFXI&FE!7&Y9^yD$d3^CRbnCSB5x(f)Kb;lgx-g)T+Z-Zxrwt; z&wWAUhhCfRHQ93=$uRR8a9|DpVcKHkQ@l}xp1XE0<%M)kZ-rl;2a+2$S_HFm-tV(T zjA~3@&_%`$E3sZAAlEMWi|h7_uzXcvIE$)XeIWWAUVT#K-D3N5j9U^aJEUxO=zgSy z{ZcOi-E48~jinoLsu03B*gc`M)W);S1o=iN~%Hq_hf-yi9cy_f^2h8e8`LXG4 zh5L%GW3nap*B#LP(o*^=n}<*J#FRYWi^mkyXXp_AC)fiM|nrleh{!m@PM`0jN0+ov}F3^ z`aEqtzbD+4sXZMAiC1Tv{b^q-JC>HmR~_w5__mm#ddC$CP&@73_L+egszN>#YX(g! z|2bKqcKo{1u*s?UBX3;lm&)w@Hon>VH^N<1GJlwPBa|D1LfiHmNz{{xg~nZ$t!kxe zREbNEzdk?wIW_NBl>p%|x>U9sP{Tfz%o7?B9=g$ih7f?yaSMM!)yC^x6zvN0C}O{9Bmo(wqNss zXNz@RV+POzp{dB=p88jLUOTO3g1oYhc!fDoWsCPfGmo~kX4=U27ZbI;?Hr_Af6kt; zbi|a5d@~|Cqa8CA2dYj3S{+j|woIBTgzHq#)cJi*3=pcZbFrdH1JwlJ&Q4Mc)7+44 zGyWdoWds|@qv=NpKMxw7B9y_Bb1GzoOfZMDau_N!Typ2vj>BJ~k5PI>%m&Dq#A#In=!ew0NhYfXZB ze&_IObGOc#L5dx|tY~CeTX{YeVd_{d$qxN>?#_eM?d;Igc*{)wkvDPyuS^FnzDA=cVMZ;$fj2g(Rd->QwJMQ%1`P&;dSTpjn41$c9 z_ZpV`=-XDLm5{2N$fhNxX7gD~FKD^w(sOo=IDVq(gtd~59}+-Dt`ft%sJ@+ww;qIi zYf&HKUu(Y^dxljZNq8=M2DuDbhAZC)DjW8H959+ktDqJ2YF#VV2gxf9FcGFM^A@PV zlW0wC?xlg)QUzB=^G>zy4~w75J{Ue&{GC(V7!Yrh!GFa0p}v@?5qYJIlHdQF__#5S zzaL$iFc(Q^>7r#2JS)Ex!xK2CR5Jsi)WRAsZBOo&da#habaH!EU2$>B%_V3y+$F?= zRVU-qlMsb3zYs^hcJ`~2YsQtaN5pkmp&`|`zgzB8l3GX0U9llG+$2q2{3D&@m5(?a zFJ69kEEhzEPVNGX%dBVZ)R)i1)pobhOH>8=^aQo6l{w~hdikR8x4x8=1MJC%I^azV zr`Km1#J=A18BuX+{yuJz>%tTXMuB)Z_GDUOyjLgpLyBnSCl<#YTKTMtjV^VoK*W5D zmwiU$eo)u5*J}8K{{ufTO`WV%kFD6daXs$1{OS*ada|MO_b6u2(n6=`9}zVk zTfC>b<6Fy!mAwVQO|_`uP`%cVRuaNMi}!fkJQNr1xzamX5uh@=@lk8A*1Su}WDTt$ z3g>+kt=iIHc<+}Zt)o#+Oel5V7}%b&)*{P}#b)G8TnH7dL{JreY5x}N&WJ_dUT3oA zyTgrs&IUy~EEoTJeWK#xYFwTv=j&EM6IreNp$54z<1%8Z2lvE(QIa!fsNvR{W z`p=jynfnjJnZ4@cHwVS;bvZ3AOlM!qL)~9d4T^fDoQFUbkV1|aacnz4D@Vqz9dGu7 zG?t2P5}PmdEj7uT*EX9nfxL24pT6{2_vl? zAKyZ4_4eFf>r40RS!4a`cHA&=ll-pjJeD8_Pz(4sA&?(|Vu*40q6tnd%susc%+V6|-By2SSJ03Qshay^vMpoh7p=o`I zzIavE!rLNu?ae|!+qkno$+St1J^R3JsPCPI7F`UNCFprm(UTK&eC?a> zr52T7i1{_X9lssPsF_@UF8clDmRZg{-ES_Rkg>_g_vOTfn&9^js{OS>i37mno|iKQ zH_6qP6I*)UxD-1`r&-2?QLMO(60S35VQKq6Ae41j6_M{46OJ!MGUR}eD|XgMLFk`k zUGqL>w_ptJC$SFtTiwRC?r&UA!Czd@Wi7e?7EbbQH`F@%L%pPV6~hYFuXq6>CNeTN zISkb>$OWW3(1|0`~3e)QT@LQ{yT3?${(L5v*m3PsJ0hK zddF5DPRjp;{{*$21v|!E-Hfbr125{bEa?e|$cXN|x_S6fQ#u}glQ46v^E;Ii7Ml-A zJ&T+@hrG%X{*N^{H``4_so7Ya3F5=@Kc%}smNb8~`FnX)?kivc<-Gt$v|F$Ulr1`= zg1nFnb(HY0$&a3jnw0RSRA7t-Z0zxMJ55{U>qxx0S{eFelqQP`hO z9z>k){Em`6v-;0SBcNQX@sA>Gx^fG=e8*pW5`cab=8Pcrx6vGM;n*5%LiwO2uhTSn zck~&Ni9mza3@!ZwSae5D0=P-MF7Fn6|Mbc-@t7GMgZsxM+x#`jTg(H0|GsMafZ8>Y zDihzQG>U;HWt{b;U2OZq9vBhzC`q6`{>fN-vpQ}S@YnMFFJ81Y?HW=E_}5}EfFZ#V zwt))&hG6=St>OO>NdJ#O`oBdWoeQC~HP3^j&9vP#7a+T7eMr;4ah9CtD8wJp{|-lLi*$L} z3R`WYhk$_G>=7|hx?hX#$lK~)x=SwlR*;5*n!+Ir-+Lp+vqz=lyWgsAg;)n7-OeFx z9Adx%HUD6|a=Bu(X><}P&Z0^`+6%8tE1|JT)xO_{17NHyE$GS!epp5?q0_g^vc|Jp z6JZMRg?KA?gVa6{-$T11+Cu8C41QZ^-bAf>KIP419JjX5erVNT)zbG)yV@lBC;V#~ z1_#uUB6w_?1wrpovvc*fe$uYyYGQ?| zFHm)V?(%oQw;CWO+(Oq8MQ>0tMTjDx8PCXS<|euss($f*$^ZU0ZhDi9jK~}L169>QeJ}f}%~lD;m2KJ58F}4<&4}+@ArK8#)TB^8;$NLl)7* zO(5cYU=9;xtq>0dj=Si34Qzm|rIQcPAJOz_IMm=#S_^Fl&z-i{_SPodP66n4HwFcF z%Q#`qXi71G>N1ki9*rX!=J-hoK?|lC|pKR3!z|8?TMynzCVZ;J_T&v-QRaD}^Mr6j4udX71r7|VEmzSNn4WKQ}O37Q$SGy%V~_%UAw@Db9V1h63q|V54pwB*=tJ)xmC2+-aVmN7vLd(Xkg*0rE zx6=i#j0h$e3x`2ONQUm9umfvTL1f)HL}j1JpIu=QZ&HGo{dU+ zn)_v`$ZC3;T;xy+@FsC8O57JuH=VB3`==nm&;Cp}kdn|8DAGb}yaBcPWU(v%C_pk} zbQ0tQa{jiP1k`|@d-$imo9At(f26F<#E2@B#9hJJthA-FY*uR5(D$PjbpZwi5C9GB z@$?6M4^yYnpqwZ8h--l@&|mptbDcX zG``gZIMVtQVc!{gfDixx-zc4(rkYao?wfIl{x1EA-pb7j-CogS`>{A`rdwf zOdSNlfV&;4XOD~>#qt4C^L}90&>pDc;6uoD@CJogc-Zl$V(&_L2CPtS28qmo6iN*p zB97jE`?LQOxr1!$_;X0B5@PC+FG0WrV+l9_^~@#?stUdQ8?UUGLY@&{po}!@D}O2{ zzD6!ml`A-^*jVaM1-}4<0K?Ji_sy3nA~ALeI`k98xQTSTRoVQpTsN#sDhm<VT#IjY&0uLU9x6gkgD{60aqH3XD_cB0&-%l~9!tygQ(?rN%2g2G=dTbHp)P6^ zd3#WlhEi+o`x<4z97;JGVi?xDEY%{Z7dl;QB`CuM<@b)Yq91m?Oc5&aXv*vFEq4i* z;Jv#c+)&XwWB@D5Kdq%1m2Fl%ALW15Z3g3j8>f78sh#^){bDXcKsgjSPzg zi)!wDW2p9)Ekbj_NLI@M_PxdZgTgB`RjJf%X^ixY2n#V3mq2^3zov|)d@f~tMe`7} zVeC$?!nqG7ORCT)nD0Q3Y`n8-s-}Q!+GL{3|0PXQ@X|C{0(yI_e$gvbMOWq1IJ8LR z6t|i&Z0Yaoko1v;x$1YcY)xu0mUfTe=p`*y=}!=tnI4+`b|s-b6*?zredG{odI^)a zgt4WreLFk6JaDC>RimFQXLCPtqriT-o>+r}YUhU3EfwWPW~BEo{RKkxir)A8-mYr) zWNv~`txrU_J9C^AOTllZ;wakAbiMgkL~5y=4bln7Zr(g-d!7;sy-z-D%O{B(+vRD8e`%XcfC%cFH8vy5KwXIK39$A|~gVqxL z&C%>O-Da8rAz2^?hCYa+G6n zD0S|*y0%aEPqRfI8)yyXFOKCz+WTg{9KBuHVTT%+t01PS+XUdJCla@I6PP{i>v3b`Xf-iWJazx* z&)F}&Xs(@bt1H^7PwzrELo>>WEWBFVL?5bdxya*El8Fi6YIUocRi4MTz_vY9KTvoa zgZrAZFyX5M6YOwPySVm8MMta>7v#$_IH5%kD9Ih~pm9N7Zj7ERvX(CAO7h#gi$Wj# z?dxxs)v2*h*;#qd?43uNYfT2ruf>)P3 zLSv{T6%-_B}8i%fPwNwPg_=Q zGElb(j_6MS<;jC9oCbinlas}0(<%i1WPl7pBXi`&`A!OPHbz@8g_|drSi}m$c}u&o zmREnL${7qpcyt8Wsd_Ja(WG}EM5;V&!(%$4lE3M6Om?wI+W`dXB&a`mn^IFFzmE0@ zk=3(?_2c%mN;GMmAL`+Vce3lYI}p74-jou?;Z(b|Uvag|;5p}*?QNPyn(TKrsedGE z!b~sQSNloHKPNVpNwbPh`p~~!gT{_o&qLC>C{n9*EW$n+r(kqo$;PlP$nF2IA~wHst3r*QyVIRA#{e768CMgWPeHdM)*X9`Y-&% zC$fXj36#ymH@8QAVn*)Ptt7) zF7-X7Ss@G%^KY*7a%3V3MtaBpzM4PjJ8_xzg z5T`!vb-${0e#WNeHNd96TMFAkb}vR%CjWI(ugt}2Ghe3i3;27cOX;tJcmF3B6;S+4 z4v=mDfNN8_Jt5+7TZj1`x(0N34q)qYz2DqjG&iIFa$vs9l?nVR4O>Eft;#}5BDwDX zUA^Xo_o9OW>&0v6uq-~m@j=iUJFN5SDSU?fy}4C5tLxkR_#X}8)=LJ5K>5RX3E{!$ z)5zH^Gh2o<Oc2po6ogLIztifZxABJQi&-mUI&7W6fT9 z68n=2>jg|FVQlMtV-~nS!Z584KJa^;p!JeZFvxt_YFB*?(Hf{EEQ6vX$)YrWZxf{|ZBYb7|~ zWm%@e_AFBydM4ry)Ic&$#l2{n(A21pxq@%TC-0|c;G4o8-g00G_7l86%o{pYhvVPl z#YtYJ4uqy>qs^7$S067HhNVbN2@Bzs8cH_%=y|M`m_8b&ZbM?hz%gc(CbTE0^`tL5 z&zF;Lx84gBWvx?jDU%MQuO=kT)&4upnnKan8$hXaejT?oo~fTAf^#EdTaVCp5}IK3 zX$}@Gqe+v;8|Nz#rV*3ZwShX6B(2EV^%1bB=ikG#wN{SY#f6sEa+iY;yKke0WwJJs zR&zR%CZtSlBi3|gisi_T;H-) zp_5*9t?eL~{Qaw2qxS&EBcX!dvr^Rr>88n6f=*GkM0PM5 z+#T9B2j!R|e7YfVsJ67N`Bqi>zJOqn9Qv4E1Xgom3Q-^Ctz>c(hGZ=x@pE4id6k2L zd$e;r9LM7ApHU+9Y%#71-_vmCO}#m_2?H$z-_=vno2TWu(1Zs9=R^$JXFVYd>FQ z)t-d5PC8*<1E)RwplRG5GYO6U^f{#;m(!qrP}9g^O_)4{3|qfhp-a{#o^&()G({Ib-C06l=?w9T6vI5`*yK4?`7P$GcT=f(fX>MABlTGbyXo?`UG>y zx3ygG0C~8_SddRS}Zaa zscN$uz`Guqt}~V}GJ>YB#_o(vw48WKID3383*@3%^k`8^EE9dn%Vk0ZiEZyKfPjP$ z0nSu>YpLPc?I>r=>8Vz%raNQV?QCi9AUB9MhFsL;xg+?es~Po8fXf`?tJACdoLaWpTy~wiZ95&WQ zqAP+GZ_Cp`4W8o(;iaI`t!J~2s81(aEIIQ~Xxwy82q;5kLXL&6SZmlOj1ZLrM=TUw z&Tv|QO4V@%Gawtk8#wtJf@D~{(GSR3^v&Ek*}}SBb&1vbtHGY3Mq+CANTS<}ZU8@cK4o%K zk4SW^8dKB$zxLiUs>!Y08cqQs(l(0pq7c9Wh|;C$-dG|{gosp8dPjOE(XCWICJcnL1#Th5)xDZvXWBOnn z5nyX}!51in<6sim(|dO%NZkTqG6M%&j36D)`Z;*i)6s99_3Z?$7t6_>7C?zy!#43n zez)+4k#lU2v|?1AD5#98l=%oSVp0ilC2h2nNb|GULIB4~$YE8Y9Vg5PR z@SPiWJKnJ4oe$ja2VPj9_2ji?6Sj`i28pNkswdE2?>>jTiBpUIeS2nAVkBj)GUw}u zUP*j>AT=V7x3Xlc^3ix?lINNsag3^KUCL&~(lLApMx5H~KH}e}<^`KE!%lo&_VK{< zr5=sxn+Tjqhp3#7qL6F3z1`=nGQqqJr@TaGB6QjxRD27v51FhO!Q0Pb37&)DR8&S9 zUAQ3zFJN#v$r~9pFdiXO6rfKf&^_LIciA8{1dF&8qOj{OV@4|!YvaB!c1n4O2v1vu zF(KV5bwQG*Yqi0ar|z?+Pt(nv3Zzw_jXfrFHxy*a5`V&JX?>x$GJxEm;b}qc_AoKj zymi5bc8Vl5lZBHgTTkq^F<<UA%-Wf`xobR^*_vuiGF)IW60oid_b zBAMp3{s<-MXpmIIKdq7KSpWnp4LL&nT-@HU;jg{R-~4lAUK72$(tp=($nVBHdi5mu zkdG_j;bf?KEOKX0)w7p%>GaITA{pzItK2ItRLvzHn7`V(bT==wHYo@b%QXqCB?`_Cw)oZ zyHl7L$yQ`SIEGvO%sOmOx7y)bZ!%b+gg;QYQ1>U@H}P!-iDR-rqyCncu6p&$-KPrb zwSN@|+??@fdF!thB==HNMR!N;Q!@K1DxgWB>+2~=O1c-A39PWX$+H`6ju>&+mN6Df zXn0nG|Gr9(v@y@~p3d4S5$jG4v|Mk;F3+&PqL^Sau!6jWaO-BXo)ClZ4WkBcZ(0@x zv4sd;m+Nyj%m*LIC=rWy%KVwTX^;FY2-dd$8wy$iiiO$AYw0(egi39=Fx!MTrCU0H zkS%q1r|O;PxK7j4;0m$kyZQ4^-d*%oE552OueL0z&%ZTR}ae7v-42M{bMo5!4l z4Mo!(doy1Xn?Kie&oSO|&Tc>M4&4`k6|=ztbCau!WD6!HX6sQta=TfhFDaM&L zc-I)o?G}X8<*thORb}e*@wEiYwk23rR*?m)+%Gv!8DH=fWZ2X0$j|lRo#B132GS=oY)otmc_vgst|c4Q9o;SkzB>!mG}I0;En~)c^=zX4Jna-`pN}pjShG zIO?;9`I+37Ulu3Ds7q2~yvs|$%JLXXk-yzlkiXnjU`z)cp@07mAy-&3P_DERtkWEB z>XT(!QZNNxQI%ek7+*7jJ3-E{r0?)FlY23D&q6VdV9TAc@-8FykYG6}fGj*kX(>>_ zEU5l?Z~2`Po5MQXIe~#gg`AfA%hCf6%QZ5Og9l z=x;_+PybIM5=0YJ#cf+|$aro&RgKtr{j=5QnPFXq z4uJg{Yiu6z9S?p#?VAWv4xXjP{BuiF1Py1`J5IRZeX&$ zpLSxLMGZh9pb2e=)Oe^r|G5QG$h z{uOAMhl$xjjz0tK$V1CSL}iSI()9gvB6T@E5*)G;ozK%=sfO<_+J8E=UYb!lf9Fci z7i{@6B7a+|n)jbQN!cp)%nuK`Ov&Zu5O?_3tZ--!yqbBBJ^^?jUJ&3D2Y0fQMt)2t z^;M<~R)x5MnXaj$`VM)RUr#R`-9~|14)CnWF%z)*1Hgb1?Ahlx4fJ<88P5`TWM~Wv z=D_X>^>)z4-6l?1(}q;T<%>F5Lg*~EMXFPPxBco||BIdZZw99KlOG^S8t1tbx<|-X z**!{TJa&ZAyBOwNG*k&@MszBI2L`|omB*^C9Cr79&aW6L#hxQHbA&fce6QT~voNsC zXG!HTEmO`pB*5*k5rS(z1W;0UzV~uEcvAWIKPW7hu@aaCS!nBR2=P;H0+^P1PyE4( z!|ZVNvsMXKE@Wo0i7V3YT1_KImxpMv^Usg z7dvCS26P;9m_yV8%Y*Vla=WkdAidlt&sT(lq4e}RxDMzoUtboyZv?SKn_!iBu zlrQJhyfP6Pd(*yl#j$d`G;US`@;)N|QC$eLkX*^3zXmtgji@oj?J8l1(LgsL2$W^} z*LWEZiKH6G>L&;0_=e$C&*ewFXn~~e_spL<)2Op&BLtZx@>yGe(eY*+0HiqWcn{Vz z&YAjC38LmnXCX=4J?)w6?v`ojm`8v^tabw(Ho+Ob!@~g1col!VAzp)lS|wD)#gqKO z^gTmg?*gU>;nEFqD(K4UQ+>>n&y+-jGYYhOX9S z_>)95JK)^eHT&1>XkS%ZT|Kw9RJT2-S|CQsi+Afdf}7E@vehpm>In|bN1Vvw>as1D zX}{Cjh^NGYk1<}M`##%@tfnOHDnYj`H&Stp=FWGRp>tzipC2TE6DXTcswm4bRt07$ ztl~;%Hp(HL{n=EFOZ7hoS-(4M0^2h|oT9I2urY4&gOL&Nxd=|{B-EB^_c}JBk2~HH zQDzRkRW1=&y=d?uhAB0IyQzF^cEW+a+=_Y8~n1n1ql2nTE!uU>}9#my|LI-Tt1n3(RvIy4k4z7f{bJ*jcarGi#0XqRjj&yOO zI*3FYeCeP%q=dI2JM%K`^Y;GKD}XGSslv#N(;t>lui%p45LJ8}X$>%au-0vw00%?# zo6g=972JQxj@G?ATpMIt{uRm}ZbvchAAg3@T@7!Bg_jF2{$~Pw?vfJbsSt3+87G#D z!G^U0-72^1UcRKV%qTzhZcYU0T((d}1rqAU-6k{MLT`|h|0VBn$uc>RHu@0y-Hwb_ zLwKWxk!g=d6+xK@ht*0UvJ+7Nk3@=|B8GySZJF{B0c2(K==hcNgWm8$ajXq>ui3lqG2|{=>e1GFC<3-b|2WTx!Q&Q9UJ8&1h8kYiJwUujfAeja@u{FYkIGy z-#DKSmXbcI0;%D+@SRtB980b9O{|U^aph+Xt(3OTHqhraQ*FF<2TEjuk%cONSG;k5Z+uiVGrPX3Bss8Ch{)_ z453gq-cJcD)t9#EOZvY#+-^9bFZF^LUgCBVKgMv4F#)(4+9~>$usTxg_^6 z6-gj!*fYecb-bmbJ9z>|GH=hnOwjPV&8g^md#@~^o|oPT2)IzUF7QCG*+!g z^m_|_v{SSjc1btK#E{|p)^r%hAt%Tg&w+c0+qS9)2(M>wi53+J*w&S52thI*PNyzp zpk{!13L^XfaB~q3zNR0=<71pVH$O79$>S+v&0Z_f&$lL8l$Wsk7rw;UojhVS@+p~T zt0;dH3(fm;eG9VEUa{y2jXgFU0`x0t%~BV z)erFlWqfPR_%cw%DTOa3GfbN+uwYZFlp~Ya9Ca9`qzPkNPOY0m zr$phkz|+1~;tl{`f#*X9Y^|4Cb)QQr%Lf9rIlKjW$>z zo{G?A3ltuDBl~7CLQ|H}=N|`rRK(T_uk;>*Vj$K1ZMqUwB5P8>M@5?HqcZ#<{1dU) z&)OojQf%`mZ3K$9+5m)lZ=B0WGu&Hn?aUTdM5kny!NW2RSF2nCj;?nzuQYe#W#Ms1 zBae{!Kl=K;Icvp&9rcgXG(6WLAo3uiH?N9g=KzEvGk7_bpN{l;zjV!Wxs=Hh?shPu z^-A0#E<}FzERxzDF;=u9^0g0s-sq&~A%?r%#9L}VRMy=*Cbr2{D*yocvV1btbCAk4 zxzc?;hU(lbzZ+^tR^7Tp+71$@j1W86xRV_+dIqDMNZP_T$YkIK1pI*J)a=7l-mSRV z=&~AMw+VFAsrs`?#mZ^v1H z&8ZbaR;KzdFI4d8X$!F3pT!2q`e-mvfAog5?Z1ZOT z7fK${UECRA$pwy3cYLi{3%Hn-ijJr~X#*7lyew_NRP&y7n98?#2-3 zU(3@!EmR7ZK+PW6Fd=7b(}HmRi zZL;sk3QHG-^snChbNLu>P`MtC4EC(~Edd>u;*@b52|TAPu=-YmiFv`z^N0TE9SH*d z5R%lOAH4~INnaa(6jY|Ln|eJ&*GLO#T^@+1zuviM7fHBRxs>$9#{FcvV}n-9xTl6D zI>aY+MT{gtuOu^aaSz#qzqD{h@}PLK3*C0BGU!jaERiHXk;uc0RN{sfrQ9&=Oa5YQ z;ByU(s?o_WCY$Zh?Rc%jEi(QBFXOrfAQ?b0N~1%}2(m^esKkoa6et(=<-X zAL5>j#l=-*WQ6|iK1QO!P5rP%WB1( zjcJ*Jkb6Tky=UE?U{Ji<#?O?SkaLd!{ZU2T0@ep)OxmS7%RklLd;S+&sK3!@<|~G# z1kK)sg>kU*mscC)Q<<>H(?)`a-m0ZK@^rf(Gk3pYO1OimPXM}sKA8|>LJ}I7QpXf|5cz;_E0F%eH4tzE&5auBo>Tkc|pGe_T{0Z;CGMK!yZv^-`5ft_UHdE~Ch zng%e$m?RF$woFeBFD%?m^wufjDdO-kBK5V`J*B@Ci2BPRh?Y8O8-t>_4~k>4y2h*A zG=M5yrLDnelh^=flKEf+P@a#6aWXE@8YYL`=5sI#&%#DNJtR)OLtDXi|5&~Fj+{GH zJZU?(LP1l3zvsE)=gL7$%|)4$f=3||aQis#iX}(Llx-oMSrQC16#V^S!3YK~j<^Bl zE2KS~mNHBEvVTBu%>{VGg|UsptDX_PJeI4Ifg6U{8U}0A4;-FUw}qfAf@uFZWncdR zMVNJ`(9hpsqh1eZ&O&)xQGr`E<~gAP(}m_IW@Dgs|GGGl&voX(FE)l6iMxHMU{7p> z{R5KAFK!`U?D&O}Gc^i~C_u1N;kJm+M%y}hFXL8^(eTI-tFGlA6pmWXexC=9*VsKW zM~gizcs$gS!U4;L7K!UQ)Z&y|bITH3=ZYRdjC}T!c_l}J?qI=ca*LzrV~05Wd=NTh z&_KcdV`zA2k$C*5h7;|tX1fhHZMW+s3o^`bKbpicTBb{QLFs5p0-mJx_-79oeDWUK$An}K6*INpF{{y0LXYg}VLNUfB? zl64!MgxG!Hj0!u1HC;aKZqrAHZR#-Y6F000T=*~iHryTV&lgXW4 zY7N=t&NglmJv=M0l}1y%X6}?93>&~hS(ZXc57cUV(X#AQ z;?sr^hX`6yE$g!8))sdb8rZ=ugGSa5K73 zcD?z^PD!A^kg#jq>8qdb^60OAyu(2Vck|K4%a)&)wATC_rnY0kv0q2>PdE9w*aib%Z3d&o>0*gILzU)=U7kjJvkw0?Y7hD0 zDY--fD2iyf;46$gUuDy5znXT8CTK?`l8(0Ags#CQ+#Zt3i7OWuc46LZwkHb2Yrdol zr+j=z-1vZAjylZP?b5#Z%^Vtlq>&aCIWs=do1v(X4B30pW9lN^Bu%aZU?mDcW2hi<;n<%Q$ zYQ$rOA8Qh{P`gh5INARD3RTE8amxNtiQ#dw97PJDimG51!`tYu{YZ@3vftZe&E6() z>>m9ID^<8+0UI!O8m79V^lg$l{yS5x=LPRtymxhIEg*S@mz~OH`?Y{~C?i2)cd~LD_^L3JXn&K}r0&=xG-zYHwPiZMGP#}@;YZ*LCXqFxL7m*hdKl&QommT)Dj^||pQ2ycn zLF!t)Kj4477?{`xz6|^0!#DXkrODx9(lOv!^*;J1JERXdt#}X2YQ~pN7&sDxOy0YK ziuD|b{fVt3f3bVB2dqGH@bpa9417rFDtCB6o$yTetQe7rU|D8lBFN?6#Bd^P;|;|x z^U?o_VC~5TkXc!zup_LBm(n_>Yl4k~N47ucu7e`xUZ?lQzs~&!9BH2bnm+Z=gbk;L zP`lEzN?ybG!@vE_?hP(6*}d_9v3oNb06gtRtDy(-i3KbxtP0+lxACiG4LKDSMo8QE zQGG}PS;>=jwD*+TT&1WQ8GAKHE@byisSPXUGS8!pGoK4tV~u@vX_i3oVB5T(0I&za z;OniM0W=G6q=L64vwE<-=m{IBkv>smcMG#=^tcjd9#^8nM3tJUKPxsSmHrKw@!x?a ze|;tev<6dPTq4&3*we}~PeNMC=+sKkbYcejyfi4J=|YFalz4&mMU<;t) zQjJvixdH^0X+2Hw4EC8porgH%ygMW&rq|(-hWKCLlNPU;RezzLU*UFeszC{eW@3d6 zb~~GEm#@EoYYsM~s5loR?)&Ya ziA1zYIwE( z2(&;x9)iJaK1X~2K+qbf=;J1$!=?V3!nLJNTlxEli$hsjthN7_y#3!MZ=?PhPm3UC zJi7qqi|%CedP9^}vhez+^rFNCyl&g?@~7kO5yk{2gVkfN2RvM`|7gp({3LHc~j9?Xm5s9fW!f(H4=06zwnhCBk4Hci?P}jrm(U zBGL&D{|BM9BSbqRzikM8E4`$~Y}@c*V>mU3*umQ2*$BK#3?2jNBddEB^X`lo|96=9 zyL(~rX(|RxrenMwThESec?BVHp79=B*@lCN{_F3VoK4prgXN=D|3COy(`6Xq(ti@P zQ&qfxutsB~PJ;TkQ7W)Xd5aC;O z0I+lgt%D~ThB|Qq*q-HXn*#8;E1v!4Z?})O94Ak7pjXlB zV|=9)R;_ZPIM)pOOw#C0C=4%^JM|6ngs#i)UWYv8w?8I=x@C-#$7@&-QT!^_%B+VU z+Qv^HB{FYh5Q&RiI7XC z=38y-QitnM?k3bA(WodE;eE$nCtRvM;2wQNM3^^5X7IFh?5S5bR4nZeJUa4aeqV}9 z^Q#m$VJnm7Zwm1bmuol{3Ff|zUK{OKAh+9O9 z!L0YTJ&gVa)uyqj^9yDa-iHhW9<{f%wdIveCBn|VKgK(MHIWL8Raam}uvdy}O;`NJYbtreOz)AfRretNNu*@R3q2 z@v0iLC?_4RaKWMi|2O^MV%kn&c25;-azH|-v$ADN=w!&j?rwG|UI1t6JFE@egxqL0 zw7gSI%!|2V5ugu~`W^)G!Ct^0n0c?q}9Bbfi@3d-V`?>jKU@|oFBH_~8F znLYbx|7qsC9^6E@Fu&!55scZ5N1NE6fmba)sKb^2$3ARY3Hnl=U>jdnYgUI%*&{I>pd&yZPj6?jM6 z(R?p@sdhd@}L>>?%jA`Qp z^k;29odPc@O*>Fle!IX7rHxV7zhWsS`SUe0=@i`Bw5BX|uF!G26|#L980JJdulN41 zXu$)#S!_Jw)_r!&9@=(^+CGaFz3x*3flY`}F{z#a!?6z_j}^_(LZN4={{;IIvKzN=!qo#)s__4V@Y<(>?C7>|FpMA~IuCQw< z!@`+4+S6alO5^l#-v}#DmQX-&S4z^5VYXW*r`Z}28_h-NK#jw;aaNKy&Z^zRdPjV} z9C&=po>~{a)!s%ji3{2Do;lt~=Zr}#9?b8vf&RWPmZn%PUA{o7P>v|hZY5uJ8mfp@ zlyoi29w3**a(m5@^V>EbWXnpo&k=(yr6wh$^B;dbILVI5oE{GzrrT|PA?REKc5fn^ z6U8CcUG@28sZXhK0|Vq;DNLn)=((;e0{zL-B>$kor`79(dP|~&^yEhV&<+A4vA$Oj zBY@d>-<#JB=7(42vN#Bo+epv$;vJhzI92+NVzkHMLeD;c-WOS`i5Be6IMCzQfEMEx z<$3fdnislC`w;3`Xmkz<=By(fZ&P@0UeePto$&NLL%{8_@aw&==e?=O;DH{?%x)m{ z^k%PeB6SR4Qa4=ntovKO*|0DtglR;bHhk#xyz;l~S4t(#-*;y2Kb3Wzn;BR?MteGg zAE<0OX(~;To8+arVaWQVvt8e3^4C9p_LnbzvQ(6f)Su;dC~SF75dT#15Ivi;D0^Y! zPIj2Iw*2H&UM6R_)=2s=@a1C>g>RX4sSwyMlCYQU3!)5MDWzx%Pn-L=dVX6()Wt4; zjJ>pW@=ejf!AR8;f8F@&&t(|ze5l@*LXz&$B=@%EaJlKsB!5Rb^)g0Ey1ixijo-za zwvw)x$PB7{k4^H}wD0cYrKB-?>B(zo`PNQ{3%wB*T~b2bQToD?u7W5-!%!2!V&wgSZGrpEgn#lx$2k+bjv0 zBXlU-(YqqM+c&*c+NS57uT{iOathW`Z)s3~p<1+`p{2M7$Pl$Aw)YBVjupZi+7`@c zqx`*U2a>s#S|_7ecT`(7k;ZVc>C(P-udH@7t;Rx^?`pzWI&Q~8oMR|qj2$YimOz5l zqt0z};M0k#ut%R3Di7D|pzNY(mDL68kUmt!)yI$7^l$NP_2J!1!!>+vax{lN41pH3B4y#a3OziZ)cN7J zOX**`oEN`^`hpI1Y@J}3S*n{?esczp8Hs;9hHV(Wa%A^W!g#w^SH+5w&jH5mu3DRg zh`#W-^EWeMT|zrl2X+=AFN@*y?^|L9^8wgZJb*RVD z!SRyMT|zacd}z8QTXTHcjKf{i6Hk`t#^u5%uI7dE@1f7(wRJqk%1JJ*@=8922yUO8N0EFBb9p(Up=n=S8o9dOiK`B2tB)toO!A+9?vE9%sZZ-)>WO^shQt)%sa@`HPrOT zUH;Wlx%dfI=$1i2lj+tsPs5NfL;J~0a{Wok$gloqFr6k#J_;{>Yzra7_XeL#4S(Ds z=MiGy4Xc;nEk(z?`jOz?%2rY9dE?+|JuPWhw2!FIo$L_4)q(uz=*CK?^nkKk?Yqg! zIpvGl6!h#LUs6LZ=xy0{nN3xC|GJ5=g>!J0j~V$wd^~zz{hV2V9JR{EGsPwbf|`RUWxY9qjaxe-uJhHXs%0>8J`I%kgW9f^9P%fao$pN z&j4M<3Cw=?1B7$Rb<|>^e6gfzDCFhx?C&>o8#N))*1gI8!1q^%n{Ln^5(4AD@~Fqe zrYkw-r!#~1RdyfbFMlagcnv|5!*KDjH>;KI1k(1E&mRz-4C7n%Rk>jKq+85YDPEF2 z-Go>pTy?o?q^#kd_r-#!P?1?LmWtMlN=+R56CMZuTPvau#c-~K$oS@M*n`c1VPwaP zswK*WFG_xXO08^>J52AxJU*yal#k3x#$83G<{=hpAXLRzhcUs#y zYTlr_r3hy3dDM=Qz5+8x6jl_wAd5^s+*UA@AdwLL(h|K_*&f}GcI4A;ICey*21Vu_ z=A+qS7Nx!)pk21pDdG%PmZW=4czHdKS!{00BWUrZ{miSDzR`8#9W*G~{C|LN(Q=$OPMTy~AL_A%Fz>~3lK#IIL3 z5#AW)Qt0|7I|nV6xr~&iJoS`FQkI#Pz3^0eGSW_5QAqt{!&1oQl|2f7EnThGx%R*r zpPfRua`CCHFz?uJn1>4-1Ofd)lgql8z6+L;Z_ae7k;YDgHk3are8lPz(V2;i+FJ|P z;@Cn87Uyd$i;0d_^W~&HlzNe< z9*J1HtXG@#$KbZ8U_z@Hi|C%M*c)aKk6*AfIPv|{8{T5QE+c5ygcDPxAj#eGjUxV+ z|1~`=^Ef0(@p?@_7vxwH8u5oFg=qD8-YiXj4Yo%|8$#WL3|0Vp!@OY8(Fp`wm>WB7 zNK})gfy70{FIm{xy9(hzfG;;KvYh>1%^fT)nK)W8+_rumDTPi?Yvo4VMKbpwdFOo) zF51`-&Jn|xlZGB4!>VGfMft^CR9DAgv>n&kxsgD=k-cgHo#!lf2Y7wX=(V{@@q^6H z>suHszY-*0vkUc*F8m6d1K$l_=$ae0pnkQ2VqZ?4;nNOH#VO$;Jw3t>D4KO0s?HZ% z{6^4#stIggZ#*vB?xll>S~&ahJX;QIVC6?@!Y4+z!vK(uabr=1?U%d}p;Kwn3-kD^ zj5B%f(4HabNdua#<(xcPayZHVsL$=}IMbnBHU2gB57OV87p^}khpIaIEkM&co<&y_ zB&RGJ5MCilrEWL{HQxaJn7X#F=;wf}LjBs94I%$KJF&&x@71@yuIIgY1OpGuStGrI I-|cSwKO`P1jsO4v literal 0 HcmV?d00001 diff --git a/web/pandas/static/img/blog/2019-user-survey/2019_31_0.png b/web/pandas/static/img/blog/2019-user-survey/2019_31_0.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8b5f1108f795e9755d6229ba215cb4b80bfe3c GIT binary patch literal 6053 zcmcIoc~lcwmk(i631Vw2JE#Ogw*o?BlTAe%N(5}B*jE8DLP#J6kS&Qz7)3z}1(8i! zL<|D5?<6DLVq|N9ge5>i8$f|T1VQ#p`kXoQ&Ghoe_kCyToOkNfeXs7T`|95N``vr{ zoRgjW4wW4+7)&0pKXo1klXxH=`?kr5B_~<}2;!R*;UwU)O?<^~3;GZ7^LD(whgdGR z`}ZNyJDRv57Mfi>?SAzF?$XuhfXHANHsC5g40kmQb8&xEa3leP3rFi4>Kh*3fBEWF z{4oQAf6VLSB0~&zT~btr!4xHdQzu+vas;E-s)K_QCO^+hN*}b{A@y|EF16j?-raFa z_l```;AIqV@MIr+r{l#EsZTfkvxD(^f@heTZyZYoi++4s?0;%M=C0(^ru-$xAZy;r>7rzYj4L|SZ3ItIg^ucb@4YKQe)pY@C#v}~1 z7StSBKLL5AZ#Y0)^=L zK@Ol+BOueRFUWr1(!4zW2O!*Gp$nO+o<)j>=IgGNK$f_mu{5AN`&mj-ZD6w=GlZgE zBv`LTnpP8p6Uexf&NwFy7b{TOip(H1>=mBmfsA?7P)Jd5$#gs~lJ_31*H?S(Tf7q9 z+hRVXX4y`A^&;d2dFSz;q!BYvtLGrqbnjd~4(gm)4NM_KoPoYpkNs>wey%-a&GY~g z^Y}9YLu*`6uAR=G>saplO1vaoF9-oN``0Lt5)B>A+yrMC}JF<%#f>B^WkH%VbUA=ZRv0FyIyVX8Lsu+7ACWy zEwuHoG7+6-IF)uQO44CbIU(v(lJl@RSVZxYEAX9oO>b8_cBZYgpDx>kAc8oZW+x^)hDVdUUW!)EhMtCs9JNDq;y`8TS|` zK5TK^&(u{Y@~|K3Be=&`cj1j*Evn6oEZ#KhjY8rl-frq~j1(rv0`9J-cG`Sv7EKl8 z!{V|0EuE*%lcDZg2YI|}{hxR7^!-cHRyEZVcIVcPVmXZ+oJ~y$lFUZ8W%tY!d5>Mn z(hqa;KfhRvmcyfkSl-7p;(*S%JopGK%&0f&ibYa3oUW138@@z}$XK-I5+Zg83({7z zjigrRw6Hjp?GF?s{jzGizDkfRB1!8}DSj4n^yFtzgtrbeZ4rp_M+RZGCqqVt^abFiY9`M)_<(y9#nhIz~m9#{Pn#x(P*z!#`QLu%f`F zV%jlG2Ei~pmmE55u3}Zh4JG1CV()4#UNTN4NNA;gBRo#cYd1!Ba`(o(?hj;Z)U_#H zPkbk*MD9DmW*q%lXX|8xf25zi}eTqIEj(%;w+71=a<{nQSYdY&# zZ79m6%s{g{nl)o&@QL7PF8?5Pe@@2|BMPWh+5RvIKmU2dj_1$ILO4I^P>$UtQA{hB zltm38VvL2i-ygGUzFFW#bd7ZO@H*mMXcMSG?7p zYcbI>b+a>8pM9?59-@Vw%V`~NotjkPIe<&;RkMWlD9d5SY=Jlp7@VmjG{vFY_PoIj zy!v>rbTeRaC>-=r*f=CyM$*%R(vb?z3wBj6YY#FP(apxIO4Q?PDsArZH7fQC=O^nQ zS)FfZG0yPr0VcSD)#qBtVSUSsXlg;F$lCa+9?2b=0GCvGQ!iIX7`xPPQW~a_aT3BD zB&X*&+hgPAdfrz#r82r&W>A$l;{~p{gQH!$VsTEDj&dIYDXa19pf`jH9ju>7D(8Ms z2Qro4Iv;MKx^e?)fFXuw@IM0@#+98M<*}ci$afxpzb1^~T}ReQhQLWbf;Nv@&#C?p zix#p>;y?dc6O@33N^m_U#)vXY{dbF*6y$eyklJ5tKQw4}{wwyv+Hf$XbvaV@p zBFdZd8N#SBdT@RC(Ft3G?Ma((Vj_09(Lkc?itTYy_mLoiroel4$3_A;dL+^!ef+o8 zg3upl9>>E5pXPo=)20Uy5({Be4Wl0TEV`u$n=t`&xysX_HmNdpX*wcvKcMQqf!6n%8RWQ%+ued&LM%B%s*ls67W$HtI_{EHUABX|LU^jV1nNLpg7*5 zVD1K`iK5EcOemQikQ<7CLMe7`EIm07Kj^5(B;o;WO<8D0MxtPKZY&O);3N70ax9si zlW*|@dN*G7-FJgNK;G=|@~o1C3_;FAzAB*ayl{tIdzh&QIGv5${t5@(fV|&lB)CE7 z;Yu%*xi<3_(E5E4JOg;|7UbB#!4#U*=8vi>JpSs4xPr0yZ|V9ca@OXbLgNmvH0 zIYDX#U zwCsy_feNKP@Cwgp`e!4*7cQ~Ce)S60)$`qEzryy44-i|D2pnJmnk zi|d6Ohd8&sf{abd*VG0L;Cxkatgh9N?R&GsEV?Py#pJQZ9VF(Y^8cf|{e#b49IBU7 z%G`U%^;P7=yNJvKfU3MW2LByDKL{Gnsk}MJ?6t%L4xUL<8=Xhn#0LEhhx}Iq<{uXP zZ$|njZOJt|9w6(=1v?>2Q>MnE_wo~Ddrw8D1kjxqFlGqUdUI5?fthgIFX!^)I+b;S z43L!tE@co02Mo#L6cG4|O)+Xoy3Zd4Qo{OhK;`#LZD1^e4=_$JMD~$CLP^dX_IJQo zHXqKL|D6nvV#nIjc(bYt#FFhW`v@gqR-DR}C5O-n-4*-c@U5*&fOO1Je&vjN8F*CE$v)jF8}+^%LICxboZ>vXG_b%7o>BMJa90*LFRTfx)gl?VI#*2M1hP zI7%{kbh7Fx?N|eC`2{Uu(jyy*$=kPEH`>t)Cr73=$_*--sjuweZ@pF64nyl?8L+py-Im}6y!i&BnNt}x0C5-7D_)UPE6qu_%P0xmJ+pp zGSUd2qBx$O(aR14#V62y1;VyagTCH<-*FW{)*+`jH({|3)Z?3A>BeAC@*K=%= zJC6qX4rmNFy-d0E(Kt-^5IGvP9WN)Wl&{ADy`GPw6@mi;6;Ah_ueOfU-7+xvYXJB+ zGxr}Hu_A0l`fkUay@%WzA}8uQ?ib#pTKx_3{4*QdgZG-K74}B&Wm{b|6@fhl=&n~u ze<;WPRH;5~(;&{Sl@j zMQ@AP4_o$k~O|b8~H{K>&1sCqv<&h_*_G&HxJO99tVm;$utUFI>h_l zf68RO2GE!3#$grmaqoeYD^^b)h7w*ug$-C?^tGB9qg07jc=L`J?%P=lP7gQbtn;W} z20x2&fr4^n1yUTydhCl_lpD($tm!$Xb{&b4->0JMCy|%Q-vVl7c7|ioHC!#GB*le= zVW^T@1}@S&DA}~>6l9zcq7;C17}v`RTv)dNC+XI)$75(>Zcx$kH%%~2``u5-bl+qj z5gP9TfsDNjX}K4EP`@AT%82pZ)6i{e;j^`R`^Pa^7;655%>Sv~|N8g-sl@;HmtADa zyc35*G3|B>(0j2e==V;--?FPp7w%7w`6j$O5d((K7O;|bpPwxcXB-Ro+~4Rvee;(K zGZ$a%(WzpyKqBw)rNf+GAD+E`h;}7ELeWqYaMh=JDmvu8in-!*nE3j)7sQJG?a3vs z__q#FzqpwIOkey?_8s$szQ5k#jK5gOeirwmFVsJ9ey+eCI%f2{{~u-^2O|BULy&hC zf5mWMK>_L-p7G)rI#Q5>M0pET4XAzf7v)5ZdO=BSBweH z-ZEgsalRa2w3`a&85ImWN)=}lC|&&CKM8|PUs)mTiaDJ6Md$JZKW36DRZq{Vwan?H*n;*L4!R^=$$^=8j*xRbn#k3 z((sYrL{60~DYp6O0mch#Y;S1p`}2qgr=L+X5AInUn-gPRzEsK!T7GJGcA=-3aMNPd zY!&?dcxi$9pSbo5D28*%wCabl;JoE>S_>savi!_K|NE>x3o8bJN+%PYL4owf^?<>T z8hg%9Sq&Rk-XQlC^<-CjPE~#@InmD0*ZLYAj!oyIfGDZUHl*R6IRM*x=fJKu0(AaGp7*Y=Rliq8`6&W zI|qtUg3t7Q^|dtp%U_*CwmlLbXnz$2=gM*(-UP~st`3IhT6bw$xy%h*YNQP}(4qoYtTs-9>LwT>969to)8s-QB5*6yFd&r#j>5dtgTAuA zApBW{Ec32{5sMLHu&)7OlQ}<=(yCpV-#HbZ4+sBU%r#`W9p55E-++ zbtgGJ-i#RzwEjA5ozFjjZ4fs*@j)#dPLCuMAHlbg z=wF5_>-MfKN%KwvwMpX^gA`G_kb6sFr(|nyQ90bT`qK@i*47yPI>UJFs-sb@@6y;$ zX^oc5Y>I()L-sg*Kb<{TwK&w*GH};ED p9I7_p^ZU8}pI-8xfF@a_aD%=rRIcJ8Q`}OA0jHf#m7Vmz{$DTwe#QU* literal 0 HcmV?d00001 diff --git a/web/pandas/static/img/blog/2019-user-survey/2019_33_0.png b/web/pandas/static/img/blog/2019-user-survey/2019_33_0.png new file mode 100644 index 0000000000000000000000000000000000000000..fd490d3e7255a3b5e609627bec35eaa28b446851 GIT binary patch literal 5547 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 R|FMbyO)vdecERKJe*uv9;=KR> literal 0 HcmV?d00001 diff --git a/web/pandas/static/img/blog/2019-user-survey/2019_4_0.png b/web/pandas/static/img/blog/2019-user-survey/2019_4_0.png new file mode 100644 index 0000000000000000000000000000000000000000..5276ed359badbb9dcbbed583846116a698c21f18 GIT binary patch literal 8545 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 DqQC(v literal 0 HcmV?d00001 diff --git a/web/pandas_web.py b/web/pandas_web.py index 38ab78f5690e7..c5309f7b9c3a2 100755 --- a/web/pandas_web.py +++ b/web/pandas_web.py @@ -78,6 +78,37 @@ def blog_add_posts(context): """ tag_expr = re.compile("<.*?>") posts = [] + # posts from the file system + if context["blog"]["posts_path"]: + posts_path = os.path.join(context["source_path"], + *context["blog"]["posts_path"].split("/")) + for fname in os.listdir(posts_path): + if fname.startswith("index."): + continue + link = (f"/{context['blog']['posts_path']}" + f"/{os.path.splitext(fname)[0]}.html") + md = markdown.Markdown(extensions=context["main"]["markdown_extensions"]) + with open(os.path.join(posts_path, fname)) as f: + html = md.convert(f.read()) + title = md.Meta["title"][0] + summary = re.sub(tag_expr, "", html) + try: + body_position = summary.index(title) + len(title) + except ValueError: + raise ValueError(f'Blog post {fname} should have a markdown header corresponding to its "Title" element "{title}"') + summary = " ".join(summary[body_position:].split(" ")[:30]) + posts.append( + { + "title": title, + "author": context["blog"]["author"], + "published": datetime.datetime.strptime(md.Meta["date"][0], "%Y-%m-%d"), + "feed": context["blog"]["feed_name"], + "link": link, + "description": summary, + "summary": summary, + } + ) + # posts from rss feeds for feed_url in context["blog"]["feed"]: feed_data = feedparser.parse(feed_url) for entry in feed_data.entries: @@ -180,6 +211,7 @@ def get_context(config_fname: str, ignore_io_errors: bool, **kwargs): with open(config_fname) as f: context = yaml.safe_load(f) + context["source_path"] = os.path.dirname(config_fname) context["ignore_io_errors"] = ignore_io_errors context.update(kwargs) From c395215abecdf936f3caa89fa7e98198cb50135a Mon Sep 17 00:00:00 2001 From: Marc Garcia Date: Tue, 31 Mar 2020 13:37:01 +0100 Subject: [PATCH 2/3] Black --- web/pandas_web.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/web/pandas_web.py b/web/pandas_web.py index c5309f7b9c3a2..3bb66202a69f4 100755 --- a/web/pandas_web.py +++ b/web/pandas_web.py @@ -80,14 +80,19 @@ def blog_add_posts(context): posts = [] # posts from the file system if context["blog"]["posts_path"]: - posts_path = os.path.join(context["source_path"], - *context["blog"]["posts_path"].split("/")) + posts_path = os.path.join( + context["source_path"], *context["blog"]["posts_path"].split("/") + ) for fname in os.listdir(posts_path): if fname.startswith("index."): continue - link = (f"/{context['blog']['posts_path']}" - f"/{os.path.splitext(fname)[0]}.html") - md = markdown.Markdown(extensions=context["main"]["markdown_extensions"]) + link = ( + f"/{context['blog']['posts_path']}" + f"/{os.path.splitext(fname)[0]}.html" + ) + md = markdown.Markdown( + extensions=context["main"]["markdown_extensions"] + ) with open(os.path.join(posts_path, fname)) as f: html = md.convert(f.read()) title = md.Meta["title"][0] @@ -95,13 +100,17 @@ def blog_add_posts(context): try: body_position = summary.index(title) + len(title) except ValueError: - raise ValueError(f'Blog post {fname} should have a markdown header corresponding to its "Title" element "{title}"') + raise ValueError( + f'Blog post {fname} should have a markdown header corresponding to its "Title" element "{title}"' + ) summary = " ".join(summary[body_position:].split(" ")[:30]) posts.append( { "title": title, "author": context["blog"]["author"], - "published": datetime.datetime.strptime(md.Meta["date"][0], "%Y-%m-%d"), + "published": datetime.datetime.strptime( + md.Meta["date"][0], "%Y-%m-%d" + ), "feed": context["blog"]["feed_name"], "link": link, "description": summary, From 83f62018d36e405c8d17eb25551271a3feeb309b Mon Sep 17 00:00:00 2001 From: Marc Garcia Date: Tue, 31 Mar 2020 14:28:56 +0100 Subject: [PATCH 3/3] Fixing CI --- web/pandas/community/blog/2019-user-survey.md | 2 +- web/pandas/community/blog/extension-arrays.md | 6 +++--- web/pandas/community/blog/pandas-1.0.md | 2 +- web/pandas_web.py | 3 ++- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/web/pandas/community/blog/2019-user-survey.md b/web/pandas/community/blog/2019-user-survey.md index 1d9508034244f..73c426e7cbec9 100644 --- a/web/pandas/community/blog/2019-user-survey.md +++ b/web/pandas/community/blog/2019-user-survey.md @@ -42,7 +42,7 @@ There was a fair amount of representation across pandas experience and frequeny ![png]({{ base_url }}/static/img/blog/2019-user-survey/2019_5_0.png) -We included a few questions that were also asked in the [Python Developers Survey](https://www.jetbrains.com/research/python-developers-survey-2018/) so we could compare Pandas' population to Python's. +We included a few questions that were also asked in the [Python Developers Survey](https://www.jetbrains.com/research/python-developers-survey-2018/) so we could compare Pandas' population to Python's. 90% of our respondents use Python as a primary language (compared with 84% from the PSF survey). diff --git a/web/pandas/community/blog/extension-arrays.md b/web/pandas/community/blog/extension-arrays.md index 48354394c9a0a..bc6179adfa719 100644 --- a/web/pandas/community/blog/extension-arrays.md +++ b/web/pandas/community/blog/extension-arrays.md @@ -155,9 +155,9 @@ To summarize: reference back to the data. - `.to_numpy()` is *always* a NumPy array, so you can reliably call ndarray-specific methods on it. - + You shouldn't ever need `.values` anymore. - + ## Possible Future Paths Extension Arrays open up quite a few exciting opportunities. Currently, pandas @@ -190,7 +190,7 @@ These new goodies are all available in the recently released pandas 0.24. conda: conda install -c conda-forge pandas - + pip: pip install --upgrade pandas diff --git a/web/pandas/community/blog/pandas-1.0.md b/web/pandas/community/blog/pandas-1.0.md index 23e5cd6f5b4ed..b07c34a4ab6b5 100644 --- a/web/pandas/community/blog/pandas-1.0.md +++ b/web/pandas/community/blog/pandas-1.0.md @@ -21,7 +21,7 @@ We're [working with those projects](https://datapythonista.me/blog/dataframe-sum This release cycle is the first to involve any kind of grant funding for pandas. [Pandas received funding](https://chanzuckerberg.com/eoss/proposals/) as part of the CZI’s [*Essential Open Source Software for Science*](https://medium.com/@cziscience/the-invisible-foundations-of-biomedicine-4ab7f8d4f5dd) [program](https://medium.com/@cziscience/the-invisible-foundations-of-biomedicine-4ab7f8d4f5dd). The pandas project relies overwhelmingly on volunteer contributors. These volunteer contributions are shepherded and augmented by some maintainers who are given time from their employers — our [institutional partners](https://github.com/pandas-dev/pandas-governance/blob/master/people.md#institutional-partners). The largest work item in our grant award was library maintenance, which specifically includes working with community members to address our large backlog of open issues and pull requests. -While a “1.0.0” version might seem arbitrary or anti-climactic (given that pandas as a codebase is nearly 12 years old), we see it as a symbolic milestone celebrating the growth of our core developer team and depth of our contributor base. Few open source projects are ever truly “done” and pandas is no different. We recognize the essential role that pandas now occupies, and we intend to continue to evolve the project and adapt to the needs of the world’s data wranglers. +While a “1.0.0” version might seem arbitrary or anti-climactic (given that pandas as a codebase is nearly 12 years old), we see it as a symbolic milestone celebrating the growth of our core developer team and depth of our contributor base. Few open source projects are ever truly “done” and pandas is no different. We recognize the essential role that pandas now occupies, and we intend to continue to evolve the project and adapt to the needs of the world’s data wranglers. ## Going Forward diff --git a/web/pandas_web.py b/web/pandas_web.py index 3bb66202a69f4..e62deaa8cdc7f 100755 --- a/web/pandas_web.py +++ b/web/pandas_web.py @@ -101,7 +101,8 @@ def blog_add_posts(context): body_position = summary.index(title) + len(title) except ValueError: raise ValueError( - f'Blog post {fname} should have a markdown header corresponding to its "Title" element "{title}"' + f'Blog post "{fname}" should have a markdown header ' + f'corresponding to its "Title" element "{title}"' ) summary = " ".join(summary[body_position:].split(" ")[:30]) posts.append(