diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 00000000..ebc6d51d --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,159 @@ +{ + "projectName": "VuePress", + "projectOwner": "Ulivz", + "repoType": "github", + "repoHost": "https://github.com", + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "commitConvention": "none", + "contributors": [ + { + "login": "yyx990803", + "name": "Evan You", + "avatar_url": "https://avatars1.githubusercontent.com/u/499550?v=4", + "profile": "http://evanyou.me", + "contributions": [ + "code" + ] + }, + { + "login": "ulivz", + "name": "ULIVZ", + "avatar_url": "https://avatars1.githubusercontent.com/u/23133919?v=4", + "profile": "http://ulivz.com", + "contributions": [ + "code", + "doc" + ] + }, + { + "login": "jlooper", + "name": "Jen Looper", + "avatar_url": "https://avatars2.githubusercontent.com/u/1450004?v=4", + "profile": "http://www.jenlooper.com", + "contributions": [ + "doc", + "design" + ] + }, + { + "login": "sarahdayan", + "name": "Sarah Dayan", + "avatar_url": "https://avatars0.githubusercontent.com/u/5370675?v=4", + "profile": "https://frontstuff.io/", + "contributions": [ + "code", + "doc" + ] + }, + { + "login": "kefranabg", + "name": "Franck Abgrall", + "avatar_url": "https://avatars3.githubusercontent.com/u/9840435?v=4", + "profile": "https://www.franck-abgrall.me/", + "contributions": [ + "code", + "question" + ] + }, + { + "login": "sobolevn", + "name": "Nikita Sobolev", + "avatar_url": "https://avatars1.githubusercontent.com/u/4660275?v=4", + "profile": "https://sobolevn.me", + "contributions": [ + "code", + "doc" + ] + }, + { + "login": "f3ltron", + "name": "Giraud Florent", + "avatar_url": "https://avatars1.githubusercontent.com/u/11556276?v=4", + "profile": "https://github.com/f3ltron", + "contributions": [ + "code" + ] + }, + { + "login": "CodesOfRa", + "name": "Ramona", + "avatar_url": "https://avatars0.githubusercontent.com/u/945186?v=4", + "profile": "https://twitter.com/CodesOfRa", + "contributions": [ + "code" + ] + }, + { + "login": "fatihacet", + "name": "Fatih Acet", + "avatar_url": "https://avatars3.githubusercontent.com/u/712419?v=4", + "profile": "https://fatihacet.com", + "contributions": [ + "code" + ] + }, + { + "login": "filrak", + "name": "Filip Rakowski", + "avatar_url": "https://avatars2.githubusercontent.com/u/15185752?v=4", + "profile": "https://rakowski.dev", + "contributions": [ + "code" + ] + }, + { + "login": "farcaller", + "name": "Vladimir Pouzanov", + "avatar_url": "https://avatars2.githubusercontent.com/u/693?v=4", + "profile": "http://farcaller.net/", + "contributions": [ + "code" + ] + }, + { + "login": "vicbergquist", + "name": "Victoria Bergquist", + "avatar_url": "https://avatars0.githubusercontent.com/u/25737281?v=4", + "profile": "https://twitter.com/vicbergquist", + "contributions": [ + "code", + "design" + ] + }, + { + "login": "newsbielt703", + "name": "Billyyyyy3320", + "avatar_url": "https://avatars0.githubusercontent.com/u/38957202?v=4", + "profile": "https://billychin.netlify.com/", + "contributions": [ + "code" + ] + }, + { + "login": "bencodezen", + "name": "Ben Hong", + "avatar_url": "https://avatars0.githubusercontent.com/u/4836334?v=4", + "profile": "http://www.bencodezen.io", + "contributions": [ + "code", + "blog" + ] + }, + { + "login": "vinayakkulkarni", + "name": "Vinayak Kulkarni", + "avatar_url": "https://avatars2.githubusercontent.com/u/19776877?v=4", + "profile": "https://twitter.com/_vinayak_k", + "contributions": [ + "plugin", + "code", + "blog" + ] + }, + ], + "contributorsPerLine": 7 +} diff --git a/.circleci/config.yml b/.circleci/config.yml index 88094174..d2cebd28 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -34,4 +34,4 @@ jobs: key: v1-dependencies-{{ checksum "package.json" }} # run tests! - - run: yarn lint && yarn test + - run: yarn build && yarn lint && yarn test diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..e9be3ec8 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,82 @@ +## Development Setup + +This project uses a monorepo setup that requires using [Yarn](https://yarnpkg.com) because it relies on [Yarn workspaces](https://yarnpkg.com/blog/2017/08/02/introducing-workspaces/). + +``` sh +# Install dependencies & compile TypeScript utilities. +yarn bootstrap + +# Clean dependencies. +yarn clean + +# Useful when creating new submodules. +yarn boot + +# Serve the docs. +yarn dev + +# Build the docs. +yarn build + +# Execute all the test suites. +yarn test +``` + +## Core packages + +- **docs**: Docs of VuePress (do not publish to npm). +- **vuepress**: VuePress CLI. +- **packages** + - `core`: containing the Node.js API, the Plugin API, the Theme API, the Client SPA, etc. + - `markdown`: internal Markdown compiler. + - `markdown-loader`: internal Markdown loader. + - `plugin-active-header-links`: a plugin for active sidebar heading links. + - `plugin-google-analytics`: Google Analytics integration. + - `plugin-last-updated`: implementation of "last updated" feature. + - `plugin-medium-zoom`: `medium-zoom` integration. + - `plugin-nprogress`: `nprogress` integration. + - `plugin-pwa`: PWA plugin. + - `plugin-search`: search plugin, providing the `SearchBox` component. + - `shared-utils`: TypeScript utilities. + - `test-utils`: test utilities. + - `theme-default`: default theme. + - `theme-vue`: a theme tweak from default theme, used for the official Vue project. + +## Core packages not in main project + +> Previously, for quick iteration, these projects were kept in ULIVZ's workspace. In the future, we may want to build an independent GitHub group. + +- [awesome-vuepress](https://github.com/ulivz/awesome-vuepress) +- [@vuepress/plugin-blog](https://github.com/ulivz/vuepress-plugin-blog) +- [@vuepress/theme-blog](https://github.com/ulivz/vuepress-theme-blog) + +## Workflow + +### Issue + +> TODO + +### Pull requests + +- Create a feature branch from the default branch (`master`) and merge back against that branch. +- It's OK to have multiple small commits as you work on the PR - GitHub automatically squashes them before merging. +- Make sure tests pass. +- If adding a new feature: + - Add accompanying test case(s). + - Provide a convincing reason to add this feature. Ideally, you should open a suggestion issue first and have it approved before working on it. +- If fixing bug: + - If you are resolving an open issue, add `(fix #xxxx)` (`#xxxx` being the issue ID) in your PR title for a better release log, e.g. `chore(feat): implement SSR (fix #1234)`. + - Provide a detailed description of the bug in the PR. Live demo preferred. + - Add appropriate test coverage if applicable. + +### Substantial Changes + +> RFC flow, TODO + +## Code Specification + +> TODO + +## Commit specification + +Commit messages should follow the [commit message convention](./COMMIT_CONVENTION.md) so that changelogs can be automatically generated. diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..a0e42215 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: ulivz # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +patreon: ulivz # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +custom: # Replace with a single custom sponsorship URL diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 7c17bf0f..71fbc7f7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -20,13 +20,11 @@ about: Create a report to help us improve ## Bug report -#### Version - #### Steps to reproduce - + #### What is expected? @@ -34,9 +32,4 @@ about: Create a report to help us improve #### Other relevant information -- Your OS: -- Node.js version: -- Browser version: -- Is this a global or local install? -- Which package manager did you use for the install? -- Does this issue occur when all plugins are disabled? +- Output of `npx vuepress info` in my VuePress project: diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 576eb21b..92cf6ab4 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -19,4 +19,4 @@ about: Suggest an idea for this project #### How should this be implemented in your opinion? -#### Are you willing to work on this yourself?** +#### Are you willing to work on this yourself? diff --git a/.github/semantic.yml b/.github/semantic.yml new file mode 100644 index 00000000..6014c248 --- /dev/null +++ b/.github/semantic.yml @@ -0,0 +1,2 @@ +titleAndCommits: true +allowMergeCommits: false diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 00000000..1bc68658 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,6 @@ +ports: + - port: 8080 + onOpen: open-preview +tasks: + - init: yarn bootstrap + command: yarn dev diff --git a/.lintstagedrc b/.lintstagedrc new file mode 100644 index 00000000..693feae1 --- /dev/null +++ b/.lintstagedrc @@ -0,0 +1,3 @@ +{ + "*.{js,vue}": ["eslint --fix", "git add"] +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d59fe87..df75154f 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,259 @@ +# [](https://github.com/vuejs/vuepress/compare/v1.0.4...v) (2019-09-06) + + + +## [1.0.4](https://github.com/vuejs/vuepress/compare/v1.0.3...v1.0.4) (2019-09-06) + + +### Bug Fixes + +* **$core:** do not transpile core packages' dependencies ([b69b107](https://github.com/vuejs/vuepress/commit/b69b107)) +* **avatar:** fix url ([45e31b4](https://github.com/vuejs/vuepress/commit/45e31b4)) +* **contributors:** fix for good contributions ([a709a4f](https://github.com/vuejs/vuepress/commit/a709a4f)) +* **contributors:** fix url parameters ([db71238](https://github.com/vuejs/vuepress/commit/db71238)) +* add missing hash in [#1706](https://github.com/vuejs/vuepress/issues/1706) ([#1780](https://github.com/vuejs/vuepress/issues/1780)) ([25777e4](https://github.com/vuejs/vuepress/commit/25777e4)) +* contributors commit link ([#1809](https://github.com/vuejs/vuepress/issues/1809)) ([bb61182](https://github.com/vuejs/vuepress/commit/bb61182)) + + +### Features + +* **$core:** use any custom protocol for outboundRE ([#1731](https://github.com/vuejs/vuepress/issues/1731)) ([120d885](https://github.com/vuejs/vuepress/commit/120d885)) +* Disable next and prev links from global config ([#1761](https://github.com/vuejs/vuepress/issues/1761)) ([92a1c02](https://github.com/vuejs/vuepress/commit/92a1c02)) + + + +# [](https://github.com/vuejs/vuepress/compare/v1.0.3...v) (2019-07-29) + + + +## [1.0.3](https://github.com/vuejs/vuepress/compare/v1.0.2...v1.0.3) (2019-07-29) + + +### Bug Fixes + +* **$core:** `'[Vue warn]: Unknown custom element'` when using `` in a custom page without markdown ([#1699](https://github.com/vuejs/vuepress/issues/1699)) ([2a59800](https://github.com/vuejs/vuepress/commit/2a59800)), closes [#1173](https://github.com/vuejs/vuepress/issues/1173) [#1426](https://github.com/vuejs/vuepress/issues/1426) +* **$core:** prioritise vuepress dependencies over cwd node_modules (close: [#1708](https://github.com/vuejs/vuepress/issues/1708)) ([#1720](https://github.com/vuejs/vuepress/issues/1720)) ([52f421b](https://github.com/vuejs/vuepress/commit/52f421b)) +* **$core:** transpile all scripts under core (close: [#1623](https://github.com/vuejs/vuepress/issues/1623)) ([#1685](https://github.com/vuejs/vuepress/issues/1685)) ([6460b0c](https://github.com/vuejs/vuepress/commit/6460b0c)) +* **$plugin-medium-zoom:** disable zoom for links ([#1719](https://github.com/vuejs/vuepress/issues/1719)) ([e3393e3](https://github.com/vuejs/vuepress/commit/e3393e3)) +* **$theme-default:** `sidebarDepth: 0` not working in YAML frontmatter (close: [#1701](https://github.com/vuejs/vuepress/issues/1701)) ([#1702](https://github.com/vuejs/vuepress/issues/1702)) ([0624828](https://github.com/vuejs/vuepress/commit/0624828)) + + +### Features + +* **$theme-default:** support custom URL scheme for external links ([#1677](https://github.com/vuejs/vuepress/issues/1677)) ([27f005b](https://github.com/vuejs/vuepress/commit/27f005b)) +* **$theme-default:** use router for Algolia search to reach no refresh ([#1706](https://github.com/vuejs/vuepress/issues/1706)) ([644142b](https://github.com/vuejs/vuepress/commit/644142b)) + + + +## [1.0.2](https://github.com/vuejs/vuepress/compare/v1.0.1...v1.0.2) (2019-06-22) + + +### Bug Fixes + +* **$core:** cannot resolve agreement file from parent theme ([1aaa6e3](https://github.com/vuejs/vuepress/commit/1aaa6e3)) +* **$core:** url display in dev log ([#1670](https://github.com/vuejs/vuepress/issues/1670)) ([17ba325](https://github.com/vuejs/vuepress/commit/17ba325)) +* **$plugin-medium-zoom:** doesn't work with default plugin options in default theme ([42f19e0](https://github.com/vuejs/vuepress/commit/42f19e0)) + + +### Features + +* **$plugin-medium-zoom:** custom options ([#1649](https://github.com/vuejs/vuepress/issues/1649)) ([54bb2f3](https://github.com/vuejs/vuepress/commit/54bb2f3)) + + + +## [1.0.1](https://github.com/vuejs/vuepress/compare/v1.0.0...v1.0.1) (2019-06-10) + + +### Bug Fixes + +* **$theme-default:** using '.theme-default-content' to replace '.content' in 404 layout ([#1646](https://github.com/vuejs/vuepress/issues/1646)) ([f0d1344](https://github.com/vuejs/vuepress/commit/f0d1344)) + + +### Features + +* **$theme-default:** enhance the styles of `blockquote` ([9d20d5f](https://github.com/vuejs/vuepress/commit/9d20d5f)) + + +# [1.0.0](https://github.com/vuejs/vuepress/compare/v1.0.0-rc.1...v1.0.0) (2019-06-08) + + + +# [1.0.0-rc.1](https://github.com/vuejs/vuepress/compare/v1.0.0-beta.2...v1.0.0-rc.1) (2019-06-08) + +It seems no any changes here. + + +# [1.0.0-beta.2](https://github.com/vuejs/vuepress/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2019-06-05) + + +### Bug Fixes + +* **$core:** failed to render `` with dynamic pageKey from current $page. ([83b02ba](https://github.com/vuejs/vuepress/commit/83b02ba)) + + + + +# [](https://github.com/vuejs/vuepress/compare/v1.0.0-beta.1...v) (2019-06-05) + + + +# [1.0.0-beta.1](https://github.com/vuejs/vuepress/compare/v1.0.0-alpha.50...v1.0.0-beta.1) (2019-06-04) + +### Features + +* **New Blog Plugin**: [@vuepress/plugin-blog](https://github.com/ulivz/vuepress-plugin-blog) + * A VuePress Blog Theme implemented in around 70 lines**: https://github.com/ulivz/70-lines-of-vuepress-blog-theme + +* **Default Blog Theme**: [@vuepress/plugin-blog](https://github.com/ulivz/vuepress-theme-blog) + * Live Example: http://example.vuepress-theme-blog.ulivz.com + +### BREAKING CHANGES + +* Deprecated `@vuepress/plugin-blog` at alpha stage. ([10dfb66](https://github.com/vuejs/vuepress/commit/10dfb66)) +* Deprecated `@vuepress/plugin-pagination` at alpha stage. ([3722192](https://github.com/vuejs/vuepress/commit/3722192)) + + +# [1.0.0-alpha.50](https://github.com/vuejs/vuepress/compare/v1.0.0-alpha.49...v1.0.0-alpha.50) (2019-06-04) + + +### Bug Fixes + +* **$core:** window is not defined ([d30e078](https://github.com/vuejs/vuepress/commit/d30e078)) + + +# [1.0.0-alpha.49](https://github.com/vuejs/vuepress/compare/v1.0.0-alpha.48...v1.0.0-alpha.49) (2019-06-03) + + +### Bug Fixes + +* **$core:** cannot load theme with shortcut. ([7eed1f4](https://github.com/vuejs/vuepress/commit/7eed1f4)) +* **$core:** cannot retrieve the correct theme name when them path is a local absolute path linked to a javascript file. ([50f64b4](https://github.com/vuejs/vuepress/commit/50f64b4)) + + +### Features + +* **$core:** global variable "__VUEPRESS__" to store runtime key infos ([bd0bdf9](https://github.com/vuejs/vuepress/commit/bd0bdf9)) +* **$core:** safer class name of content outlet ([7d0542e](https://github.com/vuejs/vuepress/commit/7d0542e)) +* **$theme-default:** using '.theme-default-content' to replace '.content' in `` outlet. ([85ff630](https://github.com/vuejs/vuepress/commit/85ff630)) + + + + +# [1.0.0-alpha.48](https://github.com/vuejs/vuepress/compare/v1.0.0-alpha.47...v1.0.0-alpha.48) (2019-05-14) + + +### Bug Fixes + +* **$core:** Failed to load theme when using `layouts/Layout.vue` as entry file (close: [#1563](https://github.com/vuejs/vuepress/issues/1563)) ([#1564](https://github.com/vuejs/vuepress/issues/1564)) ([057d8bf](https://github.com/vuejs/vuepress/commit/057d8bf)) +* **$core:** Search result cannot jump to the correct hash anchor (close: [#1594](https://github.com/vuejs/vuepress/issues/1594)) ([#1599](https://github.com/vuejs/vuepress/issues/1599)) ([e6af68f](https://github.com/vuejs/vuepress/commit/e6af68f)) +* **$core:** Use directory name to compute slug if filename is readme or index (close: [#1443](https://github.com/vuejs/vuepress/issues/1443)) ([#1535](https://github.com/vuejs/vuepress/issues/1535)) ([9efc678](https://github.com/vuejs/vuepress/commit/9efc678)) +* **$core:** webpack externals (ref: [#451](https://github.com/vuejs/vuepress/issues/451)) ([fb324d5](https://github.com/vuejs/vuepress/commit/fb324d5)) + + +### Features + +* **$core:** Infer page's date via directory name ([#1553](https://github.com/vuejs/vuepress/issues/1553)) ([2c930c9](https://github.com/vuejs/vuepress/commit/2c930c9)) +* **$core:** `info` command ([#1573](https://github.com/vuejs/vuepress/issues/1573)) ([3eeb080](https://github.com/vuejs/vuepress/commit/3eeb080)) +* **$core:** Prevent duplicate route ([#1525](https://github.com/vuejs/vuepress/issues/1525)) ([441f023](https://github.com/vuejs/vuepress/commit/441f023)) +* **$theme-default:** Support external links in sidebar (close: [#764](https://github.com/vuejs/vuepress/issues/764))([#1534](https://github.com/vuejs/vuepress/issues/1534)) ([141bd11](https://github.com/vuejs/vuepress/commit/141bd11)) + + + + +# [1.0.0-alpha.47](https://github.com/vuejs/vuepress/compare/v1.0.0-alpha.46...v1.0.0-alpha.47) (2019-04-06) + + +### Bug Fixes + +* **$core:** `index.styl` is not injected at the end of the style bundle (close: [#1523](https://github.com/vuejs/vuepress/issues/1523)) ([dabf506](https://github.com/vuejs/vuepress/commit/dabf506)) +* **$core:** `routerBase` will always get '/' (close: [#1503](https://github.com/vuejs/vuepress/issues/1503)) ([9fba549](https://github.com/vuejs/vuepress/commit/9fba549)) +* **$markdown:** Snippets should allow spaces in file path (closes [#1505](https://github.com/vuejs/vuepress/issues/1505)) ([#1517](https://github.com/vuejs/vuepress/issues/1517)) ([5c307c9](https://github.com/vuejs/vuepress/commit/5c307c9)) + + +### Features + +* **$core:** assert return type for functional plugin ([#1516](https://github.com/vuejs/vuepress/issues/1516)) ([74887c5](https://github.com/vuejs/vuepress/commit/74887c5)) +* **$core:** emit warning if the source directory doesn't exist (close: [#1521](https://github.com/vuejs/vuepress/issues/1521)) ([6da9a5f](https://github.com/vuejs/vuepress/commit/6da9a5f)) +* **$plugin-pwa:** allow using local workbox files (close: [#539](https://github.com/vuejs/vuepress/issues/539)) ([4640614](https://github.com/vuejs/vuepress/commit/4640614)) + + + + +# [1.0.0-alpha.46](https://github.com/vuejs/vuepress/compare/v1.0.0-alpha.45...v1.0.0-alpha.46) (2019-04-01) + + +### Bug Fixes + +* **$core:** regression of introducing dynamic `routerBase` (close: [#1498](https://github.com/vuejs/vuepress/issues/1498)) ([5e12b49](https://github.com/vuejs/vuepress/commit/5e12b49)) + + + + +# [1.0.0-alpha.45](https://github.com/vuejs/vuepress/compare/v1.0.0-alpha.44...v1.0.0-alpha.45) (2019-03-31) + + +### Bug Fixes + +* **$core:** do not register component in render function ([#1449](https://github.com/vuejs/vuepress/issues/1449)) ([ef82c47](https://github.com/vuejs/vuepress/commit/ef82c47)) +* **$core:** do not use stylus in outbound link ([d34e038](https://github.com/vuejs/vuepress/commit/d34e038)) +* **$core:** should default host be 0.0.0.0 ([699492a](https://github.com/vuejs/vuepress/commit/699492a)) +* **$markdown:** treat styl as stylus language ([#1433](https://github.com/vuejs/vuepress/issues/1433)) ([f44e2db](https://github.com/vuejs/vuepress/commit/f44e2db)) +* **$markdown-loader:** always use `/` instead of `\` in `relPath` ([#1484](https://github.com/vuejs/vuepress/issues/1484)) ([944ebe4](https://github.com/vuejs/vuepress/commit/944ebe4)) +* **$plugin-active-header-links:** side navigation edge case bug ([#1477](https://github.com/vuejs/vuepress/issues/1477)) ([8a11d14](https://github.com/vuejs/vuepress/commit/8a11d14)) +* **$plugin-blog:** inconsistent paths of tag and category pages with index page ([#1420](https://github.com/vuejs/vuepress/issues/1420)) ([5c0e62f](https://github.com/vuejs/vuepress/commit/5c0e62f)) +* **$plugin-pwa:** fix a typo in `opacity` ([#1444](https://github.com/vuejs/vuepress/issues/1444)) ([c174f0d](https://github.com/vuejs/vuepress/commit/c174f0d)) +* **$theme-default:** fix wrong editLink (close: [#1115](https://github.com/vuejs/vuepress/issues/1115), [#1125](https://github.com/vuejs/vuepress/issues/1125)) ([#1419](https://github.com/vuejs/vuepress/issues/1419)) ([3b14375](https://github.com/vuejs/vuepress/commit/3b14375)) +* **$theme-default:** nav url change bug (close: [#865](https://github.com/vuejs/vuepress/issues/865)) ([#1475](https://github.com/vuejs/vuepress/issues/1475)) ([521dddd](https://github.com/vuejs/vuepress/commit/521dddd)) + + +### Features + +* **$core:** allow dynamic routeBase at runtime ([fc99d59](https://github.com/vuejs/vuepress/commit/fc99d59)) +* **$core:** decode page path for better readability ([#1438](https://github.com/vuejs/vuepress/issues/1438)) ([93b2ca1](https://github.com/vuejs/vuepress/commit/93b2ca1)) +* **$core:** export version ([#1486](https://github.com/vuejs/vuepress/issues/1486)) ([d7b8daf](https://github.com/vuejs/vuepress/commit/d7b8daf)) +* **$core:** functional siteConfig.evergreen ([#1489](https://github.com/vuejs/vuepress/issues/1489)) ([19e0569](https://github.com/vuejs/vuepress/commit/19e0569)) +* **$core:** support array as plugin options ([#1493](https://github.com/vuejs/vuepress/issues/1493)) ([9e07b1e](https://github.com/vuejs/vuepress/commit/9e07b1e)) +* **$markdown:** markdown plugin (close: [#585](https://github.com/vuejs/vuepress/issues/585)) ([#1422](https://github.com/vuejs/vuepress/issues/1422)) ([9734a58](https://github.com/vuejs/vuepress/commit/9734a58)) +* **$plugin-register-components:** custom name registration (close: [#656](https://github.com/vuejs/vuepress/issues/656)) ([#1418](https://github.com/vuejs/vuepress/issues/1418)) ([9c6a00b](https://github.com/vuejs/vuepress/commit/9c6a00b)) + + +### Breaking Changes + +* Deprecated [@vuepress/plugin-container](https://www.npmjs.com/package/@vuepress/plugin-container) and moved it to [vuepress-plugin-container](https://www.npmjs.com/package/vuepress-plugin-container). +* Deprecated [@vuepress/plugin-clean-urls](https://www.npmjs.com/package/@vuepress/plugin-clean-urls) and moved it to [vuepress-plugin-clean-urls](https://www.npmjs.com/package/vuepress-plugin-clean-urls). + + + +# [1.0.0-alpha.44](https://github.com/vuejs/vuepress/compare/v1.0.0-alpha.43...v1.0.0-alpha.44) (2019-03-10) + + +### Features + +* **$core:** optional `callback` when socket connection is ready under dev. ([547e4f9](https://github.com/vuejs/vuepress/commit/547e4f9)) +* **$core:** return current app instance in node api ([1c2a6b2](https://github.com/vuejs/vuepress/commit/1c2a6b2)) + + + + + +# [1.0.0-alpha.43](https://github.com/vuejs/vuepress/compare/v1.0.0-alpha.42...v1.0.0-alpha.43) (2019-03-09) + + +### Bug Fixes + +* **$core:** cannot render another page with pageKey (close: [#1173](https://github.com/vuejs/vuepress/issues/1173)) ([9d01514](https://github.com/vuejs/vuepress/commit/9d01514)) +* **$core:** global components cannot be used as layouts (close: [#1321](https://github.com/vuejs/vuepress/issues/1321)) ([0306574](https://github.com/vuejs/vuepress/commit/0306574)) +* **$core:** PascalCase layouts cannot be used with camelCase nor hyphen-delimited (close: [#1391](https://github.com/vuejs/vuepress/issues/1391)) ([3e91eba](https://github.com/vuejs/vuepress/commit/3e91eba)) +* **$plugin-blog:** read `layoutComponents` from themeAPI ([#1396](https://github.com/vuejs/vuepress/issues/1396)) ([5bf4d24](https://github.com/vuejs/vuepress/commit/5bf4d24)) + + +### Features + +* **$core:** refine node api ([#1395](https://github.com/vuejs/vuepress/issues/1395)) ([e5d8ed4](https://github.com/vuejs/vuepress/commit/e5d8ed4)) +* **$cli:** `--no-clear-screen` flag (close: [#1421](https://github.com/vuejs/vuepress/issues/1421)) ([e5f51de](https://github.com/vuejs/vuepress/commit/e5f51de)) + + + # [1.0.0-alpha.42](https://github.com/vuejs/vuepress/compare/v1.0.0-alpha.41...v1.0.0-alpha.42) (2019-03-03) @@ -145,7 +401,7 @@ ### Features -* **$core:** Support extra watching files ([02cc268](https://github.com/vuejs/vuepress/commit/02cc268)), +* **$core:** Support extra watching files ([02cc268](https://github.com/vuejs/vuepress/commit/02cc268)),
e.g. ```js // .vuepress/config.js @@ -167,7 +423,7 @@ * **$core:** Leverage `webpack-dev-server` and sunset `webpack-serve` ([#1195](https://github.com/vuejs/vuepress/issues/1195)) ([81e3ef6](https://github.com/vuejs/vuepress/commit/81e3ef6)) - Add new plugin option api [beforeDevServer](https://v1.vuepress.vuejs.org/plugin/option-api.html#beforedevserver) and [afterDevServer](https://v1.vuepress.vuejs.org/plugin/option-api.html#afterdevserver). - - Remove `enhanceDevServer`. + - Remove `enhanceDevServer`. - Publish [vuepress-plugin-export](https://github.com/ulivz/vuepress-plugin-export). * **$core:** Allow a theme package using a sub directory (close [#1204](https://github.com/vuejs/vuepress/issues/1204)) ([#1206](https://github.com/vuejs/vuepress/issues/1206)) ([febe3a7](https://github.com/vuejs/vuepress/commit/febe3a7)) * **$theme-default:** Support shortcut for `sh` and `yml`. (close: [#1221](https://github.com/vuejs/vuepress/issues/1221)) ([fc5dba8](https://github.com/vuejs/vuepress/commit/fc5dba8)) @@ -226,7 +482,7 @@ ### Breaking Changes * **$core:** remove `contentLoading` and refine scroll behavior ([#1117](https://github.com/vuejs/vuepress/issues/1117)) ([0a7d85b](https://github.com/vuejs/vuepress/commit/0a7d85b)) - - It also fixes the exisitng issues about anchor links. (Refs: [#1113](https://github.com/vuejs/vuepress/issues/1113), [#1016](https://github.com/vuejs/vuepress/issues/1016), [#1011](https://github.com/vuejs/vuepress/issues/1011), [#895](https://github.com/vuejs/vuepress/issues/895)) + - It also fixes the existing issues about anchor links. (Refs: [#1113](https://github.com/vuejs/vuepress/issues/1113), [#1016](https://github.com/vuejs/vuepress/issues/1016), [#1011](https://github.com/vuejs/vuepress/issues/1011), [#895](https://github.com/vuejs/vuepress/issues/895)) ### Performance Improvements @@ -943,8 +1199,8 @@ * $page is missing at 404 page ([#388](https://github.com/vuejs/vuepress/issues/388)) ([cefc8c3](https://github.com/vuejs/vuepress/commit/cefc8c3)) * avoid the searchbox exceeded out of screen in narrow screen ([#254](https://github.com/vuejs/vuepress/issues/254)) ([8f04081](https://github.com/vuejs/vuepress/commit/8f04081)) -* code looks not good at small sreen (close: [#350](https://github.com/vuejs/vuepress/issues/350)) ([6514c8f](https://github.com/vuejs/vuepress/commit/6514c8f)) -* code looks not good at small sreen (close: [#350](https://github.com/vuejs/vuepress/issues/350)) ([d0ef06f](https://github.com/vuejs/vuepress/commit/d0ef06f)) +* code looks not good at small screen (close: [#350](https://github.com/vuejs/vuepress/issues/350)) ([6514c8f](https://github.com/vuejs/vuepress/commit/6514c8f)) +* code looks not good at small screen (close: [#350](https://github.com/vuejs/vuepress/issues/350)) ([d0ef06f](https://github.com/vuejs/vuepress/commit/d0ef06f)) * dropdown overlap due to word wrapping (close: [#359](https://github.com/vuejs/vuepress/issues/359)) ([#360](https://github.com/vuejs/vuepress/issues/360)) ([c65a8b7](https://github.com/vuejs/vuepress/commit/c65a8b7)) * duplicate slash when docs dir is not set ([#361](https://github.com/vuejs/vuepress/issues/361)) ([0c59ed5](https://github.com/vuejs/vuepress/commit/0c59ed5)) * emoji doesn't work in toc (close: [#417](https://github.com/vuejs/vuepress/issues/417)) ([#418](https://github.com/vuejs/vuepress/issues/418)) ([1b9012e](https://github.com/vuejs/vuepress/commit/1b9012e)) @@ -1057,7 +1313,7 @@ * fix emoji not showing on sidebars ([#206](https://github.com/vuejs/vuepress/issues/206)) ([bc2c83a](https://github.com/vuejs/vuepress/commit/bc2c83a)) * fix Sidebar link active logic ([#215](https://github.com/vuejs/vuepress/issues/215)) ([9c93d8f](https://github.com/vuejs/vuepress/commit/9c93d8f)) * Fix the style of repo link. ([f55fa00](https://github.com/vuejs/vuepress/commit/f55fa00)) -* fix title inferrence regression (close [#208](https://github.com/vuejs/vuepress/issues/208)) ([52c20cf](https://github.com/vuejs/vuepress/commit/52c20cf)) +* fix title inference regression (close [#208](https://github.com/vuejs/vuepress/issues/208)) ([52c20cf](https://github.com/vuejs/vuepress/commit/52c20cf)) * renames index.js to enhanceApp.js ([#226](https://github.com/vuejs/vuepress/issues/226)) ([0170449](https://github.com/vuejs/vuepress/commit/0170449)) * siteTitle vs pageTitle ([cd9b788](https://github.com/vuejs/vuepress/commit/cd9b788)) @@ -1073,7 +1329,7 @@ * support excerpt extraction with `` (close [#174](https://github.com/vuejs/vuepress/issues/174)) ([fa404dc](https://github.com/vuejs/vuepress/commit/fa404dc)) * support for TOML front matter ([#141](https://github.com/vuejs/vuepress/issues/141)) ([#164](https://github.com/vuejs/vuepress/issues/164)) ([70620ba](https://github.com/vuejs/vuepress/commit/70620ba)) * support toml config ([#138](https://github.com/vuejs/vuepress/issues/138)) ([d136e22](https://github.com/vuejs/vuepress/commit/d136e22)) -* theme index enhancment support ([#154](https://github.com/vuejs/vuepress/issues/154)) ([d026801](https://github.com/vuejs/vuepress/commit/d026801)) +* theme index enhancement support ([#154](https://github.com/vuejs/vuepress/issues/154)) ([d026801](https://github.com/vuejs/vuepress/commit/d026801)) @@ -1119,7 +1375,7 @@ * handle headers that start with numbers (fix [#121](https://github.com/vuejs/vuepress/issues/121)) ([ad83169](https://github.com/vuejs/vuepress/commit/ad83169)) * make search locale-scoped (close [#128](https://github.com/vuejs/vuepress/issues/128)) ([846eb59](https://github.com/vuejs/vuepress/commit/846eb59)) -* **nav:** unepxected error when themeConfig.nav isn't given. (close: [#125](https://github.com/vuejs/vuepress/issues/125)) ([#127](https://github.com/vuejs/vuepress/issues/127)) ([f052472](https://github.com/vuejs/vuepress/commit/f052472)) +* **nav:** unexpected error when themeConfig.nav isn't given. (close: [#125](https://github.com/vuejs/vuepress/issues/125)) ([#127](https://github.com/vuejs/vuepress/issues/127)) ([f052472](https://github.com/vuejs/vuepress/commit/f052472)) * service worker path ([51c6eb2](https://github.com/vuejs/vuepress/commit/51c6eb2)) * use correct host in tip after the server has started ([#130](https://github.com/vuejs/vuepress/issues/130)) ([fd447ae](https://github.com/vuejs/vuepress/commit/fd447ae)) * use header's slug as it is if possible ([#119](https://github.com/vuejs/vuepress/issues/119)) ([5f7e199](https://github.com/vuejs/vuepress/commit/5f7e199)) @@ -1200,7 +1456,7 @@ ### Bug Fixes * always transpile lib directory ([#73](https://github.com/vuejs/vuepress/issues/73)) ([56e0392](https://github.com/vuejs/vuepress/commit/56e0392)) -* avoid html-webpack-plugin requiring incomaptible webpack internals ([4816bef](https://github.com/vuejs/vuepress/commit/4816bef)) +* avoid html-webpack-plugin requiring incompatible webpack internals ([4816bef](https://github.com/vuejs/vuepress/commit/4816bef)) * prioritize own deps + avoid serving wrong index.html (fix [#69](https://github.com/vuejs/vuepress/issues/69)) ([781e37a](https://github.com/vuejs/vuepress/commit/781e37a)) * redirect */index.html to */ (close [#83](https://github.com/vuejs/vuepress/issues/83)) ([52e04c4](https://github.com/vuejs/vuepress/commit/52e04c4)) * remove override import when ejecting (close [#56](https://github.com/vuejs/vuepress/issues/56)) ([2d811ed](https://github.com/vuejs/vuepress/commit/2d811ed)) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..2c495d25 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at vuepresscore@gmail.com. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/README.md b/README.md index c3772446..1195d4b9 100644 --- a/README.md +++ b/README.md @@ -5,43 +5,115 @@

- Downloads + Downloads Version - npm next version - License + License vuepress channel on Discord

-> This is the branch for `VuePress 1.x` and docs are available at https://v1.vuepress.vuejs.org. +

Supporting VuePress

-## Status: alpha +Maintaining and developing new features to VuePress takes a considerable amount of time (if you know that Gastby's team is a company), and I am currently exploring the possibility of working on VuePress fulltime. -Certain combinations of plugins may not work properly, and things may change or break until we reach `beta` phase. Do not use in production yet unless you are adventurous. +- [Sponsor ULIVZ on Patreon](https://www.patreon.com/ulivz) +- [Sponsor Vue.js](https://vuejs.org/support-vuejs) -For 0.x, it's moved to [0.x branch](https://github.com/vuejs/vuepress/tree/0.x) and still maintained, the website is: https://vuepress.vuejs.org. +> "VuePress is much more than that." β€”β€” ULIVZ ## Install ```bash -yarn add vuepress -D # Install 0.x -yarn add vuepress@next -D # Install 1.x. +yarn add vuepress -D ``` ## Showcase -Check out [Awesome Vuepress](https://github.com/ulivz/awesome-vuepress) to find awesome things related to VuePress 1.x . +- [Awesome Vuepress](https://github.com/ulivz/awesome-vuepress) +- [vuepress.gallery](https://vuepress.gallery) (by [@vicbergquist](https://twitter.com/vicbergquist)) -## Development +## Documentation -> Please make sure your version of Node.js is greater than 8. +This is the branch for `VuePress 1.x` and docs are available at https://v1.vuepress.vuejs.org. -``` bash +## Contribution + +Want to contribute? Check our [issues for beginners](https://github.com/vuejs/vuepress/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22)! + +```bash +yarn bootstrap # Install and link dependencies for this lerna repo yarn dev # serves VuePress' own docs with itself yarn test # make sure your code change pass the test ``` +If you don't have a local checkout, you can also open [VuePress in Gitpod](https://gitpod.io/#https://github.com/vuejs/vuepress/blob/master/packages/docs/docs/README.md), a free online IDE for GitHub. + If you intend to make `"substantial"` changes to VuePress or its documentation, please checkout [VuePress RFCs](./rfcs/README.md). +If you have a VuePress-related project/component/tool, add it with a pull request to [this curated list](https://github.com/ulivz/awesome-vuepress)! + +## Contributors + +### Core Team + + + + + + + + + + + + + + + + + + + + + + + + + + +
Evan You
Evan You

πŸ’»
ULIVZ
ULIVZ

πŸ’» πŸ“–
Jen Looper
Jen Looper

πŸ“– 🎨
Sarah Dayan
Sarah Dayan

πŸ’» πŸ“–
Franck Abgrall
Franck Abgrall

πŸ’» πŸ’¬
Nikita Sobolev
Nikita Sobolev

πŸ’» πŸ“–
Giraud Florent
Giraud Florent

πŸ’»
Ramona
Ramona

πŸ’»
Fatih Acet
Fatih Acet

πŸ’»
Filip Rakowski
Filip Rakowski

πŸ’»
Vladimir Pouzanov
Vladimir Pouzanov

πŸ’»
Victoria Bergquist
Victoria Bergquist

πŸ’» 🎨
Billyyyyy3320
Billyyyyy3320

πŸ’»
Ben Hong
Ben Hong

πŸ’» πŸ“
Vinayak Kulkarni
Vinayak Kulkarni

πŸ’»
+ + + + + +### Code Contributors + +This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. + + +### Financial Contributors + +Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/vuepress/contribute)] + +#### Individuals + + + +#### Organizations + +Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/vuepress/contribute)] + + + + + + + + + + + + ## License [MIT](https://github.com/vuejs/vuepress/blob/master/LICENSE) diff --git a/__mocks__/vuepress-theme-without-index/Layout.vue b/__mocks__/vuepress-theme-without-index/Layout.vue new file mode 100644 index 00000000..e69de29b diff --git a/__mocks__/vuepress-theme-without-index/index.js b/__mocks__/vuepress-theme-without-index/index.js new file mode 100644 index 00000000..964c7556 --- /dev/null +++ b/__mocks__/vuepress-theme-without-index/index.js @@ -0,0 +1,2 @@ +module.exports = {} +// This file is just for jest. diff --git a/__mocks__/vuepress-theme-without-index/package.json b/__mocks__/vuepress-theme-without-index/package.json new file mode 100644 index 00000000..a67c4956 --- /dev/null +++ b/__mocks__/vuepress-theme-without-index/package.json @@ -0,0 +1,4 @@ +{ + "name": "vuepress-theme-without-index", + "main": "Layout.vue" +} diff --git a/art/VuePress-Icon.ai b/art/VuePress-Icon.ai new file mode 100644 index 00000000..63ec74af --- /dev/null +++ b/art/VuePress-Icon.ai @@ -0,0 +1,1359 @@ +%PDF-1.5 %βγΟΣ +1 0 obj <>/OCGs[5 0 R 62 0 R 148 0 R 221 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + Adobe Illustrator CC 23.0 (Windows) + 2019-05-29T13:53:31-07:00 + 2019-05-29T14:12:32-07:00 + 2019-05-29T14:12:32-07:00 + + + + 228 + 256 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADkAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq0WUd8VcHU9DireKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuqMVa5L4jFWvUTxriruR7A4q6snYU+eKupIe4H44q7g3dj9FMVb4DvviruK+AxVbJHyUg bN+yffFVCyufVWjfbGzDwI64qisVdirsVdirsVdirsVdirsVdirsVdiriQMVW+ovzxV3M9lOKurJ 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 rsVdirsVdirsVdirsVdirsVf/9k= + + + + 3 + sRGB IEC61966-2.1 + + + xmp.did:A77706D087AB11E3B70DEE037706C123 + + + application/pdf + uuid:a3fb1f86-fd9c-4b22-be00-d8c29ea4396f + xmp.did:248539d3-8190-4647-a7c2-f58aac979746 + xmp.did:b0ad8870-0927-4ef5-a908-c1686f1ddc69 + proof:pdf + + + + created + xmp.iid:b0ad8870-0927-4ef5-a908-c1686f1ddc69 + 2018-04-12T10:41:10-04:00 + Adobe Photoshop CC 2017 (Macintosh) + + + saved + xmp.iid:a86be286-02bd-45c3-801e-b9430b9feebc + 2018-04-12T10:46:39-04:00 + Adobe Photoshop CC 2017 (Macintosh) + / + + + saved + xmp.iid:248539d3-8190-4647-a7c2-f58aac979746 + 2019-05-29T13:53:31-07:00 + Adobe Illustrator CC 23.0 (Windows) + / + + + + + uuid:55ec20c6-343f-4a83-a806-80239a5ba58b + xmp.did:1eed275b-e294-6d41-9a25-e46e3c40af5f + xmp.did:b0ad8870-0927-4ef5-a908-c1686f1ddc69 + proof:pdf + + 1 + 3000000/10000 + 3000000/10000 + 2 + 1 + 600 + 600 + 1 + True + False + + 144.000000 + 144.000000 + Points + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + R=115 G=203 B=141 + PROCESS + 100.000000 + RGB + 115 + 203 + 141 + + + R=47 G=152 B=105 + PROCESS + 100.000000 + RGB + 47 + 152 + 105 + + + R=88 G=96 B=128 + PROCESS + 100.000000 + RGB + 88 + 96 + 128 + + + R=44 G=50 B=71 + PROCESS + 100.000000 + RGB + 44 + 50 + 71 + + + + + + + Document + + + + + + + + + + + + + + + + + + + + + + + + + +endstream endobj 3 0 obj <> endobj 7 0 obj <>/Resources<>/Properties<>/XObject<>>>/Thumb 228 0 R/TrimBox[0.0 0.0 144.0 144.0]/Type/Page>> endobj 223 0 obj <>stream +H‰χwVΠχu6PprqVΰ*δ2P041c]Q”ʐΧw6PH/Κ‡ψθ»ε(ΈδsrΉϊ5rωγ +endstream endobj 224 0 obj <> endobj 228 0 obj <>stream +8;WRk]bQ&?%"q7hE/Rsi'c/$Q*Ksm+ND@>SXCM%7YVCFaOY:p0P^\9#hlhg,9rt!$ +\[?Z@5n\ZY"E5`kqH"^@:!R/X_kn`uS6b2U+&t$PY1QM"S;iWl'OP!ZoB5d40]s=? +W&E.[5\Q&a04[=YW-Pcge'E7C!*O^"Wr~> +endstream endobj 230 0 obj [/Indexed/DeviceRGB 255 231 0 R] endobj 231 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> +endstream endobj 227 0 obj <>/ExtGState<>/ProcSet[/PDF/ImageC/ImageI]/Shading<>/XObject<>>>/Subtype/Form>>stream +q +15.415 106.843 m +83.042 116.883 l +84.851 117.151 86.748 116.057 87.287 114.432 c +115.265 30.124 l +115.951 28.056 114.885 26.018 112.873 25.581 c +37.142 9.162 l +34.9 8.676 32.682 10.109 32.195 12.353 c +12.493 103.167 l +12.116 104.905 13.427 106.548 15.415 106.843 c +W* n +q +0 g +/GS0 gs +0 107.8557281 107.8557281 -0 63.9506111 9.0674381 cm +BX /Sh0 sh EX Q +Q +q +15.837 107.75 m +83.465 117.789 l +85.273 118.058 87.171 116.963 87.71 115.338 c +115.688 31.03 l +116.374 28.962 115.308 26.924 113.296 26.487 c +37.564 10.068 l +35.323 9.582 33.104 11.016 32.618 13.259 c +12.916 104.073 l +12.538 105.812 13.85 107.455 15.837 107.75 c +W* n +q +0 g +/GS0 gs +0 107.8557281 107.8557281 -0 64.37323 9.9737463 cm +BX /Sh1 sh EX Q +Q +q +/GS1 gs +123.3600049 0 0 136.8000054 9.0872765 1.4457679 cm +/Im0 Do +Q +q +22.673 118.746 m +89.808 128.591 l +91.608 128.855 93.515 127.752 94.073 126.122 c +122.446 43.292 l +123.128 41.301 122.098 39.348 120.137 38.936 c +46.631 23.494 l +44.465 23.039 42.275 24.411 41.747 26.551 c +19.88 115.091 l +19.452 116.824 20.705 118.458 22.673 118.746 c +W* n +q +0 g +/GS0 gs +0 105.2224884 105.2224884 -0 71.2262192 23.4073429 cm +BX /Sh2 sh EX Q +Q +q +/GS2 gs +123.1200049 0 0 133.6800053 16.3960667 14.64519 cm +/Im1 Do +Q +q +29.886 129.375 m +96.445 138.905 l +98.231 139.161 100.136 138.067 100.704 136.458 c +129.388 55.155 l +130.072 53.213 129.066 51.313 127.133 50.918 c +54.774 36.131 l +52.646 35.696 50.471 37.035 49.925 39.115 c +27.165 125.782 l +26.716 127.49 27.937 129.097 29.886 129.375 c +W* n +q +0 g +/GS0 gs +0 102.8930511 102.8930511 -0 78.3371201 36.0491562 cm +BX /Sh3 sh EX Q +Q +/CS0 cs 0.737 0.753 0.812 scn +/GS0 gs +q 1 0 0 1 93.2695 71.6797 cm +0 0 m +-1.659 5.58 l +-5.109 4.99 l +-3.359 -0.64 l +-6.46 -1.239 l +-0.09 -5.489 l +3.141 0.61 l +h +-24.126 1.463 m +-21.027 -9.416 l +-17.698 -8.657 l +-19.479 -2.394 l +-14.933 -5.954 l +-12.72 -0.943 l +-10.907 -7.306 l +-7.676 -6.613 l +-10.808 3.903 l +-14.236 3.309 l +-16.313 -1.306 l +-20.797 2.089 l +h +-29.975 2.777 m +-25.545 -13.353 l +-25.201 -14.604 -23.952 -15.379 -22.679 -15.132 c +7.423 -9.279 l +8.882 -8.996 9.766 -7.503 9.313 -6.087 c +4.344 9.446 l +3.966 10.63 2.77 11.351 1.546 11.133 c +-28.017 5.877 l +-29.455 5.622 -30.362 4.186 -29.975 2.777 c +-27.443 4.169 m +1.88 9.603 l +2.296 9.68 2.705 9.434 2.832 9.03 c +7.755 -6.612 l +7.904 -7.09 7.606 -7.592 7.115 -7.687 c +-22.628 -13.479 l +-23.057 -13.563 -23.478 -13.303 -23.596 -12.883 c +-28.098 3.117 l +-28.231 3.592 -27.928 4.079 -27.443 4.169 c +f* +Q +0.635 0.651 0.702 scn +q 1 0 0 1 74.2402 67.7002 cm +0 0 m +-0.45 1.59 l +-0.87 0.68 l +0.7 -4.82 l +1.33 -4.681 l +h +11.35 -2.63 m +10.7 -2.771 l +7.8 6.98 l +4.38 6.38 l +4.79 7.29 l +8.22 7.88 l +h +2.7 2.68 m +2.29 1.77 l +-2.19 5.16 l +-4.88 4.66 l +-5.1 5.44 l +-1.771 6.07 l +h +15.01 3.21 m +15.67 3.34 l +15.25 2.43 l +13.529 2.1 l +12.569 2.74 l +h +22.17 4.59 m +21.68 3.67 l +18.609 3.069 l +16.95 8.65 l +14.17 8.17 l +13.92 8.97 l +17.37 9.56 l +19.029 3.979 l +h +27.96 -4.34 m +28.069 -3.92 28.06 -3.46 27.92 -3.01 c +22.95 12.52 l +22.569 13.7 21.38 14.42 20.149 14.21 c +-9.41 8.95 l +-10.06 8.84 -10.61 8.48 -10.96 7.98 c +-10.76 8.91 -10.01 9.68 -8.99 9.86 c +20.58 15.11 l +21.8 15.33 23 14.61 23.37 13.43 c +28.34 -2.11 l +28.6 -2.9 28.43 -3.73 27.96 -4.34 c +26.71 -3.3 m +26.359 -4.03 l +26.25 -4.26 l +26.13 -4.44 25.939 -4.57 25.72 -4.61 c +-4.021 -10.41 l +-4.45 -10.49 -4.87 -10.23 -4.99 -9.811 c +-9.49 6.19 l +-9.54 6.38 -9.53 6.58 -9.45 6.75 c +-9.42 6.81 l +-9.39 6.87 l +-9.05 7.6 l +-9.11 7.45 -9.12 7.27 -9.07 7.1 c +-8.95 6.67 l +-4.57 -8.9 l +-4.45 -9.32 -4.03 -9.58 -3.6 -9.5 c +26.13 -3.71 l +26.14 -3.71 l +26.399 -3.66 26.6 -3.5 26.71 -3.3 c +f +Q +q +56.64 117.12 m +48 115.92 l +78.72 87.36 l +89.76 122.4 l +81.6 120.96 l +75.12 100.32 l +h +W n +q +0 g +43.4175301 -142.0123444 -142.0123444 -43.4175301 58.1532707 154.2455444 cm +BX /Sh4 sh EX Q +Q +q +56.64 117.12 m +64.56 118.32 l +71.52 112.08 l +74.16 119.76 l +81.6 120.96 l +75.12 100.32 l +h +W n +q +0 g +67.9753189 -197.4146423 -197.4146423 -67.9753189 52.600174 167.0170593 cm +BX /Sh5 sh EX Q +Q + +endstream endobj 232 0 obj <> endobj 244 0 obj <>stream +H‰μΥ{#Λ†Q‡97ΜpΓ̌7ΜΜΜΜΜρoΟ“]'­δ][κ꩚:ηττχJ}vΐΒω…΅ΟΑdη‡­},&Έb{lί=§ΧΐV]z lΜΣk`#NΩ^₯ ˜^5 œ^΅L/Flό [$PΝ°ι$PΒ€ιχ·Ώkk1B§Ώ[k8#¦π΅I “©ΣK “ӟ?δX +XΣͺΣ_Y€&Θ0ύΥ ¬};›6bϊ‡&9N―€9Lώ°H +ˆ’~z D)3½†0ύΓηSΐ¦_c{ œφτ +8Α&¦Ώ €1ύ#’‘ΐυlpϊ +Έ‡ӟ?23\eσӏξΤfϊ +ΈΤlϊ +8λχ³ίΥ:Σ?ͺΊž˜ώO[{žH¦ίΧ₯Σ_eσ ˜~«Ϋίvΰ{ΧήlΣ?Ίƒ `ϊΩX§N˜~άΒΪ+ν€νΫΦV +0ύ±ΆQΐ1Σ?ŽΫ6€ιORΏ€kOx)_€νOU<ӟ¬v¦?]ιL?Bαv}ΗΩHk_cau Xžω ―lφ€j₯~Oδ4Eΐ05 π0NρΦΎΎ-(™ΐΟϊ$N¦€ξ*p€‘ +& €‘НΪ«—ΐεIŸΜ +θrOa„r œK`,t·_@ς0ZαžΚ… 8T{0\±Ξ0šΊ«ό < +π FP@{΅Pΐx΅ +ΐx… x&CΤJ@γ) »Zμ$π,†¨•€Ζ«[ΐ³BνI ;t§€φJ%°<ζs£T €φJ% €e x.c”*`'η1F© lΟg ΄'ξНΪ«”ΐς”χ3H₯$aΏ€Δ ,OωQ@wU x!ƒT}ΦΎ· )Z€†©Zΐ‹€3 €… +X&πbF)Z€Ζ)”€B( ;΄W4—0ŠΊS@{uP@Œ:H †Ϊ«“€bΤ,ΰ₯ S§ ©“€b( ;΄W3—1ŒΊ«YΐΛ§L +R¦ ©Yΐ+§L +’€ξΚ (eXρ•ŒS²€W1Ξ~IP@”*H ŠΊσ ΄W±€W3P•$₯δ3°φ₯m‹Ί«XΐkIέU,ΰ΅ €€φŠ$ €0E +@΄W$ε_ΗH +θH; Όž‘Š$ €0 +θ`o`( t§€ξ +πF†ͺ‘€βΤ(@qΠ^GέΥ(@j$°<ί›Jέν1*Q€) »zΟΐ›Kέ•(`'·0T½g`νΫt§€φ$Π]ΉήΚX +h―BΛΣ½Α* Hε +x;ƒUH@‘Π]…vxƒUH@‘НΪ«–ΐ;Lέ) ½ ,χ.F+P€BU+ΰ݌V „R@w +ΨIΰ=ŒV „*Vΐ{MνΥJ`νΫΪ’Zœ―}]΄_@Ί«V0\ώΞͺΨ3π>†S@w +θ.3 €`ι @°ZΌŸρ' €` +θ.}; |€ρ' €`₯ +ψ γ) ½R |ˆρΠ]©>L€μ ( Zφ$MνeO@Ρ*πd/@α²' €h +θNνUJΰ£P@w• +ψ’' €pΙ @8΄—<„S@wϋδMΰγDP@w… +ψ’? +ˆ—»€>ItWθψ!Π]ξ$0AξOέ) = tW§€O’NŸ!Fκ0Aκ$0ΪK€&(Sΐg‰‘Ί ̐:L €ξΚπ9‚H ;tW¦€Ο$s +˜!s˜AνeN`yͺ/Dέe.@SdN`yͺ/Dέν'L‘Έ L‘€ξͺ<_"ŠΊK\ΐN_&H•g`ν{Ϊ0t§€φ$Π]‘ΎB΄—7Μ‘· ΜQ€€―&oΛ3}0 +θ.o; |0yPΐ +θNνI ;t§€φ&°<7ˆ“Ά LR£€o'm +˜Dέ₯-ΰL“€MΐŸΐ$% +ψqΠ^…ΎM  +H ~IPΐ, +ψΠ]‰g`νKΪ6t§€ξ²>Λ}—HI ΐ4 +ψ‘’& €iΠ]$0O0ΊS@{ψ>‘НΪΛ™€ζΙY€ζQ@{9Pΐ<ω ψ‘r°“ΐ •3Μ£€ξОΊΛ_ΐ₯€φR& €‰R ‰Π^Κ0Qϊ~L¬ύ²%πb) ;t—ςPΐL ΐL +θ.ύ3πS‚e/ΰgΛX€¦Κ˜€fR@w +h/{?'˜ΊΛ^ΐ/ˆ–0L•°€~I0΄§€ξ’π+’eΦΎŸνS@w +θNέe,@3) »τόšX +θ.e˜g?τR €ίθ@ +θδP) +ΐ$5 +ψ-AξŸ#Μp8tqΕώY +@¬+ηWΐφέmόDμπ;ΖΈΧψ +Ψ°kŸͺ Œsύυ3 €!n4ΎΆεζγη +@'8nόdHΰ8ǏŸ»€ίs 'Ÿ-άΔιγη @Χ4fό„HΰήƍŸ2άΥΨυ3ξΏ[ΐΈ4zό¬(ΰ€ˆρ³ξΆ›ΐΫ ?ρώ +Έ·~βωΟpKΰψΙη?S@θψιΧΏ₯oΖΏmyκ΅7™Ζψ ν +°ώ:`όƒz`ό«-ΏdνB6]€ρ―a«„ŽΏ™υkƒf6•€ρ°όΔ?fόc-ΏσΟEYΕ 0ώι–_ό—JŒ?HΕŒ?ςΫZ€υG+T€ρc”Hΐψ²`όh™ 0ώ I ίϊ;%`όΙ–Χσ·• I +0ώj`ύu­š€ρX«γg±BΖOerΖΟgy…:Ύυ7£γg\€ρΣ[^θ?†2~! XΏΡΏš ώηIŒ_˜Œ_ΨΙ XΏΈέ 7~?G`όνΈγςίΝόλnŒΏA{Cόϋ°Πρ­Ώ¦ύ9ŒίΛα]ŒίGμΘΖ/ΐϊνΏ;γ·gόξŒίžυΫ3~{ΖoΟψνYΏ=γcόφŒυ1>WU°φ©˜ΝτΐΖύG€O=žΧ +endstream endobj 245 0 obj <>stream +H‰μΦΆ9†QOΞ9ηœGϋίήwΫ=O.½(€χ Δ;€ή½€Y.Ÿ;ϋ3XμrΫٟEΊG–Χΐφž]^›zωςΨΛ–—ΐξY^E,/ŽB—W@#)Λ+ ˜‰ΏτtΉό) ΎœεŸNΰμίΜ{ΙΛ?™ΐΩΏ}ΈEΛ+ œΕΛ?QΐΩ'1ΝIΛ+ΰt!ΛωnXΘς +XΨςX¦ζς +ΘW{yδi±ΌtZ^‘B–_=½4^ώΡπύ—H―³όWκΐ Ε,Υrn|δΩG]LΜς_+KΪ|ωp4cωn|ϊΩηžQΛ$€wC—`v“—hf–Β°,©)„,υν^€εŸ±m!Λc;`ϊΧΨ«€ϋ—ζ4;`ω7Έqgοψ6–£=°ό›m€είξƝ=η«Yών°ό}ΊπδςίβY7ŽνμM_ΓςwΫ+€oσZ­0~€Ζ<όθοπF{pφ)6Φ7ϋΗh[€ύcτΰμlk.€(M ψβkΏΛ}0ά1€\¦yίγN½8ϋτ6Πς @ Φ\ΎΟ½0\Η7@‘0\λ~ΐύϊpQ@$ '€ιΪπΰKΘύ: €˜[Φ-€«~Δݎ/@Α0\η~ΜύΊ½k€+ š†λόό„P@„fΈΒ5+@Ρ0\³ +ψ)šππCF Χ8„h\ΐΩG· w  tΏσηDθ€Bτ +ΐΞ0†λΐεhόœ}t›ΐp˜NΓ `ΈΎό’­ +@ΌV( ž¦kU€β΅ ΰς+"θRΐ― !€α0\«7ΰ’€xp$hΐoΡφ 8ϋΰΆΡ5ι€+ C§~εo‰!€α: €  +xψ•Ώ#††ΐt +kΏ'Ζ1€Ί CΣ₯QWό]ί€³Οmi +ˆυ ψ#A0œ¦λSΐEϊpUΐŸ"€ιϊ €}Έ*ΰΟΐt} +@ + w @³τ ΰ/Dΐp}ή€‹R΄ ΰͺ€ΏEΓυ|ώF˜–( N›\IΪ €e +Τ²€³m'-ψ;a0]ΛώA˜–ό“0NJ €$K +H⠘NΓu @ΌΣu ΰ_ΔΐtM +ΈϊΒ§IοDΣ5)@Y €HMp€iR€²`Έc +˜EΓ5 ΰ?jς<όΎ©G +H#€αΌΣυ @‘zΰ +ΘΣ£€ΐpύP@¬~œ}b›ΐp˜Eώδi€+ Ο1€Š †k€ςx¦ΐpνP@,oΐtNΣu(ΐŸ€Dp$ΐt +@’n( X‡\™: €Dξ€fΐpΓ €L P@& η ˜Y +ˆΦ W@ͺ “†k€Β5+ΰμγڏ†ΐtυ π' Uύ\©Ž”+@©0\ύΚ0†ΐpή€ι0œ¦+_ΐE©Κΰ +Θ%€ιΚ €\­P@ΌςΈ’•/@Ή0ά1€bψ¬z€dΥpφam©z +H&€αΌΣ `Έκ( [υLΓu +@:pφYmIΓ `Ίβψ­x€lΗj €lQ +Θΰ ˜NΓ `8oΐtNΣΥ.@ιj €t˜vHΧ'€¨€+ _νNΓ¨T€?ωJΰ +Θ'€αϊΌgŸΤΪ €₯pδσL'€αJ €J €|NΣ)`8 '€ι*pQ@ΎΚΈ8P¨, €αΊ €$ή€ι0œ†«όψ°Bα\+`ΊΒ`…Β(`LWΈ¬ €α + €% + €0ά1€2\°Bέ\K`Έ&oΐΩΗ΄±( Mέ\Kx¦ΐp=P@žœ}Jΐp˜NΓ `8LWΆ€‹–(€+`cU +ΐE +Θ㠘NΓ `Έ²o€?‹T ΐ°ˆ¦«Z€©€ΐtU ΐ"j +X₯jXDΓ¨QΐE‹ ΐ°Š†λπœ}F{k€2 ΐ°Š7`: Χ €ͺ€+`™WΐΩG΄7LW3,#€α0œ?Γ @«`8 Χ!$ͺ€+`γώEΓυ@Ynμ_%Wΐ·φΐ₯χ@Ί›ϋΧ @ρnΟ_(W@¦Ηζΐώί^»{fϋZϋ+ Τ Άΐ¦^Ί}΅ύpΏΧl/€½Όzϋrϋ+ΰΝή4ΎΆπζν ξ/€ΧΉkϋŠϋ_ €§ά½}Ν\/³}Νύπ΄Έν‹ξ/€GΕn_t~n +ίΎξώ€O€l_x~<5~εωπΉΌν‹ΟοO@ξφΕΗΜΰr·ο0ώ{3HήΎΛψο ΐφŸT€νo™€ν΅}ΆΪΦ6-ΐφ/΅_Ά•­°ύλ]ύΐ³ΌƒνίͺΆΏKλlΏΨ>ΘΥ―>{Υ—±}¨Vdo?mόχΪ`ϋ°}’«“8{ι#Ϋ§+€νΧ¨€ν*€ν—+S€νΟQ!۟θδ²·7ώsN ΐφ%œR€νλX€ν‹Y€ν+Ί:BΫ”€ν‹K ΐφδ`ϋ6ΞΥφE`ό†NΨφσά€ν{»§ΫoΰϊΘm?Ξ'oϋiηoϋa^X€νwuc ۏr{•5ΫΏ€τ‘m_œν‡³ύtΆΞφΣΩ~:ΫgϋιŒ?νΗ³ύtΆŸΞφγΩ~<ۏg{nGpφG±šα€Ίώ'ΐ¦Fυ +endstream endobj 235 0 obj [/Indexed 233 0 R 45 248 0 R] endobj 247 0 obj <>/Filter/FlateDecode/Height 557/Intent/RelativeColorimetric/Length 7774/Name/X/Subtype/Image/Type/XObject/Width 513>>stream +H‰μ—έZκΨE»m’Ϋ„ ωWDT•τύίλœͺ•υ|)Μͺ8ΗUχ;sRcΏώ~§ύg€oζο)ϊΟ{η]ή― eηΓδΩςΆE₯@–’Οb―Ό²m*P~Ÿ<ξ0‡9όάT  |.ω#βΧϊonAΕά4@+ŸNž"?>>v]ΧKqέγcju€Ξΐ* Ž/'οyΥjΥχύZŠοW«žk:ΰTpρ―’7ΑŸœΤλA‚ ^?©ω¦¦h€υμ˜|6ΝfτC+ŠšΝFH  +l`)ΙGYς―΄Ϋ­¨ΩΈζ φ±Ÿδsz]κUΐ―Ί― (ϊί ˜='ŸΣο΅[Ν°^C¬α›’ίr6 +@G€4pt˜-Α’?Αε›“ί2φ;­&iΐϋu”½Šώ?ίžϋJύ~’ί2>tO›α [€€πmόQτϋM~ΛεhH xΠ ΐ ψ,I~Λ$k@6pφΗ§Ζύχ%Ÿ1ŒέV£N3'`O|νY—&_έ{ςoΠ‰xΰHσ΅δ)yο“Ο˜έ\žχΫ©p„ψjςoΞ=%pςΝ½'Ÿ1Ÿ]‡$Ÿv 9E=Νμ|φ£Ύδ·<ή^ν'`'vOώ;Ξύ‡,ξ§—g½ΣΖλ +(ϊcͺBqςOσ»« ΪtΜC3πsθO~ΛςO­€*9 ό‰ς$Ÿ‘ž€v³Žψ)]ςsΊ­°V53ψ_ʚό>£Ύ9δœ€7”<ωŒdq3ΎEχβωΙg<―o'ηζ%hπ£πΫs_Ι’/Sς[ΦρμϊΗΟΐ?ŠΎŒΙgπ yώDόδδ·<ΝΙύŸζ€Oϋ’'Ÿ‘,~”Ύφ¬K“―–3ω vΐεYωπ΅δ)y―δΙoyšί]Ά¨”Ο_MώΝΉ§δNΎYΞδ3’ΕύΝxΨ‰ί+—vH>ϋΡ—<ωŒηΥ#9 Η03° Ψ5ωžϋYΗ욁₯p’2Ήjϊπ6|$IΘ·v€™\₯ x MτHώΟ¬γYκί%h=oΣ7Ω#ωΟ²Y²ΊΊΕΟιgΩ#ωΟbpή;m(v@š–>…OΡ{iτHώΟ°.©Tž€·ρσ/Ÿφ=’$δ€); d8ϊ +πš?ΕOιWMφ’,/«ω;(k@–?§Οα7‹ώͺšHβΩuζ…3π5ϊυϋ΅zΡ_S!›εΓτς¬ΫRι€<_Η^΅θ/©•§ωέdΤWι€mώtώ½’?£^’…ZpΜοίΕΟί£Χ&ψώ#] \ε¨(r@*ΪΈ;‘,ξoΖΓNψž.€8ϊ…όwγyυHθ±Μ ΤR€t`μΞ:fΠ Τεc؝ά5UHΐΐΐn'μ3Ή` @O―VτχΣΟ:ž₯π]r€’°5@υ€θΟ§ŸΝ’ΠΥε€­ό’Ώ^ 08ο649 {x(€μ€‹Aκ-'`[€ZXτΧ+δ€); d8z +ΰ@vηe5η 0ΰ Ψ(ϊ땁$ž]gΠ2QI6Λ‡ιεY·₯Θ(€(Oσ»Ι¨―Ι―8-ϊ㕁d‘Ν(€(ϊΏPΘWΉ* +ΰ—‡Ȑ,ξoΖΓNψžp*T€ZΨκύρΚΐσκ‘Πc˜¨§AΤ-ϊγ•‚uΜ ¨ΔT€ƒŠsδϊυ¨Sτ·+ΉjŠΐΟ€z³=(ϊγ•rΐν„`f ΐςΌyφ‹ώx₯`ΟRψ.9ΐώ€(ΜfΙθͺq@VΧ0D08ο6”8 [Η>F€쀋Aκ-'#@rΐ”²ΘF@·θoW +^Vσw°½$ρμ:s€†Θ#ΐ8#@ˆΝςazyΦmir@6παi~7υ΅9#@Œd‘ΝT€#Χ―cΘ Χm<E \娨p€sH["$‹ϋ›ρ°Ύ§Η4‚#@„ηΥ#9 Η03ΠώTx +±ŽΩ49 }bˆ; ¦ΖNϊāp;a˜Θ°Ίβ¬γYκί%Ψ~0ΔΩ,Ω]UΐΔ8ΰΌwΪΠγŒQΨƒΤφŸ€lΈ~uŠώr%0e„μGAR`Hρ²šΏs€ύ ؎8@†$ž]gP0σ‡`ΨΒCP†ΝςazyΦm©qF€0Oσ»Ι¨―Ν4π”!Yhs€sˆ ˆJ`BΈΚP±άiŽ\ΏήΔ"Yάߌ‡(π=-H‚2<―Ι=v€™ + +px을-Œ!Φ1;€f Π"Œ!rΤ8€ +pPqΜhŠώr%p;a˜Θ°ΌΒ¬γYκί%Ψh˜‡ F€›%; «ΖΒœχN€°ΨƒΤ*NF€,δ€); d8 +€ ΚΛjώΞV7 D’?\iHβΩuζλg γŒ96Λ‡ιεY·₯Ηι€€xšίMF}Uΰ€‡ ΙB•0€QιxJAΈΚP±ίΞ!F€(Ιβώf<μDοiqF€$Ο«Gr@`f ύ8rύz#@ŒuΜ ¨ΕιC#@Šά5 ΰ„-Œ)Θ·v€™\{€ ΒcΟRψ.9ΐκ@8¨8f΄E·°Y²Ίz€ ‹qΐyο΄‘ΔNϊΔƒp1H`ω ΐΨδ€); d8Ά#@œ—Υό,oF€8I<»Ξ`ϋ ΔΨ›εΓτς¬ΫαD’?[‰xšίMF} ΰ`€ I²Πε€tΐbθs<ε \ε¨XξŒy’ΕύΝxΨ‰ίΣβxŠρΌz$τΨfΪ^€CŒaΦ1;€f `Θ’; f»Ή~½‰ 9ΰvΒ03 `u²‡ F€λx–:ΐwΙΆŸήIؐc³dtΥ8€F@aΘapή;mXο*ΐAΕ1# =(ϊ³•vΐΕ u€ύ'#@rΐ”²λ >1δxYΝί9ΐή`μ‡$ž]g°{bμ‡ΝςazyΦm)qF€8Oσ»Ι¨―Δς$ =ΰΰϊAΤ)ϊ£• 5ΰ`€ 9ΰ*w@Εv€#$Yάߌ‡(π=ΰ€‡  Ο«Gr@`f νΐf³hjq<ΙPSΰη#@rΐν„`f ΐ`μ‰uω"ŒIΘSv@Θp¬.ΐAΕ1# =(ϊ£•‰—ΥόlnFΐ>HβΩuζ«g`:ΜC#@’ΝςazyΦm)pFΐ^xšίMF}λ€°/’…"`Θ£Ιϋ€p•; b³xΈ~uŠώdε"Yάߌ‡(π=›ΐ#ΐ8#@˜ηΥ#9 Η03ΠΌp€(λ˜@3P…xΰ!(Jξ€šνΐΨ δ€Ϋ ;ΐΜ@.€½ ΘF‚’¬γYκί%X}œCŒy6Kv@W‰0Δ18ο6μv@Z€#Χ―71da\ RX~²‡ F€(δ€); d8vΰπΨ; [’Ό¬ζο`iςD²$ρμ:s€Ε3 +pPqΜhŠώdεb³|˜ώ—ύr]N\;ΒhAΈŽˆlKXβζ"@\uCΜLζL2οLιή+vώŽͺΧ#H_ν΅z>ξyχΰ‰ +ŽαƟ ξΑ†>%ͺ%οΔ4ά‡$θ,JΤY;@"€‚<ή­f£k[MζΈD€8 ZNιΠG¨ δ;ˆΣ²έξ­ΏΨ£‘EθΘ@ΞΐP¨œΟμ #@Αj¬}t€Κ@Η”‡ D@εdΡV;ΐ2ΑLŸ=<%ͺ¦HΠ½»q@GΑjQxο·[μ`4`Ž'P1θ€ιP;€νPF€νJT 8 @8θƒοju#@Αͺ9§α°]ΐΗ!(P1y΄]^ΐ7u¨CP" bŠdΜΗ=»$¨8†2ΰν‰Bςψ^ @Βέ8@"€pΐ’t@­0LΛv»·ώ^GοV³QΧ΅­&[`(HTΟ)=€ϊ蕁π9ΔU“EθΘ@ώΐC°jJ<³v€Dΰ€΅Pˆ`Ί€KΘ!X5Y΄Υ°Lpί'ΐhHP$θ€ή=8@"€ε€χ~»ΕΨzO¦υϊ&P9θ€ιP;€σp9%ͺ t€ΑxΏš/Ž'P5η4ό⎠(#ΐv%*'ΆΛ‹Έf  V7Tt†·ώ^G‘μƒωΈη±w€DΗpγOμ`θCP" rςψ @Ζ8@"€pΐ’t@―$ˆΘγέj6κΊΆΥδμ‰*NιΠG¨ d:ˆΣ²έξ­?Χ’EθΘ@ΆΐP  tΐ3oθT8`ν£TβΨ- <OΑκΙ’­v€e‚8>€ : w€C°r”ήϋνo ‰"ΠΣ‘vΟ'@"€p@€pΠί<™Φλ›D@υœΣπ‹˜.ΰrJTOm—0ΝΐK4_O" zŠdΜΗ=» lW"€€cΈρ'Ζ€Τκ†Š€ΞπΦ_λΙγ»p€DχαC‚€₯κ< @HοV³QΧ΅­&OHΠrJΰ€>:@e »H“EθΘ@ΐ £tΐ3_`˜–νvoύ±pΐΪG¨ Δ0[F€r€D Y΄Υ°LpΣ'ΰβŠΠcοŒ9 Pxο·[Œ @ :`:Τ`ϋ\"@Aΐ:ΐA\А βœ†_ΐnΔδΡvyqΛ Τx2­Χ7‰ +ŠdΜΗ=·τ!(@Α1άψ“o@4_O"€‚<Ύ@ΨDά¨Υ α­?ΦCX”¨3u€DyΌ[ΝF]ΧΆšl`θCP"€‚SzτΡ*9@"€’,B@ςt€D5₯ž;@"€pΐΪG¨ ΔπZ€D5Y΄Υ°Lp»'ΰ¦e»έ[ͺΗ€HΠ=ΐP B9ΰ½ίnqv€Žq θ€ιP;€η AΗ“Cp@€pΠΧHqNΓ/ΰΈ€KΘ!HBm—0Ν@8%θ(’}0χ<ސ γnόΙ€«τžLλυM"€†<ζο}Jp€hΎ8žD ΰ€Eι€:O@ΨD yΌ[ΝF]ΧΆš ¨Υ α­?ΥcrJΰ€>:@e ―HΠ“EθΘ@Ά0τ!(@Cι€g¦ °φΡ*qœ @Om΅,ΐρ  ₯HΠ=Ɛ E9ΰ½ίnquF€iΩnχΦ_κQAL‡Ϊ잌ε‰2ΐ:ΐAΜπ9Δ4œΣπ‹x- <OA"ςh»Ό8€_JΠS$ϋ`>ξyΌ ‡ ΗpγOŒ`4$(Ιcώ „΅τžLλυM"€ +pΐ’t@£τ!(@DοV³QΧ΅­&O@4_O"€ˆSzτΡ*Ω @E€νJP‘EθΘ@†€Τκ†Š€ΞπΦκQ)πΜΥ€€Φ>:@e €Ρt¨CP"€Š,ΪjX&8€Χ pŠΠc鉀+ πήo·Ψ:@"€tΐt¨ΐ𠐠 t€Αo¦e»έ[§‡εœ†_ΐiΚ„δΡvyqΗ όˆqE²ζγžΗΨr’q 7ώdΐΥδδ1@Θ!Hw ‰Zΐ‹uސ %w«Ω¨λΪV“›τžLλυM"€ŒSzτΡ* ΰσ!(@F‘ y:" ωβxd”xfκˆΫ• °φΡ*ql¨Υ α­ΏΣγ’E[νΛ°{$¨)t@« }J‘πήo·X:@"€tΐt¨ΐλ Έ +ΰ€ΰ  NΈ +η4όβF ψβ:ςh»Ό8€Y^"ΐ΄l·{λ―τΐΙ>˜{?`(Hr 7ώdΐΦ:δ€#™;@"€Φ€ΰ!(@ 8`Q: ΞΣ9ιΘγέj6κΊΆΥdθ£p<‰:NιΠG¨ δ5Ά+@H‘ Ή9ΑΊ ‡ %₯žY:@‚t€Φ>:@e €Λt¨CP"€,ΪjX&8€Ρ pŠΠγ牀λ πήo·x:@"€tΐt¨ΐν Έΰ€ΰ  f€0-Ϋνήϊ#=2η4όβ6 ΐP %ΆΛ‹ΨeΰGˆ)’}0χ<ΐC’cΈρ'–ΈyΜάrΒΪFC"€pΐ’t@$¨Ιγέj6κΊΆΥdε=€'Σz}“ δ”ΐ}t€Κ@.ψ|JP’EθΘ@†€hΎ8žD%₯ž9:"ΐv%(¬}t€Κ@ΐjuCE@gxλτΠdΡV;ΐ2ΑΌž‰€+P$θ€Kϊ” D9ΰ½ίnρs€DΐU@L‡ΪŒž‰€kρΕ›H\‹3cH\pΐ’§0LΛv»·ώDM‘μ†wF€r€D5iψΈυΏΧ|Šq)Ÿο£^γ²€ςt<9IΡw@Χ΅-nΈpΜΗ}ΟazBΘ!HJn“ΟhHΠ“Η‡ @Ρ$ΑG°¬ΐ'Σz}“ ε”μƒΩ¨hrͺΐΟ‡ D%§τΜΗ=]άΠψ«ωβx”œΤΐs*lW"€’Ση;ΧjuCE@gxλτΘp}$ΓŒ@ΎΠ‡ Dί‹Ο@Έ8@"€œoY΄]N‡7ng DΐUψqJÍ?tή^-σΙ¨Χψ @"ΰ +όό–Η»€ΦΛ?z2ώΑn”όύ½€`1v]Υ€#”`ZΆΫ½υ—zL~~?£έ +€6€WθP α—ώk‚€2―|Žq@Υόϊωγ\€Ρ~½˜ŽϊνΦ«₯ ΐnurVΘοϊϋηo§, wλΕlάο@ΐ  ΐoΥρϋ?ψσυγΫΉΘθ° ΰΰΏ`p{ώηˆ9όχ—Ÿ*²cvλ•?…ο‘> +€ίJωοΏγΟϏi…ϋ-όώΩϋήΦ+€γ πηόώύείgiGαa·]K6 zmΧΉό²_.Z‰#Q]ψ0!B‚ ‚ΎPΫΫ±{œ΅d֚Α₯ΉυHA2•P*ΧΩ_Ω·ξ=' @@έr\!ΰΓΌ‡?βώρΫΓύμφζκr2&ύύžOχŸόσ·)‚!Ρύέμφϊκr:Ÿ…~·Mχ_Όά-μΆΧC0DΊaοΧO:ψ?”ϋ›λ«ιδb|>žžτI‡ž?εΏΌϊ_†€N€°ξ> ϊΒ=?ψ==ό rvz2`φ»τϊ[€Ώ‘_lφyθ³ώΌΉ&τ&Έ?c/ΈϋŽΠ―όηo Π»dI?ξΎΟέw½Ž°o‘~ώόsλ_†^ώO’{φψΑ—K?tΟδsϋςυ“ώΌϊGHδΣξ…|i?ηϊ΄,)ξ—A_Ήχ#ξ…|a©?§ώbΌΛ’—δ>τƒ€»w₯{[Ή'ωμν3ϋω֏°‚©{φ<Ήoiά3ωKϋ9Φ―B€εt‚AΦ²CΊŸΏ χ/$_η>τ#ξλ½’/νηZΏόT5pχμα/έΣΓ_ηž/ύυξs.Ÿ³ͺvτAίΘ={0μiέA>CA―W‘"˜Xς έkώ}Qδ3*έ³‡/άGJ^Δ}RΨ+¦{Ax(”½nΗ}α–~ QΛ‹χ΄τγξύ4χΕ=ψ:JήeΙKr|ι>ΰξέJΈηˆ¨[Žλ—/˜ΊWaΟσ˜ϋ–‘ϋΒΛη¬Α2…ι~ώ&άΏ|ϋXЏΊO)yεpΟ‘!ΐn{½’„ξž=ό₯{zψλάσ₯_1χ:AρC€>θΉoΪ–EξUrΟ‘Ψ;8δ! ?ΜZΰH,y†ξυ%―άξΕ‰ξΩΓξ#%―›Vς*εž#B/‚Ε Ϋq_ž’gBQC@ͺ{Zϊqχ~š{ΝΓΟΪΛΞ(`X,έ‡_ΊΈ{ξ(Txη%Οΐ½ +{žΗά· έWM>£0!ΐΠ},θGέW­δ™ C€εt‚A֎“ξηoΒύ Ι7pΟ—>ά―ƒ…~ςΈ{φπ—ξιαΉoΪ–EξpŸΞJΘΧ Π}sχϊ’χqTτzΉ)‚‰%ΟΔ}<μΑ}:9 ‰ξΩΓξΗ+%ΟΠ}eKž α  mά¨{ΝΓΟϊCηQ³ ‹EŠ{Zϊqχ>άoŽŒCΐ»,yIξΓƒ/έά½kξςΧ! n9Ώλ`κ^…=Οcξ[pΏQVŠΰξB€t?ξ_HΎΞ},θGέΧα~#ˆΠ°Ϋ^o'!€»gιžώ:χ|ιΓύ6P! l;θƒΎ‘ϋ¦mYδΎχ‡`οΰ‡€ώpΗξi麏|Έί(Ϋ‰ξΩΓξ#%―›Vςΰ~σ„!` Ep;ξχΰ~£Θΐoΐέ/Rάӏ»χΣάk~Φ_­D°°Ρπ.K^’ϋπΰKχwοΒ}flς˜ΊWaΟσ˜ϋ–‘{Θί«7ΰ =@ΊŸΏ χ/$_η>τ£ξQς²`ετN?οž=ό₯{zψλάσ₯χ9@έ€N0ψθ +Π}#χMΫ²Θ}ξ³Fά€ΊΕbΰιωέΣ7t―/ypΏ{ΒΐV@xρχμα χ‘’ΧM+ypŸ55)œŒ&Χ»w’—)++ΐ§#0½ω„{Zϊqχ~š{ΝΓΟϊ3T΅šm/蟍/oοcξύ‡uΌdχαΑ—ξξή…ϋ’ W@Γvάno0_ήά=>= χσΏ‰9WŸξ^…=Οcξ[†ξ!?ΘΐŽ€˜€ιυμαϋΣσΛ―?__"ρ―L}’ϋXЏΊGΙ+bόΦ8jς 8;Ÿ\έή=<ώώτγωΞ³™{ΎταΎxˆpΘb›€ώιh<½Ί™έ?|{όΞ!υ&ξ›Άe‘ϋά Ύ(π ŽOΞF“Λλ›ΫΩ쎘IυλάλKάηŸΪΚ8mΟουiΞ/&ΣKΑ4μxzχρ°χ…c9GΆΣviާgΓΡθœ3²Žχ!χ(yΕ"œκl Π½γώΰD0ϊuξ5?λŒ©-'€–ŽΧυƒ GAΰϋ]ξKš€pZνΆKSΐθt܏Έ‡όB"'€-6–έl:ŽΣb8R=ά—›ΘΠ Y–Ν±„zΈ/;bψπ¨7Bκp_ jjΨ °)Β}EG€Νΐώbξ«BMΝ€˜eξ«‚Ό§¨Α}Ε¨ιΘϊG]ρΘ/ 0Ԋ«Ξ +endstream endobj 233 0 obj [/ICCBased 249 0 R] endobj 248 0 obj <>stream +ίίίήήήέήήέέήέέέάέέάάέάάάΫάάΫΫάΫΫΫΪΫΫΪΪΫΪΪΪΩΪΪΩΩΪΩΩΩΨΩΩΨΨΩΨΨΨΧΨΨΧΧΨΦΧΧΦΦΧΥΦΧΥΦΦΥΥΦΤΥΦΤΥΥΤΤΥΣΤΥΣΤΤΣΣΤΣΤΣΣΣΡΣΡΡΡΠΡΠΡΡΟΠΡΟΠΠΞΟΠ +endstream endobj 249 0 obj <>stream +H‰œ–yTSwΗoɞ•°Γc [€°5, ‹μ ˆBHBK!aPͺVΚX·Ρ=uΊΈŽ΅:Xχ©KΤΓ¨£γΠZ\;v^ΰυ΄™NΏόήηάί½χύ~χήwΞ€.MΡh«aUZƒ>31[”_€‘& (€DΘ΅ΊΤ¬„l€K/Αjq'πVO―›V₯ιώ?±:½O“Žs€RU«ΐΉηΚzƒΞdŸΑ™WRab5±? Ξ–&VΟ³χœΟSΊ7εΑβT₯rc₯3ΥMQ]YmΤc΅:ΉB… :ΔΏ9π—Οᝩ*UιUZ<"Ÿ2V·[«Τ4ΥZL£ύOMόa?Ρό\γ⎽Ό"ΐΊΘΘ?.”KHα6|zΣ·J.Hǟyχζη~NΠΟ³Β}¦₯V£ž‹“dfc +£Ύn~ΟτY &ΰ+`œ;ΒA4ˆI dƒ|°(@¨zPZ@;θ=`=Ψ†Αv0vƒύΰ ƒΰΟΰ<ψ\·ΐ$˜Α x +^AD‚²‚ WΘ ς‡ΔP$₯@™P>T ©!-d„Z PΤ C; έΠ‘£Π θt ϊ +š‚@ίA/a¦Γ<Ψvƒ}a1'ΓΩπX ΧΐMp'Ό‚Gα}πaψ|ΎOΒαY 4„8"BDŒH4€)EτH+ "£Θ~δrΉ‚L"(ε’*DΓQ)šƒ*Π΄νE‡Ρ]θaτ4zBgΠΧΑ–ΰE#Θ‹jB=‘‹0HΨIψˆp†p0MxJ$ωD1„(%ζΛ‰ΝΔ^βVββqβ%β]β,‰D²"y‘"Hi$9Ι@κ"m!ν#}FΊLš&='ΣΘdrΉ€¬%wΙ{ȟ’/“ο‘_QXWJ%’€4Rϊ(c”c”‹”iΚ+*›* FP³©εΤvκu?υ υ6υ Fs’…2hΪrΪν΄ΟiS΄tέ“.‘τuτιΗι_џ0 7F4£€a`¬cμfœb|ΝxnΖ5σ1“™)ΝΪΜFΜ›]6{Μ€0]™1Μ₯Μ&ζ σσ"σ‹ΒrcIXrV+k„u”uƒ5Λζ²Eμ4v»—½‡}Ž}ŸCβΈqβ9JN'ηΞ)Ξ].ΒuζJΈ +ξ +ξχ wšGδ x2^9―‡χ{ήoƜchžkή`>bώ‰ω$α»ρeόJ~ :₯…EŒ…ΚbΕ~‹ΛΟ,m,£-U–έ–,―YΎ΄Β¬β­*¬6X[έ±F­=­3¬λ­·YŸ±~dΓ³ ·QΨtΫ΄Ήi ΫzΪfΪ6Ϋ~`{ΑvΦΞή.ΡNg·Εξ”έ#{Ύ}΄}Ήύ€ύ§φΈ‘‡‡ΟώŽ™c1X%6„Ζfm₯ŽFΗŽŽ―œN9NNœξ8SΕΞ₯ΞΞ'g\\R]Z\φΊάt₯ΈŠ]Λ\7»žu}ζ&pΛs[ε6ξv_`) š{·έξQξ5ξ£ξW=ˆb +­_zžAžež#ž½`―`/ΧV―KήοPo­χ¨χ !]#¬ξNωπ}R|:|Ζ}ϋΊψψnπ=λϋΪ/Θ―oΜο–ˆ#JuˆŽ‰ΎσχτWψψ_ `$΄ ψ6Π+PΈ-π―Aά Τ UA'ƒώ¬ήό Δ%€8佐bž8]ά+ώ<”Ϊϊqθ‹°ΰ0CΨΑ°† Γ+Βχ„ί_ X Z0Άΰn„S„PE¨ϊUχJ#JϋKο«#ΤΥΚ’ΚΛi$šaΝ·εςνεΟ**>¬ψ±2―ς@ΉͺΈκ¨–£­ΠžΆ―n¨Ύ€σuι&kΒj6ΥΜθ“υ;k‘Ϊ%΅G <όgκ‚ΡέΈ8UY7RχΌ>·ώP»AΫp‘Ρ³qM㽦„¦ί5£ΝŠζ“-Ž-ν-SΛb–νh…ZKZOΆ9·uΆM/O\Ύ«Ϊ^Ρώ—ΏŽώŽοWδ­8ΦiΧΉΌσξΚΔ•{»ΜΊτ]7V…―ΪΎ]­Y=±&`Ν–5―»•έ_τψυ φόΠ«θύb­hνΠΪΧ•›θ ξΫΆžΈ^»ώϊ†¨ »ϊΩύMύw7¦n<<€ t|Ώ©hΣΉΑΐΑν›©››'‡ώ ₯ZώL˜Έ™$™™όšhšΥ›B›―œœ‰œχdž@žŸŸ‹Ÿϊ i Ψ‘G‘Ά’&’–££v£ζ€V€Η₯8₯©¦¦‹¦ύ§n§ΰ¨R¨Δ©7©©ͺͺ««u«ι¬\¬Π­D­Έ-‘――‹°°u°κ±`±Φ²K²Β³8³΄%΄œ΅΅ŠΆΆyΆπ·h·ΰΈYΈΡΉJΉΒΊ;Ί΅».»§Ό!Ό›½½Ύ +Ύ„ΎΏzΏυΐpΐμΑgΑγΒ_ΒΫΓXΓΤΔQΔΞΕKΕΘΖFΖΓΗAΗΏΘ=ΘΌΙ:ΙΉΚ8Κ·Λ6ΛΆΜ5Μ΅Ν5Ν΅Ξ6ΞΆΟ7ΟΈΠ9ΠΊΡ<ΡΎ?ΑΣDΣΖΤIΤΛΥNΥΡΦUΦΨΧ\ΧΰΨdΨθΩlΩρΪvΪϋΫ€ά܊έέ–ήή’ί)ί―ΰ6ΰ½αDαΜβSβΫγcγλδsδόε„ζ ζ–ηη©θ2θΌιFιΠκ[κελpλϋμ†ννœξ(ξ΄ο@οΜπXπερrρςŒσσ§τ4τΒυPυήφmφϋχŠψψ¨ω8ωΗϊWϊηϋwόό˜ύ)ύΊώKώάm ˜σό +endstream endobj 234 0 obj [/Indexed 233 0 R 126 250 0 R] endobj 246 0 obj <>/Filter/FlateDecode/Height 570/Intent/RelativeColorimetric/Length 6289/Name/X/Subtype/Image/Type/XObject/Width 514>>stream +H‰μ—ΩBκΚEΠm τιΔϋ†6AώΏξ­ͺ4ΘQΩ ΅ΜZqŽ·ύΆ­šΤωηπŽƒˆ΄ΰ‡9ψœ΄[ΰX»ρΓXAζωτζy?ƒ΄§ΐ2ŸύκΓkΟ½#ž6!6^}^s” • G€ d€Ώ]½Ύσcşυ=ƒ\²΄π=ΆωΥ‡7rrβ8N!ΒqNNώ˜˜ `ςψςΕΟ­μΝέ››/]Χ-EΈn±XpΤήm ν? lΗ_e΄φ³ΎT*—+•J΅R­VΚε’[,θ δσ˜€vΌz'ωΥ««―Vkυz£ΡόŸΑσšΝF½¦Vo ‡ °fGΩ―Ύl~υ««ΗiΛk6jzΞ &ΐ–­ΎξήΛΎΈzρυΥΧ͏wΣm·<΅’«žL€;uήdΧ«9λuNΥΚο'φμΙ~ΤZMυ £ ΰH“o_ύΩ•σ~χ΄Y&π/&ϋvήV/ώW\z§žš@Aε <πΣμ$ϋ];oKn½Άš€jcxΰΗΨQφίλΌ-ΉU8mͺt΄π󳝷Λͺ*Œπ±―μ >βQM Ϋj(ΰ a›«§–ύF^n.Ο:^­œ<iYVΨ©σˆeΏ‘ηϋαEο΄Q-…4°7eΏ‰ρΣέΥ γΥυ#Η#°ίΎzrΩobφϊxsΡW€?iŸ£@φνΌ{ρ?eς|w=ˆJ-Έ#;Ι>ΞΫ†ΩH=ͺ*σ-Έ-;Κ>½ΞΫ‚@=Wϊs  l΄ΞΫ†ΩθA}΄’„Ύb_Ω3Όϊˆ`ςtwΩo7M BΩζκΩΛ~o³ΧϋλA7iA, f§Ξc.ϋψγΈ‘,Κ~ Σ‚J%hΰΫWΟ^φ›Pxώv μΫyb^όOρΗO‘₯_6d/±σΆa1Υθό2 μ({Ή·Fη]―žh Σψm· Z—ύμk`_Ωgπκ#2―m>σ²ίΔ2Τ@+{Ψ©σ2.ϋ( άΖΘΘ#ΩοΔbϊr―5PΣΘ‹_ΐχ>σ²ίΔr>ZΣ€δ ¬]ώ.χk^όO Vέ‚οn‹ŸύoμΌmΠΈt<ΩHί\>:o'ζ£ΗαEO΄βϋΧΧonίά=:oK‚‰t $χŸ oί<ω^|\ύWˆΧ@8€πώΥυ‡—”n δΔi zΜύλλΧ?|sχΈϊm &ΟwWgνfΥ-Τ@ς˜ϋ/κΫW—ήf―J]­Σ‚’ ΉJ5νγ”ˆo4 ZPžΒ˜ΐ)Έi€X ”Δi@/ΐΌκHϋ£4π`4`ZPΒ'@ €μƒ?Ž4ΰ:²4:@ ν#ΞB¨ŒryΥiŸ t΄†59ΰΟ °/ώψI’’'؟ΕTk #LFκ pπΈ7Fη]―.J‘πXΑh /LFGΗxl R‘ +₯΄O/ HΤ@,b9νΣΛZ—²4  ΏŠ•΄/Τ@˜κK °@ D (”ͺi^6§d΅΄Ο.ΘΣ@ς)€XAžβ”λiŸ]FXΧ€€ „ PƒυVΪg— Δi`υ`Vψ¨ζˆK°\σ>»Œ M«o,ΐ4πn΄Ο.,C ΄€h Z€γV›X€”nc ˆxsωcΗ­4Ϋi]FXL_ξ΅jZy ΠΗ'ΕJγ4ν£ΛΛωhMά'/@}φ>»Œ¬4 ‘ΝΒμ¦}tAkΰzΠρ„h ω@ +Zc>z^τ€hΰ IΑRΠΑDžLœ"μ Pω#“‚K( ά$Θ Π@5!`‰`ς|wuΦnVέ‚ „ Π!ΠDXβmφͺ4ΠΥ0-Θ{IT[ψFͺΕh!`—D%9@ΨDiΰΑhΐ΄ Œ ¬β# ΈŽ ¬²§„€]΄†Β4€°Š?~’£„‹©Φ@G’V18οzu1@XΖh /J«ˆB€@ΨEkΰR’–¨„€UDi!@< μ"NΛΤBΐ.λΰ=hŽ[EΨCžΒθ§}p™α£O ^€ +€ 5j!`I@P° 5Π’‘C£W…@Ϊη–!”nc HxΆYL_ξ΅jZyώ ˆB ›φΉe‡ε|΄¦Ξˆ B)h`₯ώ-xx˜Λ;«h \:ž ¬3=/zb4GΨ&˜ˆΡ@’‚›ΐΑ*Ϊi[–PΈI4γ―§{“η»«³v³κ$h tR(Χy›½* t΅L 2_€ Bΐ&ΎΡ€jAφ C ‰°H’’ ¨¨4Qx00-ΘG:[‹ψγH#B:<„€Eb4€ Ak`(Hλψγ'A@Ψg1ΥθˆΡBΐ6Fη]―Ξ^"Œϊb4€°Ž, μ#Mλh \JΠB€a@XG–ΣBΐ:b4€ B˜φYΧγ ˆ¦„€u>j€ιTΘBΐ>’4€ `j %Dϋ( άΖΰό ¨XL_ξ΅jZyΎ @P±œΦ4ΐv*‚•X· B€ +­λAΗγ„σΡγπ’'D‚‰ (₯„J7‰rl5€ #˜<ί]΅›U·ΐ_ήf―J]­Σ‚¬€ ΐ7P-(A ”Xk!@†ΐƒΡ€iAΆ @Πα# Έw HXHB€­! θπΗOb4€ `1ΥθHΠB€£σW— „F}ξ@Π!I +i!@ƒΦΐ₯ (‘„’4€ a]\'€ C’|ΤΗ €„ r4€ aj %A”nc °}„,¦/χZ5­<Σ YΞGkΰ9„!ΑJ|[!@ˆΦΐυ γ±ΦB€’ωθqxΡ“ „ ΑDˆDB€₯›D9ž@PLžοΞΪΝͺ[`„ o³W₯Φ€iAΎ @α ¨d―„ ‰J|5€ DiΰΑhΐ΄ Ο HρΗ‘\‡΅T,Δh!@ƒΦΐΉ€ψγ'@±˜j tΨk!@…ΡΐyΧ«³ΧB€£>k H£„R4€ CkΰR‚DΠ@΄Η­"£0ϊiŸW’½HAϋΘΡB€@Π²ž84pU€}ZYDˆd|Τ» Ό nΪΗ•Eψk ^€ +€ 4px˜Λ;–‘ZΜ5€ Ciΰ6ΦΟGΐ,!@Ζbϊr―5PΣΘs]€IA„ ΛωhMό&p° +vΪ§•I‚•˜Άΰ*Nh \:o δN +ε:B€„ωθqxΡ㭁0j‚ s „ Π!ΠDP D** „ J7‰rL5 B@₯` !@A0yΎ»:k7«n³tx +ήf―J]­Σ‚L€ Γ7P-ΘZ: ”k!@ˆΐƒΡ€iA¦ @Pβ# ΈK ¨YˆΠB€­!w (ρΗO4€ c1Υθ°ΥB€£σWg­„!F}ή@P"C:Έk!@ŽΦΐ%w ‘ „%24€ „ΉδˆΠB€ @²v@Γ\r>j€ί€ΠB€@² 5Πbͺ„=J·±˜>RΣ—{­šΦ@žη”,η£5 0›B€ž`₯†-ˆ GkΰzΠρ8k!@Κ|τ8ΌθqΦB€–`Β_Jxk!π( ά$Θ±ΤB€”`ς|wuΦnVέS hy›½* t΅L ς[B€ίh@΅ G ~€D%Ά@’4π`4`Zε΄ψgΏLH’(ŒŽŠ’μ«€¬n(«l‰Ζd2KσͺΊiξfQλρ€{Ύ ρ>κœnΫ₯j!`”‘d P¨ΙΦBΐ,ύvCΆ†v•²’5€0ŠΦΐu.“¨„ZyΙ@˜EΌ†Ω Μ’4Pͺ„ς5€0‹x L#_³HΦB€ω@ζ½dB€ω@˜Ε­9'€`AΌ†‘„€iΖ–Rr5€0 iΰf’aB€…aχιNi ͺ4p$κ,ŒŸ[ο4 ι, ¦Φ‚”ͺΕlR <<·j₯+Ή@˜fΠ­„€qΔk!`@έΡΐ‘$ xto+…L":©„€iF½&i §4 [PΪ ŒΣΧ ͺ„€i \HΣB€ΐ½Φ€nAI€`’ίΆ5 + +ΤBΐέ) D•Žd]€(Bΐ,γηΦ; H9λT$fL5 ­u„γ³( T‹Ω€D PP +¦fyn=ΤJWB5 B ‰0Λ #R6Dk!ΐi ξhΰP”, :·•B& ΙΣB€Q―IΘ) θuϊZΤ‚5€ΰΐΡΐ…8 X άk θuϊm[‘  ψ +ΦB€₯šL xθ·b5€ΰ`ΨUΘ +ΣB€­λ\2&P΄ς5€ΰA²ΘΤB€₯²L X«„’5€`A€ŒΦB€Ή@0ρ^BN!ΐˆH qk@Κ ˜«„‚5€`ali %JNH7 ˆzL »OwJQ₯#I€ΰaόάz§'€ΰd0Υ€˜Dp’4P-f“ς4€`βΉυP+]ΙΣB€‹AGͺ>Πώ•R!—IZp,ν_‚=ώλ‹5ώs―Ϋn5Ÿ4½Jϋ_eS‰Xψβœ"ΰλC@Ψ >_ύτρ;΄ώ#­w£ζ/ώιdυξϏ?YŸζNφ—yεxKίί‘Ύ5ΎύΣ·ΦΧσΣϋoν/σ Y­ψhύ΄ύξGΓτΣ§—Ÿ~ϋ΄Ύš_ψώ_άwί¬τ­w_O?}g}5d‘0Ή€`(‚˜°HϊΎγ;οΎί^ߞ_πώίή…@~ΣϊΝ³Tϊ^Ε§Η·ίύ“ΩρυϊΦόbχŸ^…ΐž§ΰjW|αιψφ»οΉΎΰωΏ!4+Kί]|gKΖ>7„€]ι/{ΦΧ΄B›^ƒ§ψΦ–Ύ«ψΆπ§?e/Cΐ»ψV–ώlρmυψš™ΘmzόΖιoΫϊŠΙPμ| +Ί‹―γ=ώίκρ-(Žƒ;Žτ=ŠήύωρI[‹Ο—oιΟ_y€ο…Ύ€] ΥŠοƒίτr_…“‚;nιϋί~Iίƒΐ42›^ν‹ΠγϋHίwό=‘ΎΣHo8Εη'}ίβΫι{a…ΐιΩel»Cΐ»ψ\χ+Ύ=‘ΎND·7όΖw½ϋ)Ύ^_a]€ +Δ6†€»ψ:Ÿ.ΎύψιO™„@8Ύe!ΰHί£ψθݟ?Ύ ψφμݟΓJΑΤΦ„€·τgŠ―ΌPϊϋY|ΎLC Ή!°ZρAϊ«³E!ΰ–ΎOρ­!ύύίb+B`‘τ}Ηχ–ώήŸ/C`©τ}‹_ Ι!°šτύŠoΙ»Ώι?Ό„†ΐΚGρ}q! Η_WϊKΖΗO’Bΐ)Ύ΅₯ο*>Όϋ+#$Ό‹oeι£ψ>Ž€πηa£!ΰ.ΎŽχψkHγ―Ι¦Bΐ‘ΎGρΡ»??ώ"ι£ψ>Ε4\!ΰ-ύ™β+CϊŒLC Ξ«ί₯ΏιΏε–2 €ΩpKί§ψ }^μ8»Œ&…€ίGϊΎγCϊL8!1NρωIί·ψ }&θt€Ώv|οβsIί―ψ }.fBΰλ4ΰ7ΎλέHρaύ―ε«ΏέΕΧωtρα§o’™οΑtώ“γO€οQ|τξϏ_P|xχωP!`kΰ_ޟ)ΎςBι£ψ6‰υ=¨Ώ2zV+>H_,ŽT ?4ώΜ»οS|kHγs3Ρ€jΑ5Eχί[ϊ(Ύ c P ͺG ²|ό₯χ->H_$ΣG ’H_•j«ΌϋK€οW|KήύM%φ•€σΠη@ΆPVϊ(ΎmC_€~ΒρTŽNΰ~~ό¨ρΧ”ώ’ρρΣ—ƒύŸž_Dβι\±\Ώk΄ΊφψΏ―ϊΩ_SϊβΓ»/•€UΪΡDš^ΪνΓS»ΫλG£±b€Ά_Wϊ(Ύν!`{ΰδΜ>R•ž§V»Σν=½^w2>€Ώ›θG@y@Ÿ@*›/–«7wΗ§f‹hͺν?%}Œ/ύ¬ˆ'3ΉΒuΉZ»Ή½»Χά9ΟώΚGρmΆ¬ˆΔθΘε‹₯r₯Z­Υjen|HΧ°bΠ:σ‹p4žHe²WωB±xM‹=~6Z_ϊ›ώ―Υ˜žΐIžp4–H¦™l6Gd³κ—ιο6Φ ¨8‘g tŽDcρD"©IhηCϊ»}ϊ8 \\†#‘¨&’œιο:ϊ” ¬8£—€Ξΐ"d=ϋώnpžΊ:‚Σ …Ϊί}φ3 o€ŽΰψΔαΨc|ότwηΤ¨3˜pιο ϋΤ|?œα;ΖίΞXg0ίœ™¦0ώžπdΣ*ΐ ¦μ8 09Υ% +endstream endobj 250 0 obj <>stream +yΈx·x·€w·€wΆ€vΆv΅u΅u΄~s΄~s³~s³}r³}r²}q²|q±|p±|p°|n―|n―zm―zmzlzl­yj­yj¬yj¬xi«xi«wh«whͺwhͺvh©vf©vf¨ve¨uc§uc¦ub¦ub₯s`₯s`€s`€r_£r_£q_’q]’q]‘p\‘p\ pZŸpXŸnXžnXnXmVmVœmVœlV›lU›lU›jUšjSšjS™jS˜jQ˜jQ˜iQ—iO—iO–hM–hM•hM”hK”hK”fK“fI’fI’eI‘eI‘cIcGcGcGŽcEŽbEbE`B`BŒ`B‹`@‹`@Š`@Š_@‰_=‰_=ˆ_=‡];†];†\;…\8…\8„\8ƒ\8ƒZ8‚Z5‚Z5‚X5X5€X2€X2V2~V2}V.}V.|U.zU*zU*zS*yS*xS*wS&wQ&vQ&vO&uO +endstream endobj 238 0 obj <> endobj 239 0 obj <> endobj 240 0 obj <> endobj 241 0 obj <> endobj 242 0 obj <> endobj 243 0 obj <> endobj 256 0 obj <> endobj 257 0 obj <> endobj 258 0 obj <> endobj 259 0 obj <> endobj 255 0 obj <> endobj 260 0 obj <> endobj 261 0 obj <> endobj 262 0 obj <> endobj 254 0 obj <> endobj 263 0 obj <> endobj 264 0 obj <> endobj 253 0 obj <> endobj 265 0 obj <> endobj 252 0 obj <> endobj 266 0 obj <> endobj 251 0 obj <> endobj 267 0 obj <> endobj 226 0 obj <> endobj 236 0 obj <> endobj 237 0 obj <> endobj 269 0 obj <> endobj 270 0 obj [0.0 0.0 0.0] endobj 271 0 obj <>/ProcSet[/PDF/ImageB]/XObject<>>>/Subtype/Form>>stream +q +/GS0 gs +123.1200049 0 0 133.6800053 16.3960667 14.64519 cm +/Im0 Do +Q + +endstream endobj 272 0 obj <> endobj 274 0 obj <>/Filter/FlateDecode/Height 557/Intent/RelativeColorimetric/Length 7774/Name/X/Subtype/Image/Type/XObject/Width 513>>stream +H‰μ—έZκΨE»m’Ϋ„ ωWDT•τύίλœͺ•υ|)Μͺ8ΗUχ;sRcΏώ~§ύg€oζο)ϊΟ{η]ή― eηΓδΩςΆE₯@–’Οb―Ό²m*P~Ÿ<ξ0‡9όάT  |.ω#βΧϊonAΕά4@+ŸNž"?>>v]ΧKqέγcju€Ξΐ* Ž/'οyΥjΥχύZŠοW«žk:ΰTpρ―’7ΑŸœΤλA‚ ^?©ω¦¦h€υμ˜|6ΝfτC+ŠšΝFH  +l`)ΙGYς―΄Ϋ­¨ΩΈζ φ±Ÿδsz]κUΐ―Ί― (ϊί ˜='ŸΣο΅[Ν°^C¬α›’ίr6 +@G€4pt˜-Α’?Αε›“ί2φ;­&iΐϋu”½Šώ?ίžϋJύ~’ί2>tO›α [€€πmόQτϋM~ΛεhH xΠ ΐ ψ,I~Λ$k@6pφΗ§Ζύχ%Ÿ1ŒέV£N3'`O|νY—&_έ{ςoΠ‰xΰHσ΅δ)yο“Ο˜έ\žχΫ©p„ψjςoΞ=%pςΝ½'Ÿ1Ÿ]‡$Ÿv 9E=Νμ|φ£Ύδ·<ή^ν'`'vOώ;Ξύ‡,ξ§—g½ΣΖλ +(ϊcͺBqςOσ»« ΪtΜC3πsθO~ΛςO­€*9 ό‰ς$Ÿ‘ž€v³Žψ)]ςsΊ­°V53ψ_ʚό>£Ύ9δœ€7”<ωŒdq3ΎEχβωΙg<―o'ηζ%hπ£πΫs_Ι’/Sς[ΦρμϊΗΟΐ?ŠΎŒΙgπ yώDόδδ·<ΝΙύŸζ€Oϋ’'Ÿ‘,~”Ύφ¬K“―–3ω vΐεYωπ΅δ)y―δΙoyšί]Ά¨”Ο_MώΝΉ§δNΎYΞδ3’ΕύΝxΨ‰ί+—vH>ϋΡ—<ωŒηΥ#9 Η03° Ψ5ωžϋYΗ욁₯p’2Ήjϊπ6|$IΘ·v€™\₯ x MτHώΟ¬γYκί%h=oΣ7Ω#ωΟ²Y²ΊΊΕΟιgΩ#ωΟbpή;m(v@š–>…OΡ{iτHώΟ°.©Tž€·ρσ/Ÿφ=’$δ€); d8ϊ +πš?ΕOιWMφ’,/«ω;(k@–?§Οα7‹ώͺšHβΩuζ…3π5ϊυϋ΅zΡ_S!›εΓτς¬ΫRι€<_Η^΅θ/©•§ωέdΤWι€mώtώ½’?£^’…ZpΜοίΕΟί£Χ&ψώ#] \ε¨(r@*ΪΈ;‘,ξoΖΓNψž.€8ϊ…όwγyυHθ±Μ ΤR€t`μΞ:fΠ Τεc؝ά5UHΐΐΐn'μ3Ή` @O―VτχΣΟ:ž₯π]r€’°5@υ€θΟ§ŸΝ’ΠΥε€­ό’Ώ^ 08ο649 {x(€μ€‹Aκ-'`[€ZXτΧ+δ€); d8z +ΰ@vηe5η 0ΰ Ψ(ϊ땁$ž]gΠ2QI6Λ‡ιεY·₯Θ(€(Oσ»Ι¨―Ι―8-ϊ㕁d‘Ν(€(ϊΏPΘWΉ* +ΰ—‡Ȑ,ξoΖΓNψžp*T€ZΨκύρΚΐσκ‘Πc˜¨§AΤ-ϊγ•‚uΜ ¨ΔT€ƒŠsδϊυ¨Sτ·+ΉjŠΐΟ€z³=(ϊγ•rΐν„`f ΐςΌyφ‹ώx₯`ΟRψ.9ΐώ€(ΜfΙθͺq@VΧ0D08ο6”8 [Η>F€쀋Aκ-'#@rΐ”²ΘF@·θoW +^Vσw°½$ρμ:s€†Θ#ΐ8#@ˆΝςazyΦmir@6παi~7υ΅9#@Œd‘ΝT€#Χ―cΘ Χm<E \娨p€sH["$‹ϋ›ρ°Ύ§Η4‚#@„ηΥ#9 Η03ΠώTx +±ŽΩ49 }bˆ; ¦ΖNϊāp;a˜Θ°Ίβ¬γYκί%Ψ~0ΔΩ,Ω]UΐΔ8ΰΌwΪΠγŒQΨƒΤφŸ€lΈ~uŠώr%0e„μGAR`Hρ²šΏs€ύ ؎8@†$ž]gP0σ‡`ΨΒCP†ΝςazyΦm©qF€0Oσ»Ι¨―Ν4π”!Yhs€sˆ ˆJ`BΈΚP±άiŽ\ΏήΔ"Yάߌ‡(π=-H‚2<―Ι=v€™ + +px을-Œ!Φ1;€f Π"Œ!rΤ8€ +pPqΜhŠώr%p;a˜Θ°ΌΒ¬γYκί%Ψh˜‡ F€›%; «ΖΒœχN€°ΨƒΤ*NF€,δ€); d8 +€ ΚΛjώΞV7 D’?\iHβΩuζλg γŒ96Λ‡ιεY·₯Ηι€€xšίMF}Uΰ€‡ ΙB•0€QιxJAΈΚP±ίΞ!F€(Ιβώf<μDοiqF€$Ο«Gr@`f ύ8rύz#@ŒuΜ ¨ΕιC#@Šά5 ΰ„-Œ)Θ·v€™\{€ ΒcΟRψ.9ΐκ@8¨8f΄E·°Y²Ίz€ ‹qΐyο΄‘ΔNϊΔƒp1H`ω ΐΨδ€); d8Ά#@œ—Υό,oF€8I<»Ξ`ϋ ΔΨ›εΓτς¬ΫαD’?[‰xšίMF} ΰ`€ I²Πε€tΐbθs<ε \ε¨XξŒy’ΕύΝxΨ‰ίΣβxŠρΌz$τΨfΪ^€CŒaΦ1;€f `Θ’; f»Ή~½‰ 9ΰvΒ03 `u²‡ F€λx–:ΐwΙΆŸήIؐc³dtΥ8€F@aΘapή;mXο*ΐAΕ1# =(ϊ³•vΐΕ u€ύ'#@rΐ”²λ >1δxYΝί9ΐή`μ‡$ž]g°{bμ‡ΝςazyΦm)qF€8Oσ»Ι¨―Δς$ =ΰΰϊAΤ)ϊ£• 5ΰ`€ 9ΰ*w@Εv€#$Yάߌ‡(π=ΰ€‡  Ο«Gr@`f νΐf³hjq<ΙPSΰη#@rΐν„`f ΐ`μ‰uω"ŒIΘSv@Θp¬.ΐAΕ1# =(ϊ£•‰—ΥόlnFΐ>HβΩuζ«g`:ΜC#@’ΝςazyΦm)pFΐ^xšίMF}λ€°/’…"`Θ£Ιϋ€p•; b³xΈ~uŠώdε"Yάߌ‡(π=›ΐ#ΐ8#@˜ηΥ#9 Η03ΠΌp€(λ˜@3P…xΰ!(Jξ€šνΐΨ δ€Ϋ ;ΐΜ@.€½ ΘF‚’¬γYκί%X}œCŒy6Kv@W‰0Δ18ο6μv@Z€#Χ―71da\ RX~²‡ F€(δ€); d8vΰπΨ; [’Ό¬ζο`iςD²$ρμ:s€Ε3 +pPqΜhŠώdεb³|˜ώ—ύr]N\;ΒhAΈŽˆlKXβζ"@\uCΜLζL2οLιή+vώŽͺΧ#H_ν΅z>ξyχΰ‰ +ŽαƟ ξΑ†>%ͺ%οΔ4ά‡$θ,JΤY;@"€‚<ή­f£k[MζΈD€8 ZNιΠG¨ δ;ˆΣ²έξ­ΏΨ£‘EθΘ@ΞΐP¨œΟμ #@Αj¬}t€Κ@Η”‡ D@εdΡV;ΐ2ΑLŸ=<%ͺ¦HΠ½»q@GΑjQxο·[μ`4`Ž'P1θ€ιP;€νPF€νJT 8 @8θƒοju#@Αͺ9§α°]ΐΗ!(P1y΄]^ΐ7u¨CP" bŠdΜΗ=»$¨8†2ΰν‰Bςψ^ @Βέ8@"€pΐ’t@­0LΛv»·ώ^GοV³QΧ΅­&[`(HTΟ)=€ϊ蕁π9ΔU“EθΘ@ώΐC°jJ<³v€Dΰ€΅Pˆ`Ί€KΘ!X5Y΄Υ°Lpί'ΐhHP$θ€ή=8@"€ε€χ~»ΕΨzO¦υϊ&P9θ€ιP;€σp9%ͺ t€ΑxΏš/Ž'P5η4ό⎠(#ΐv%*'ΆΛ‹Έf  V7Tt†·ώ^G‘μƒωΈη±w€DΗpγOμ`θCP" rςψ @Ζ8@"€pΐ’t@―$ˆΘγέj6κΊΆΥδμ‰*NιΠG¨ d:ˆΣ²έξ­?Χ’EθΘ@ΆΐP  tΐ3oθT8`ν£TβΨ- <OΑκΙ’­v€e‚8>€ : w€C°r”ήϋνo ‰"ΠΣ‘vΟ'@"€p@€pΠί<™Φλ›D@υœΣπ‹˜.ΰrJTOm—0ΝΐK4_O" zŠdΜΗ=» lW"€€cΈρ'Ζ€Τκ†Š€ΞπΦ_λΙγ»p€DχαC‚€₯κ< @HοV³QΧ΅­&OHΠrJΰ€>:@e »H“EθΘ@ΐ £tΐ3_`˜–νvoύ±pΐΪG¨ Δ0[F€r€D Y΄Υ°LpΣ'ΰβŠΠcοŒ9 Pxο·[Œ @ :`:Τ`ϋ\"@Aΐ:ΐA\А βœ†_ΐnΔδΡvyqΛ Τx2­Χ7‰ +ŠdΜΗ=·τ!(@Α1άψ“o@4_O"€‚<Ύ@ΨDά¨Υ α­?ΦCX”¨3u€DyΌ[ΝF]ΧΆšl`θCP"€‚SzτΡ*9@"€’,B@ςt€D5₯ž;@"€pΐΪG¨ ΔπZ€D5Y΄Υ°Lp»'ΰ¦e»έ[ͺΗ€HΠ=ΐP B9ΰ½ίnqv€Žq θ€ιP;€η AΗ“Cp@€pΠΧHqNΓ/ΰΈ€KΘ!HBm—0Ν@8%θ(’}0χ<ސ γnόΙ€«τžLλυM"€†<ζο}Jp€hΎ8žD ΰ€Eι€:O@ΨD yΌ[ΝF]ΧΆš ¨Υ α­?ΥcrJΰ€>:@e ―HΠ“EθΘ@Ά0τ!(@Cι€g¦ °φΡ*qœ @Om΅,ΐρ  ₯HΠ=Ɛ E9ΰ½ίnquF€iΩnχΦ_κQAL‡Ϊ잌ε‰2ΐ:ΐAΜπ9Δ4œΣπ‹x- <OA"ςh»Ό8€_JΠS$ϋ`>ξyΌ ‡ ΗpγOŒ`4$(Ιcώ „΅τžLλυM"€ +pΐ’t@£τ!(@DοV³QΧ΅­&O@4_O"€ˆSzτΡ*Ω @E€νJP‘EθΘ@†€Τκ†Š€ΞπΦκQ)πΜΥ€€Φ>:@e €Ρt¨CP"€Š,ΪjX&8€Χ pŠΠc鉀+ πήo·Ψ:@"€tΐt¨ΐ𠐠 t€Αo¦e»έ[§‡εœ†_ΐiΚ„δΡvyqΗ όˆqE²ζγžΗΨr’q 7ώdΐΥδδ1@Θ!Hw ‰Zΐ‹uސ %w«Ω¨λΪV“›τžLλυM"€ŒSzτΡ* ΰσ!(@F‘ y:" ωβxd”xfκˆΫ• °φΡ*ql¨Υ α­ΏΣγ’E[νΛ°{$¨)t@« }J‘πήo·X:@"€tΐt¨ΐλ Έ +ΰ€ΰ  NΈ +η4όβF ψβ:ςh»Ό8€Y^"ΐ΄l·{λ―τΐΙ>˜{?`(Hr 7ώdΐΦ:δ€#™;@"€Φ€ΰ!(@ 8`Q: ΞΣ9ιΘγέj6κΊΆΥdθ£p<‰:NιΠG¨ δ5Ά+@H‘ Ή9ΑΊ ‡ %₯žY:@‚t€Φ>:@e €Λt¨CP"€,ΪjX&8€Ρ pŠΠγ牀λ πήo·x:@"€tΐt¨ΐν Έΰ€ΰ  f€0-Ϋνήϊ#=2η4όβ6 ΐP %ΆΛ‹ΨeΰGˆ)’}0χ<ΐC’cΈρ'–ΈyΜάrΒΪFC"€pΐ’t@$¨Ιγέj6κΊΆΥdε=€'Σz}“ δ”ΐ}t€Κ@.ψ|JP’EθΘ@†€hΎ8žD%₯ž9:"ΐv%(¬}t€Κ@ΐjuCE@gxλτΠdΡV;ΐ2ΑΌž‰€+P$θ€Kϊ” D9ΰ½ίnρs€DΐU@L‡ΪŒž‰€kρΕ›H\‹3cH\pΐ’§0LΛv»·ώDM‘μ†wF€r€D5iψΈυΏΧ|Šq)Ÿο£^γ²€ςt<9IΡw@Χ΅-nΈpΜΗ}ΟazBΘ!HJn“ΟhHΠ“Η‡ @Ρ$ΑG°¬ΐ'Σz}“ ε”μƒΩ¨hrͺΐΟ‡ D%§τΜΗ=]άΠψ«ωβx”œΤΐs*lW"€’Ση;ΧjuCE@gxλτΘp}$ΓŒ@ΎΠ‡ Dί‹Ο@Έ8@"€œoY΄]N‡7ng DΐUψqJÍ?tή^-σΙ¨Χψ @"ΰ +όό–Η»€ΦΛ?z2ώΑn”όύ½€`1v]Υ€#”`ZΆΫ½υ—zL~~?£έ +€6€WθP α—ώk‚€2―|Žq@Υόϊωγ\€Ρ~½˜ŽϊνΦ«₯ ΐnurVΘοϊϋηo§, wλΕlάο@ΐ  ΐoΥρϋ?ψσυγΫΉΘθ° ΰΰΏ`p{ώηˆ9όχ—Ÿ*²cvλ•?…ο‘> +€ίJωοΏγΟϏi…ϋ-όώΩϋήΦ+€γ πηόώύείgiGαa·]K6 zmΧΉό²_.Z‰#Q]ψ0!B‚ ‚ΎPΫΫ±{œ΅d֚Α₯ΉυHA2•P*ΧΩ_Ω·ξ=' @@έr\!ΰΓΌ‡?βώρΫΓύμφζκr2&ύύžOχŸόσ·)‚!Ρύέμφϊκr:Ÿ…~·Mχ_Όά-μΆΧC0DΊaοΧO:ψ?”ϋ›λ«ιδb|>žžτI‡ž?εΏΌϊ_†€N€°ξ> ϊΒ=?ψ==ό rvz2`φ»τϊ[€Ώ‘_lφyθ³ώΌΉ&τ&Έ?c/ΈϋŽΠ―όηo Π»dI?ξΎΟέw½Ž°o‘~ώόsλ_†^ώO’{φψΑ—K?tΟδsϋςυ“ώΌϊGHδΣξ…|i?ηϊ΄,)ξ—A_Ήχ#ξ…|a©?§ώbΌΛ’—δ>τƒ€»w₯{[Ή'ωμν3ϋω֏°‚©{φ<Ήoiά3ωKϋ9Φ―B€εt‚AΦ²CΊŸΏ χ/$_η>τ#ξλ½’/νηZΏόT5pχμα/έΣΓ_ηž/ύυξs.Ÿ³ͺvτAίΘ={0μiέA>CA―W‘"˜Xς έkώ}Qδ3*έ³‡/άGJ^Δ}RΨ+¦{Ax(”½nΗ}α–~ QΛ‹χ΄τγξύ4χΕ=ψ:JήeΙKr|ι>ΰξέJΈηˆ¨[Žλ—/˜ΊWaΟσ˜ϋ–‘ϋΒΛη¬Α2…ι~ώ&άΏ|ϋXЏΊO)yεpΟ‘!ΐn{½’„ξž=ό₯{zψλάσ₯_1χ:AρC€>θΉoΪ–EξUrΟ‘Ψ;8δ! ?ΜZΰH,y†ξυ%―άξΕ‰ξΩΓξ#%―›Vς*εž#B/‚Ε Ϋq_ž’gBQC@ͺ{Zϊqχ~š{ΝΓΟΪΛΞ(`X,έ‡_ΊΈ{ξ(Txη%Οΐ½ +{žΗά· έWM>£0!ΐΠ},θGέW­δ™ C€εt‚A֎“ξηoΒύ Ι7pΟ—>ά―ƒ…~ςΈ{φπ—ξιαΉoΪ–EξpŸΞJΘΧ Π}sχϊ’χqTτzΉ)‚‰%ΟΔ}<μΑ}:9 ‰ξΩΓξΗ+%ΟΠ}eKž α  mά¨{ΝΓΟϊCηQ³ ‹EŠ{Zϊqχ>άoŽŒCΐ»,yIξΓƒ/έά½kξςΧ! n9Ώλ`κ^…=Οcξ[pΏQVŠΰξB€t?ξ_HΎΞ},θGέΧα~#ˆΠ°Ϋ^o'!€»gιžώ:χ|ιΓύ6P! l;θƒΎ‘ϋ¦mYδΎχ‡`οΰ‡€ώpΗξi麏|Έί(Ϋ‰ξΩΓξ#%―›Vςΰ~σ„!` Ep;ξχΰ~£Θΐoΐέ/Rάӏ»χΣάk~Φ_­D°°Ρπ.K^’ϋπΰKχwοΒ}flς˜ΊWaΟσ˜ϋ–‘{Θί«7ΰ =@ΊŸΏ χ/$_η>τ£ξQς²`ετN?οž=ό₯{zψλάσ₯χ9@έ€N0ψθ +Π}#χMΫ²Θ}ξ³Fά€ΊΕbΰιωέΣ7t―/ypΏ{ΒΐV@xρχμα χ‘’ΧM+ypŸ55)œŒ&Χ»w’—)++ΐ§#0½ω„{Zϊqχ~š{ΝΓΟϊ3T΅šm/蟍/oοcξύ‡uΌdχαΑ—ξξή…ϋ’ W@Γvάno0_ήά=>= χσΏ‰9WŸξ^…=Οcξ[†ξ!?ΘΐŽ€˜€ιυμαϋΣσΛ―?__"ρ―L}’ϋXЏΊGΙ+bόΦ8jς 8;Ÿ\έή=<ώώτγωΞ³™{ΎταΎxˆpΘb›€ώιh<½Ί™έ?|{όΞ!υ&ξ›Άe‘ϋά Ύ(π ŽOΞF“Λλ›ΫΩ쎘IυλάλKάηŸΪΚ8mΟουiΞ/&ΣKΑ4μxzχρ°χ…c9GΆΣviާgΓΡθœ3²Žχ!χ(yΕ"œκl Π½γώΰD0ϊuξ5?λŒ©-'€–ŽΧυƒ GAΰϋ]ξKš€pZνΆKSΐθt܏Έ‡όB"'€-6–έl:ŽΣb8R=ά—›ΘΠ Y–Ν±„zΈ/;bψπ¨7Bκp_ jjΨ °)Β}EG€Νΐώbξ«BMΝ€˜eξ«‚Ό§¨Α}Ε¨ιΘϊG]ρΘ/ 0Ԋ«Ξ +endstream endobj 273 0 obj <> endobj 268 0 obj <> endobj 275 0 obj [0.0 0.0 0.0] endobj 276 0 obj <>/ProcSet[/PDF/ImageB]/XObject<>>>/Subtype/Form>>stream +q +/GS0 gs +123.3600049 0 0 136.8000054 9.0872765 1.4457679 cm +/Im0 Do +Q + +endstream endobj 277 0 obj <> endobj 278 0 obj <>/Filter/FlateDecode/Height 570/Intent/RelativeColorimetric/Length 6289/Name/X/Subtype/Image/Type/XObject/Width 514>>stream +H‰μ—ΩBκΚEΠm τιΔϋ†6AώΏξ­ͺ4ΘQΩ ΅ΜZqŽ·ύΆ­šΤωηπŽƒˆ΄ΰ‡9ψœ΄[ΰX»ρΓXAζωτζy?ƒ΄§ΐ2ŸύκΓkΟ½#ž6!6^}^s” • G€ d€Ώ]½Ύσcşυ=ƒ\²΄π=ΆωΥ‡7rrβ8N!ΒqNNώ˜˜ `ςψςΕΟ­μΝέ››/]Χ-EΈn±XpΤήm ν? lΗ_e΄φ³ΎT*—+•J΅R­VΚε’[,θ δσ˜€vΌz'ωΥ««―Vkυz£ΡόŸΑσšΝF½¦Vo ‡ °fGΩ―Ύl~υ««ΗiΛk6jzΞ &ΐ–­ΎξήΛΎΈzρυΥΧ͏wΣm·<΅’«žL€;uήdΧ«9λuNΥΚο'φμΙ~ΤZMυ £ ΰH“o_ύΩ•σ~χ΄Y&π/&ϋvήV/ώW\z§žš@Aε <πΣμ$ϋ];oKn½Άš€jcxΰΗΨQφίλΌ-ΉU8mͺt΄π󳝷Λͺ*Œπ±―μ >βQM Ϋj(ΰ a›«§–ύF^n.Ο:^­œ<iYVΨ©σˆeΏ‘ηϋαEο΄Q-…4°7eΏ‰ρΣέΥ γΥυ#Η#°ίΎzrΩobφϊxsΡW€?iŸ£@φνΌ{ρ?eς|w=ˆJ-Έ#;Ι>ΞΫ†ΩH=ͺ*σ-Έ-;Κ>½ΞΫ‚@=Wϊs  l΄ΞΫ†ΩθA}΄’„Ύb_Ω3Όϊˆ`ςtwΩo7M BΩζκΩΛ~o³ΧϋλA7iA, f§Ξc.ϋψγΈ‘,Κ~ Σ‚J%hΰΫWΟ^φ›Pxώv μΫyb^όOρΗO‘₯_6d/±σΆa1Υθό2 μ({Ή·Fη]―žh Σψm· Z—ύμk`_Ωgπκ#2―m>σ²ίΔ2Τ@+{Ψ©σ2.ϋ( άΖΘΘ#ΩοΔbϊr―5PΣΘ‹_ΐχ>σ²ίΔr>ZΣ€δ ¬]ώ.χk^όO Vέ‚οn‹ŸύoμΌmΠΈt<ΩHί\>:o'ζ£ΗαEO΄βϋΧΧonίά=:oK‚‰t $χŸ oί<ω^|\ύWˆΧ@8€πώΥυ‡—”n δΔi zΜύλλΧ?|sχΈϊm &ΟwWgνfΥ-Τ@ς˜ϋ/κΫW—ήf―J]­Σ‚’ ΉJ5νγ”ˆo4 ZPžΒ˜ΐ)Έi€X ”Δi@/ΐΌκHϋ£4π`4`ZPΒ'@ €μƒ?Ž4ΰ:²4:@ ν#ΞB¨ŒryΥiŸ t΄†59ΰΟ °/ώψI’’'؟ΕTk #LFκ pπΈ7Fη]―.J‘πXΑh /LFGΗxl R‘ +₯΄O/ HΤ@,b9νΣΛZ—²4  ΏŠ•΄/Τ@˜κK °@ D (”ͺi^6§d΅΄Ο.ΘΣ@ς)€XAžβ”λiŸ]FXΧ€€ „ PƒυVΪg— Δi`υ`Vψ¨ζˆK°\σ>»Œ M«o,ΐ4πn΄Ο.,C ΄€h Z€γV›X€”nc ˆxsωcΗ­4Ϋi]FXL_ξ΅jZy ΠΗ'ΕJγ4ν£ΛΛωhMά'/@}φ>»Œ¬4 ‘ΝΒμ¦}tAkΰzΠρ„h ω@ +Zc>z^τ€hΰ IΑRΠΑDžLœ"μ Pω#“‚K( ά$Θ Π@5!`‰`ς|wuΦnVέ‚ „ Π!ΠDXβmφͺ4ΠΥ0-Θ{IT[ψFͺΕh!`—D%9@ΨDiΰΑhΐ΄ Œ ¬β# ΈŽ ¬²§„€]΄†Β4€°Š?~’£„‹©Φ@G’V18οzu1@XΖh /J«ˆB€@ΨEkΰR’–¨„€UDi!@< μ"NΛΤBΐ.λΰ=hŽ[EΨCžΒθ§}p™α£O ^€ +€ 5j!`I@P° 5Π’‘C£W…@Ϊη–!”nc HxΆYL_ξ΅jZyώ ˆB ›φΉe‡ε|΄¦Ξˆ B)h`₯ώ-xx˜Λ;«h \:ž ¬3=/zb4GΨ&˜ˆΡ@’‚›ΐΑ*Ϊi[–PΈI4γ―§{“η»«³v³κ$h tR(Χy›½* t΅L 2_€ Bΐ&ΎΡ€jAφ C ‰°H’’ ¨¨4Qx00-ΘG:[‹ψγH#B:<„€Eb4€ Ak`(Hλψγ'A@Ψg1ΥθˆΡBΐ6Fη]―Ξ^"Œϊb4€°Ž, μ#Mλh \JΠB€a@XG–ΣBΐ:b4€ B˜φYΧγ ˆ¦„€u>j€ιTΘBΐ>’4€ `j %Dϋ( άΖΰό ¨XL_ξ΅jZyΎ @P±œΦ4ΐv*‚•X· B€ +­λAΗγ„σΡγπ’'D‚‰ (₯„J7‰rl5€ #˜<ί]΅›U·ΐ_ήf―J]­Σ‚¬€ ΐ7P-(A ”Xk!@†ΐƒΡ€iAΆ @Πα# Έw HXHB€­! θπΗOb4€ `1ΥθHΠB€£σW— „F}ξ@Π!I +i!@ƒΦΐ₯ (‘„’4€ a]\'€ C’|ΤΗ €„ r4€ aj %A”nc °}„,¦/χZ5­<Σ YΞGkΰ9„!ΑJ|[!@ˆΦΐυ γ±ΦB€’ωθqxΡ“ „ ΑDˆDB€₯›D9ž@PLžοΞΪΝͺ[`„ o³W₯Φ€iAΎ @α ¨d―„ ‰J|5€ DiΰΑhΐ΄ Ο HρΗ‘\‡΅T,Δh!@ƒΦΐΉ€ψγ'@±˜j tΨk!@…ΡΐyΧ«³ΧB€£>k H£„R4€ CkΰR‚DΠ@΄Η­"£0ϊiŸW’½HAϋΘΡB€@Π²ž84pU€}ZYDˆd|Τ» Ό nΪΗ•Eψk ^€ +€ 4px˜Λ;–‘ZΜ5€ Ciΰ6ΦΟGΐ,!@Ζbϊr―5PΣΘs]€IA„ ΛωhMό&p° +vΪ§•I‚•˜Άΰ*Nh \:o δN +ε:B€„ωθqxΡ㭁0j‚ s „ Π!ΠDP D** „ J7‰rL5 B@₯` !@A0yΎ»:k7«n³tx +ήf―J]­Σ‚L€ Γ7P-ΘZ: ”k!@ˆΐƒΡ€iA¦ @Pβ# ΈK ¨YˆΠB€­!w (ρΗO4€ c1Υθ°ΥB€£σWg­„!F}ή@P"C:Έk!@ŽΦΐ%w ‘ „%24€ „ΉδˆΠB€ @²v@Γ\r>j€ί€ΠB€@² 5Πbͺ„=J·±˜>RΣ—{­šΦ@žη”,η£5 0›B€ž`₯†-ˆ GkΰzΠρ8k!@Κ|τ8ΌθqΦB€–`Β_Jxk!π( ά$Θ±ΤB€”`ς|wuΦnVέS hy›½* t΅L ς[B€ίh@΅ G ~€D%Ά@’4π`4`Zε΄ψgΏLH’(ŒŽŠ’μ«€¬n(«l‰Ζd2KσͺΊiξfQλρ€{Ύ ρ>κœnΫ₯j!`”‘d P¨ΙΦBΐ,ύvCΆ†v•²’5€0ŠΦΐu.“¨„ZyΙ@˜EΌ†Ω Μ’4Pͺ„ς5€0‹x L#_³HΦB€ω@ζ½dB€ω@˜Ε­9'€`AΌ†‘„€iΖ–Rr5€0 iΰf’aB€…aχιNi ͺ4p$κ,ŒŸ[ο4 ι, ¦Φ‚”ͺΕlR <<·j₯+Ή@˜fΠ­„€qΔk!`@έΡΐ‘$ xto+…L":©„€iF½&i §4 [PΪ ŒΣΧ ͺ„€i \HΣB€ΐ½Φ€nAI€`’ίΆ5 + +ΤBΐέ) D•Žd]€(Bΐ,γηΦ; H9λT$fL5 ­u„γ³( T‹Ω€D PP +¦fyn=ΤJWB5 B ‰0Λ #R6Dk!ΐi ξhΰP”, :·•B& ΙΣB€Q―IΘ) θuϊZΤ‚5€ΰΐΡΐ…8 X άk θuϊm[‘  ψ +ΦB€₯šL xθ·b5€ΰ`ΨUΘ +ΣB€­λ\2&P΄ς5€ΰA²ΘΤB€₯²L X«„’5€`A€ŒΦB€Ή@0ρ^BN!ΐˆH qk@Κ ˜«„‚5€`ali %JNH7 ˆzL »OwJQ₯#I€ΰaόάz§'€ΰd0Υ€˜Dp’4P-f“ς4€`βΉυP+]ΙΣB€‹AGͺ>Πώ•R!—IZp,ν_‚=ώλ‹5ώs―Ϋn5Ÿ4½Jϋ_eS‰Xψβœ"ΰλC@Ψ >_ύτρ;΄ώ#­w£ζ/ώιdυξϏ?YŸζNφ—yεxKίί‘Ύ5ΎύΣ·ΦΧσΣϋoν/σ Y­ψhύ΄ύξGΓτΣ§—Ÿ~ϋ΄Ύš_ψώ_άwί¬τ­w_O?}g}5d‘0Ή€`(‚˜°HϊΎγ;οΎί^ߞ_πώίή…@~ΣϊΝ³Tϊ^Ε§Η·ίύ“ΩρυϊΦόbχŸ^…ΐž§ΰjW|αιψφ»οΉΎΰωΏ!4+Kί]|gKΖ>7„€]ι/{ΦΧ΄B›^ƒ§ψΦ–Ύ«ψΆπ§?e/Cΐ»ψV–ώlρmυψš™ΘmzόΖιoΫϊŠΙPμ| +Ί‹―γ=ώίκρ-(Žƒ;Žτ=ŠήύωρI[‹Ο—oιΟ_y€ο…Ύ€] ΥŠοƒίτr_…“‚;nιϋί~Iίƒΐ42›^ν‹ΠγϋHίwό=‘ΎΣHo8Εη'}ίβΫι{a…ΐιΩel»Cΐ»ψ\χ+Ύ=‘ΎND·7όΖw½ϋ)Ύ^_a]€ +Δ6†€»ψ:Ÿ.ΎύψιO™„@8Ύe!ΰHί£ψθݟ?Ύ ψφμݟΓJΑΤΦ„€·τgŠ―ΌPϊϋY|ΎLC Ή!°ZρAϊ«³E!ΰ–ΎOρ­!ύύίb+B`‘τ}Ηχ–ώήŸ/C`©τ}‹_ Ι!°šτύŠoΙ»Ώι?Ό„†ΐΚGρ}q! Η_WϊKΖΗO’Bΐ)Ύ΅₯ο*>Όϋ+#$Ό‹oeι£ψ>Ž€πηa£!ΰ.ΎŽχψkHγ―Ι¦Bΐ‘ΎGρΡ»??ώ"ι£ψ>Ε4\!ΰ-ύ™β+CϊŒLC Ξ«ί₯ΏιΏε–2 €ΩpKί§ψ }^μ8»Œ&…€ίGϊΎγCϊL8!1NρωIί·ψ }&θt€Ώv|οβsIί―ψ }.fBΰλ4ΰ7ΎλέHρaύ―ε«ΏέΕΧωtρα§o’™οΑtώ“γO€οQ|τξϏ_P|xχωP!`kΰ_ޟ)ΎςBι£ψ6‰υ=¨Ώ2zV+>H_,ŽT ?4ώΜ»οS|kHγs3Ρ€jΑ5Eχί[ϊ(Ύ c P ͺG ²|ό₯χ->H_$ΣG ’H_•j«ΌϋK€οW|KήύM%φ•€σΠη@ΆPVϊ(ΎmC_€~ΒρTŽNΰ~~ό¨ρΧ”ώ’ρρΣ—ƒύŸž_Dβι\±\Ώk΄ΊφψΏ―ϊΩ_SϊβΓ»/•€UΪΡDš^ΪνΓS»ΫλG£±b€Ά_Wϊ(Ύν!`{ΰδΜ>R•ž§V»Σν=½^w2>€Ώ›θG@y@Ÿ@*›/–«7wΗ§f‹hͺν?%}Œ/ύ¬ˆ'3ΉΒuΉZ»Ή½»Χά9ΟώΚGρmΆ¬ˆΔθΘε‹₯r₯Z­Υjen|HΧ°bΠ:σ‹p4žHe²WωB±xM‹=~6Z_ϊ›ώ―Υ˜žΐIžp4–H¦™l6Gd³κ—ιο6Φ ¨8‘g tŽDcρD"©IhηCϊ»}ϊ8 \\†#‘¨&’œιο:ϊ” ¬8£—€Ξΐ"d=ϋώnpžΊ:‚Σ …Ϊί}φ3 o€ŽΰψΔαΨc|ότwηΤ¨3˜pιο ϋΤ|?œα;ΖίΞXg0ίœ™¦0ώžπdΣ*ΐ ¦μ8 09Υ% +endstream endobj 221 0 obj <> endobj 279 0 obj [/View/Design] endobj 280 0 obj <>>> endobj 225 0 obj <> endobj 281 0 obj <> endobj 282 0 obj <>stream +%!PS-Adobe-3.0 +%%Creator: Adobe Illustrator(R) 17.0 +%%AI8_CreatorVersion: 23.0.3 +%%For: (Drake Costa) () +%%Title: (VuePress Icon.ai) +%%CreationDate: 5/29/2019 2:12 PM +%%Canvassize: 16383 +%%BoundingBox: 87 29 218 177 +%%HiResBoundingBox: 87.087276845743 29.4457671384607 217.516072292132 176.325199464285 +%%DocumentProcessColors: Cyan Magenta Yellow Black +%AI5_FileFormat 13.0 +%AI12_BuildNumber: 585 +%AI3_ColorUsage: Color +%AI7_ImageSettings: 0 +%%RGBProcessColor: 0.450980395078659 0.796078443527222 0.552941203117371 (R=115 G=203 B=141) +%%+ 0.172549024224281 0.196078434586525 0.278431385755539 (R=44 G=50 B=71) +%%+ 0.184313729405403 0.596078455448151 0.411764711141586 (R=47 G=152 B=105) +%%+ 0.345098048448563 0.376470595598221 0.501960813999176 (R=88 G=96 B=128) +%%+ 0 0 0 ([Registration]) +%AI3_Cropmarks: 78 28 222 172 +%AI3_TemplateBox: 149.5 100.5 149.5 100.5 +%AI3_TileBox: -156 -296 456 496 +%AI3_DocumentPreview: None +%AI5_ArtSize: 14400 14400 +%AI5_RulerUnits: 2 +%AI9_ColorModel: 1 +%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 +%AI5_TargetResolution: 800 +%AI5_NumLayers: 1 +%AI9_OpenToView: -68.1978021978011 205.846153846153 5.05555555555556 1870 954 26 0 0 5 120 0 0 0 1 1 0 1 1 0 1 +%AI5_OpenViewLayers: 7 +%%PageOrigin:0 0 +%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 +%AI9_Flatten: 1 +%AI12_CMSettings: 00.MS +%%EndComments + +endstream endobj 283 0 obj <>stream +%%BoundingBox: 87 29 218 177 +%%HiResBoundingBox: 87.087276845743 29.4457671384607 217.516072292132 176.325199464285 +%AI7_Thumbnail: 116 128 8 +%%BeginData: 12995 Hex Bytes +%0000330000660000990000CC0033000033330033660033990033CC0033FF +%0066000066330066660066990066CC0066FF009900009933009966009999 +%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 +%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 +%3333663333993333CC3333FF3366003366333366663366993366CC3366FF +%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 +%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 +%6600666600996600CC6600FF6633006633336633666633996633CC6633FF +%6666006666336666666666996666CC6666FF669900669933669966669999 +%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 +%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF +%9933009933339933669933999933CC9933FF996600996633996666996699 +%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 +%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF +%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 +%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 +%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF +%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC +%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 +%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 +%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 +%000011111111220000002200000022222222440000004400000044444444 +%550000005500000055555555770000007700000077777777880000008800 +%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB +%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF +%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF +%524C45FDFCFFFDFCFFFDFCFFFD84FFA8FFFFFFA8FDD7FFA8FD0FFFA8FD74 +%FFA8FD50FFA8FFFFFFA8FFFFFFA8FD1BFFA8FDE7FFA8FD74FFA8FD34FFA8 +%FFFFFFA8FD3AFFA8A8FD72FFA8FD30FFA8FD43FFA8FD74FFA8FD2CFFA8FD +%45FFA8A8A8FD2CFFA8FD45FFA8FD2EFFA8FD45FFA8FD2CFFA8FD35FFAFAE +%A8FD3CFFA8FD2FFFA8AE8383585F34AEFD0EFFA8FFA8FD55FFA87E845953 +%525F5E5F585F5E5FFD10FFA8FD28FFA8AE848A5FFD28FF7E282E28532853 +%345F585F345F83FD0FFFA8A8A8FD25FFAE838983898383A8FD1AFFA984A8 +%7D7D7DFD07FF525352532E53585F585F5E5F34AFFD10FFA8FD25FF845F89 +%83895F895F83CAFD0FFFA8FFAEAE84AE8383585328522852282E53FD05FF +%A82E285328522859345F345F345FA8FD11FFA8FD24FF838A8389838A8389 +%83FD11FFFD045F5E5F5E5F595352535253525353FD04FF7E285352532859 +%5E5F585F585F83FD36FFA8835F8983895F898383A8FD10FFAE5E5F585F5E +%5F585F585328532E53285252A9FFFF5252285228522E5F345F345F34A8FD +%12FFA8FD24FF8389838A838983895FAEFD12FF5F5F5E5F5F5F5E5F595328 +%5352532E532EAFA8522E5228532859345F345F345FAFFD13FFA8FD22FFA8 +%835F895F895F895F8383FD13FF5E5E345F585F345F345228522852285228 +%532852282E2852345E345F343459FD13FFA8A8A8FD22FF7D83838A838983 +%8A8383FD14FFFD045F585F5E5F5853285328532E5228532E5228532E5F34 +%5F345F34AEFD14FFA8FD23FFA858895F8983895F895EA8FD14FF5F5F585F +%345F345F345328522852282E2852282E28593458345F3458A8FD15FFA8FD +%22FF7E83838983898389838384FD15FF5F5F585F345F585F345928522852 +%285228522852345F345F343A5FFD34FFA87E535352532E895F835F895F83 +%5E83CBFD15FF5F3A345E345F345E34522828282E282827282E3AFD053484 +%FD16FFA8FD1CFFA8532E53535352595F89838A8389838983FD17FF845F34 +%5F345F345F34592852285228522859345F345F345FAEFD17FFA8FD1BFF7D +%28532E535253285F5F835F895F835F83A8FD17FF8334345F3458345F3434 +%27282828272EFD063458FD19FFA8FD1AFF2E53535352535353588983895F +%8983895E83FD18FF843A345F345F345F3458285228282E5F3434345F3484 +%FD18FFA8FD1AFFA85228532E53285328525E895F835F835F5F58FD19FF84 +%343458FD0634272827FD0734A8FD19FFA8FD1AFF52535353525353535289 +%83895F8983895F83A8FD19FFA85F345F345F345F34592828345F34353434 +%59FD35FF7D28532E532E53285258895F835F895F835EA8FD1AFFA85FFD08 +%342EFD05340B84FD1AFFA8FD1AFF7E525253525352532E5F5F895F895F89 +%5F8383FD1BFFA85F343434353434343BFD0634A8FD1BFFA8FD19FFA82853 +%28532E532852345F5F835F835E835E83A8FD1BFFA85F12FD0934123434FD +%1CFFA8A8FD19FF532E535253525352585F895F895F895F835FFD1EFF5F12 +%3534343435343434353484FD1CFFA8FD1AFF53522E532E5328532E5E5F83 +%5F835F835F5F83FD1EFF5F0BFD07341234A8FD1DFFA8FD19FF8428532E53 +%52532E5358895F895F835F895F83FD1FFF8312FD0834FD1FFFA8FD18FF7D +%52285328532E5328525E5F5E835F5F5E5F58FD20FF830B34343412340B83 +%FD1EFFA8A8A8FD18FF52535253525352532E835F895F835F895F5FA8FD20 +%FFAE34343435343484FD1FFFA8FD19FF53285328532E53285258835E835F +%5F5E835E83FD21FFA812FD0434FD21FFA8FD18FF7D5252532E5352532859 +%5F835F835F835F8359FD22FFAE34341283FD3AFFA827532852285328522E +%5F5F5F5E5F5E5F5883A8FD22FFAE341284FD21FFA8FFA8FD16FFA8535253 +%2E53525328585F835F895F835F835FA8FD23FFAF34FD23FFA8FD18FF2853 +%285228532852285F5F5F5E5F5F5F5E5F83FD47FFA8A8A8FD17FF7D285352 +%532E53525234835F5F5F835F835E83FD48FFA8FD18FF7D28285328522853 +%2852585F5E5F585F5E5F34A8FD48FFA8FD17FFA8285352532E5352532E5F +%5F835F835F835F5F84FD60FFA852285328522853282E345F5E5F5E5F5E5F +%3483FD2DFFAFA8A87E7E7DA8FD14FFA8FD18FF525228532E53285328585E +%835F5F5E835F5F58FD27FFA8FFA8A87DA87DA87EA8A8A97DA8FD14FFA8FD +%17FF7D28522852285228522E5F585F5E5F585F58587DFD1FFFA8FFA8A87D +%A87D7E7D847EA8A8FFA8FD04FFA87DFD13FFA8A8A8FD16FF7E2E2E532E53 +%2E53285258835F5F5F835F5F34A8FD1CFFA8A87EA87EA87DA8A8AFA8FD0B +%FFA8A8A9FD13FFA8FD17FFA828522852285228522E58585F5E5F585F5E5E +%7DFD16FFA8A8A87D7E7D847DA8A8AFA8FD11FF7DA8FD14FFA8FD17FF5328 +%5328532E532852345F5E5F5F5F5E5F5E83A8FD14FFA87DA87EA9A8FFA9FD +%0EFFA87DA8A8FD04FFA87DFD2CFF522E2852285228522858585F345F585F +%585F34A8FD14FF7DA8A8FD0BFFA8A87EFD05FFA8A87DA8FD04FFA87EA8FD +%13FFA8FFA8FD15FF7E285328532E5328532EFD055F5E5F5F5F83FD14FFA9 +%84FD0BFFA8A87EA8A8FD05FF84A97EFD05FF7EA9FD14FFA8FD16FF7D2828 +%52285228522852345F585F585F585F3483A8FD13FFA87EA8FFFFA87D7E7D +%FD04FFA87EA87EA8FD05FFA87EA8A8FD04FFA87DFD15FFA8FD16FF28532E +%5228532E5228585F5F585F5F5F585F58FD15FF7DA9FFFFFD04A87DA9FFFF +%7EA8A8A87DFD05FFA8A87EFD04A8FFA884A8FD13FFA8FD17FF522852282E +%285228282D5F585F345F585F34587DFFA8FFFFFFA8FFFFFFA8FFFFFFA8FF +%FFFFA8FFA8A87DFFFFFF7EA87EA87DA8A8A87EA87E7EA8FFA8A87EA87EA8 +%7D7E7EFFFFFF7DA8FD04FFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FD16 +%FF53522E5228532E522852585F5E5F5F5F5E5F3483FD14FFA8A8FFFFFFA9 +%FD04A87EA884A9A8A87EA8FFFFA8A87EA8A8A9A8FD04FFA87EFD2BFF7E27 +%52282E2852282E2758585F345F585F345F34FD14FFA97DA9FFFFA8A87EA8 +%A8A87EA8A8FF7EA87DFFFFFFA9A97EA87EA9FD04FFA87EA8FD13FFA8FD16 +%FFA82E285228522852284C2E5F5E5F585F5E5F345FA8FD13FFAFA87EFFFF +%FF7EA87EFFA8A8A8FFFFA9A8A8A8FD05FFA8A8A8FD05FF7EA8FD14FFA8FD +%16FF28282852282E2852282E345F345F345F345E34A8FFFFA8FFFFFFA8FF +%FFFFA8FFFFFFA8FFFFFFA8FF7E7EA8FFA8A87E84A8FFA8A9FFFFA8A87DA8 +%FD06FFA8FFA8FFFFFFA8A87DFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8 +%FFFFA8A8FD15FF5328532852285328522E5F5F5F585F5E5F585F83FD14FF +%A97DFFFFFFA8A97EA8FD06FFA8A8A8FD0DFFA8A8A8FD13FFA8FD16FF7D28 +%2852282E2852282E345F345F345F345F345FA8FFAFFFFFFFAFFFFFFFAFFF +%FFFFAFFFFFFFA9FFA87EA8FFFFA97EA87DFD05FFA8FFFFFFAFFD07FFAFFF +%A8A884A87EFD05FFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFA8FD15FFA827 +%522852285228522858345F585F345F585F34FD15FF84A8FFFFAFA8A8AFFD +%0EFFA8AFA8A87DA87EA8A8FD17FFA8FD14FFA82E2828282E282E28282D5E +%345F345F345F34347DFFAFFFA8FFAFFFA8FFAFFFA8FFAFFFA8FFAFFFA8A8 +%7DFFA8FFA9FD05FFA8FFFFFFA8FFA8A87EA87D7E7DA87EA8A8FFA8FFA8FF +%AFFFA8FFAFFFA8FFAFFFA8FFAFFFA8FFAFFFA8FFA8A8A8FD14FF522E2852 +%28522852282E345F585F345F585F3483FD14FFA8A8A8FD09FFA8A984A87E +%A87DA8A8AFA8FD1FFFA8FD15FF7D272E2852282E282E2734345F345F345F +%345834FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FD05FF7EA8FFFFAFFFA8A8 +%7E7E7D847DA884A9A8FFA8FD07FFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFF +%A8FFFFFFA8FFFFFFA8FFFFFFA8FD14FF7D2828522852285228522E5F345F +%345F345F345883FD13FFAFA87DA87EA87D847DA8A8AFA8FD2BFFA8FD13FF +%A8052E2828272E2828272E345E345F3458345F3483CBFFA9FFA8FFA9FFA8 +%FFA9FFA8FFA9FFA8FFA9FFA8A87DA884A9A8FFA8FFFFFFA8FFA9FFA8FFA9 +%FFA8FFA9FFA8FFA9FFA8FFA9FFA8FFA9FFA8FFA9FFA8FFA9FFA8FFA9FFA8 +%FFA9FFA8FFA8FFA8FD12FFA95228522852285228522859345F345F345F34 +%5E7DFD4BFFA8FD14FF2E282828272E282827282E5F345F3458345F3459A8 +%FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFF +%FFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8 +%FFFFFFA8FFFFFFA8FFFFFFA8FFA8A8A8FD13FF7D275228522852282E2758 +%345F345F345F345F34A8FD4AFFA8FD14FF7D27272E2728272E27282D5E34 +%34345EFD043459FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF +%A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF +%A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8A8FD14FF28522852 +%285228522852345F345F345F345F3459A8FD47FFA8A8A8FD15FF52272E28 +%28272E282827FD04345F3434345834A8FFFFAFFFA8FFAFFFA8FFAFFFA8FF +%AFFFA8FFAFFFA8FFAFFFA8FFAFFFA8FFAFFFA8FFAFFFA8FFAFFFA8FFAFFF +%A8FFAFFFA8FFAFFFA8FFAFFFA8FFAFFFA8FD05FFA8AFA8A87DA8A8FFA8FD +%14FF53282852282E285228282D5F345F345F345F343483FFAFFFFFFFAFFF +%FFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFF +%AFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFD07FFA8FFA8837DFD06A8FFA8 +%FD15FF7D0528272827282728272EFD093459A8FFA8FFA8FFA8FFA8FFA8FF +%A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF +%A8FFA8FFA8FFA8FFA8FFA9FFA8FFCBCBA88459582D340B7DA8A8A8FFA8FF +%A8FD16FFA8282852282E2852282E2759345F345F345F345F34AFFD34FFA8 +%FF7D8358582E342E34343459FD1EFF2828272E2728272E27282D5FFD0834 +%A8FFA8FFA9FFA8FFA9FFA8FFA9FFA8FFA9FFA8FFA9FFA8FFA9FFA8FFA9FF +%A8FFA9FFA8FFA8FFA8FFA9FFA8FFFFFFA8FFA87D598359582D340B342DFD +%063459A8FD1DFF53272E2852282E2852272E345F345F345F343434A8FFFF +%AFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFA9FF +%FFFFAFFD07FFA8A87D7D2E342D340BFD0434583434345F3434345F34A8FD +%1DFF5228272827282728272827FD093458FFA8FFA8FFA8FFA8FFA8FFA8FF +%A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA9FFA8AFA8A87D7D522E +%2D340B342DFD113459FFA8FD1BFFA8272E2852282E2852282E345F345F34 +%5F345F3459A8FFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFD09 +%FFA8A859592E342E342EFD06345F3459345F345F345F345F345F345F345F +%345FCAFD1CFFA828272827282728272827FD09342DA8FFFFA8FFA8FFA8FF +%A8FFA8FFA8FFA8FFA8FFA8FFAFFFCBFFCBFFA8A87D7D2E342D2E0B342E34 +%2EFD193459FFA8FD1CFFFD0428272E2828272E2E34345F3434345F34347D +%FFFFFFA9FFFFFFA9FFFFFFA9FFFFFFAFFFFFFFA9FFA884598359582E342D +%342EFD0834593434345F3434345F3434345F3434345F3434345F343434A8 +%CAFD1DFF520028272827282728272EFD093458A8FFA8FFA8FFA8FFA8FFA8 +%FFA8FFA9FFA8A87D592D340B2D0B340B342DFD1F340B342D59A8FFA8FD1C +%FF7D28282E2752282E27522734345F3434345F343434A8FFFFAFFD07FFA8 +%FFA88358582E340BFD0834593434345F3434345F3434345F3434345F3434 +%345F3435345F3434345834342E5959A8A8FD1FFFA8002827282728272827 +%282EFD09342EA8CBFFA8FFA88459582D342D340B340BFD25342D2E057D7D +%A8A2CAA8A8A8FD1EFFA82E272E2828272E2828272E343434353434343534 +%342E837D7D2E342D2E0B3434342EFD083435343434353434343534343435 +%343434353434343BFD06342D2E2D2E272827277DFFA8FFA8FD22FF2E2727 +%2827282728272805FD0B340B340B340B342E340BFD1F342D342D2E052D05 +%270027002700280053CFFFFFFFA8FD21FF7D272E2828272E2828272E3434 +%34353434343BFD0B34353434343B3434343B343434353434343B3434343B +%3434343BFD04342E342D2E27272728272827282728272E272828FD26FF7D +%27272827282728272805FD2B342D2E272700272727002827272728272827 +%282728272827277DFD26FF272827282728272827282DFD27342D2E272727 +%282728272827282728272827282728272827282728277DFD25FFA8520528 +%272827282728272E11343434123434341234343412343434123434341234 +%343412343434123434340B2E052D05270527002705270528272705282728 +%052827282728272827282728272752FD26FF5228272E2728272E272827FD +%04343534343435343434353434343534343435FD06342E342D2E27282727 +%2728272827282728272E2728272E2728272E2728272E2728272E2728272E +%277DFD26FF7D002827282728272827270B34343412343434123434341234 +%34341234343412342D2E0B2E052700270027002827270528272827282728 +%27282728272827282728272827282728272827280028A8FD26FFA8282728 +%272827282728272EFD10342D342D2E05FD04272827282728272827282728 +%27282728272827282728272827282728272827282728272700272752A8FD +%28FF2728272705282727052705340C3412340C3412340B340B2E0B2D0527 +%002700270027052700282727052827270528272705282727052827270528 +%272705282727002700270028287D7DA8FD2AFF5327282728272827282728 +%2DFD0734272E272E05282727272827282728272827282728272827282728 +%2728272827282728272827282728272827270528287D7DA8FD2FFF52FD04 +%2728272727282727052E0B2D052700270027002700282727052827270528 +%2727272827272728272727282727052827272728272700270027275359A8 +%A8FD33FFA800282728272827282728272705FD0427282728272827282728 +%272827282728272827282728272827282728272827282728272700282752 +%53A8A8FD38FFA82700282727052827270528052700270527002705270028 +%27270528272705282727052827270528272705280527002700270052527D +%7EFD3EFF2828272827282728272827282728272827282728272827282728 +%2728272827282728272827282728272800272752527DA8FD43FF52002827 +%270528272705282727052827270528272705282727052827270528272705 +%28052700270027287D7DA8FD47FF7D272728272827282728272827282728 +%27282728272827282728272827282728002700282E7D7DA9FD4CFFA80027 +%002705270027052700270527002705270027052700270527000500272753 +%7DA8A8FD50FFA82827282728272827282728272827282728272827280527 +%002727537DA8A8FD56FF282705282727052827270528272700270005F827 +%2752527EA8FD5BFF7D00282728272827282727052700272752527DA8FD60 +%FFA827002700270027F82700272E7D7DFD66FF7D27002727282E7D7DFD6C +%FFA87D7DA8A8FDFCFFFDFCFFFDFCFFFD1CFFFF +%%EndData + +endstream endobj 284 0 obj <>stream +%AI12_CompressedDataxœμ½gwκΘ²0ό~ž΅ζ?lrPBlŒ„Ζƒ Ξ M˜ταωνou+"xφΎgζάuΝl€VWuεͺ{kυΈΨ™΄΄8 <Ώώr|œŸiκb2K{πeOi8\Ξ3t)tφ\‚@­Δί4Zήi³y2N{(θ"A£» +z>$ΟԁζΙOζ 5μ …ΡF1ΤΰΦέR«Ν΄ωάSjOΖ ΅Ά CO²Ί€6©$%$)‚RFΖ§Xԍž$RB*%π…zK[ž€A€~Qo<½ ,κŒβΝΞπ+τ|£}τ±ΰƒDΎ†M~Μ&Σ‘:Ν9ήCΑ’ΚΈέΠFΣ!H/3’)Iθέώl69ΐΝβdŠυΔ)ΐ‚Œΐ lω~λkΏ§=W“±f‘8[Τu`‚Πߍ[7Λ‘6»χ€’Ž– KQeΡ†π„έ…2T±πΰiΏ-κμC[€ςL†ΛVpή‚’ZVԐΐ“κT7&wΥ8ΛƒhpŒ»φ|ΊXN ΰ M—Ϊ¬?FϊΛ•~oΦ†KΈYœM–ΣΈ;ωυ—nηΛύ±ζΡozπ]0Ωψš:[ό>™ ΰk©£©Άω«= οι΄>Πνήz·ΖΥιΈ¦.z`V΅qgΟλΧτ―0Œύoš~ν Aˆ¦Z{­γ»·γΦ! ςκpؘ©Σ^Ών‘fΛyΟӘL†$—ϋΦ œχπ-τδA¬ψsԚ ϋσ‘Ζy₯Μθ·‡ZύΟωBίŒw2#ΤρT[Ÿπρy%Oc¦ΆAζΰ»Υζ@–.΄ΩΈ:Φy»I£Α:EΐιΟ|‹YhΦSnΰζ°_3Νξ5 Ά1eέp\½e0.Oά#PL!)tϊ θ[μΖΞ6υίU°…ε~λ #%k]0‘β«…ρoΪp2u0EowΠ†κX­‘\Ζ6Nίaw‰j‹‡έ}"aκφΗ n}Ω_hΆI›Œ¦(χΤ{κTΓΗlY·»L5Α―9ύV<ώλ/ΌG;ύZq¦vϊΰ!‹Έ~χ˜_=:%‘#ΧΛΰκ!fμόϊΛ󯿜όϊ‹LΘD^Ιΰ%ηџ”σBž‡/6ŸΚ3π’σΌΘCΡδB$ΉX”I )‘"‰Ρ ]I +Qψυ’€HKHπ‚!<ΑΑ‹% ΔG`ˆoA?ωΟΩ£IΜi†Fαˆίˆγ +pΌ`ό“0η%༈Ή/Hΐ :‡eύC’²/νDP‰-‰@ΐ^ NL\ Ι@²ώ!b°| AΒ£ΛR‚εδΧ_@VcHxις"Γ+ešρ’x₯ ©ΑrΓ#( 9HzόδA‚ρœπλ/¨9ˆ H“Iƒo:ηLށαƒ_΄ρ’/ρϊrοηχh’cˆ-3σ J!“ -4 ©3ΝΝΣ°O’σ΄LhH1>dΒ “b υ„TTK`Fdτ‚Q€„Έ¦θƒςȏyΠEt2ϊYH)@ht–fΠ^Žερ"θtž•AΏ`δ™ ρ ‡Jζž€Ή™ΗόU€a$p,Λƒβ&„Θ`[Ι‘ΐή0 O,–-δLy“AςYμ’GΖ€ƒΡή|Β~ΖzJPŒ§πs Χ,–oΫ?€>5 €τιΨI +΄„Α:ƒ΄‡ΗΊ$bύΚc]έΛX‘N2`Ί€`•y°ΠΠΨκb:0žγ¦4Γ.”HΠ4κŸ&9•gxœJCf<'0 ΙΣ ΎΖκeT7"Υa\p"υϊ Ο£6+xjΓzR*˜ ˜(!nώAJs4BδήPW +UN―v₯8Ž%@ΩI•ΣXPvπΗ,ECWΰψ>“ηHŠžΪž²ΓΕ3T­(2œ¦8\Θ²ΡqŽ_‚’Ž$Ϋ›jm nΗcuYβ‡‘Ρ +ά.―i†aЍƒl0 Θ8Ψ8 W +ΏLa ώIyύ pσΨdΐ‹΄Œ†n8RΖΛr„H=PΘfDμ°‘b …ΰ¦ ύΓ¦ Ή}lΪhΨ9 ‡iκς8 °F€Ώ›°Εα,»`°»@ƒ7F; ΕpN·Α†I7M22L`Ύ +–aM“i–aΒQƒ ; ˆ+C¨§@ΘG‚ά0κξPw†Ί+€±ԝ`;@δϊXμφΣ+ΐ:S9Ί<Ψ\0Υρ0v +ΰcY˜"+ O0HΜαEBΤΤ` +`Ϋσˆ€`‘€ΐaΠ n—Δ‘‰xΘX($ΐ +ΐŽαgΑqΣ8ά%pΌyΛΐ@Ν‚*λa²`ΰ“Β ul0>Ϋ±AΈ`lΆŽlbγΐ…Ρq1aγ hy—Ÿ +8Δ—qB|~%ΔΧ1·ρ^ZxΣ Mœ Œ7 :Έp€Χ%€+AΆ$Es<‚%…lk‚~…’ΑΜLJŸa3Aƒ†\€μI‡-1?Fٞ$0¦lγB§œζξη"τC³Έϊœr ©»4…’J!ό%δόH\‘L˜Ε/…3dήγ›QΎιΞ ~‹FίΟμœΩ)΅ς2sY=³E֝Ε/«>²Η3ΫLπŠv˜_°Ή¦Λ°ιp]Ί«°…ξ²ΐaY• +½R%ΰJkTͺh\Ώ Qh„λςZ₯ŠsΤͺh¨f΅ +’|½>!bώςΈfΕβp‡6+WVνJ―^ιΥ +d°ͺΞN\Ώk,Ξ`P&CoΤ$ +FM"έr|"΍xœΩ"Θβ…ΑnΖa iπBΑΩ–Œ9bVΎ€/›NCζ +±'ΐqΊ7ΰό$2ˆΐAδU JΑH!@γPΔLq £γδη“Υ†c³'«>ΝQƒΝ¦mϋΜ8cψŸŒΠΝž―ΪgΖL|`<ΰ† ₯ (>K +Fδ˜%(•†ŒάkΕiΡφκURkΉ†ν΅(UΎ ρΧ3¬ω%κ‡ύKΊϊ%–ά¨;σ ς¬ρnΎR8ad-BB‚R”’θjΕͺQηqB#:jΥ +F½Z·΄a (œ ™Ά@―^І=ΰΊ₯Y±4­^Ήο€lemtΫβ΄0”£gΕQ—°} {oB°*δΧE Λ#γΊέπ?[Ξ°<φBvΝ\―Š +ΈjVΞq-όΑ[ΦΡ°&Ί%pjc[’ΤV;bΫΫvWΐΊCb@φ]Φ«θΨΖ 8γp΄¨'ΨΞ[ΙJΑJ΅GΆY{dοΑKκιa;i\ΫG•Y0E’zΎ Ψ J>ς0ΰη±_ΑΡ)φ(:½oδE)Πΐ=0π<φ΄‘θ šΎˆλω(Π«ω$©΅|TΙŒJ~ +Χςα&.γ*z% °Ϋͺ‹κ© Y΅ͺ£V}Ԑš5R»JjΦIνJ)ΤΠ«₯v½Τ¨˜ΒΛL‚Νš©]5¬4Ψ¬œš΅SZ―ΥYψκ:+ΈΞ³Šλ¬γΪ•\g-WΔώ[ΗNY©ηΪ]gMΧYΥ5t»~¨ΧvΎzŠnΜΗμ©#³ŠΜBοάξ:ςw«ΘHߐ֭{Z–…'₯zΒ‚$Šε εRΈ6œ Ψ"A Hϋ lπA5H +b*η=›~Υιy \­²λRΘϋl+ώ[02ͺ‰ Ο²πC —κ@QyΈΒ?qΕπΠ-Ip „’Δ,E"A„ξωΉ5 ¬‡a9SG’ΪRMόw τΓ—qw½ΜΊλΓf5Η$kLmΡxkeO€±8)0§ΏμΙ―•©.λ {Β3΅ς ΅>=†Ÿ πCŽΩΟ<€©B•=4%€Jτh:M_(–—³Zκm£΅³ύΪFΏfk³w³½ Α|©َ%x€#¨%mQΪΪB—| θG"«$ !"PZ“)R€€+2 ζό,M‚ΐQ8ΨΘ•ΊB―ό‘+«Q·»€Cό¨dσ΄«dΓε5Ι6j™’εζSΨΝ“xfVAnήr‡ι–ϋGΐJ`΅Δa‚ΡƒΩΦ.p 6Κκ€ULησoxφ͊'WΫ±Ϋ[Ί΄skΉβƒPδΒ§X\DζpšFπ40F€¬‚†δŠΓWΰ»Nnq‚>aΔsΞTF8θʧ󏑠λΈnšd8Ε8L/I3Θc”βz( +€ΑCR) uΐ \W+²h²i5EWœnޱΑ§ψ„Ύ5E‘~8'9ώψό°&ςξšΘo€wz§§sŒ1%­§uŒ•ΪQΖIcΚ™ζ9# yHΓP’g)‘zYΙ^”΄Ά8I6Jky£Πf'e‚#-Γe:\°³g!τ‚]²Ρ‹6€£d£ј₯ΠΣ+=Α2Λ4FΑŒΛ€,³wHιHHζdAΒ)ƒ=π/X! ψΜγ…)›Im,cBI kh^‰LY~WŸ―Β₯Ogα%+άf²‚]ΈΉ˜Γ^ΞαH ‡dΐ²…zŸŒΥ§£˜κcjmˆ΄žZ€Υ’k‰Ε7–”e !p)…ρ h$ Γ’x^Β>d‚ ½βiΩ2K€/$@ϋΦAΰ‚‚’i‚Γ‘άϊδ:΅6•Om+ϊ¬ΪΚ FF€¦QŠΝr`^ρlΟCβ@ +cƒaBΑ―ή dΦΩρΰΔ šP%I ›tζW@ch…Βψς–ψό_ΟšNp5pyΣtšFΣ4Θ0ΪfQr]£iΥ₯ΦWhβ χ:ΧΚ +M½κΔYΥξυUšz½‰3Wiκ•&ή2 F]_―ν―O;+όz}†Dͺμ¨σΫ΅~£ή¦ΐš^Y•™w¬Λδ!ž#Μ3Β΄<ž’Œ ‚9š΄&Ψ1σΖβήAK{&A§―†ΤWD’V5±`¬‰,`7ξhl:ΡXήΐαu±«k"I\ύ#­υF₯Ρβg—πΌvΐ Λτκυ+4zsά¬½"ΥQΕW€’ΦYΗ"qΚ‡’>#νΓ+υΤOΨXίΈΎΒ‘ή²Βq-‘[M⧬+ŽΜό7j>ϋΦώϊ‹^υ±j¦φκ4³dΧ‚œΥ »δ¬Ω+ ™VΠve}αζZAsnQŸWδέV +ZλSkξښτ°+ƒvmΠΐ!κΨU8»FhT QAΦ^Ο‘ +oΠΜ\Ρ'›+ϊΛfμυ|¬ƒb‡ΦΦς‘Eˆv›neiϊeτ£X΄:$˜ηr@D@XŠgΈΐκSι·ΊB ΝΗ§œ†|›Ϋύ§00έ,‹dƒ₯γυj4JHΑVr4žBΫlS<ΌA–$pϊtβQpμ€7γZubV@§pΗ«o‹›ύ7ΰsˆ›uέΠGϊΝϊ]QιˆYϊμIΓ·‡JωjΡπgΉίF;9Υٟ{ne<‘?FΓ1܌«‹Ε¬ίZ.΄yΨƒ†βl¦·iχϊΓΞLγ”'YoέDo‹?ΡΈκ-Σt2ωϋοΏ'~§“ΩGm +HΞϋ{’·γ~ZΧβψc΅‡ίΤαθ]žοnΒ άΨ@ΐύŸ0xςデΦΣϊ½Εαc3ΫSƒλΜ&ΣyOνL~?xˆύΞαΓCmc‡αo“σϊd9kkβpΪS'Νψ€ƒ"H<¦ω’#kΏυρ6ϊΓG·ϊԁ"°m0δΑx’{ΠՊκr>ο«ciΈœ<„έΌωgΨv0Σ:Ξ*ΤφΔΓGτΗ7FτΗ?7’I·;Χ­½’ζΪL›/‡ίπfϋX«ͺx€?IŸώ=Δ°?ΦΤΓΩ¬?x(“-0ΘΠPΑνpφ.Γ5θΝaιU–γΆψαύŸBο¬CͺИ©γyWϋYκ5κŸδME›}h―fg­ΗEύ€ΙςΏŽS£Θό Α©ϋΑx$e­λɘ΅€ΒΈγ¨l;Raο!AϊiCψxύpλΌύЌŠ:V?΄™§:λͺϋnzv{“„χe»ηr;φ$ „ΠyG+θό mΫ±<Π`†θι!)ό‘—Ή―ŸΏ ίCη-ώjsPΛρδχ1ώ†45$Žqžu’λ0>–ΘΊŸ4Oβ°+D‘|Oν=zŐ>„h£‹τ]ήo υN]:©/Τφΰ[HκΌί^ιa6hίι‚Β·†Υ™ρhlΝ>&‹­=Iμΰ»zCƒΦ©g„ηαO΄ι>}¡߁‘žŠηω•πt~…›7ϊ2¨‡κ©›τ8δθΛEŽ”Ρ“D*ΉŽ2?w–ύΕaάέϋ·(Ύ“6ΠVqχ„nηZα7m\νθΕLb›bUD‹oΔd“Zˆ[Ϋ3Α<έΝ>ˆNϊ@K +Ν-\ΆS|7͌#€ξŠΙ<…n^Eξ’\Θ2ͺzs|d @Α*N.3Υ-dχ χρi—He¬Β Œ1νY-¨Ω…\p5Φ—suάšQ‚.½«'χηΣ‘ϊ§ώuεΞu[’―œfΏxγΧ~žP&qC_2cw±Shΰ™ΒZu¨ί4<«›…υ …gfΟΜώw˜Y}ΉΕ™Ω3³=fΦH}ARNc[CΫΨ~W[Άi‰ΎœπΔ9z‡š˜Ί–ΤΘ;|τ`ϊ!*hδΟΒ3\W—ΓΕλ~䝻Ttε―;dναΠ1RxœεR`(ŽL± Γ3ψ +Z‰>5Ε ϊ ™G +DŠ€Y’‹ψ-*‘ΫΗ‰s)ΘΏ™Τώ”¬¦΅ΕBΣ[kύμΡ­Ÿ9©ωπβΒϊaΤ΅φίΩ¨ϋ3ΆΝ> ·#Βu”ώ}ϋ› „77πύם—aΰ»~4ΉŽξΏξL“Ί«GΌ#d ΅ε0NϋTo7΅εdOΤmM²5ΥΗοUMΚ J+¦ΝΕΫΈXοM£‘wτ7K9ΦΚ| 3κκsVρΦnƒ` Ν<,^V*ZΧ”4/ ϋŒΎT­α‚£€νr{{M[UαT7? ΚΆrνqsg%ώΈ +ŒηΝίΤΩ<ήW½…Ζζꀝu[ ›ωκΧzRAn¬B₯α€=Π:‘ΙlϋW °ΥΗ?$B2H™ΊΆΠCϋκlώ3…βΗ‰²sFγΈy)ϊ*δ"iΖ!œώΗ…φrΎ˜ŒώΝΒΏb”ί3}ιί%jϋ-IΡτ\Ey ς‘ ‡‡KκBoκx©ΜΏ +Ÿ]ͺ<οώώοwο5™ϋν=fά*Ηnok²_ΦΊ ύ‡…βύζC +sΎώΛgΙMέ5φ?τΙθH†M ­£hϋ/δεΜήαY«νχΡ±Πώ_0Prz +†šb–ζ…½ύ½ίYτ§Ρς_1̍ίεΫ7Μ?⟒˜S}©ώ‰ΒGΠΎπ_ΗH[¨ύzδ##ό02ώŽQR9HΘ­υǟ+Z§ΏyμίΣ{ݜK$ι±J7ψ'έ<ΖοΕi3ϊΕLmαq$ˆ`Hγ¬ (ΪΓΣ€‘&΅Iokό<ϊ)Ό&rKψη|ςΪpXψcacΙ“εα†ΪΫΗ 2‡Έ »:άΤθ…0h½ρ ϊiBέ–Ζν₯?›[YŽJ[j)2•ς`TΒβNχη= ί!8(ΓΙd†ρΖ“cύaρg}‘.΄=ΟY4s,n +;.ZvχtΊx½ε¨εΑγ…wO±Άύ‰ΖdΊ΅9΅―†-Γ,:pι‘n¬*ΚV‘f’-τ)žXaŠa€έˆ³"G&Ά±TSg ― xβΎΧoχj³I·?Τ.5Σ +Ӎp»˜ε@Η +ΦVϊE«$Πoɚ[…mb¦x€Υ©Ϊώ­™©•> £–ΦωΈηβLsš?dk²‚πU†™­΄Εύ*j[ΗCmοqΘΉ2>ΒΔ•–=]˚L– ΄Α³Πώ0ΩFoνY +τ‹£.}²Ž>Υρ’οQ‡}Υτ£!ύ7&¨‘,‡CΣΘ? wDwŽ—ƒΜχΛΞ§· /ώwa±ƒη˜]BιdτŒm.†>‘ΣΖΆ[‡¬οΥ [›©νT8G?Ώ8Ÿ;£W†ίΪύž*pIξΟκΈmΕa,En£ΒzUκΙ½V»ήV‡N£΅£λύ& ύΤνχ¬Φ¨ΏιφΝquzšνͺ‹°Ή› πj€YΧ†ηκ΄«ΝJςίvJ­Άε P…+­-¨fƒ@›€BΣ~EΕ’€~‹΅5QgOύT°‡ς̜„·’τ˜a§a ψ?O -ϋ0—»¬:!—ŽIhΏt³"ŽžγI{κξωΠ”Нn4k’}ͺv:–3Ε€3ν'ΦΑ€aš[bj\›O'#GΣ c4R盬bΙ#.ύ:&Ωfqοΰmͺ’[›­ΉPΤ`ΆφLUˆfΫUϊΟάΥ ž©:[9C{ομˆ}8Tx―l|«±ƒί‡«™mm.Ρ/q‹3MΥ^Ί•Φ%†GΏ'ίΦΑ;Σ5(ƊŠ:،3΄]Ό1YEQθ§ΐν^o΄acr£wh p2ο[†ƒ2£wτυΤαΟ‘¦SM"»μud–—ζζ`€ΜN)\oaLŠ_ΉεVf››δR°f£αV²πΗt2[ ϋ#ΞΑΞνpjgΊ3F§ˆM.nt£!ψMΓή5I ·Δνa +Œ&ώύ€αY†Γ²0kΟΜ°-ˆ†ςΨΣR‡ŠŽ.3=‰Nώ8(M³Ι°‘§mCΕΑΪμ7Ν3ωM›MΡJΌuΑ]‰GλΛ0E™@Λd1lξ`mε„οh+$0Nςrie§hιΞa9κΝ•[‡#dSn £C3Ӻ֞ŒΧ#·δΌ¬Ž?–θG―k“©ε«h›ΦΘ$V—‹)x3ΣY`»μ(XΑιΚCmήΫϋȊ¬™Όo@@mX]I1Hτk]ΦPΜqδΥρoκάΪ―˜P©o.λωR‰OΙ²5Έε_Νfχμ‘ύύΏμ†‘πάή–d-NΞ~ΝάΧln―τ1Μ“§Ύ€\XΟ‚ν.2ˆ@φ’Υ5Ϋ³±¨u@’B­Ξ=ΒOwtRνf…ρ˜…"zLgΞξΗ(D <΅Š#~κNuΙυ=όn|Ek‘šKτv‹ήO(μyΈΗODu]‘ε…6šκ’UtXŽ0’ώ¦UΐτΑώ™&Ύήl#2ξM~?οw6|ΟF»±κΣΉ°ΟTΌ€]žM"†@έlΜϊ#δ•ηαύmk  θͺΧσ5·ΆPΣ:`5n«G(`q£}8&w45+@όƒρΈqdx‘FlύNϋ’§y:ΊKχ€‘G+Ηζžί{ΪΨ3WCƒ:φ”†Γ%^\ +Ž <<κ]6~ \V¬Π<ṝγ.α}΅³?'KJcΨ) LκΦ»ϋ@_ϊ+€bf=:†x  †.ښ§Ώ@U^( P§ΣaΏ­Ϋΐ9Ϊ‡ θ•Ζ²6οŒνnthc Ρ°›tmπύΉg9 eΝ‰Νpiž’'tݞυ§uΫΕWTι^k‘ΤωΦb^‚h[5ψXδQΈ-©³=ϊ@ιΊ$έΘDΦZ2˜“6Fψ`)DΞ{wΏˆζΖ°*Vqά)‚Žη;˜ωςΐ#gΔ›ΪK#δ@_ηαζO·>[™@VΪ›MFšέΑeάΩ΄β«Oμώwΐ/ς§£Θy½TnέΕ½ψ€Ϊ`J~ŸΜ+֊J±ϋ¨ΥZ­ϋΉ΅ίSVά2ΆύΥ½]"dgKγ6HΐΐH˜D ¦θ:kP₯eΌ0ϊsE₯¦œŒΨšX©θχψb{œ]‚`†xb{6i©‹²ϊ§f)ll ϊΣρδχΤκ@mΘδψ7}Ύfeœ;coΏh3Δ ΗTε–'vN%ν˜5鳝~Ržs«ύα!Ι„‘G GIφ€ βfL π§v­|·EcZsΏvρΙν»”ƒ+9ξα̞δd}ϊ’ή‰˜[μ΄aEΈ-.θΠΫ!~Σeτ$%―Nυ*I  cKΐ°’ ΘyeE7²y+HέΜ²)Β.&ΥϊhCΘ”υ=« 4J˜ο{©2A [s} g6f2¬vςLύέ²­ύ{Ϋ;Astv'!;Τ–ψœ΄&8CrXΒŒ‹IΛSΥo9—ͺμ¬%1gΥΐsτδώ4˜Qbt —r³β¨—ώ{/o,ΜχΥΔόˆ½=/°ώt­0gιςK°’›-ۜR *ό1Ι0~‚˜ΛŸςGŒ8Κeή‘άIl:ΟΝ/©$€ΙeΚή™Ωκb!}œ_—s'ŒVΟχO³m9‘~lΐ*w '+Ηiξ©Έ?_%ζ)G“ς\,Υ½h–υ/™9Ί—>‡ATk‘»ΔEΛ΅·#NθrwΧΟ/b#ŸΈΫΥΩ.ύš;(―Ήτ<1ŠΚ±γ₯*vΊΣKy‘”»―χœ4Μ ]©·ΘχΈ'r…"οΉM–Ώr'gΑ{½#@zžϋx›ΐ§ΐ—\κ”ΌRœ<λqXGβAν J’πŠΆ νΤu(ίcš™ρ˜D₯«Ψ{4—ή*ymΙή]ψ{™v[ Oύh‘[ξι I"©r³ώΡ{ΊvΡ‘†ΗgΑψ,ϊ²Λυΐ@8—ΉθΡ†Νά½ζΔq;8ŠžV2InτrΪηΈδΌK‹³v‰Œ€Υe[Ύ˜ίεΈ ΖέΣD'έΟ'U`2Y9 Εcš4δj#} εγ\ΎtβΏ/Δ„Ϊγ+—žY–ΛOή’'wη4ΥςΏβ~³γcR–ψ[žΩ{φzŒH••a6nθ]§L―ώŠœTOŠ7ϊ4C`Xtγ χ‚›’ε+1ψK4«œŸNξ —zϋ|¬πχF=R%ΰ"šΝb”|φqjttz’ι|^½anZCU)e‚V……Β«:½A­4_Ky%Ή‰Ι ΑΖΓ>±Ÿm±!Fεnςς« ͺΑ#‰mέ^ŸœΛΝ¬Ψθ΅bν¨]D@δ^ύπPη©ππ~Ά΄¨€ Ύ μήψabvn2νq"wλ…&)τ«†£Yζ^ηκΐšdτNb.”άlΦ»e•ϋ3Μ%>՟±ΐΑH,*M„·ujέIz“T:sQW&=]†yHJΔE* oE’―w”e[“\¦±π‰‹Εr“škάtήδώΓΜ‹5MϋJτΕuR-oM ¦α|½y*΄ˆ“ˆ¬Νf1B«f,LtŠXδ(Εζ‰eξ$ώ •½LΘ₯ON5¬€ΞUΎώ5Ί«oREΙw/x‚Όlu”|gτˆ-© А=½·;gεΣ'ιΌα?]CΐZU.Ž5€u}‚Œ MtΣχ“M|ΧΫ΅αSlQœϊZ‚Ν0Wk4Ι”ζ“nΎ?ο³ΨtƟkTΨ_:·Η•сθτM Y%zzρtaBύx›FΓέγr€ΈhvFbύύBNφOCŠήA7xΊΚδ#wΧ(©JΏ~0'Q’πbQdZˆM(%ΐ¦€ρK‘Π|LXQ†ͺn¦ΟΑ2ΨΚΣ x3œFœνΥs0…A†»ιEβεcMΰ:,ΊΩ ™kpjΎόΥ W\H$ wΕΰۊKΈQ”fΨΫΓ<Φ@΅R­΅»¦ ƒΟγx<n΅8)ΔνS δυ=¨ψΓQ4{ΚψXεΖω~ΊƒηEMςεεy\9)€Βψ.ΝGd¬·oTrΗπ‚H ~=ۊΚρgύ“»k%ΉΪyε†l½έŠtΐ{T ΒGoy²˜/ηΠ§,H:yJh­τ εΟ¬khiυ!½)Ύ†ΎJΘBζρ“ψ+[/SΧθξ)~ά‚GΧ$½+ρ$p©Έ|C5Ÿ¦ΤδYhΤ]‘-Xjuew€ƒAWϋΘYθg­'2Έ B§†qΒH Ρ@G’Ž ©>f„"P]Λΰήl0Έu*!€έ β―&ΡP—υU‚β‡2θ.Θ™MM½1ΒN'δψ#sm‘ŽIj9qŽΖζ`v'fΖ'Μ3τ‡½μΞρ@0©V)rŠΗeΕ]Y ‹6f•‘Y7ΑΫΙiόΙ—ΥώjHš«x ¨qΩ—-/λ’kŒf+½Nυ±b 2)rj5ΊΡuMeŒEΖΣ΅‘ZdI―φqΆŠNή~ί]ƒjςΖV@‡ά¬°6k /nŒˆ!Ί¨LΖB±f™]TΡ(˜–ΈίCΙν@b§Π`ͺ#@΄΄:ΟΊYC<8KGΏ'Œ˜'ΡN,Λ–'ΓUόIg5V޽KtΑœ†#Δ±xΣύΈ„€σrΊζ?ΔΖέεXΙ‘δΐ‹M K*Δ:"–ευρ‰\4"Ή QσF wη¦o‹9b G€°žF9Ϋ!FyƒΤ€WŽ:’7R€„ζRbƒ†Ÿ·¦[\橬ˆτΰθg «CŠβτΐπ“ ‚+Δc]FΎ<ϋbœ`€¦&ތλ·b}Q’εdhυξPΙ ΗS3ηΈ Ϋι™‘τάψ«y©†##κ­ΠT­ŽΥp™φνΘ½\άΘ³Θ»[bκό΅$^ή_£ΪΐνφxPœW΅™–Y \ωKΒJ-»S‹έy9ΜΤυΖq·―Ϊ₯ά½žΧ“ύΪ3„Τ…―ΌŒΣ”οywΆ΄5U0ΞlΙT48=«ŠόyίΜχ?Ωd¦;:ώ€Π7BY²οwΣ™ μβvΨdDΈυα«έh£·]‰± +Yω#>Σ!\ΣΩwΰͺΑ|/ϊ˜Oφ³§iƒ_«€ZIU ύ ΕΞ–‘Msς‘vŽYPi?ͺ2”uΩ7dԁɢœ#ΥΕέΦƒΪω%vz°š8PΪe†Τ‰*οΝ¬ Ή.dνŠ ŠLe½ίkoψe-‡1$­`~Ώ–»·Ρ"XmE¦Β‚Š8E.AЍΨΫI`°MΏ8εν5βW +γε;u,ŒxSNbGΙgžk—/€λZFσ8Ί2 +ΛΗcρϊͺ~§ΘαŽyΓ–ωI€ΰΛV(_Ά¦v&½^œ žˆ7ωή‹7Ν›MSΎ^ΐΖΔ₯4¨D!π―umεM£ͺΜ›4 N½φ «`@€;£!|Κ"ψ“]AI‘ τŸ Ϊ œJdr&IƒZ²§½½#’Ξ μŠς©aNοOSΘσS¨šEnm%Ήb€κ’~rίΜ ΡΫuΈ0[ϊ@±Gώ/>—ΎκgΊη­\ϊAqv₯Ϋo=ΕZ¨ΌψIμ‘=ǝ;όΉΡ”A:ΏhŸ2²6­–qŒΑϊˌ]£δΛFΕgΓηξ†εxΎ³£B“ΏΚέ†Œ +Δ…Ψ€²S9ρΉΠ ΓkQ”QΝό8€u|ܞρŽ~ιH(¬' \ƒ{3§ΏrΗkSx2J¨4…ήΛ•_‘k•ΊrA…|₯Sφ»σά 4xa’lZ“σψžvΐύkA}/ω€Q4ΰπΩ–€9b’³«`wί±`­7‡nŒ9˜nyω‚pΌte9ilL?gΑ%°œj³” ‚„ά‘Ίγ&£ζ4QJŸŸ΅œ\κ\/δ‹PHAσ©%}ζIͺ#1’Χ}¦W]βΪ²[pkDΈ3I_LΌŽ4ΑgΆG€Σ8_,DιΉx²¦ζh li7Wo­₯ςώF€ΡΦάό“S N5Ια Ζλ”8&Οΰ+Br70υ³‹ΛΕ©&’«`ϊo±ΰΘ<Β₯ί’u4£]η Σ$0ͺΘƒΌΏLŠ|qΎ@λ Π+©ΉyψΑ'_^Ό~ΙΪΙ›ΟfšžΌ3ΰΆ»S°$/I6έͺ}=+@φu~4―q%Τ«3z,ΦΓؘyC Όu.ήγ`¬X|β/…VCΌ—?Rώš%³Œ˜iΏ,Η­›,ƒ-Μ΄ϊMeζ{Ο'_ŠXΛMΣ•ωr²ZMdΩ/RΈ‘Ϋyu GϊΙ6wB΄ΒS·T°JšΈItΏ _₯Š|<αCU“"Ά`:ΡjO\γύ<©ΘKOo^CŒΛΚX¬€Gm„₯Aζ$n„-k]~€±«/{1ˆnN―}R*¬ u6…NZώp˜N£AΓoPΪ ί­x3)Ώ³Ω―πΐ™X#2KΑ“r!φ*yαYjd—t1½ΐΏτΡ²_‘ Ήυ έ€ΪeΟ‹Νι;6˜–m‘ΎΕ £²x +ζ<ψΩΩυωDg`°/Ώ$Œ“UR₯C $U'μm­“•½)Ηd²λλ›˜|ανΞ1荧${χΥ±‡PŽΛ\z­s«1’4%πτ1–»“Χ(.4ΉΎ Λ/ρ¨ͺά(.Σ7ρς)ΜΫ"€– ν₯žΣ Ž]d”fμ.½>«£Fa²ζΚW;zΟτ” šCηWΆ:˜²Eqς5O’%#Uω΅θ_™ϊΆMAϊB½«Ψ$XIΆ―!6(Αβ±r>²ς&Θ ξςEԟr‚.Ž +νV¬ƒ—%άSgΖε‘/€ΈίDάΙJό•ΛeήβK±‘ηš™v OΖUq"jŠή 3ΉΜλ­ΔK R~ύx₯P] >Μ%ΝήΐtΤ: ˆύσJ”ZPΕςΤ^κ”π„;–½θ°ψγUπΖ₯doάQ„ϋ {Ž~5C"σ}οsιM4ώ’‰£ψ»ό”7!!eω ΈmQΉυ˜€ΝΝ–›Λνd|V–±χVpμ[]mζάνΉkUžΧλ-,…Ϊ…Ττ>f³΄œ¬ž E=žJυnΕ_¦3W^ομžπ˜σΘns ‘―T^ώ⫏Λ&Ε_‘έ‘>―7ό.{½‘ | +]ψP2Ÿ*ͺΩ¨•›]—Hψp4C_!•zύΒ‡γkΤ_”rZQΗ*ΠC RΉ»Χ―0|ρΧΒ{»tΎfπW‰ζ3gθkUoάxj§ΡΧ6ώ*ςΧτ>„|¨σ‘―}vαSψ}EΉLˆ1ψA­|7@ό+>ΕΠγˆ)Iτ£šsŸΓ‡8‰οBΤ4ϋB_oΡΧxα=ϋBTxRΥkΝπW}4ΰΖ¦FvpΚ―§qžφΐΑ>εŒu‚.ŸEh)―‰―ω±R"Π<τZh₯Ÿq'_.ι7L5LOΰBTτ{{”\’+”|τœ&ήοΘ›Ώώ +LfΉ αe£&O~E{|ϊ 3: ίv FOϊEΗέ£PΗοC΄Ž6ρEτ8\Ώ€‘/ίΰϊ o6φ₯‹ͺMΈSΊ±ζ°ΰHΧυ3ž~ΉJEιριFΌιœ€BΟ`ŒB‰―·¨œœ“‡HQzaί₯AΊΛ}=φ%‡DΩέV‘Ό‘ž$θ¨xσ±TN”R•e/Ϋh5ζy:Z¨”IT”β’…²rΕGΛφ_%—ΰ‰3ΞTα‹΄±f棃φ s£—l₯xdEΒ±\ς²eΈΡ3y»†O%SšŸWΑΎΖ–`>ό]ΰηgTŠ ΧΟhf§μΥJΓΤqke€πŠΕw}°ΛpΕ`σ₯Υ-Šδ,ŽVcΆLBΛR₯’]g¬ΑΡΏ°0ευ‡ΙΈΧŸlΌΎΞω§Χ+ί3 Ό³ΌΧ{v±ΐŠk0,yυyΓW_ήHZˆ`aΧΉ M ν ½’oΰ&<ρ{F!ϊϊΰΡ­8roΐλ Ό¦½ώ˜|ε=’’-ο1Z8­’Ί«7˜&ŠήΠΩπΩ.Τ'ήΘe&αB@αέ½έyγ/…Oo’{“ύS/1ͺ]{Ι9§yiβΘK/oYo*prαecώ7/G6g^>W‘½‚Βœ{Σ·ή7o¦sΣ{ΈηΌΩμEΥ{vwϊα͍ɨWJGdoώΩίτ³#―RϋΚyϏ§/ήRuκχ^‚Ϋπ–Υγ¦χκ,φΦlΙ{έϋήz©Βxo‰‡[οέςΣη}˜Δ +ή§ζ)ΚNΌ/·œχνzψβ}o€bήΦέMέΫy˜y»lΩΫ›¨ ο @œ{GιΗ/(zΏΪχ_ήEŒ:χyKκηŸJ_@ς|‘ήΓ­/š?#|ρωρ»¨¨MVFΖ—ϊL_ψψ«`Θ—I_|Ω zβΛΝΏ|ωήMέ§Ό]2Ύkiθ+ΏœW}ΥN…ρέ ―ΗΎΫΕ]ΓχH@G/βΠηkΦ½M_k »™ελίB#τΥ7­ρ(έφ-‚·¬ίWŸωΜYΟξ·ξύρ:{ξ'ιGޟ +ΠQ??Rηώ“χLן»ω|ςΛWUyPόεϋΑ©ΏφrΝψŸ§q£?τΏ +SŸ_­©3ΏφQω?©ΛOγίδ{ώy@ό8ςUΟΊGΑXώγ(ϊVμ™ΛΟ£”χvt$Ό4ΏŽ²—SοQ^&ƒGη΄?ͺDοSG7±ωιΡ}"]{όΩ|―O»νQΐΫQ™@pΠΉ$£i€α|™@ΊF>r}Eφξ2PyŒ@μ4πt]lT’Ο>΄Τs`,ί'Λxψ>˜ίΗƒq-ωdξ^ΑΜuζ%(]N˜`©Zοk/Ω³ΰ}?4 Ύ-{•`—}ŒGεR3Έδΐ5 fO½‘DWx±›~ς‹PAΙ<„*`#Cq=zyQΫ‘ΞΕ΄JZH—ΎpPΪαd>Z sεr6|φ6O„‹_ς<\K :ᇋό}ψ}β½ χ³ &ό5δS‘cω+IžύφUώŠœ3ƒΘ9}€E5ς8Ρή"­‘ϊτ_Ÿ#‹Iσ9ΌF)~ŒfΞ}­¨όNt£W1y½―<Μ’ͺo~ύ¬π‰θΒwΓ˜X¨ι—b”RΊŠΔ'Ο±Β\ιΗͺνΉ?φψZ£cνwΊ΅χqίΈ1ˆΗ³Ρ8—Ž‹qρκλ>~9μNβw©:ώώr_‰7½ψςγ‰HD₯ηJ‚ ΄†‰\oŠΐ$.οBχ‰»ςΙQB½Ό=O /ΖΓ€ο‚>IΖonZIΎγO%σΛσ·d5½ “O·oIΗTς«φΦ"B!ρ„ oύβ,₯*ΔΕ’ζ'ξ>δ{’uM§ˆ1&K!” ’δU8IžΦΓ=²€ςvΒQd‹ΜOΘρyνŽ:ώκ‹uŒRΩIaH]ζί©‡H’Hu΄:G}•ύA:,ΧΗ4Λ„ίι|κύ–qύ*εθΟςΟψξ«hr”I.ςQζτ„ 0Qσ9Z0Ϊγќ™ΣGσTtY€„{Ξ—*ζσΗ©Ϋd5œjΗ?ˆΤW,Β±‘ˆtΖςδϋ9«HΙ:ΫΈ©7ΩΦ04dΏ„ΗyaXNwπZΉβΫεw—₯\g6‰pσr6•κ=r~>ε/σΓ?e3W|2χ)ψ«9J ΄Λš ξ¦Βu‘w"ΌkG ωόI,ι?^§ΣŠΟ ζ묘~Τz37Ne4Ϋt9œd˜|QΙΘrpžiΘ―εLηώ"˜Y¨Δύ ς§NrωΟώI­Χ.¨όKψδ«ϋτ~?{̟f#πι•ΪkŸ6οŽ.O§):+^Ξ²§rλ5{u)e›O$Ωi8‹Ησƒ³μΥμυ¬:-ΧΞT%&ŸΝ¦ͺKV‹ΙœΘΡΑ\=tμΝuFƒ©θ}{ˆ΄ϊά ΗρώγΎ+~ΥdͺƒOIΈ^Ž€Λ)1“ή€’_šΞΪ踍|β*BηEͺœΝΧ‹‹|·UΌ“–™«^Νε‹j"!ΏήχDyϊ^©’lΏ ρ‘pαφΕ+ϊ‘Ρ£Όœ+™dOP΄Α­ͺ.ζEo:|ZLΕω·b)|…ΐ_Ϋ•βW4<;'„ΛόΉ\› Ξz…μω(2ό(Ε—Ω’–nŸΫω§Pœ]„—ΤΥEVσG/κήλEοNΛ^†ͺΟσΛΣ§·»ΛMΐxφε?{,Ÿ6)΄ΐ°\Š‘rοξω³&½w•l_ΚW·}ͺς)eΌWQξ£w%²…η«ϋ”κjtς"W%S•ίͺϊμ[Ζͺ_…A°FυT­tφ²¬5o‹kοkwyΝ+ίuU˜λn” ί„’5βζŒώδnξψδΩΝθκφ’žΤ·υbς¦U«†§ ―ο%Ϊΰg'Z:Tm|,Ί­ΫHϋΞ+=_¦oŸκΉλΫY#3ΈK½’w•^ΆrΧ >οΓR0χβGχφώ‰?φέΟΊΩΒ{ώϊωP†2ƒJϋ1ϊ~Δ=Κ―·­ΗΧgŠςͺύξSΊW>{jΔ“§Q!\~&»σΘσ%ύρφάyke_Β§mοKώΈτςšf_½― ΄ˆν5s•n½ή^ΧΛ―“Ɛ{cTΦVυ>uίϊ\δΆ™Έ½-4K!’kΆzΡχ0SZΎηΗδΰύνyΡVJ­υ,ww―>εjuuYͺ]·27΅ZλsWkΝ"­›6΅@«dΪυ9ωܞ\–Τϋψμ\·‰Ygtχ֘ "₯ΥNŸ$m˜Οάtισ―v·z°μΊ9ϊƒ¦θG΅h~ ζoΎgz΅δθ7Μf}ζ%œι_ί¦Ÿϋγ«2 +L?ΩZ»τY‰Ž>§₯Ӂvw²Θ ζŸSuxRΈζ‡KRωFΩQξ€>½QΚΕ8‚γB|·“Δι$Ζ%“‹sϊ~keO¦QυOkυζϋtυ^˜/ώ=›ϊΊ/©Ύ™—Nh³\βυn֌pΕyψΈ+¬ζΏφ:}?ž3 ΆΩ3Nρ©n‹΅r„j’GΎσΖ†ο›• ί[6_―ތΊΨub3ιLΚΕ&F\j­…Ύϋ:y§oz”Φ7=ZθγΖ;°_=³aˆv؊h‡­c£ίή!b0»FH“ γΒƒœZgŽ'φ±eθ΄ληv\€N;γЈ†}Τ±ΑO—FN덾Ec³ΗϊϊY[ ―Ά[ejηΖ‡Ώs4瀕˜ϊSΒ¬γeφμ"G˜'6ΞΤρΗζqθλ­§κ‡ζlΉ t<‹}bŸΫžZάβ΅:ξιl¦‘mη£œ=ͺkηVe¬St]LZθ@(γDΤ(ΎΉ«~ϊ1$Zθΰ›I· 6mΊc ΈνΜρ;ž;ΪvΗ‹Dg8u'ΆaΨΪg{Ά.b[ί>Λυˆάp„ލBƒΪηl‡ŒhΩ‡Ή1EΚhΩy<Α*μΕξσ·V©>sρΰ†i{ΦI,œΫξIχ³zP»9:™8ρΫΎqkctœε#τΞΪγω^Ξ­_Lή«­:ΝρOŽ!CΊ‹D>2¦Cušθν"Ξp–°Œ.Žφ`Oγ6>bŽΝέ%˜¨©ƒη{Iή;ά^9~gΑνΘΤηΤ85Υ΄χΤ6Ή˜ΜΠι|kΪΈ…š³§`lo΄“άΠ¦ .Ί7™ύ΅GύηΛΦNᱍݼΥ_ŒΤohΜ>՞'†dŸς°CΒ‘U Ομξ©½q8^y5©μvΒ œΑ.‡‘ Υtxθ1,σΕP'€6oΖiλ-³τŒ¬¨ιΞ,;½i)ΣπψMχœL„D?K―Ν΄ώežkͺγ„eΞ<Αu­αt–θ£Sz-η c,Ή§υšρήΥΤv +! 6VOλO<άf{μ&τα »’FΞ?Ϊj°[ΞρΆœC„+Pόημτнθ/†»,Δی{pιτMΤ.7Π2~>jΏΓ˜8‚‡‚1§Š’[LΙ’Ψ%ΜΣ©'‹ήΞ8ήΡ΄=ϊs°cτΠΩaϋˆΜΠό¦(yJ…ŽXΖ=7‚όiΎ‘E›΄ΒΝ̍,zν‘}ό:Ov‰ŒήσrάޝΙοσΗtΝJΊΓX ~ݚAGF˜θ<υΌ7hϊ1s=Ω­ιl£©λ©QΠrΩP6’ϊ™“{šBΠΆ{ΔθΌ2u5‰ίr2mOφ΅˜οbnΡYξΠ h1_Nqΰυ{―ΏΠvž.Ή.ηšyκλόp#ΡZ;y_ΊήήΥZιqνΟWSyΡ|Ζ™Μ›Γ,«σ…y‚uIΆžίΜξ3π&–„faά±~Ό@]¨ψ*I6%HΫΗ¨‚dήόυ|Έ˜σ’ϋšh6υΞEΟξZI"­Δ£g½>QΜΙušΆn\[Ÿπ }ΦXHrW(Ξύ7§ͺά%³Φ]*zzΓφΌaϊόΤOΡΊ[o4;8ρ†―žo¬Χ‡{οέ„7ΊLΧ½±ΚƒμŠHž>†0ό”7ΎfζΤΌΨΙζ¬ϊž₯%žζΩ'vτ„˜Α¦ν»ΔySCΛβg³μiKŒM―.r—Β<˟Ÿά'”ΙsW˜½<ς“ςΨPNΕΣ6Ή1‘¬j·hWE\ΤnςΔω{*I½{Ο«d,ػۊ €9™ΩμΜ»”ή+ˊxΞΆ«ιΐΈ)¦• qWΟ%„’~­Κα½αΩ‹Ρ <ΚΤ©Ξ›β0+œ}βΞΑZ>šGn£2»7:υtY8ΪlRžΟf™y¨+I¦Žζ‚1Lσ9―,ξ¨·Ι ‘c„LΥξwφJΜO s~Ν½›6‰δœ/2όWζ£mŒΖ„Šy“™ΏΜ^+/ΧπΤ"χ–J—ήPߎΚ[‘²ύΛ’N,³x6;ρ†fsςxζ΅FΎ0>*qƒ:Ζ*q7¨§z!5ψXpξlΖ<> +©ΈBυ)φˆ» _ΉA%”Ζ½Œ‘bX.λ?ΥEqΤw’θΊu‡ZŒη‚₯Vβa *ƒ‰ός©²ΖpkΑΰ‘ιΜbΨΑPAyZ…Uzœ½RWjx“―‰gζ΄’κΌa&υv’l…šV}‹mPΥΩ[ΰψn *cVΪμ8ΘPηβ+½ κ93y~œΈC=ρ…ζA.0C`\†;[Ύ“ΗαΠΩσ«TB +Ω-PYQύn–YƒŠΑ¬}%”ΧσW"ϋ”yζxΌ«»B-Ζ–W[‘΅\Υ46›Γυ&gσiνAl°φZ‰œq9o rΣu¨eNz4 >ΖCͺΖΜΦΛƒ;jαe ¬ˆρSŽ(?RP}η_snΰΏf]‘V"3΄τz ° 57hζΕ-PŸΓD=­Νέ‘^Ζ_.;ZlaC0ΐυζYf+Τ«—σ iΤΘ'W¨―‹ΔυV¨£Z4π`CΕnΝ X!šΧ_'ξP«ΉπμYœη]‘>γμ¨ό9Šl²Xυ-Š«Κs6[ή?3jtCyͺώLψm9jΤΣΩ:ΤχΘΝ‘u  MΜ+€S½QΉJa¨T0:_…š˜Ν?.όj|ΣP”ή?«Τά| *rσ—‰ > bkDφŠJ5¨C}]€/V(ΎfΞO/Τδ¦QΌ%γ\9π P$ΠλΦxΦ? PΣΧ‰Υ±žίJǁ •>»-—WΖκž§ZΟ5•Xƒ +`ζό•π=,K˜Ϊ°Υ3±5ΎΣ'ξw%>ψx[~Ήp½»T½'Dι%ΊΠݚ[ƒ`–Tη5ΏΫ]ΰƒσKG2ΊλbβZc–SŽHt7ꦞ罩ιΫ¨ Ρςg\υυ<΅εξbΑ“Ω'Ξν."š―πζͺχ…kχΗK‹ΜeιΒ?wΏ{IΌ–£ΡΤrΛ]Άy•Λ.ƒΡ\\vkiξ.ξz—Ώz"MίJΕ6m%qdq3ξjΣΨΐ­ϊ\ΘΪ Vξž„ξς'χΉ-w₯ΘύΡ¬/ΉέΕD+ŸΗšyΆρβώxET>OΓtΨύξΥMοsή,D·ά}ψΡσ$eΝ₯ΑθkhΌϋέΗΧ{£Ζ)χ»―‘gKΘ]‰ΦόΊ3£Λγκuκ‹qŠϋ]ναJYψͺΪV’u‰Χ^π³δs}όψώΊsς^ΉέΝN›Χtξ:Bw›w)©T½–FΡ6LLlŽζήΧ μzwωžEŽOΌο[ξž†#Ήϋˆjίύ­Ω ŸLνόmgςΖνNήΠϊr“oξΡϊrΘ‘›†7τF¦}©‘t:ο_6!Dzpϊ“ΩΣΙ0ͺη0@t²Βƒ]?,q2vΆ{bAυ'ϋ§­0Δ}Ύ$CIb]f>*xZ‹ωΠΡΔι³~:ˆSW=jέ lΣν„Κ„_ά °Oy[ε―*‘Hlu TšΗt¦Ήκγ†κˆV†λ+zSΫ‘‹³G *½•?χ±Λjqˆ‘βPέ ς«sΈLύΘIδλ܍j'πΫP£™ανΥ¨©’Ή©#0[Γ}άΥ§|[‘βΌb ͺͺDF©EkTuΤ"‘ή +)ΞX€^c-ŠSnέ‘žxc»ΖZ +¬ρIZ bŒώd0γjΩYkκήκΧh‡mZυΤ{@ΣΩ²9Π+/Ίέ@£6žxΏ8[Σ`x6ŠJ“ω••°Γ—<Š K˜6&}-έ/Vo€•˜ρvF”μ’€QΤbb7N­ͺFD'ψœ7Po$]=Σ“μ4Τi¬›)€/%{š|Œήό„ˆ[Ω Πy–Ιˆτ© &΄ήe±€e Ξ70“v0~Š_; & ϊe61l#M\€Žρ’ˆϋ΅Œΐΐ­jAŽf[τΉƒ†κokπ5€Κ ΛΘ~œζΈ‰ξoάΡJφύι~ΣIͺΧvpGΆΌ@c zyΉ›κΖ’ώ3uwαyYή7Bό¦>Θk<\I<0ι³»FōNΖ*†Πθ)“λ3›‡f]ΰ6Ίσ°Xο—R“h7{{»ϋ!™7GƒιEtƒ_?EΎ&€z<·Iοtkί§~ςP ²JC;θ՚mz™VΘ*¦dcγ5C σS'KϊΎi…ސ…& ―σ’ΥνNΓβeΐΦ\ΘWx©.v’γ7όM ½=;K΅δ+ <ϋr‹wUΟπvυ|+ΠG™ΛςξΕΏ68‹7+δθΊ΄„¦6oχŽ+ΐγ²G³&φ±ιͺγψ{C’λΖΖΗ‰'΄Z"°Θ;Y•-Ύ|ν—C0N³A›n:τ΄Νq_[’c;ξθ.&ΊωΔσίξm- hQ“uνS}ε/œίόΈͺŠΥΔ•›˜7±BL3X¦ΟUlšΔν[1b[XŠή {ˆ«ίΠΛΪ€—>Θ +Ή΅·do=έD,ύ΅1κ‹’ž„ cŽ`s€1)δνbΛ€Ÿ±ž½αq9Αšευh…Šˆ6Κ7e„’fG4ι`r§Έjb7ƒ„]^sk~ΉΫSTξ-―-ΓϊΔΚ½Π“ϋo ψΆβd£ƒί,½ΩVΟΏΝ{ζlεέΝC##(ξ‹υšΛΰ‘fΨ‘χfτ`¨ηωzΒώ·Υσγœz]J—»%m=Φ'†]tv|p:mTέ0:<3t―€:ΕΪhŸ…vΫΨ=ίgV0q― œ+ ܊‰m¬ϊοe5κά…‰Ν›Mdφ€΅δ±E‡]–τΠD³Έί«ΐθS£VmάΡε{OΈί8+β!y±·˜²aKω£„²ΰβn3’/±-ΙEDm»ί?'gUϊi¦ΰ³΄f +ΆΦφ›aΰΫu­„?K_WΎaΏέqΒ£yΨ@¬ ―ι― ολΌGΊ‹ΐχE«ψ8ύNε#Ό=)ό,]χψΓτΒΔΒ‘ϊ·”}½Rίρž›τZUφΣΕ†²“Λέiœ f%πb]ΩχlςYήbθ£έšsΠGiTN8 ˜r@!χb=Έί9ΈmŽϊ’5ο*„\؞Ϊ66»j![d~tAhσΑύCΥsƒeΆύpQ>Ύ6άΪί€MsΆ»VbΤ‘ύ{Λ;@ ΅7£ΰ,I£qDΪhΥ6±i_‡Ωϋ l„ΩΆή€―ύ?JΎΛ­sZ(“ώ¦kœ^ΊΖ-b±β·κMϊϊ‡υζv‰Φ ϋw,”…‰wΥnw[\$ώμφ˜ώ όxPup§)˜^»?Β`+°—6»+Œ„Ήf,€Δ@ ΓΒάp(ΊΊ"Dθ‡ϊ+ 180ΙnVΠ-)άeQέ>ώ}χgο7zK"d.UZ—ˆŸ`‘ΡFάς ½Sd1ηœ λχί!«ΙζίΠ άΛ£λ4™Q~ψNG‡ΟslŸΒνσ…‡9Bά•1ΛΈ/δΨΫZA½X―G’θšm<Œ8mΣ~ZΐC½νw?Φκ‡=E„οŽY#Χ™Βθή46¦mέ©ι LwY·ˆιΦl‡ΐάώ4λv7Ω(¦ό0œ{μΡ7Šχ¨·ν³F‡Z7+χ„ή¨Άn>Τ}?Α +άώMλΆ!i·?ΕΊέY7ηάΪ·;ϊ³ΈΈ£UλΆ2uCh‹Ϋ€!KξρƒiϊR« ±}ZΙ9ι»a`„9Yυ1˜Ÿ΅–βαnk²m‡κϋ£YΔΥ}Ϋ‹λΆ^υφν˜+bx5ΕΦYά-N7ψΕ ΥΜnΕ.ΌΘΡ6ΊΘ{"ΌCμΜκͺŠ΅^VJCϋ;:(DtιΕYLΑmΧ ύρϊNΓ~ΰϊ΄]ώ1Άύ# Ί_sŽ+εξοϊΗ—―Ck »’B”…νρh‡ΏπΚwPŠy@τ]ΉͺΡfεvΈ©>νθ'Έ΅ϋŽώΝ^œΞρo»΅ϋ­Ρ7έΪύߌώ7{iΞΦκί?’ε9ΤVΥΖΩΪwύ#Zˆ[σφš·‘;Χάΰv£λ²μ₯xόξ’··­Yλ +5mΝά2…‡ jo&}¨ž£ήΆ;ΈUGpˆž§C©ο]Άmό­…k[Π¬ξίX·ΕL7g»jή†X˜ΛGCk»ΆξQ2£ΦΉζ©.žκρGΈ΅ IH;wxͺ–Ζ9Ηh―ίw-©ξΠ3Wy‘ΙΣίYΪ‹zϋ:ΐΥΈΞύόΊ²IΦθmρsdωρΠ:τ–‰…5n°Χ9ΓΎ%ξΘ'’;Vϊ:Ε"Ή'»Φ‰ΠΪQP>xY¬Bθ«ΠέηΦ½ΠΝηυ>λh^ΩηγΝ­Ϋωvοε[ ώv>{'’Ϋ^>{εύnηΫ½—οWγ”‘ήΞηΥάΛχ«ϋΦΕοoηΫ½—οWsλβnηΫ½—ΟYλό‘ν|ѝ{ω~΅Ά.ώΰvΎ­Pρ^Ύ_·m]όξvΎέ{ωVDΰGΆσνήΛg8‚ίΞ·{/Ÿ^Lω Ϋωvοε³η€vϋf€ιyΆ3Ϊ3w"Ή¬ΌˆΉέΛΫΕiΆ7aGR:`―β‘Ke1τΆY€Z`ΟϊυoˆT5οΟ UΠuΫJ&}(©Φζ:ΆΘڎ΄-3…¨ώύ›RεUl=ΏωΫΒ°{ŸΩΆν.ρ7qZ/? ΄Vgƒφ~Nďθ͚Ω9lσήΖ¨Γδφ16ϋVΠ=),μΪ6ύ­υ%o\k> @|@Ήω1Ύg7“•Iοή£ΆΆκςΫλK°<Ζ¦‡.1ΩΉνn{™ωπqα[•­5V™ml»Ϋ»ΔdίlΖmΆΒN<KT½­μ£Ψ“σθΑJo« Ό ±-FW# e_κ~Έ…V}»ΧMΊέLΑ›^ΝΔΞf‡φήΓ?Ž$νο»½χξ½;ξΞζΌ··$ςδ r ΑL‚`Μ@„KŸ7Κ–mY–,Ϋ²$K–eΙ–,Y–dewηͺξž™žΤSΣΣ=Ύίύ}ΈžξͺηχtuUu›VΈ΅d=|ΓΠ°dω`Ό}G[έE«οkkξQyΊlsS«‡^―KGͺσΡ:NF{pμΰœBλ₯6΅u Tη£uΜΙμΧϊΈŽΙμ7ΛrΒΛ₯6‡Υ9Ν?&Λ‘χΥTšξUμ”t3§p―mΗ»rΖ*s +ŸsτR#šjhΞΊΨ[‡):¦]U‚Υή: ζος’u˜΄ΣΝi6 3θι’uX­‘γE«ο/.6£:žnZε“νŸF=_ι8•ΈμΫξ :o/Φn +VΗ}tŒ=·Σϊ?'b_μΠΞU”ΘΠΩΨ#lq?Ψ2EΛΜέ;}ΞzF„ΆΪΗΖ¦ς]M›k2}€]΄†Ψ©”¬΄Έ#*t‡Ιv’@ηΛΡτlΝΞQπ;ΩgΣρΩιŠB‹oŸ¬ΚΣ¬»χΜ<:ΪNΤg˜«fκ6d˜ϊΡΡ^7v&κΕL³‰j1¨]rωjΥζ΄ιyš8,•Y“ +m?σθxψ\Η\—½7±Vλ Θ©p½φήΘ £0ΐ_mΌΌ@΅ +­6Dpζ€ijμ䍁Nct*MΫθ„l׍}pΉχ’ο€Οv£zrΩzΩ3­έ(χ\ΆΉμY]…η75ϋ4Άƒ!όFmŠ_χ˞5?[“3ΨTΖwœβgΎ—΅;DQNρS˜ΐRs’―³ώYτœvlΖ΅ώ9£ηvH|ϊ™‘†g²βgΓΦ#<՞[θΗzn€ +3σ΄`£8l―‡™yΝ5M›œητΜ<Ϋƒa»›™g1ΦΙ™yJc{Ÿ™SΊΨΫΜ@&·»G―˜O2:»Τς¬c¦ykͺιΕ|ΣΚ―‘>’«εΚσM/μM<“Ι½ΚC/λωRλϋͺ.v€Άό†υΓbΉ£†»l›ηΥ.Ïu5‘Lξ¨ύέ΅ΕΠΟ–7ZCi߁¦0‘a|υX₯ +Τ·ΗυžΫcuΊY’qρ,›σ»:­rl«ή©=.>\WhAν—Α‰5ΜτΊg=L[‘=·ΊΩξ:U—ΞξΜRΗڎzlϊ^ͺΡzt·ΒŽΤξΈ+Άf±£.ΆYΏlδήκΧΔι΄P–Εx y†cΝ―=?ξΈ†Κθ19Κ‘I²ί99IVμΝ©I²ί93I6}ZeΦO§ήAm’ΨxΟΉˆŒibGν§·v1ΩπJϋ›,υ1Pڎμή_Υ‡Nυ…;υ€i­€vήκρjηΡPνqrxΌ‘=ʟu^Ύ]±=*OΚ«³΅φσ…z”Wί₯*ηεΉ2)―ΝEszRžΙή'ε™ο=7oυmLΚ3}LW‹ςw9)―R6–I£­Iyu£>³]8Ÿphυ{έ€·κ—KξqŠ_σŸ¦GxŠCvεά·.ή·3Ώε·υήΦdTΜlΆκ—PΆϋdB›KΧκP­3Eiεa9γΠ’S―­W΄>ͺOρS«V^atCβ׊­ku%'Τή Z|φΰY±ςβυΉ΅ΕΓΗS›S·^§ηη’—ξ.œΩ½tkαβΨ­ΫSϋOΖ +β«ελb»‘ω₯‡KO΅GίΣ§tz‰MύΠλΝSΡJW/šg„5L»;³~οΊΉ·«2K*¦½RΌ΄2=9ΰ^»iwm'ΐΙ7¦Ϋ~ͺφ&ςϊ\ aΪ]ρζΘ£vΣξ,'ϋd[}j¬2ΩOΎŒΌΥιꯞ^έN₯°]κΙθδlύ€Λv›ŽMξ/ΦΜTœυ½\cŠZωj¨…ΑΞ[?,ξ<Ύ·apώθl~€ώΣB‹`lOδ™RX‹ϊlυ‰‡–r΄§—υ’ιjΗ€·›ωΆkdu5»―ύΪˆ.Η^―Χͺ/Κό˜¨‹Χλ)Ÿ±j›ςˆ.‹7Ε₯:,–ή4v°Χ7λ™.UύΜχž +oΦS>Γ†aΑ­žίΤM°:ΓN΅ηίXVW“ΪS%tζR΅zSH-λl;΄ΦΦΔΎV‡hŸζΤΔΎMkžOμk•§Φ.šcϋZ\¬qωή'φ΅šΥΧφΉ§ύ‰}]MΔ΄?±―VT΅^κ^Ί»ΫLμkuobͺΠNMμλ8μΪ™‰}νLΪα‰}*έέLμk5«O?G'φYŒrrb_«Y}VC{mNμke'Ɛ''φ΅Š³-―φ6±Ο|L•Y}΅.UΗ&φ΅Κϊc•WU:7±―UΦu;3±―Υ¬ΎXλΧ!φ2±ΟφΓβξ&φ΅ΪU¬~Ύ§ϋZΝκλύ’΅_?ΨΞESŸΨΧbWM£†˜ΨΧ~δ½£ϋZν vΚρ‰}­y­KΥ±‰}­fυΕΪ/˜awb_«ΤG&φ΅rΓ†~h'&φ΅κΘ6_4‡&φu±lNΫ+έ=bγbNMμk8¦ͺί΅zŠ«xxqxα°ρ%ŏŽž·Μ;κυ)NTθ&φŒ΄O9^­v|±j]΄ύ[εv³eΚΡΫ[όZέ–Uο=;^ͺoρ³ž΅ΎΥW™H54΅ž΄ΚΊœw+ŽΙΊZΔͺλͺ«Ξ»OL4eŒσ‰ DƒΘζέή³ω2Μ6&™ΫxΡv9‰n_†9ŸΘvΜΣΤηέΞ':Μ”­Λl:Ν»O¨¬1¨–Ω4 +±ϋdB›yj<ͺٚy·ς݁_†Y₯vXΆ_†Y7ͺΦ’SΙ₯Ν‰VX™ρΆ;xx1}VŸ0xϋbρήΒύ₯{·ξ/ΞΜn_šŸKμΜΟΟ%/ΛΑ’·LΣ|ΞΎ©?@£/ͺαΥtwήΖκύeΣ§6Ύšnrμ¨ϊ©sδr/ΦΞΧζΘΙ³1_δΣΓmηΘžψάΪξ‹§ν>uΧj>ΰΆŸ*+τβΥΛm/rέ{?υFSΉŠ6j|Ύφ•Qέ'[UΦ›žWΪ.χp­ΥvΖ£ˆϊMGλ›ΖΉVh‘ŽVZπΙ›F3mΡΉl~~3ΣΚS―]3-’W›λΣΕψ4+»~°ΠiˆMcgJρ νΑυsοz4ͺ“LybukBΪ(²Π˜χςbš +·Ϊv7ά^κjŒ[ϋKΥ0j«αcΊ›Χιε/]Lλ45’ΉV΅Ϊ•Σδΐn†Yaλ1`ν‡(ZΝKμj ˜<&σέZύau<Pv.;Σn,Ζ€ΝTηF5ί +Υ‡Δ~SθΊ7~ΠUίtϋ[άΗ‹=?­­|g‘άͺ> \TΈGŽRΌM~ΌθΔc"q~{νO{ΌΨΆ¬«ώ4Qπ6ŸΧ ηq€Gz±ΥνCΣ(U΅)‰jσΦTϊlδήΪ SκO«‡’5ΟνΜ~γTή­ΣkΦΛ +«›νΜ‰cw +}ΘΖΰ$…gθK–£ς:t4λ”‹¨΅_¨K₯―ΎϋE[ΌΒπ›Ϊˆ„εΞοΥQμ¬{Ί\kd­ψwχ¦Ί±Β„Ά˜±yΗy‰­—bθn¦W§Ό·ύ1νžn8¦.Su󴬆πo9)Ρ0ιφΕXώνΞ-ιSε;Ύ6Fynιϊ„‡ϊή:Ξ:ͺΫ•ΡyίvoνΥwu`ϊΑz‡έœfΛ§ŒΆ/ZΛΉIΆ/ZΗ7uuΡrmχΦ4‹Ή}Ϊh1±ξ‘—­[&₯ωˆ±Κš)mχ‘šύ·Ϋ9 +؝’¨:±‹~θ^^4X©Π6§$Φ„Ε|DσΠ^SUK)fΜ^΅9%±zΒζ#Ζ§ωt7%Qu>’μOIl>₯ΦOjΫίI+MIlNWτΓi<―˜ΎZ‚9―rγe…Υ +νξΛ +-Ίνœ|Ya»n;‡_VΨ0Φ­—6=tηe…uχžξ½¬0Φy58'^VΨaδ½S/+Œiοχ|‘wκR­εΆ:&=B_»£4cΩκ…‡Φ·Β±Ž«Z)ΎπPaB™CC6,ήvXpΩγ »Ϊkχ…‡uGτΆΓVέέΆ^xh}J­{nmΌπ°UQ9²ͺUύ ­―t¨¬ϊΒCλX΅ΠΩγ ­²ωƒΛ1ή·¦½πΠ:Δτ₯Yzα‘υX©ΊΡέΣ=Όπ°ξδšήvh£―³υ ­kim¨U]Αχ2ͺ:PuΝϋn^xhΎ§3ο=©Μtp +TΫ·Ζ:½ίSυ…‡Φ­―ζ7=ΎπΠΊ#’.Oλε…‡-,ε@Mk|α‘ݚΦε ­φ²Ύί© +(ΏπP©σΎχZοرϋ 뎩ijpλΠiγ…‡•Τϊm‡±†•“lΏπΠϊѻޟζΐ «fΦςjeΣϋ λ‡x7ΎνΠψ˜ή_xX―Υ2(ΕΊŸΧϊ…‡ΦΟ>Zg6^xhύΆC’ΐ…δ>¦ψžB[S.ξoœxαα˜εΫ»›JbρΒΓξ¦’Ψ~αaΛB«6FσΗττΒΓ†φ8]ΆΓΆχ7έΎπ°χιqJ/<΄Ξυc•IK½Ύπ°ξΐšήvh#UoύΒΓSu{/?Ό‘œ8;y.{χJ~6_;z±šά?ΩZΩ-•G/>Όz`υxd`vιfςτ½Η…ΙΑ[λϋ³g_οέZΪ}q0QΈ΅φn³ψϊιΪσ™ΧOΎΈΌ{«\Ύϊpεέϊ­τΑεg·^άx)mνΞrςΚΙϊζςΘπζζόΨΘ«{ωWΧή^;μ`μώΜραΩ[ΓC‡‡ΩΑΣϋ»ϋΙ³©ΑηGξ―ν¬•Η OΏ|»–zzvoαππβδυΡGΛW2sΧތίΙΝ€–R§SK·οΚ©$©ε3ϋWSΛΧΎ8<|yqβπδΕτΠΡΠψΥmyφΖΜΟιw‹cS₯«d± hπR‹λΕΝΓ£η—Ξ€’Χv[F&£l6weM;<œ>:^ΈΏ4»Ά45;΅S{A¦ώ†Ε‘Ήw7[_―7ιά­wίΞμά½zy¬νΉΚ9y’=wvγϊ`ιό›Ή³Χo-_zrku*W>w₯0V*ŠκαβDqνά+Q7Ζ–ŽN/­N Ύ|””3Jo +«ΉvXίͺζkΝ(fΜΕ­λ‘•9†ΡK;W;ΉšΥ.†(‘βΠδΉύLnρξά»υ™δρθΒX9·œ[̬̈Ÿ]Ή4σμΞν«βcfW +OŽ•σS—Κƒ7ŸΞ?ΊtfE;έΜά½±E½‰kΟe¦—οΛ―†ΗΖϞ, ―¬¦O^˜Ή•LΛΪ[άyύœJnΌžΘl<O%·ήMHΣ4YLΘ?:΅:{ρΞι„ΆίJ¨_Ι»₯T2ŸΡΎmf_|;9¦}+ZυΝwβΫ™ ύΫGG»γΪWΩΑ ž,mŽ<Έ¬έβ>žy>s~mΰPωe󑎧φžT1jώΕόΩνκ/ΖΝΏΈ“~ZύE’φ νρκσ©gΥί₯L41Έϊ’ς‹«#ΪΉ¦—ΧNoU6fΪxωqb§ϊ‹ σ/&Sϊσ›«IΓ$ςWSrήΤΫτJa-#ΏΝθ;ί~|ΆΊσcϊ&ΫiΉ’ȍ‰jμυeXΎηFBίd§0/χrCϋΉF~zgεšφcΏ;χ€΅Ϋ˜TςήXςΚ­ΧYρΫΫγΪo3#…Ικ΅ΉΠ?&52XJeήά:»8^y΅>X«–z…6–ΥξB›oq #»L*μ²ΥώκMΊn—)Σ.ΣΙ3GΖξœ?,LίΙ]->z:¬·ͺ‘ϋ·Œj|οAfφνώΪΡμε»wŸΤ*Yfδδ©Ό[«œύ]S•Ι,¬LΙρ^Ι3 χWΣZΘ,μ\Λ_½Ή“1Ύ:yπXkφ™Ε‘­Mγ«ΜσΌάA^ہl7›χgδ.ο'΄)2™Ν7β&_ϋσΝ“›ΖόlTλάύŒιpžœϊͺϊ‹άΨβϊƊ<›mΣΩ<Ή;0oΈηyΉσΝΉ7‰η£³Χwž­-\^ΈUλΩIUV§œ―vκ3uV‚σ\φμΙκnεS%υζ~.s'g<[̞; o|΅°υ²ΊiΦΨtύνlγα\›ΏύhiαΝιΩ›·-nOΜά•.{AF•€~γ“<>(,-f”²Ξ6¦§Σωυw΅¬€‘+K{Iσtαμό‰π”ݍ…3OOη-ίܘ|tm_&·Zys(_Μ\X™[L%nŸΏΏΆ7½όf}㑬ΫcΥΥͺK+ i§ž-iΌG*νϋϊΎq"―ΗτrΫx|€εi―O'’/O_?'RŸ·Η©ΤpβΘ¨£ωĐΨκή„Φ5€…Nνu΅Π™ή0-vΎ2^-ύ‡β/ΦSςgΪ Τ9‚&Qyβ!C’μ"\IΆι^I΅¨7υ`;}<ύ1Ξj±D„Ψ툡³™žΡχ°Ρ§W“©όφε‹ Q6=~0ŸZΈta?%6Ή–6ΕΗzι άςΤhε E`•%¬UA‘Ε‰LθaU‹n"’&pZ\_™ςzvWTž§Gb7M;Ύ4p’J^Ÿ­οψ>hΈρq}ή4΄wmͺCΒ7Ύp3#Ύ«cχ‡gΖήδ–Ζ7Ÿ^’ίŽ L\*ίΫI\Ο,ΝŒŒΞL”&ŒΌ|#CηΐΔލ‡rƒΤ€Έ »¨'¦©ύβ"‹*Χ>09Έ²'+Γ„)μ₯ŽΦwgΦ/O­.mίX|RΈφbis|εΜμ΅ηΦd.p{!7ΈπμΖΡM-‹8x4΄`dxSχΟ4ve©κΒήά΅λ3’ησO΄9jxaυAαμ­“αΣ3..%ͺ-ξv₯΅Ά—|qvοPΤε[Ήξ?ZΦ4έ=v6GgΞ?|±ΉΈωδpώΩΤήvνœ;œ°ά₯ έλoΟιΟYv―OizꞱΤΘβΓ₯w²ύ«ρkfώεΉΓ™υ‘w3ϋ+‡χΊϊθμμαΐBS?΄ιΣ-?ϊΖΒ³sg&³σ Ϋ‹[Ov6zL{έ{νΒ?,Ϋ/sΫ5νβdeε Σ½—:‡++$΅χiλ©L%~R›.œ9Z{yΕμνυ»‡βcΞο–_‹ΣxQ|·rsmqkk(±xιιZ£S:Ρ›ηθσ£³ +Εέκ‚›έΣΖ5Χ]ζΞζθ’ΌρIΦz N=V[ΟFιμ»?u­Ί5=[s§ΊU'՟}Fάs€W ~zΟά―ΪeLM ŒΏ;+υιauμΖισ2’^:Έ3(wMFAoo LΜf§ε?OΖ―l¬ ŒŽŒ<’gΈp%΄(ΰX³o[υ‡ΕΚaF\ύΕΧ3{ο’OΔηίΌΧE°έ·llœ°vΓήκΊhλ–©zέ9‹κΆ>(ϋδnfއΉ•Ή!›];kω1–'u’΄mvͺŸίTΣμFλ―wΫuιμέΫz‹QCŽLΓ₯γJ*Σ©¦)_ξNX|ŒΒ9·¬nέ|t5 +t[-ΪΧμΫ^kZ―YœψS;Σn΅η6ΆŽΫφ&ŠΛχΌ8ωθϊ•²Έ+Θ5σ.ΜΝ=Ήzζͺφmy±t’YΟ€o‰[ΐ[kβξοβεΩ•ό€L9ζ]ZΈ₯u³‰­vΖO>6ίζ€f’G/΄;ΓΊ +­M[ο[c)2ΩA]½ƒΜΞ•²₯Β™Ι59ζvfrqχεάλαα‹+Χ_¦gήΝ&gVίΎ<·Ιι9£/9·π²RGWεMΓ鱋η§Ο5œuۏΦMΊώΣζηη^ν=\H‡Ž”sŒ³ϋζΫ~ͺώ1η|ώςΰΒΓ…εε©Χ’€³οΊϊΤZZQ 6½€” +-?¦‡―κm2‡ξœRͺ–tΫ §κ]\s‡lM9ŸθΚV+Y§ΓYTcΔ“·Qφ“ +eG―ά­uoΏa_™žœp©rσ6uΣf7ίFuyυ>ίς¬c΅₯'{sωˆεΊ©ΉΙG&΅«n<)Τ{kK—΅κaœŸK€2ΒGξ]?HΝΜξάΈΊ΄pq,iv|NjαdλΕ]νΝΜ³Ϋηm_;1½^Ί#ΕΗ,\]ΜjKΌΊβ7Z(c?όΆΏ§mˆ½1} =ξi-?Ϊxτέ9ς +—}χP6EΡ +η?μΒjŸ]θ·ίΤ»­Ά8aYΟY›‰½‰;n΄`ΣρΔE”?΄ξ?°QΣξf‰ wErύ(=sώλ›=gVz―z—–Ϋ}#Σ*tνΜf«Τ΄^šΈB“VΊig6OX~Œύΐ[Mλ&°¨52嘦]Z52£¦υb”™φ1 +νL{Ά·υ.Υhωζα4Η…‘«χΛ²pFώ3'»όjίΚήΑ‘ΡΉΜΐΔΓΕ[²#qMφ ^–ΏK ŒΏxuK~»40rακδΐψϊγ”ΝΞΒNΟκΒiœδD†»Ο,³-•g]ήΞ:t'm'Îi―{ο%ΧTΊΙΡΫσΆ Ÿ―OλύξΆCΕ·κOkH·{©ψ²?­›ξK›]ߟζܝ†λ=·-οοZφ§½>m³?­™HΜ?ΊTΊ&Ύ}v½v##α9ΨwvρζθΓΩΫw^=nhιZhΥΨ΅―ταˆ#ΫΊοj7tϊΨ€.«ϋ¬ΦsϋϊΝθμ›­W +έ—ΪWϊΨΑ©ϋϋƘ‡­w kηiΛΆ2ί‘αω—FT³=ΔΚ―&R7τR•nΣΪΔΥ—Ϊ=žQ|΄«ΨήUjšόζνΖΐ~ςΆi1Ω0πΆηo›r8[ϊZΡΛ*ΰnι·Ο:-ύκTwK_+zρ1.—ΎVτΪIWK_+z- +ΈZϊZΡkQΐΥοΖoz(}­θ΅a ΅7Œυψ¬Ϊ<‚Ί‹6Άg>m:Žι†έΈ“5ώr¬iΞ@Σ;cDBγλU4Σ›JΎͺwjχt>©}VΜxy½φγ³Ή« 7*«ΗΜ‡ͺνγΒΕ[¦}¬>OԎWgntwIwjŴΜΡSϊxξ~ζ’ιh/θYΌp­ΆϊWίh;8©ΫΑΚΉ•ΊΕ³΄qZ4†4Ž_͈Κ;-jΔψʘό*QύY²ϊ³”ψκ–h(ΗΓ‡ϊxΖΤpβ~CΣͺΎψι‰žCkο7šΚT«Η‹ανΑ›E‘ε–_|d ΦΪςΘ#ΣTω +€jΣΎ'qƘƒπζΞΥΖ9ηήe37ry¬2ΆεQβτ«;Zσ”³δ@Γλϋϊ,ƒα‹ήΤΝ +™Υ/ZΆxν΅ρΪžΜ‰œιUkbΪk―δϊΣ•#2½ύgΤtf·+a2]»#σχŸ>\„ΔDγΌ΅ά»κuxlΎ™η7ͺΧαΎω:4Ό…λxϊυEΠfEl]ΈZ»Ωo₯Ζ5OMŸjΌΎθ‘βEHΤέ{ʐ°¨_‡ΓΉ{Τ*ƒΆ°›VΏOja wτΰ\υ"lh‘Ρ₯Υ‡ΊΧkκa» +΅ΡP‘šΥ1v`Tχ±ΎίΥAΘ³iΪΗ½ƒξ[FέΎk8ˆκES?‘ΝΓξ―fCσ”/λλνDv[„<υy‘\΅vPΛ‘—ί ΨάG%P­ο΅mδF·]Ηv~ύή~/BΟ:τloΆ‰V•βΠσ4λ‹±}h½¦ƒhάΑ>ςΎC‰Œšφqqώέ~έ>^΄¬Z υʈνŽγυIoηϊΎ^―Œ‹ΦφbX΅‘뇧+qοmm©•+χvκR©‡ϋ΅‹–»g:ήΤ£•ΊΥΕξm*Τ’φη₯Υ΄{ۍ1¨Λkso·M-©„qΡ¬jλ½G½΅Ϋ{―MΝζ‰μ(΄Ή†šΦx"‡= {'§ΫΦ4ΥΆΜ™N‘9zXgCλ/n™χ±½έcΪή}W;ˆ:“numβE‡ͺΥpšI7Ηλ£ήͺΕφήqΓΥ¬^4ε ΆύΞF2~XΡ§Ι₯+ΚuσŸGsr¬φ†н&Ÿ€\«άb―˜&BΚ‰δIγΖkκ^ΎΏI>X1ζRΝ§ΟΣP—67+³οkσΑ΄Ž€τψσηΣΪύ»1§QN©¦ U¦T%΅oεRΓΖW―veκ½2Rνεx6τNv+¬ŒίNOθΗ«+UΛgw&+΄VSΥΙER+[Ηeγ8§‹#΅_h' ΗΏ›3ύnkp~ͺς‹ω‰Ϊ/2sχο\¬όb5YϋEvπόσΩΚ/fNO +—§Fk?6_ΎεωqΣ/L½ΌšG3s΅ Ή#"₯u’MŸΎ­Νœv Ÿίˆ}l3Σ/isΎFΕέΒξœvG ϋ,JΪTym&΄ΨδZRφŒ‹Ox7(Ύ½£νwT/ δυΩκTqύΟ\8#;¦w?$DZ~o­vmžT>FλωΈ?±άΊpnςωήН₯ ‹ΉW¦~½Χ`yγ†yΕ‰Κ²•ήμ΅²ή/°7οΰ.λ:gF.•n”KΛ²khfhχφΒκΣ©£ΪίΫHWͺρmσάΞ‘7›g*3U·rΥSί2W²νkΪdιqq]‹";άΎ“ΤjΏVΆ7Rιν΅ΥρΥƒ΄1σpϋqfΊΌšε΅½•­|υ4§νΓ(ίΧ7΅]Nh‹Bˆo7*Σ/_?HUΎzœ6WνΜΠΕ΅iγˆ^?ΝVu;σx »iLC½ςξ¬q6―ίLΓ"v<›QXΊ6χ¦t¦ΤͺΏ%f,‘gϊG_+·ΦgsΌ‘¨~κŽQ_ާΛι™aρΥVΊςΥΣΪ”ίczβρ«\εNΪ|Dωγυ₯Ρ‘ισΕυ‰ΣW–ž\9[Φ'ΏžΫ<*¦.-ΙYΌ +ƀˍ”> +Ya"¨ή5Τz.¨ƒA²i9ΤΑ‰ ±Ϊ<ι¦Ή N­Δ΄VsA›zτg’”RΉLΌ”)gβΙ›'ov―Ύ|ώr/>;%βwrv5Ύ³χtιpwχφξoφwNήξξΗ'γΙΩ[σ««₯όΒξΞώΣέψΈ^ΞOŠΥΐ1aΤU£‚›Χd©λiΤΊ“ηž•—_―œΉ9΅΅π,uoΊqfΤHveJhΟ·ε † ϊˆρ/Εοžσϊϊβέ™¬>rR|Lέ ξκρJ{zμuQΎ(όήγJνΎ²W­:›Υ™ΦOΔ­Σm•‹qc…‚ό½C#8Φδ7¦.špε«τ°6ΩήΈTωβ¨Ύ ΖΦιU‘Ϊζ§τu/DΣ} l3?Ÿ¨όΩR²β+©†ε*†^TΣ’Λ#ζΆU>qΩΌ4ΕψΪXuiŠΛζ₯)Ζ«³ϋ/'>ζ`ΎΆψFΪΌžΕά;™K]5―»±|gΈΊξΖUσΊΛΟsΥ΅%&΄@/φLͺ²”HzebIζWΣzDYΉxS~{ΓΌσνηc²ΛπΖΈ±˜Ε`q°ρ+ϋz\Ψ™˜’=¨7’Ζ‚Wε•»‘<ΦHοάΈ£ν7[K7De?ΤsΞΜΘDN†•ΫfOΎ8sΎ«•b¦w…žm΅˜BfdeιBΧ‹34ξ/fšg%vycmͺIςΗΧw—έ/=Ÿ½u2ψrρώΣλn§kΥ8σθδρŒaΰχg«ιHΞΌςΕΕβŽ)Ϊߝ0VΐΈ1/£νέd₯ά;ί~4"ΏJWV>Έ«­Ϋ΄/ΏΚVΏΚι;XΩΊ~­ε‚BΥ%‹Œ‡Άz‘]zkΔ/qΔzF΄uϊ’ΆΠXeqΧ&κwB^fyεk“΅E-Rϊ«EθΤŸΡΩ©ƒΊΠy+gܜMΏ«$M3Ϊ“Syλ&rρυΓJYΌP]½LάΜ=hΉλ³Η3«€ό… ΆΙqvL±•#~d„sqOgœΝ°|HςzξΝι½₯ϊ(›ͺ¦*O³Χζ*·d“#²€ΘΫ‰’Έ@%}9XK’„Ÿ_Σ«ΎΡσ\^―iWFΤœIYΥς΅”~ gΊq\Ύ“ΡnΏͺΟK[.SU]£ͺΆΚΪ\¬Εk/›ΒΤUS²2Έψ8oυθρhΒόθq§tΉΎλ\ϋρΐρp΅ξθzΣ>r£ΛΪ ½ΚcΦύΡζΗ¬WjY3Γε{ΩΖG΅…3gη«3 wΞ5νc.iΪGzic9]k_Ζm‡L΄dΊ|9}gQΛτ“/Η'§cΖT»ΚΧίi?Φ2†δΛk{c΅%{DΈzΉ.!ινYv%OΙxj¬^6:swt«ς„3h„S6·†'œZ:˜9I+>ά©]΄žμΕjomJχΨηχΊtPΉ3YΣE¨^νW +£ΣŒ'ΒΝϋ8z=’Ί–;x6τn΄Φ,bΖΥZ†±ͺy!>¦iΪJΜ½œΘ|b’‘}W.šϊ‰hK|v{1σϋΑ€&{ͺZΒoS­v >Fy4†°ζαΆνάΊ‘WŒ@φkŒΨά‡±ƒςρhΑFφ’Œ΅ά‡b΅ΠξΦΦΖΖ;ξΓ|MWσNz’Ηq!2Ρ±Q΅Μ;x>₯υ τ΄ƒωTΗ+‘NTϊζZξcbp5­ά;½Ό2WΩGαŒ³σΞ΄Έ1Ά[z•m'‡=©―iΛk§ΫW•σ™`ϋdͺi–ϋxœh]K«»ό‘}v¨(β`²C-ΡύΖj2αν©έL,₯ͺ5Ν扬Φ +QWӚŽγβΝL‡ƒ8œN¦«;XΙ'ξ\0ν`ϋρΩQ“IΫΊΫΟΗΖT’2l«ι8=U-Ω­3Q«νMΪͺDv&¦Š΄.‚Ι Al§0Ÿ΄€΄ΞMqΛͺεŽυΛK[+M μδ.Žmnˆ{κε5q']>cάο‹[Χj‡γC­Zοԝ}8;Φ͚½²—£έ²½ΩkάβΆ\ΆΧΑ5{cϊ›O[.Ϋλΰš½¦Ž¦e{ǜ[³WΒέzΩ^Χμ•eΣΝ»6Χμ5έ­)οƚ½ςΙV»e{\³W–M»e{\³WΖ΄vΛφ:Έf―Œiν–νupΝ^cΛe{«KςηλFy$ΟιρΛhPWφŒ?»Ά;ͺ_Θ‘©[£Ζ#–₯“7ZΘGŠηSFΤΊ»Έ₯Ηqs*‹EI‘ΓΊΕ=βΈόvΤΏ‘>Μ,L<Σ±TŸ€Lh ΄η,ς%$ΥήΎ‘XυmΞω₯dλΧVδWS•‘ςέR•L₯’Σ9-θ ηž¬ŒΥ˜ΤNdXDθ§΄#–)ΊΡ/pyΒx|*έΚΓΠ₯„yΠGωυ½ο°!œ™ž„NgΈ<3Vλ;Τ’Άώ uiBvB¦Œΐ½ΌV}"{5etΦj;―…³ £.ΝΚ‡€r(‹|ΊΉΈχΤόTόψ¬ψΡ­έγ“m“όζάξσ—{k[ΏΫ=ŒJΗυRβΏt</–γ™|^ώ/ΟΛmΗN ―Ÿμ^?ά=:Š―ξμοΔΧφδΞΚ™ι›ΙΩΓγ…—;Η/χχΆŸΤ~ΆqeνΞκB|2^ύΛMύ/ΟΗ‡ΕA¦6Ε‰ F΄G²›ςΠ7c§RρYωΟΖo΄οΖNh?_Œj_]“θG*Άϊόξ’ψκ•ψΩoβιTόJόΑ£Tόi,ίΈ;UΞ&rι\9ŸΙες™|&Ogs‰R.›)‹ωB6•Ž‹[ςt!Hε2Yc«\<•2…R1ŸζβoδF™D)Ÿͺl”ει|:U*Šύ—Sβ― +ΉD1W,›Άχξω‚܍Ψy^\ΰB>!>9ml!~Λ$rΩtQlQΘεΛεΈπ·΄8ζL!Ÿ’G‡Ο—ιLΆ,>Bl'φ©Ψ¨œOηΕF)QPω‚ψ |¦²I!ž.‹£-ε +βχٌψ¬x^JΊ˜5ΆHΛ-R‰R1›[”²™‚Ψ"›Θ—•}d +Ϊ±€Ε9ζΔaWN)[Lˆ ‘ͺl”ΥŽ%I”S¦+“-$ +ΕBΊ²Q1žN§…RΊXΫBœRͺ\9šLFΫ"]T6žK%ΔK΅}ˆ£Gœ+g*{I‹+žM‹Γ)ˆ-JΉrΊX”G#6G―|”άHžΨW±$ώΝ—γεt"—)T&―Υ‰|$J²XΘσ₯xηZ#Žfn[ΦΠα;{{[owŸΖŸn=})”J#Zέ,§LMJwξΉ¨‰Tβꀊ’fε‹±σT:£Ÿ΅‘˜*€2Ήb|’ωoJ₯†³“*sΩRF\”B9ίxΫψYbηρRΊTLdsιRΎœ3mγΓωψD)O%2Ε\.“Nε³…\|n§g6ηΦ™eτ–_ΈΟΙ— ΩLY;―g2ΖΜΝ΅ sΓ.Δ“ϋ»‡[ςΗρδɞόίττH9ή­}£wΪ}F*ž\UK‹šρύ·ϋ'{OγG/ΆvγoΕ'4…P#\ŠŠ\5Ί˜Χ œK•DEΞ'΄x•Οη²ΩB5όΙHal•Σ"[±T*—e,ζςzψQ©˜©l$C—Œ9"’ˆ2εB^ nιb*oΪB\ΛBFμ&›Nzψ+¦ΚEΣΩD6[J‰-ς’W’Ÿ˜’Q‹6-bW<_N€²©LY„γΌ¨Fe=ϊεΩ’ˆK’ΑΣeώΚ…tήΨFœ•άK6U­Ό(>'§…?Q¬c‹¬ά"Θˆλ ‚GNΆtΉEN„ac‹\ΊώD`Ξ,ΓVͺPΚVφR£Ÿψ¨LυΒΘκš/er΅ύ€Σ"H₯rΩκβ„ωκ‘τθ˜.Φ.\NZΎœ;ΦΚιΌ±aZXK³βΪ²…Œ~,b£|VΔΩκυ͊ς'!J[Vj-τ‰HY9Y$’>δDU[δS%ΉEΗcϊ +ιήB_S„(΅i΄ug)xΉ(ͺCAό6#Jέ*τ Ήœψ¬L)oγ£dάΛ•Ε²ΈξiYν‹jqΟ‘Σ²ˆ{=VZkπ’ηΔΗΙ 'Μ°Χv7ΖοΛρα‘ψΖέ¦Ός€–Q¦ŒR¦ŽZ’ΌτςΝξ€9aΎΉut,3f±+±ρrμTraχΧ/wvo.ΟΕ7ΖN=ˆ cΜιZ4ΨΌ0I=Wmϊ©(6‘qdŠ"ΏΜ {Ρ± Ά ^δŠ—ββ2ΗMQ&Ί/ή΅όΓΚξ+/Ε³²έ΅‹‘‹k{—7Ϊ‰/loMŠ=—„CΔNm¬žϊ¨ρ£6x}\ΰνB}Wx} „#1Gπ?}ψx€π6ΰ[ΰυ…^Ηu;x}Ν‚ŠΧρΫ1ΌΎ~Ηλ8ν:^_`Ώΰu<φ ―/<@Ώρ:ξϊ― ΐ-ΌŽ―Nς»ο/δΰΞ½.(p0*zKsΐο¨ή?Τλθ‚ήƒž°σ]ς―K ŽDZŸΰ`ΐwΓΌ.jˆ:N[?πΫό—Κφa{] B8r½ΕΫ€€q0δzΞoσ_EφNΠλΚΑΖшλ1ž‡qO\ΰG¨α\ΈυΟ#Ά―ŒΐλšΎΓшλ1ΏωΟ)Ω»J^Χ8πGƒ—xύ {—Ξλ:}ΒΡ λ1ΏωOšeοbz]1ΐyΈγyh –μ]d―+,ΨΗшλ1ž‡ΠΘή•χΊ€*Ž]/ωυϊsδ†μ‡ΧυZΰlΤυΟcc€d―ŒΌο‘Ζِλ-žΗ@d―ΰΌnQΑِλ-ž‡;ΤRφJΣλ–Bœ Ήήςλψη(@²WΚ^·€`γlΤυΟ#κ]φŠήλ6œΊήrς…Oφ*ƒΧ ΐ8r½ΕσΠ„ϊ){•Δλΰ%Ξ†\oρ<!Οe―ζxέ +ϊ‡³QΧC<6ȟ²WΌn—ΰlΤυΟc +μΥ1―Ϋ+@O8r½εδ?όB½Θ^ΕσΊ¨βlΘυΟΓ +₯lWH―7@#Ζ[Ορ<2 HΙ^-υΊΕCΤq6κzˆη!{UΧλΒΩ¨λ-ž·w„še»>{ „8o=ηθ?όBA‘½Jξuΐ€ΐγlΤυΟ›0B=Κ^Νχ:„@ q6όφŸ£g…OΆ[„ΧƒƒqΈŸύϋ?E("²ΧFΌ-ΰwœΙβyDΘ[Ωk8^Ηπ/Ξ†hg9όχŠj–½εu°ίαlΔξΟ›B’½VζuΘαl οŠΓχ§‘^d―ιyuΐG8Υ­ρΌ½ JΩk^ΗπΞy3ž· „’#{ΤλπήCΐG(Βΐ|„Β$ŒΊB½’Όϋw‚ςΏpθ +β?B!.κ(YΐΏύ„P°„€"Δ„B)\Tΐ +«pPΑΊ>όΫ?AWt @(ΔΒΐλšΰyFυ(\¬Α +½0°ΐΚώί?A…@ΈX€ zαΠλ:ΰyΥE9%ŒZ‚ αΠ\‘ˆ€–ΰEG4c]ϊ{ζOB‘.ΝΰEGΈ4ΣΙ~ +“0h cι{^iB +€p„"%{.€„\‘¨ 3‹ώνΏω=B(LΒΐŒJιΏύΧΏG…Fφ\#+ΈB.fp„’&\ΜΰEMφ\#+*Eζ_!&αPEΙώΥοBa.Up„’)Œtp„’)\ͺ`EPΈTQ)ϊWκw‘ #\‘h +\‘h +€*JFπό!2a ƒ Mα £ζΏE…LΈθΰEVθ`ESΈθΰESΈθΰEVόAΝ^ώΛί"„Β'\t0„’)\tp„"+Œώ€ aαπUψ B(|Β@G₯ά_όΛί „Β'Œώ€ aαπEψΏƒ +Ÿpψ.€P΄…ΐ0„",\ώ€ aαπ\‘h #5ψ5B(”ΒΰB–=ΐB†’ ό‹_#„B)\p„’,\TJόΩΏψ5B(”²ηAΘΐвpP)qΟ+*BΘ%α δόΧ‘Pʞ `a@(βΒ cqοώσ„PX… €J‰{^QBξ #ˆ8ΈB.qp„".\ βΰ!Œ β¨χΞu‚ +«pˆƒ qα@aQ@α#@(βΒ".€Β’ .€Β’Œ’ ό³„Pˆ… DŒ!„D\!„ D\!„ D\!΄ƒD•²ήώg'‘ ˆ2ΈBˆ2J.πOBαFYp„Π6.m0„.eTΚϊΙ?=B…[AdΑBOpƒ „žΰΡ#@=Α"Œ’ όŸG‘p ˆ,j.pˆ +·μΉFp„.\ ²`‘'Έ@„ΑBOθŠ0ΈBH.MTJyσ8D…^Έ@dΑB›v]#ΈBH.Mp„.\ š¨Ήΐ;„P„DŒ!€ ˆ&J.πOή!„B/\ šΰ‘ͺ0‚‚ „ͺΒ’ F€… D\!TFATŠψΡ?y‡Š‚p‚ „ͺΒ’‰’όγ„P„D\!T.Ap„PUΈ@Q)β‡ψ!a#@U… D\!T.A”\ΰ?@EDAΤΐBfα#@U… D\!dF5p„YΈ@ΤΐBfα#@™…D •ς½B.5p„Yφ\#.ΈB¨AΈ@ΤΐBfαQ@™eΟ0‚ΰ’RΈh!α‘@5ˆJFπΏν!„""{.€\!Τ \ Rΰ‘α‘@5 #ˆB¨AΈ@€PrΈ‡ŠŽpH „š…D5x‹Š”pH „„ D +•Β]‡oB‘Fp„P³pθ€ „š… D +%#ψ_ί"„"%Œ :ΰ‘fαΡ@5 ˆΈB¨₯0‚θ foB‘.p„P³pθ€ „Z +#ˆJ.πή „’&\ :`‘fαΡA₯dοόƒ7‘¨ #ˆΈB¨₯pˆ€ „Z +ˆjFπ +!5a@΅.”\ΰοΏBEMΈ@DΐBν„D\!ΤRΈ@DP)VΟk#B¨²ηAΰΐBν„ D•2½υχ_!„"(\ "ΰ‘–²ηAΰP)Σ[Λ+„P… D\!ΤNΈ@ΐBνdΟ0‚` „,„ DŒ!ΤNΈ@PrΏχ +!Ma‘@Y=ΈBΘBΈ@P)ΣοB(šΒB.€².zΤ\ΰ%B(šΒB.€²Fz”ŒΰοΎDESΈ@θΑBΒBJ^ϋ»/B‘Fnp„΅pΠƒ „,„ „\!d-Œ άΰ!kααFΙώΞ „Pd… „Œ!d-Œ άΰ!kαα@Y 7ΈB¨£0‚p£RšWώΞ „Pd… „\!d-\ ά(Ήΐό!ea!@u.n0„΅ppƒ „: +#1ΈB¨£pƒ „:ʞ `AAΙώφ „P”… „\!ΤQΈ@ˆQ)ΚΛϋB(Κ²ηA ΐB*ΒBŒšD‘v²ηP2‚ς!B΅.hp„PΒ .€κQφ\#π ΈB¨wα#@υ(\ Πΰ‘eΟ0Ÿ δΕC„².\Τ\ΰ>BY4B¨waΑ@υ.\ Έΰ‘ή… \!δˆ0‚ΰ’dε>BY.ΈB¨wαΑE₯€ςε>BY #(ΈBΘαΑEΝ6BΘBΈ@pΑBŽ(ΈBΘαEΙώr!„¬eΓ0Ÿ€ „z.\p„PοΒ‚ .€κ]Έ@pΑB½ 4B¨Gα@υ(\ Π(Ήΐ_l „P;α@υ(\ θ`!Ϋ²gΈ€―ΐBΆ… „•ςΚόΕB5ΘΆΰΎ@ΩP/€ ψ Œ!Τ­p0‘δΎŽBB=Ζ,ΐ‡ΰ!EυnΈ€ΑBεHόΗ| F€j)ƒ?.ΰgp„.7Β>ΰ”\ΰΟΦBα“ΫaΏ―£΄F₯μ<―«!Gδvœ·ΖλhmQ)>Οk/BȞ܎νŠxηΐ +•τΌ&#„εv<·‡Χq¬P)AΟ+6B¨άΰ½γuƒ¨’ηυ!T•ΫAΫYΌŽp „JQz^σЬάΤβux%TŠ2σ§λ‘ΎΙνΰάΌŽm ŠJizή( +·άΘύΗλΐ] R ž·„B&·ƒ°·xΥ kTŠΥσVƒP εvΰυ^Η3°ƒJΙzވ +œάŽ·~ΓλHφQ)ίğ#„¬εv˜υ3^‡1θ •"φΌ}!δCΉZΧ œA₯¬r‘ˆΛνˆ,ΌŽ[ΰ$*%ξyDΘΉK‡Χα +\A₯θ=oŒυGnGΡ€βu”wQ©ž·M„\’Ϋρ3Έx™ ―t¬ž7U„œRβg@ρ:—¨ΤΟ/Bφδvπ .^π*Ζ󢌐ΊάŽŸΑΕλ`>E₯ςxή²ΫΑ3Έx] 0t¬Kž7s„ΜκCό (^Η**΅Λ󆏒,·ƒgpρ:x@HP©lžΗ5Ή?ŠΧΡΒ‰Jέσ<& ΠΛνψ\ΌŽ~Tκ‘η!…OnΟΰβuH€(’R3=(θr;x―€š όώB]Ινΰ\Όnρ¨ΤΫΡίίA¨£άŽŸΑΕλV`…Jφ<Ό Κνΰ\ΌnΦέ‘R«G !·ƒgpρΊτ„J%χ<ώ Oδvπ .^·Z'Q©σ£Ώ»…""·γgpρΊ₯Έ…Jύχ<4!χδvπ .^7M€ώ‘"<VΘ)Ή<ƒ‹Χ ΐ3Tˆη± Ω–ΫΑ3Έxέςό‚J{ρ<”‘δvό (^75Ÿ’|<kΘZnΗΟΰβuσ*­Ισ@‡Μr;x―@ Qi\£Ώ½…<”ΫΑ3ΈxέzΒ€J[σ< FMnΟΰβus!*MΟσ¨Ή?ƒ‹ΧM ό¨΄DΟƒdψδvπ .^7€Θ‘0=™!ΫΑ3Έxέ’ŽJ;υ<„QnΟΰβu•€:Tš­η5(r;~―λ8t@₯!ώζj–Ϋρ3Έx]©  T΅ηρΦ'r;x―k1ΨG₯{~ ϋ~Γλj Ž‘δΟύζFDδvπ .^ΧSp• ΰy|&ςχ―+&τ •€ΰy¬&μχ―k"xƒbˆ8χλ•«‘3Πx]υΐ(F Οƒ9aΏwΌkΰScˆηαΘo―+υβy΄'μwΔλΪΑC=Βφ}ˆΧΥΒ@Wa‡°ο-^W!έ’sΏΎζ†άˆ™!ΐλΪαΗFh:wr­w90CƒΧ5"‡½`EΨw +―Λ’NοqŒ°ί^8@^Επγu tΐλ0BΌ.R€ξπ:j―  'Ό’ΑΓλp―ΓͺίρΊ|άΕλ(λ;Ό.€~γuάυ―KΐcΌΓύΖλλ ΰ;ΌΜξβυΥ^‡j'ρϊZ―ƒwOx}ρΒ€Χ±Ό ΌΎT‘Ελί―― +@„π:δKΌΎQ‡Θ„}Π!μ€>ψ–€™χ Ό>θ3ο΅ΖλΓ‚>PWβ?A-=-Kώ*˜«ΧG +ΣͺΥλΕώ•j@–ESΙW‘ίύD―ԁΠ©θe™Lπσ*βY ~R­^ŸΨC₯Υλ%‹_όβΤ©Sοœ:υ‹_ό\«Z  +Ά'υΝ^+{­δ?ψ ‹}h‹}πΑϋ§D%0Υ―O Τθhφ\Χ썒πÏ>ϊψγ?ωTη“O>ώθ£cΌ/λΐOJ]ύ©j«EΙ'Ÿ~φΩηŸ‘/Σϊε—_|ρωgŸŠZP©?‘ +ψš.ΝΎVτi­ΎVτ&ΎώκΛ/>TցSΏ  +ψ₯»;³ΩP‹ψ²θ?ϋό‹ζ²―πέ7_})κΐ‡1¨~£«<―Αμ;}…_ύςΫ―EψΘ\Ό>qpΞμUuΰ«/Dψΐ¨/±]τfί‘ψχί}ύΕgFψ#ͺ€7τšη)Eόvœώα—_)ͺΐϋ"ΔϊMם:έδyŠœ;σΓ/ΏU@δ?ΓϊF/:N}…!QΎώB€ƒ§€\¦Ώy^7Uΰ‘ +h>@p 7:uœaLTοΎϊ\ψAΐ\νΤq‚δθΉΣΏϊφΛO?ͺ―/YXθK§ŽLŒœψεןς‘°žρ£Ω[‘>σΓ·_~&ƒΐO =αI§NΟδ’cηΎA V ^_Ηβi§NΟd&†02rΑ.ρC§NΟδR"ˆLΰcΩ'€ (β§N^)Š pFή|ˆ (΄ψΘλ« +κ'Βd w|μυΕ ΄= wΤ'  5ΰύy μΑ³j ψΤλk‚gΥ[j€#Ο*5ΰ£ΟΌΎv!!pK θ5@ά ~φ•ΧΧ.Ξj1€ΰ[Q¦’ ~τι—^_»4¨έ Pœ!h6`ͺίz}νΒAΠV”©φ ~ς5ΐ‚Ά’Œώ\ΰTμγ/Ύρϊ…„ ­(£έ Θ'CŸνυ₯ A[Q¦RΔνΰ/½Ύv!!`+ΚΤΊ…ΏόΞλKΆ”@να © SkE™χͺ©ΰ瀂°ej‰ΐΧ$Ξ@0ž ‘8D°V”‘WΠy‚΅’LuΒ}BްeL}B$¬eHœ'X+ʐ8O°V”!p`­(C"ΰ<ΑZQ†Dΐy‚΅’ ‰€ jEΦpAη Φδ!Ԋ2$.( pΪ‰€³j)  8J l€Dΐ ‚g$Ξ8 p˜Ϊ‰€³i)ΣbΗž θ‰ΐχ^_ΈΠ¨e˜@κ΄G ’ ΈA V”1V™±’„“iE7Š2¦D€>!ΗŠ2•ΐ’bŽ€ej+I8G– p…­(Γ’R eXRΚd,)εZQ†%₯\!@+Κ£Dήθ3 Њ2΅>!' Ί2 u‡­(ΓpQWЊ2 u‡ΰ¬(Γ(wΊ2$ξ eHά!8+ʐΈCp† ’ΈCp&‘ΈDpV”!p‡`Ω‰€σΝH'0K ΈDΐl€Dΐq‚e$.0 pœΐΨ‰€KΜHœ'0K ΈDΐl€Dΐq³’ ‰€[ΛHœ'P6@"ΰYQ†Dΐ-‚²’ ‰€[fE—̊2$n”eHά"(K ΈFPV”!p‹ ¬(C"ΰΑ²Ȋ2$”eHά"(+ʐΈF@V”!p€¬(C"ΰAYQ†Dΐ5²’ ‰€kdEΧȊ2$ξeH\# ΓI\# “‡Hά#+ʐΈGl€Dΐ d$ξŒ₯Hά#6@"ΰA²WΖRχ’ ΈA0– p‘Ω‰€+ΗHά!K ΈH – p‘`,%@"ΰΑXJ€DΐE±”‰€‹b)‰€›b) ΔR$.  p‡ ,%@"ΰ&XJ€DΐE±”‰€›a)7 ΒR$nˆ₯Hά$K ΈI– p“ ,%@"ΰ*AXJ€DΐM‚0\DΐM‚0yˆDΐU°”‰€«ΖH\"(6@"ΰXJ€DΐU`F 8ϋ„Dΐcz"π½ΧΧ+„Δd ‰© σΗHά!6@"ΰ.XJΰ½k6‰€ΧW+ŒΔH\#+ʘϊ„\ΐ6P©" t Ψΐό“ŸΚ‡C$n€eHάΕ+Κθ‡HάΒ+ΚTSAWπŠ2οΥϊ„άΐ+ΚΤF‰Έ—0F‰ΌΡg$ΰϋej}B$ΰϋe.κ2±†‹Ί‡οW”aΈ¨Λψ~EF‰ΈŒοW”!pί―(C"ΰ2Ύ_Q†Dΐe|Ώ’ ‰€Ϋψ}E·ρύŠ2$.γϋeHάΖο+ʐΈί‡ ’Έο'‘ΈίW”!p›`Ψ‰€{ψέH\ΗοK ΈMl€DΐM‚a$.βs p@Ψ‰€‹ΑH\ΕηK ΈŽΟm€DΐuόΎ’ ‰€λΐH\%6@"ΰ">_Q†Dΐ}|Ύ’ ‰€λψ|EΧρωŠ2$ξγοeHάΗηK ΈΏW”!p―(C"ΰ>ώΆ>ΰοeHάΗί+ʐΈΏW”!θΎ^Q†D ψ{EχρχŠ2$}ΐΧ+ʐτ_―(C"Πό½’ ‰@πυŠ2$}ΐΧΓIϊ€―'‘τ_―(C"Π|o$. p?/%@"Πόo$ξβ{ pΫ‰€»ψΩHϊm€DΐeόΌ”‰@?𿠐Έ‹ŸW”!θ Ύ·—ρ» ΈŸW”!θ >^Q†D /ψyE~ΰηeHϊ‚W”!θ >^J€D ?ψxEΎΰγeHϊ‚οm€Dΐmό»’ ‰@πρŠ2$}ΑΗ+ʐτ(C"Πό»’ ‰@πρŠ2$ύΑΏ+ʐτ(C"Πό»’ ‰@ŸποŠ2$ύΑΏΓIϊƒ'‘τ ί(cΤ€S±OH\Εη6 'ί{}•ΒŒΏm@Φ‘ +Ί‰o— θΎ΅>αcψ±f1‘x}‘―m€D ψέd"@Ÿ›ψΦ*5@$€‚βΫ₯D"π“ŸΚ‡C$ξβk θΎ]QF8D"ΰ>~΅j*H"ΰ2~΅χj‰}BβΫej‰£DάΕ―+Κ£Dήθ3wρλŠ2΅>!wρλŠ2 ν~]Q†α’ύΒ―K 0\΄oψtEF‰τ Ÿ(C"Π7|m$ύΐ§+ʐτ Ÿ(C"Π7|Ί’ ‰@πιŠ2$}Γ§+ʐτ Ÿ(C"Π?όΉ’ ‰@πιŠ2$}Γ§+ʐτ(C"Π?ό9\D ψtς‰@πηŠ2$ύΓΟ6@"Πόi$}ğK τΪ‰@𳠐τ_Ϊ‰@ρ± τΪ‰@ŸπεR$}Δ—6@"ΠGόΉ’ ‰@ρ­ τ Ϋ‰@_πεŠ2$ύΔ—+ʐτ_(C"ΠG|Ή’ ‰@?ργŠ2$ύΔ—K τ?(C"ΠOόΈ’ ‰@?ρ£ τ•Ίeόd$}B.%pϊϋo|g$ύ’œMϊΤHϊDƒ ψαΩ‰@_1έ ψζΩ‰@?Ρξ*ΟόTHϊ…ώl@)D"IτΕ$ΎςӐaΎ’ίϊkζ‰@?© ψ„ˆ’―1kτψ¨τ m˜ˆΎΚ°Οj‰@˜,€ΖτBώι$θ'ηε:ΣΖP1Ձώ Υ€Φ>1™―Έ€οj‰@_0ζ|ω©Ÿςώ1εΗ»A>rAέ„Οf’τιIΣ bίΥΧ™ΉPΚΚ4ΰ—_}ΖK‡"ΙT9Ÿ—&P}Υ€―j‰€ΛΜNO3‰Ρ³ςMŸψh  „D ̈ +MŽ ΙπΩGψg”˜„Dΐuf/N‰ +όAΎ2—™εΎTΘ$Eψώ™Tξ|UH\`a^τ…ΙR!—NŒΙ + <ΰ㘠>2WXX˜›™™žΊ0Y.²ιδψθΉ3ροΏύJx€Έ!ΐw5€Dΐ)eӟΉ(J|ΉT,δ2²ό‡ΟžώA«šόΤW&@"ΰ ΅ΒŸΤJ?›I%'ΖDωŸψΥwί|©W€Ÿω­8‚QψΣSzαηsΩt*™ΕnP”/Ώύκ‹Ο>ώπ‘ό±~#ΰ³@"ΠZαΛ¦_-όŒ(ύ Qϊ#C²ψευ—Ÿ**€ˆ’ψ,τ€Μψβ~₯π‡‡Ξž9-‹»o΄ς(φΎ?+‰€=›M_Ζύ‰qYψηŒ^+ώ/΄ς`Tց.hWψ²ιλ…Aώ·ί|ύ•(ώΟ>©•OόXHΊ‘9γΛ4ώ―L₯©(ώςΧneωϋ¬(R5ύζŒOΖύΖΒ―”Ύ(ώS•ςχg θLkΣ―~ΥτυΒ7šΎ^ϊZρ‹ψ―—Ώ?+‰€%jŸ(ύ―ΈιΗ’ι‹Θ/ΪΎ(}Yό>/Ά΄ξζioϊzάΧ +_4ύjιΛβ―”Ώ/+@₯œŠ}B"PΑΚτΫ~5ξk…o”ΎQό>.Υ%ί{}ι½§£ι·Κψ΄Β7βώΟΝ…―•Ύ^όΎ-Z ‰@ΔSAΕnsΖχq­πΈί²τ}\ό?"ΠP6ύζŒού…οσ≀ųυŒ―‘πƒSϊούX³˜HΌ.>cωlΗτ›2Ύ6ύ‘LTŸν΄1}sΖθΒΧ0%ΡθRyΆcΫτƒVϊ’J ‰@θSΑnŸν¨˜~  _G$?ω©|8κDΐΦ³Άέ<ΜψΪϊDΐΞ³Πš~+τ‡C!MzxΆό;}Uͺ©`ΘGžν„Οτ[π^-KŸ­nžˆ˜~+j‰@F‰Ψοζ‰ˆι·Β%ςώGŸ;θ±›'"¦ίŠZŸPpΊyz!ΰΓEέθζ‰FΣ―Ψα’vσD,ξ7Δα’tσ8IΠF‰ΈΪΝΉ—( ›Η‘8;„7š_[όž88„Σo‰ŸΊyϊOW‡πRϊuψ.`oŸρS"ΐ^/πI"ΐ^ΟπA"ΐ³oρ4`―π*`―_π`ŒΟv|E-θΛ`A†πϊΎΝΰَO©tqΦCxύŒΛ³Βλ{ήsmϊ Cx‚)pΞθζ Nί2„7h˜ξ{]WŽ!Όδ=cA‘zš:D7O€©Ξ"δ‹ol†πœͺ Θ\π[…O7O ©Ψ€Μ» α ΥΕ%?–AΰLηΒgoΘ¨OΎψϊ—gUβ>έβ‹/5ΎΠ<Σ7FΠΒΐ/N‰:παGςΙ§ŸHΟΗτÎV€θuΰ} D5Π‰ιaΣ7οUΓ€¨’ό┨:²μ1ύπσž΄: *ΑΟ~^εg<Ϋ‰Υ: +¬~ŠιG„χŒ: +ΑύΔΔQψQα½j%Π«A­θ1ύ¨P-ζΧxΒο΅Δ룂~CΡ@Θ9{vqοιΒΦρVμΤΖJμΤΩΩΥό¦ψΙΝ­£γέΓΨ©«βG›ΙΩΓγ…—;Η/χχΆŸ”?K%2Ή”F9ΟgŠΉxςζξΦ›ψ°ώ—qρ'ρk‡/ŸΏά?Ό΅³υfw$>.πΌό'vκNΫΗ“«{ΗραΩΥt*Ύ³φ`dοiόθΕΦΑnόνώΣ†έ€βιxJϋoγwς;ρ§±S…ψπH|γΎ»Ω]ωΡωo:%Ž;ŸœΛε3ωl<Λ'JΩrΉTΜKωT:ώVΫ¬PLdKb}³\\œb’PΚεJΕL¦\J•βoτΝΚ‰t)Ÿ­Ϋ¬œ+i›eΣΩr<]L'RεŒy‹\’”ΛΔω”ψXm‹Bέ峉L:/Ž(SΈ‰οȏʈO‰ύδΚb_ιT9^LΙ#,–SβΈ‹ι\A?"ΉYQμLl–Ν•JρB)‘dl%¨\NŠβΛΩ‚(9±E!‘Λ₯ΣΖ™΄Ψ’˜›ζΚΉt*'Yl‘‡RΩ’¬P:“KdR₯Κ%ΚΔσ©DΎTJΧ6Σ/Q&“Hεͺ@Ϋ,ΝV6Λ‰ .'Δ₯NΥΆH'ΔυHUŽ9­m‘Νd‹΅-²‰B.W9’\^?"qάΉ|1]Ω*#Κ6#Š'—)σΕ”ψύˆΔfβtͺ›Ι*M”ΣΕ¬Ψ,SLγεR"#ΞΛΨ ]ΦκH>Ÿδδ;ξX‹΄ΪkWΕ‡/\ˆ'χv·δγΙ“=ωΏιι‘xςΞήΛQΙoΎά{.ΑΣύνέ«ϋΗ»³Ηβ'Ϋ'Η Υ_ΦοαΩ=ρΧ…\&]©σ£m—ψΩαVε(fWγ³'Ηϋq½ΕΎό½Ψwψ`ύ3ŒΟߜ]-o^Ϋ>Ϊ=όυξΣΝΛ»ΏΫΤ·:2Ž%iώ”xRξΝݝύΓ§»OϊύΖ•΅;« 7—Δ―‡Ε7« ›™Ν‘Έ8Ύ[λΛqγW⸌γ٘jnψ©ψ5­:Ζ7nˆ}sΫzΥΎ³··υVΤκη‡[O_ξ +“+§F4ο*KӍ¬ςοάsέeSuΔgζ™LF”e&+Ξ]ώ (J²-J₯r!SŒO4ώ‘8•|ΓΉΚBJ₯SbYqύ²…ψΖΫζΛ§2qQΉ„¨›Ή\NT“bΖΖΗ₯sρ‰’ΌΈ…bJ쀐/ζ²ρΉΎžήœ{§'kŽhξEY·³Ρ EMΡΟξ™xζζϊαzΜί“κqQf`΅ xή9+?›]έ›.½|# @έH‹Θ/φsλψwov7k‡ol¦˜ͺ%›\¨ιν#όβowwN΄ΛΣηΕoσν>B?ώΈΌϊΩΕŸ=Ϋ•'X±ΈκίVOvuοθxkoGœ¨H‡7Ε!\Ω:huAͺ‡Tυ%’nςeݐ€ifԘΉ^_½?ϋ¨ƒρ+ρRρ§1έ―dœ)³i•RŽEœ)$ŠΉB¦œΟςω‚ζV«J)υ€ΕωrͺXM‘P*h^%ͺ ~T·Q)ŸΣ6J SΠ|H4ΩΚFεαOl‘-₯ς©D(―MVσ2ίΕш=g2%υ€εrqP…tΆ(όMμV˜Gͺ\G\?”G“I₯Ε–ΔFy +εΈ8ΊlJ„y}#α9šέ•Ε© ™Œ8πΈ4δ\1gl‘Ν ›* #],3"ΚH›ޘ7Ά§(ŽFšT!›ͺ\i-ΒΦr΅mδ₯•+TO\n“’ξg°8͌ˆφςP*ˆνΣΒ 4ΟV7Θ »HUŽ€ D˜NI\}c q>2. +‹Λ—EφP,§5o ,]έH\ρœHDp₯sι¬t&aξ•Hε΄ϊ Ψ‘ίΪ^a2l₯u―ρtΩ~Γj{‘xΟ°•ΦΎώϊ蝽‡Ϋφπ†Λ¬#| ΡoΨ^UŽ2l±΅ŽνϊΖι71l―3ϋ [l­c»zOΫλ`<¬΄.`»κ€[τ›EΆ%€†-ΆΦ±]]ΐϊM-Ϋ+ΰ° [l­c»€Ητ›rΆW0€.Γ[λΨ.ύζ‘νe ° Γ[λΨ ύ&§ν΅±3l±΅ΞW_hΛ~“Φv €XΆΨZΗϊzG\³ίLΆ] @†-ΆΦωκ«―έ·ίτΆ]- †-Ήv±Ύ{ΫoΞΫΰΓV][|ύ‚νr>1l ΫK` z/Ϋu\gΐjlΫ«ΐ&ύVνξ2l}Ϋ« ΐ9ϊ-%Ϋee؊}l/,?θ½ΔlpŽ ψFΨ^C~ΣoέΩ7ΰΓ–τ}°½V€ίb΄]uΐ†-ςKώώΥWˆ8‚½©νΪφ‘Ϊ# ύΨΈΪύ+DtM"z@ΩG FR6B―ψ€°Τ€ @κ?@x  υ <ˆΠ„ϊDθ°|°=‹ ?€Θ>3αΛΏύ•€!C΅_ρ°4°>ρ°Dΐ—GD―%`¨ˆaΫ/HH ƒ—€½Ψ| ώCΐ^ΑΣ/H b€€]!b€€]ΩόνΛ/1 Ix”'€υy‹ˆƒHΐ£ˆ‘Hΐ£ˆρH +ΐGΐίΎDΔ0$`  `}ή"β °€•€t!£’€5τRB _CD]ˆ€¨  ‹ΞθυoCΔ0μ€@¨hŽΎυy‹ˆCI@"1*‰θB FeΏ BE+ώϊ7D F"–hŽΎυI‹ˆCI@"16IXB Ζ&KˆΔΨ$ ‹^ +@8°DgθςΧΏ"b0°„@ŒM"–hŽΎυI‹ˆJ +ΐ"16‰XB ΖfΏ ‚D+ώςWD I"Z4‡ήϊŒEΔ%` €›ύ"€"1B‰h!#”€Ν‘σ_ώ‚ˆΑΨ/H !#”€"1B‰h!㔀R1B‰h!#”€­ψσ_10Iψ†@ŒU"ZHΔ% …@ŒSRΎ!c•€o΄¦ˆ?ύω/ˆ’ύ"€½ψ3"&ίˆ±Jΐ7Db¬φ‹R 04έϊtEΔΑ%ΰ.c•€o4#ΰOFΔΐμ€@`ˆΡJ€ζ [Ÿ«ˆ8ΈD|Γ…bΔ’ 3βόӟ1<‰ £•€oHĈ%@/ώ„ˆαI€­Dˆ1K +)€­DhEΐ„ˆαΩ/H c–ˆΝ·>QΡ„DθŒψώψ'D Ο~@ +„€³D@δˆ1KDŽζˆ[Ÿ¨ˆhΒ~@ +„„^όƒ”ˆ"1f‰€Θ!#—ˆΝαΆ>KѐD@δhEΐώˆˆAJD€Ή€@Μˆ‘KDŽΞpώDΔ %"‡@Œ\R fˆΔΘ%b†@Œά~@ +)€ΉD@ΜθEΐ1T‰€˜!#·_a 9ΦΦg)"š“ˆ­ψύ1T‰€˜!#·_a 3Π_όώˆ°D@΄hŽ΅υ)Šˆζ$b†@DR ZˆD$’…@D" Z4ΗΪϊED£’ΡB "-zπ{D X" ZˆDό‚ˆ­ψβχˆ°D@΄θ τη_όΆ_@ βη\Δ +€ˆŸC + bΏ €@ΔΟΉˆ"?'bEs ­ΟOD4jΏ €@ΔΟΉˆ½ψΓ–ˆ"[IΡεί}ώ"†-'D"ώŽˆ"[I!±•ˆΝQΆ>9Ρ΄D@œˆΨJ +D€ˆ­D@„ˆΨΪ/Hί!±•ˆ"[‰€Ρ‹€Ο1xϋE)ΰ5:γϋ~χ9"Ζ !€"ΆB bkΏ Ό†@Δ₯D@lh±υ™‰ˆ#HD€ˆKIΨ q)D".%bCsˆ­ΟLDGR 6ˆD\JΔ€ˆK‰€Ψ ±+)šγk}Z"β8±A β~@ +ψ €ˆ]‰€¨ ±+€".ν€€ΏˆΨ•ˆ +"»Q‘9ΎΦ§%"ŽcΏ ό…@ΔD@TˆΨ•ˆ +"Χ$βAsp­ΟIDM" *ˆDμJD€ˆk’ρ@ βšD@B β£ρ@ + βšD@<ˆΈfΏ |„@ΔG%"Asd­OHDS" ˆD|TR ˆD|T" ˆD|T" 4GΦϊ„DΔ‘%"@ΔG%"@ΔG%"@Δ]%b@sX­ΟFDY" ˆD|Τ~@ +x€ˆ»JΔ€ˆ»JD)€ˆΪ/Hο qW‰€ qW‰€ qWϋE)ΰ€"ξ*D"ξ*D"ξ%)<šcj}*"βψ1@ β1@ β^’ΑC β^Α£9¦Φ§""Ž/D"ξ%)D"κH €ˆ:‘B + ’Ž€@ˆ¨#$D"κH €ˆš’AB + ’ŽD@ˆ¨#$D"jJ +„‡ζ ZŸ{ˆh]" HˆDΤ±_ŽC ’¦D@xˆ¨)šƒh}ξ!’uϋE)ΰ8D"jJ„€ˆšαA ’¦ύ"€pΝ΄>χΡ‰€π QS" <ˆDΤ— "υ%Βƒ@DM‰€π Q_R 0ˆDΤ— "υ%Βƒ@D}Iΐ Q_" 0ˆDΤ·_Ξ’9|Φ'":"D"κK€ˆϊφ‹RΐYˆDάH" $4‡Οϊ¬CDG$ƒ@D}ϋE)ΰ,D"n$D"n$šΓg}Φ!’;’!A βF!A βF!A β¦’!A + βF!A βF!A β¦’Α 9vΦ§"Ί#D"ndΏ ά„@ΔM%‚@ΔM%‚Asμ¬O9DtΗ~@ +Έ €ˆ›J€ˆ›J€ˆ›Ϊ/HΡ8λS’"7•"{H +„€ˆ=$‚@ΔM%‚@Δ’a@ b‰€0 ±‡D@0ˆΨCR ˆDμ!D"φ°_‘9jΦη"Ί&D"φ"{Ψ/HΧ ±ŸD@hŽšυΙ†ˆI„€ˆ=μ€€kˆΨO" ˆDμ'š£f}²!’ƒ@ b?{D)ΰD"φ“"{K)€ˆύ$€@Δ~@ b?{D)ΰD"φ“R{H„€ˆ=$Β€@Δa 9pΦη":% D"ndΏϊOΈ €ˆI„€ˆI„„ζΨYŸuˆθ‚½λ?ΰ,D"κx˜ϊO8 €ˆJύ"χχυŸpΝ΄> q|_ό‰χ!qΝ‘Š?ΰ>D"[σ‰ #ΤhΝοb»ΒΑΑ茣υ‹ˆ‡Ρt©ί Ϋε Fg­O`DάHΣ΅]Ϋ΅ ΄ΠJλσχΧt=ονΪZθ ₯υ鍈kš.ΰ‡Δvaƒ ΠPλMΧν±]Υ`tΤϊδGŒPΣ…ΪΆKl†Ξ˜Z_ ˆ1hΊ8€νz£9²ΦWbx­ΖV°]Ο :#k}±  ι +lΫ• z’3ΈΦΧ’šΊξ`»ŒAtΖΧϊRBτBΣ•ΦAl08,šm}q!:¨Ρκκ>Ά« ƒΞX[_kˆ.hΊ¨ϊ‚ν’C’3βΦ—’-M—SΏ°]`xtΖέϊ2DMΣUΤSl*0…ζ°Ύ0 i΄rzνβ#‘3¬―SΔ‘4]9½Ζv5 θL λΛ±·¦Λ¦οΨ@`Ib}#κkΊfϊŽν’Ξ‘3m¬―kΔ½4]3}ΗvΧΡ™EΦ—9βRΣ5ΣwlWπ Ie}Υc̚™Ύc»„€ίθΜ1λEcΣtΩτΫe‚BgΚY― Ά¦k¦οΨ.2:3Πz‰ΐΐ4]3}ΗvU€ˆΠ™Φ+ϊιšι;ΆΛΔ‹ζ΅^CΠ/Μ°½ξvΠ™±ΦK +:ιšι;ΆW9ΐžθL`λ]ΣtΝτΫΛ@ωl½ΰ uMΧLί±½Žz’9Γ­— Y£3l/\€ΑΠ™πΦ+šΦtΝ Ϋ+ΐ:“ίzBš™Ύc{iŒΞZ°^¬pMΧLί±½, Ή:¬—/μ‘Ρ‚Ά€θ,λΥ u4]3}ΗφRp΅c½Έαš™Ύc{mx€ΞR²^λ°ΥtΝτΫ‹ ΐKt—υꧦk¦οΨ^:! ³Φ¬ΓH4]3}ΗφZ₯g½6†ͺιšΆΧ@ΰθ,Cλ₯2$MΧLί±½ ’CgaZ―œώjΊfϊŽνι;:λΤz!υHΣ5ΣwlΟwXAgΩZ―«.kΊfϊŽν ϋ‘Ή­WZw4Z0ΐφŒ€ΝΠYΧΦ /5ίYlΟ_8:Λάz¦ζ»ƒν C’³κ­—ejΎElΟP0ˆf°^¨©ω£a{Jΐ¨θ”λu›²oΫs¬‘Y%¬—qjώ€Ψžtΰ +šEΓzU§ζΫ³ άE³ŒX―σΤ|}lΟ)πύΒBΝwΫ“|e£RCΝwΫ³‘Gύ‘描νiΑ£"QσMc{R@,τ.SΤό±= ^_Α¨ω=°=μ +Ϋ΅0l3ΐξ؎ab{T΄°],Αφ0τΔvωτΫƒ0 Ά«©Ψ%SΨ―.b{LΖΓvΕ΅ν°†νlΫ§ΐ!l—δ1°}ŽάΕv…Ϋgΐ3l—νCaϋδxνBΎΆO@€Ψ.ν{bϋΔΔ‚νz―°}’†š9Τ|ψζΠq`ϋγΐPκBβŸ"γ±ΫFζ±έ±ύ±ΐ8+γύ­˜‘³λΘ{AwΨώ€0,»ό|Ψίa1 ˜α°χΘΛ€?‘ψΞυΏΤ,` +„€ήΘ?)<΅@ώ»š7u€ΰ+Ϊ#/CώτΣO9rδhΛ‘#O?-³@ζ€”o1Όcγ‘?zτΨ±c[[[Ο΄lm;vτH3žxœ"ΰ½FΎψγΗOœ8yςTΓΙ“'Nf«™Ν`8Ο!GώԩӧϜ9ΫώΝ›ηΞ=sζτ)™2E€ΰ(CŒόΩ³λϋκωσηΞ9}RM¦0άΓΜΘ/yαy™2ΆŽΩ™ΆΏ3( ό’ /œ?wζΤ‰g˜Ξ0Θ/xιE©R$žόΞ|'hϋDΚΘ#ΏΰŠϝ;#1pτ©'ηΧΆΟDlμYξŸ½™‘_pyςβσϞ9u\₯€š”€Ρ80θ͎ό‚W.]”pRνd@ GF~Α•ω ˜o(ζΠΪ܏7ςs]ΉτβσηNŸm%ΐ›]Φ-οΫωξ xξ¬ΪP†fΣ ϊ£ν’iδηΌqυ•Ι…σmPβ·rš'6ϋφΖ™ΎρΪε‹Η·dΨ”ΫgΟgoΌ‘_pσϊ«—^<–p(ΖΊ}k€τΖ΅W^zαΩΣ;»Ϋ'Σ+<ω9ΕτυW_–} ”€ζB€m ώό‚l[•Ω“ xœ 8ˆpF~N[Ο9Α6p‚ω9³¦<ξΤ3ǚm °N¨#Ώ@•€Kš0$dϋŒ;Cΰ#?§Jo\½|±» ΄}ήνΗΘΟ©σ›Χ―Lš+AnμYξΗy@o‡2yγ΅θ·}ˆ#?GmΥύΰSQf@Μ#Ώ ˜J\ˆ-΄6χόœ**6»¬ϋ½ vn„›^Π[y@o…φVΐ³Αή>Δ­œΡΠ[ay+@΅†…”‡Ώ‰ψΘΟ©σ›Ν‘Sσ€&@L·rO™Μo‘ŒόΖ¬άφ<ΊƒΟΘkάVpάσG‚;ƒΧ­œCS&oπH°;ϊΝΨ3ςΊΜ2•ΟϋσαW£?{F^—υG‚>f@;ώσΡ—ΑκVΞ‘Q0ΏμgwpwψΥΚWΛ^†ž‘ΧD2@=<λλνΰρ—α—Ρ?֌ύIF^—7σ©Οm!σρŸΏ}5ψglŸUŸ¨Όn ΩYύ[Ϝ°}6=ΔλG‚Λρκι£ΗlŸI_)¦―_Ήδg[Θbό₯ό΅}ύΕγΆ5šυ„εί3 o«ϊΟψoΫBڐύυPxΫΐ“O1ώ‡ΓΧΆvΐΰπxΪ$ΐΐαρ΄-€-ORŸm!MΘ%ΐΡglŸ?ρ²-d‘ΗŽΫ>}ώγe[Θ"ΆlŸ½π²-d~ p” 0>Ά…,&ΐ3§lŸ½π±-€έΚ€ px|l i&€ΪžΆ}φBΐΓΆ&ΐxψH 0(ώ΅…μL€gmŸΌπ―-„ 0(ώeΐς*€ 0ή΅…,0†Α»ΆAη^°}ςBΐ»Άε8yφyΫ'/|k QOβΙ#['Ξ>gϋ܁wm!‹Λ€gΞΏhϋδ…€wm!λΐ ΆO^ψΦΒ.p`|k Y4od0Ύ΅…ΜwOo± ίΪBΨ Œom!Mw†ΐ·Ά6CγY[Θ²1œMΐ@ψφH°³ ΰBp΅…Πf― fŸΪBx$lŸΪBΨΐΛ  /l@|j ‘/Μ>΅…° 0€Om!τ…™ΐ§Άξΐ§ΆϊΒ ΰS[„MΰQ[„MΰS[›ψΤΒ#axΤΒ&ΐ΅…° 0Om!lLΰQ[›xτHGΒFπ§-„Ύ0#xΤB_˜ όΛ ‹?m!lŒΰQ[}a&π¨-„Ύ0#ψΣΒ&ΐώ΄…ΠfΪBΈlΪBθ 3‚?m!<6‚?m!<6ƒ?m!lŒΰO[„ΰO[›3xΣΒ&ΐ ώ<d`oΪBΨ˜Α›Ά ›Α›  /Μή΄…ΠfoΪBx$loΪBΨΒ›ΆϊΒΜΰM[}afπ¦-„M€!|i ‘/Μή΄…p7Ψ ή΄…Πf_ΪBx$l_ΪBx$loΪBΨΒ—Ά Β—G‚lLαI[›SψΒ&ΐ>e›xΒ#aSxB_˜)|i ‘/Μž΄…πHΨž΄…° 0…/m!τ…™Β“ΆϊΒLαI[›SxB_˜1΄…° 0ˆm!lΜαM° 0„m!<6ˆm!<6ˆm!<6ˆm!<6ˆm!l βE[UˆA|h α― +1ˆm!l βC[UˆI|h αn°A|h α― +1ˆm!<6‰m!<6‰Ω˜ΔƒΆ ›ΔƒΆ6&ρ ΨΕƒΆ6&ρ -„M€Iψ χ…mpsg—ΎΊΜ{jŸ±χaπq>ξws瑍ώjΰ/ƒ―ˆnp¨ ό½6{~Ž}KD}afΖή»’ΏF}a‡ΊΉ³>φώώnΏ ςζN`cίt_ؐ7w‚όέτn°Ρ›;‘Œ}Cx}afoξ„4φ A=6|s'΄±oε‘07wϊβ&€›;‡ΒλGΒάά9<ΎnφϋΈoξl†‡›€ƒnμΕ~sgCΌΪhίΨ‹ϊζΞfx³ Π{nξlˆ„ϋέΨ‹φζΞf8ήvˆ{ΡήάΩgϋΒ{c/ς |m\|$|¨{άάΩ Η6άάgϊΒ{.π΅q‘/Œ-‹Xή˜ξΪbπΒb_7φœΐΚέ`ΊΆάaq7x¬Ύ0ΊΆcΔGΒtmΉΘ8„ιΪrΣ›ΊΆ§σHxθ ΰƞ,οK 8φάάρ…ε#α‘2€%Ο3†ΜnξxH7qΐΝ_ιd@Ο{Aάάρ›eœ<ϋά¦%€›;°x Τ<~ιcΟΝXd€*η_Όt˜±η掏<ΆάΚ.ΰω‹/Ώ:ώΨs‘g•N 8#!pω΅cΟ͏Y–€cΗO=aςΚΥΧΧΖών·Τ57wBe^ž:ΊuβτΉη^œΌςΪυν$kΗώ?~Π =7wBe^T΄3ΰς«ΧήΈ™dE5«λ7eΰk5τό+yα–€ο<υτ±f\xιε+W―Ώ±=M,oΘτƞ›;ž–€'Τ6@Ν€σ/\œ\ΎςΪ΅ΧίΈ±}³A†ž›;!Σ”€ΗeΠΜ€³Ο>αβ₯—_yυ΅«Χ]Ν‡ž›;‘ςXgl?uζάy™/]zως+-—Χxό+y²3ž>Ίuό„LgŸ{αΒ‹/ΎΤpρEu·ΡΨs‘η‹ ΧͺΘ8{ξΩσΟ=ίςœΊΎη_Ι ™Ηvf€5Nž:}ζμΩsΒΩ³Ν}=Ζ>h–3`1ž9~ό„ΜΕIu_%/pζ3@5Ž=vlkkλΕΦ|θϋ°Y™2ž>rδhΓ‘vθϋΠig@3š9πδS ždμ£ΰ±εPs@Ν‚9O0φ‘°˜j|ϋρ%ίώ6c -η@; vnν0φ‘°ζo-yŒ±ŒΗvΓφ‡‚±aΰΐ]\yχήGοάyxgλΘϋqλΘ•[οΘO~zηΣ‡wlωωΡ7o=xψΞΗ>όψώ½;~;ySύlΊζΣ†:)Š΄Κ'7zχΞ'“«νoNδW&?yπρ―>Ύ'?όΩ‡w>Ή{mς†ϊΕοͺ?ΆŽό|Οžά|οήΓΙΥ[ο%ΣΙ‡χύ›ϋŸέϋhςιΊσ›»“_ίhνe¦“d2mώούίͺ%ωΡΦ‘rrυΪδύήΎά­»κ?―¦ώL¦Υv^fςσΌH‹t’₯ό NgU:­λY:ωusX•oOΣtqX6IΚb[ώq5+k98―&Ÿ΄‡Ϋ³iv+·Σ"/Τai5+&IUmWI–η΅œ₯jZ7/””Σ™QOσ$—#fΫιL‘d₯zl»(¦ςfΣ,™Ξ²Ι‡κ­iΉ]—yΧIUVE>™₯2³\^€šUIZ΄Ÿ(•ο'G©ΓŠ:/&³ιv6-«ωQY2Q―SζY%ΜςY9›ΘΫηΣ*YΌN.Gδς‘§ς,«uΐ4‘“Σ ―Ω|ž$K·³BNΐβDΚ§Nε-^g~‚2™&i6]ž 2έfυςσΘ·Mεεεƒμ‘oΛΟ―“«#ͺνbšζ;ο$ηxΊόζI9@κcηIέΩt{VrL6VεβΙaieΓςνb–ΝdU™$“dZlς=W¦ˆœ5E“ΙΑs¨ω@χφšΰWΏχ½ΙΝϋΏΉϋΰŽϊρδζgχΤόΰΧ&7~ογeŠμ჏ούJ–ΐGχqχ_ξ?Ό{λ‘όδŸ=\›όjv_½uοώ½ΕdΏΎηͺ’Ÿ=Έ³ψ·ή›άϊμαύI»T?ώΏς²7ηοΩΎόό­?Έυ^ύΑO~ριέzχ£ώσέί~ΠυιόcάμΎΛδ¦|Ÿήύπώƒξ~4Π?Η·ώή;?}χGς―ΚxMδσύμΏύ‡ΙόΙηšžχΏθŠŸN~ŒϋδύŸR(#€·~ΡNΌ«?ΏwοΞ―eNκΑ>Ύ+Ω6Λ5‘U«τjσkρη[ΏjΓuΊB)ο)_¦Ξδ+gEY̚Ϡώ[]Κ9Jκjrcύwͺζw:_5SC”δι,―Κi:•±ΌλGίMN΅Μ­i²Κ4“‰œΙΫφy»trc6•ΩŸΛO²B^²žΌυαnί.›διv2+“f T2ϋ}½$ΝΆeZTy1-ΚY.'ΣΰΧkΧϊTΎ˜¬5y$›»_ΆUη­·Ζ¨mΑuυg[ΥΎk§"~·[6?yύΦ{Θ‘?ϊψ©ώκΣ]Ϋ₯μΛλόμαo?ΉϋΑΞǟ¦ΉA»ωH=ςƒ½Λϋ»ηξ‡Ÿ5§η‘"/΄Ψλ-ΪΟ?Qη‘ύv“wωΛ»κ .ςmω»Λ/ϋή½OήΉχ‘|QΩ αΗw~³Ϋ Y~€ΥίX‘€›Ηm©jBh}«ϊŸδΏύoωΩΏΙԚόxς?ώηtςΡV›Sj>JBH΅©¦e-3Y²c;“ω*s­¦Ref«Œ’©Έ8(m&d-ΌΞ«’Μ¦MFIXl§Y2›€fmΥ䏔׳ΌhςGrgZΞdιeuέΞkYrDUΙQΝRχj9’T₯\ސw.ͺ΄ΞgΙ,ΙsUοTπdRnΛ*ΟfΉόl&Ε¦Θ+)‡e‘^X})ΫΫS©³rPš$ς³™¬CɈωAςiΤΛLΛ2“#ςRΦη€ͺ·3ŽΛ—I₯‹ϊ΄ςF‹c’"“”ZXLe3‘6‘Τ$—ΔυΞ1ΕΆ€›DΩTNB•6‰TKο '©–rUL§Ή\Mž/ςQTν–FeΎo˜EΙzωœνU>;_2Q£2U»”B*π΄Ξς&Œφ¨Υ₯ΚωcZ¦}ήL’(ΙΤΎH~ž‰ŒAS«χΙ‘<)ε₯‡ϊfoϋfκͺ^ΘhΜdiΚ\Pίμ—ͺΎŒ‘@{_plvΏηΛΜy½Έ OššϊΩβΏ΄Εuώ#Ωj²ίKΣ2“U(›ΧΙTφm²—““ΙZŸV3υΩ€RΊd3WΚ&WΝτν*“’Τ,9uP~"η2OdhςjZΜΤοΝvώ—:ί“χοΘ‡ΘeΗ‘–ωlVd™Τ, ΅‘}`>M+Ω"ΆuZm»jΩΚΛ&R +‡Tˎ_vΕ3YΏjϋρI{ZLRƒTΩkΚd…Λ£,g™Μ9’VυXΎ’ΤΗΊ9BŠh){εD&ŒΤ# „DΎƒμwε«•R'¦ͺpK吟δI³-M€žΚ^Zfό–Ϊ€Υ™*φ™šKE&η₯ύ0ςΚR@₯΄Θy+:•-r-Χ=3UΆΐRvU±OeΛIΜΥrM3•kŠRNDή!AΙni:›Κt―Ή€’3WΘαBϋiς™Z•y‘§RGl2S[ϋ¦΄©Ρ˜—G9(MdjηRŽguͺJΤK₯ΖΚ™‘³žΛEV-[ΪiUΛδκˆL’δΰ"S©Υ!ί²šMΣR’£PGT΅Μ&JYϋid $χ2ΉόsT·‹MbOΞažΙΫO#',›e‰Tf9Χi3δ©ΤζB…§ΌύD‘εΝ +ž–…ϊ!y!!₯jΎDΨΑΣ¦]ΓΙδυ†’‘ςώY-ΆTq,Ÿ*We"m渚ay±-Ώ[ΘΥ—Μ°is³T¦R&ί?‘7n?ΈŠu9r%#gf2“8«ŠfΞ7AͺNQ&£>›I‰TU}–Λ₯£Iώ©Ι‰ˆBζ±\€¦3΅˜δyΟTm.dκΚώΎ™`2€2Sdδe2ΘεT=•λK ²JβNζN{ε²Tήeš¨‰ «’ϋT.€$=kU eg 6Ι§²²RM0uiPT²‘β,C*―!WrškYυ’Ά2“εœdκ"]fΰ¬έ +ΘΊlΝεU₯ΤyΩ.š΄¨³:IΤ +o§{‘J¨\jΛ§ΞΤK'κͺYvυ³²ΉΖlV–œ†΄–/!﯎PO†·”+ΉΔ”#$εΣ₯*ή²ŒΤkΘδ’ gANΡb‚Ιš“„‘ΙZσKMΩΘ§•-N{WA·lͺd/#˜ISς ω4ς%*™+ς2SΩηΙH5ϋ:uΗ@MŸ²Pc%σ[ύΰ€9ΣN―ŸwλͺŒΎΊ6,ͺζOυIχU3Ο +uΧWNΧ¬ω³PΓ&ΕVͺGϋg{6e‡³ψ%ω³T _b·VkOώ¬Ϊ/Y$²²δδ̚?ε j{η½’lΦ$ΣXΆ=ΝoΙP#,uZfQσg1;™”rξδšOώ”*XKΝ[| ω³-h₯ θΞϚr•uŽΚΫƒΤΚrυg֖ƝŸ,_)/ε;Κ?ΫΕ=?͟νg’ύY³Emώ,šΣ_Λf@fŸϊsώΑσνZBIζ₯ϊ3QόΡΟ$g<ίωΞν°Θ~AΒ£ω³0 έ'm5©dRTS΅―ΜΤύ’Ί–’(%K]«Kτf„Kω‘Ί‡!_MNΦLΎ΄”)\Λ|,ε·n«ƒ€²±”"˜«•§6°e©ξ|Hu_k’Νρ΄sΌ,‘fT™\#΄εκώ™όTežlΤδδ걂Τ™εςώ·Ϋϝt>θ€ΞΥν˜υƒδ’dΊς™dnΞ–ο—/^iί3p»9Q{oj–vφο¨}‡δš¨ςΙεΏ$jί‘Φj•O3ωR$ΤO$»€.Ι’”x‘AQϋ©mF­~’nό©R“4₯EνD»yαJ–“ΪwLΫ«Duν#[ΙIUυ5«;'/ο>TΡ^œa9ν²»c5?{rήεdI4ΘΠΘEΪed‚ΚoΦR•%ˆ›WZ™Ν•δΚ@ΙΐI„Hy“Hφn¨|™¦ΘER[š’5“Ψ–ΜδνEήΧΝ·&IͺΞHΞgŽŠόξπͺƒ’WΞΪ<λ~\9"/;/«h_]Φ€D‘dFσέ› Α_4 ©σΟζo,hΪ9ιjm«N’ΆTrε;iŽθ|”φΞ‘ΪIυ•ΝDΡΡύπmyξΌθ‡σ7ͺΥ=ηJύ^»YϋικκiŽθcs„J JφaiΎ†δξΘͿμ,ο̐ζ ͺσ[·η{£Ξ’k·=ݏ·8hgΐΫ`’Ά3š#’Ξ 4•qυKΙέZnΒ:oτφ\“,a^`šG έ. ΅2ΫΥ«tP}ž¬;K›έ`7*Ru]ά™6o·›΄΅ ΈV&ζ)°Ά"κν•:¦’Κ• (ϋ΄Υ);Ή¬»θΥk¬$ΩbΝdέE―"°X+˜κvB·ͺƒŠ¬;meŸV.˜|νWΤNnεlΚ’κ†Vϋi€\ΛΟd“;?&_Kqω$rmΧ9 XhνΞtΎ휿ζΔ―Χ΅³νžδω‰Ÿ|³vƒάωάΝ&»;κΙΪΌiφκ«{z΅œΌέΞΆ’[m›]7An·­―€Υ•―ŽX© j₯­”‘§ώ|‰Έο˜ί¨“ξ»ΥέZ°XΨΣΥ2¬6²ΝΚνvwΆΆδ­ϋ;σέΩΪ'RWk΅Qo §³ΤΨSimΞ~ΩξΥKΜVΦΫ|cͺ΅¬ΦΆ1³΅ HsP±r^λj—TΠΪ—ξρiηίEmο;ΏlοW‚εΧνAEw•ΤΥjΔίn/¦ωΚ>@&JΡ–yŒeΕΚPMWp{q‘°RΩ’ΥΜίnu—‘8Φζαίm1ž+‹³n¨v6r›‘MΧ^LώwΊ>ƒδ²k΅ΎHΰ―”ΑΫνυbΉΎΉXٚέ^\›­ΤτѐmςVΆpΩjΩΉ­σνnwξβk‘W+ΫΘv’««βξ²hŠΧ'Ή΄Ί‘Xί±άnίnυ€Κœyτ luŸΧ\©―τA[σ’IϋosE•dRΤΫVω,UιT΄]Λ•“δSsRՐ‘I²Y]UM„ΥMΙ–±•‘]άA¨ΤΟRu;S”Hπ© +–ΙόN„¬βͺlnΘuΩL=ΜonXM§™ΊTKη―S7Q΅ΊYΥν–―V?)S91ΕβΎGσ!+Υ« nΣ€²*’¦΄Θ%ήό©Σώίλ“½ŸδΥ5υ< –Ν@^«oœf3u§zr£Κ&Ύ΅Τ¬Yš6χγf»<Ζ‘³£ξQΘεi%οXζ“jS )— RΠΤ―ΝmΙJέ³’“Uζ₯“Ι^¨ΞdΣRΙδK¨Ϋ-ΣRυ:eYȐ(3­HΥΣ*υΤ°yŒ#ŸM­ώDuXκΣ;zwrηή½ϋο<ΌϋωG2=ο~ϊπώƒ»ςΆχMύDύς\yχ'?Ϊ:ς‘ͺ,Ψ +endstream endobj 229 0 obj [/ICCBased 249 0 R] endobj 5 0 obj <> endobj 62 0 obj <> endobj 148 0 obj <> endobj 213 0 obj [/View/Design] endobj 214 0 obj <>>> endobj 140 0 obj [/View/Design] endobj 141 0 obj <>>> endobj 51 0 obj [/View/Design] endobj 52 0 obj <>>> endobj 222 0 obj [221 0 R] endobj 285 0 obj <> endobj xref +0 286 +0000000004 65535 f +0000000016 00000 n +0000000192 00000 n +0000023642 00000 n +0000000006 00000 f +0000149307 00000 n +0000000008 00000 f +0000023693 00000 n +0000000009 00000 f +0000000010 00000 f +0000000011 00000 f +0000000012 00000 f +0000000013 00000 f +0000000014 00000 f +0000000015 00000 f +0000000016 00000 f +0000000017 00000 f +0000000018 00000 f +0000000019 00000 f +0000000020 00000 f +0000000021 00000 f +0000000022 00000 f +0000000023 00000 f +0000000024 00000 f +0000000025 00000 f +0000000026 00000 f +0000000027 00000 f +0000000028 00000 f +0000000029 00000 f +0000000030 00000 f +0000000031 00000 f +0000000032 00000 f +0000000033 00000 f +0000000034 00000 f +0000000035 00000 f +0000000036 00000 f +0000000037 00000 f +0000000038 00000 f +0000000039 00000 f +0000000040 00000 f +0000000041 00000 f +0000000042 00000 f +0000000043 00000 f +0000000044 00000 f +0000000045 00000 f +0000000046 00000 f +0000000047 00000 f +0000000048 00000 f +0000000049 00000 f +0000000050 00000 f +0000000053 00000 f +0000149772 00000 n +0000149803 00000 n +0000000054 00000 f +0000000055 00000 f +0000000056 00000 f +0000000057 00000 f +0000000058 00000 f +0000000059 00000 f +0000000060 00000 f +0000000061 00000 f +0000000063 00000 f +0000149377 00000 n +0000000064 00000 f +0000000065 00000 f +0000000066 00000 f +0000000067 00000 f +0000000068 00000 f +0000000069 00000 f +0000000070 00000 f +0000000071 00000 f +0000000072 00000 f +0000000073 00000 f +0000000074 00000 f +0000000075 00000 f +0000000076 00000 f +0000000077 00000 f +0000000078 00000 f +0000000079 00000 f +0000000080 00000 f +0000000081 00000 f +0000000082 00000 f +0000000083 00000 f +0000000084 00000 f +0000000085 00000 f +0000000086 00000 f +0000000087 00000 f +0000000088 00000 f +0000000089 00000 f +0000000090 00000 f +0000000091 00000 f +0000000092 00000 f +0000000093 00000 f +0000000094 00000 f +0000000095 00000 f +0000000096 00000 f +0000000097 00000 f +0000000098 00000 f +0000000099 00000 f +0000000100 00000 f +0000000101 00000 f +0000000102 00000 f +0000000103 00000 f +0000000104 00000 f +0000000105 00000 f +0000000106 00000 f +0000000107 00000 f +0000000108 00000 f +0000000109 00000 f +0000000110 00000 f +0000000111 00000 f +0000000112 00000 f +0000000113 00000 f +0000000114 00000 f +0000000115 00000 f +0000000116 00000 f +0000000117 00000 f +0000000118 00000 f +0000000119 00000 f +0000000120 00000 f +0000000121 00000 f +0000000122 00000 f +0000000123 00000 f +0000000124 00000 f +0000000125 00000 f +0000000126 00000 f +0000000127 00000 f +0000000128 00000 f +0000000129 00000 f +0000000130 00000 f +0000000131 00000 f +0000000132 00000 f +0000000133 00000 f +0000000134 00000 f +0000000135 00000 f +0000000136 00000 f +0000000137 00000 f +0000000138 00000 f +0000000139 00000 f +0000000142 00000 f +0000149654 00000 n +0000149686 00000 n +0000000143 00000 f +0000000144 00000 f +0000000145 00000 f +0000000146 00000 f +0000000147 00000 f +0000000000 00000 f +0000149456 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000149536 00000 n +0000149568 00000 n +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000000000 00000 f +0000071658 00000 n +0000149888 00000 n +0000024100 00000 n +0000024240 00000 n +0000071856 00000 n +0000055680 00000 n +0000025179 00000 n +0000024304 00000 n +0000149270 00000 n +0000024614 00000 n +0000024664 00000 n +0000029546 00000 n +0000042939 00000 n +0000045817 00000 n +0000034866 00000 n +0000055794 00000 n +0000055910 00000 n +0000052839 00000 n +0000052985 00000 n +0000053131 00000 n +0000053277 00000 n +0000053423 00000 n +0000053569 00000 n +0000029609 00000 n +0000032299 00000 n +0000045865 00000 n +0000034913 00000 n +0000042976 00000 n +0000043166 00000 n +0000052406 00000 n +0000055462 00000 n +0000055245 00000 n +0000055027 00000 n +0000054713 00000 n +0000054216 00000 n +0000053715 00000 n +0000053853 00000 n +0000053974 00000 n +0000054095 00000 n +0000054353 00000 n +0000054472 00000 n +0000054592 00000 n +0000054830 00000 n +0000054936 00000 n +0000055124 00000 n +0000055342 00000 n +0000055559 00000 n +0000064641 00000 n +0000056026 00000 n +0000056092 00000 n +0000056123 00000 n +0000056427 00000 n +0000064528 00000 n +0000056502 00000 n +0000064707 00000 n +0000064738 00000 n +0000065042 00000 n +0000065117 00000 n +0000071738 00000 n +0000071770 00000 n +0000071932 00000 n +0000072110 00000 n +0000073610 00000 n +0000086845 00000 n +0000149915 00000 n +trailer +<<53701A8F86781B4884F15DAE952D0FC1>]>> +startxref +150055 +%%EOF diff --git a/art/vuepress-icon.svg b/art/vuepress-icon.svg new file mode 100644 index 00000000..1730e2a9 --- /dev/null +++ b/art/vuepress-icon.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lerna.json b/lerna.json index 6aee3c28..489c0038 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,5 @@ { - "lerna": "2.5.1", "npmClient": "yarn", "useWorkspaces": true, - "version": "1.0.0-alpha.42" + "version": "1.0.4" } diff --git a/package.json b/package.json index ca677c54..4698b8fe 100644 --- a/package.json +++ b/package.json @@ -3,53 +3,50 @@ "workspaces": [ "packages/@vuepress/*", "packages/vuepress", - "packages/docs", - "packages/blog" + "packages/docs" ], "description": "Minimalistic doc generator with Vue component based layout system", "scripts": { - "bootstrap": "yarn && lerna bootstrap && yarn tsc", + "precommit": "lint-staged", + "bootstrap": "yarn && yarn tsc", + "clean": "lerna clean && rm -rf node_modules", + "packages:list": "lerna ls -l", + "packages:diff": "lerna diff", + "packages:changed": "lerna changed", "boot": "node scripts/bootstrap.js", "remote-version": "node scripts/remote-version.js", - "dev": "yarn tsc && yarn workspace docs dev", - "build": "yarn tsc && yarn workspace docs build", + "dev": "yarn tsc && yarn dev:docs", + "dev:docs": "yarn workspace docs dev", + "build": "yarn tsc && yarn build:docs", + "build:docs": "yarn workspace docs build", "view-info": "yarn tsc && yarn workspace docs view-info", "show-help": "yarn workspace docs show-help", - "dev:blog": "yarn tsc && yarn workspace blog dev", - "build:blog": "yarn tsc && yarn workspace blog build", "register-vuepress": "lerna exec --scope vuepress -- yarn link", + "unregister-vuepress": "lerna exec --scope vuepress -- yarn unlink", "lint": "eslint packages --fix --ext .js,.vue", - "release": "yarn --pure-lockfile && yarn tsc && node scripts/release.js", + "release": "yarn --pure-lockfile && yarn tsc && node scripts/release.js", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s -r 2", "test": "node scripts/test.js", - "tsc": "lerna run tsc" - }, - "gitHooks": { - "pre-commit": "lint-staged" - }, - "lint-staged": { - "*.{js,vue}": [ - "eslint --fix", - "git add" - ] + "tsc": "yarn workspace @vuepress/shared-utils tsc" }, "devDependencies": { - "conventional-changelog-cli": "^1.3.22", + "@types/escape-html": "^0.0.20", + "@types/fs-extra": "^5.0.4", + "@types/globby": "^9.1.0", + "@types/hash-sum": "^1.0.0", + "@types/lru-cache": "^4.1.1", + "@types/node": "^10.12.12", + "@types/semver": "^6.0.0", + "conventional-changelog-cli": "^2.0.21", "eslint": "^4.19.1", "eslint-plugin-jest": "^21.15.1", "eslint-plugin-vue-libs": "^3.0.0", - "lerna": "^3.6.0", - "lint-staged": "^7.0.4", - "minimist": "^1.2.0", - "yorkie": "^1.0.3", + "husky": "^3.0.2", "inquirer": "^6.2.0", + "lerna": "3.13.4", + "lint-staged": "^8.1.5", + "minimist": "^1.2.0", "typescript": "^3.2.2", - "@types/node": "^10.12.12", - "@types/lru-cache": "^4.1.1", - "@types/fs-extra": "^5.0.4", - "@types/semver": "^5.5.0", - "@types/hash-sum": "^1.0.0", - "@types/globby": "^8.0.0", - "@types/escape-html": "^0.0.20" + "all-contributors-cli": "^6.8.1" } } diff --git a/packages/@vuepress/core/lib/client/app.js b/packages/@vuepress/core/lib/client/app.js index bcccec17..25b964c4 100644 --- a/packages/@vuepress/core/lib/client/app.js +++ b/packages/@vuepress/core/lib/client/app.js @@ -16,7 +16,6 @@ import Content from './components/Content.js' import ContentSlotsDistributor from './components/ContentSlotsDistributor' import OutboundLink from './components/OutboundLink.vue' import ClientOnly from './components/ClientOnly' -import TOC from './components/TOC.vue' // suggest dev server restart on base change if (module.hot) { @@ -47,8 +46,6 @@ Vue.component('ClientOnly', ClientOnly) // core components Vue.component('Layout', getLayoutAsyncComponent('Layout')) Vue.component('NotFound', getLayoutAsyncComponent('NotFound')) -// markdown components -Vue.component('TOC', TOC) // global helper for adding base path to absolute urls Vue.prototype.$withBase = function (path) { @@ -61,8 +58,12 @@ Vue.prototype.$withBase = function (path) { } export function createApp (isServer) { + const routerBase = typeof window !== 'undefined' && window.__VUEPRESS_ROUTER_BASE__ + ? window.__VUEPRESS_ROUTER_BASE__ + : (siteData.routerBase || siteData.base) + const router = new Router({ - base: siteData.base, + base: routerBase, mode: 'history', fallback: false, routes, diff --git a/packages/@vuepress/core/lib/client/clientEntry.js b/packages/@vuepress/core/lib/client/clientEntry.js index b7f795f6..7a8e568f 100644 --- a/packages/@vuepress/core/lib/client/clientEntry.js +++ b/packages/@vuepress/core/lib/client/clientEntry.js @@ -4,7 +4,7 @@ import { createApp } from './app' const { app, router } = createApp(false /* isServer */) -window.__VUEPRESS_VERSION__ = { +window.__VUEPRESS__ = { version: VUEPRESS_VERSION, hash: LAST_COMMIT_HASH } diff --git a/packages/@vuepress/core/lib/client/components/Content.js b/packages/@vuepress/core/lib/client/components/Content.js index c2ed88d4..ce032789 100644 --- a/packages/@vuepress/core/lib/client/components/Content.js +++ b/packages/@vuepress/core/lib/client/components/Content.js @@ -1,4 +1,5 @@ -import { isPageExists } from '../util' +import Vue from 'vue' +import { setGlobalInfo, getPageAsyncComponent } from '@app/util' export default { props: { @@ -10,7 +11,17 @@ export default { }, render (h) { const pageKey = this.pageKey || this.$parent.$page.key - if (isPageExists(pageKey)) { + setGlobalInfo('pageKey', pageKey) + + /** + * This is for use cases that render `` + * with dynamic pageKey from current $page. + */ + if (!Vue.component(pageKey)) { + Vue.component(pageKey, getPageAsyncComponent(pageKey)) + } + + if (Vue.component(pageKey)) { return h(pageKey) } return h('') diff --git a/packages/@vuepress/core/lib/client/components/ContentSlotsDistributor.js b/packages/@vuepress/core/lib/client/components/ContentSlotsDistributor.js index 4de753a5..857b3e41 100644 --- a/packages/@vuepress/core/lib/client/components/ContentSlotsDistributor.js +++ b/packages/@vuepress/core/lib/client/components/ContentSlotsDistributor.js @@ -8,8 +8,7 @@ export default { return h('div', { class: [ - 'content', - props.slotKey + `content__${props.slotKey}` ] }, slots()[props.slotKey] diff --git a/packages/@vuepress/core/lib/client/components/GlobalLayout.vue b/packages/@vuepress/core/lib/client/components/GlobalLayout.vue index e137bb3c..3a8f1005 100644 --- a/packages/@vuepress/core/lib/client/components/GlobalLayout.vue +++ b/packages/@vuepress/core/lib/client/components/GlobalLayout.vue @@ -3,17 +3,30 @@ diff --git a/packages/@vuepress/core/lib/client/components/HeaderList.vue b/packages/@vuepress/core/lib/client/components/HeaderList.vue deleted file mode 100644 index a1945e08..00000000 --- a/packages/@vuepress/core/lib/client/components/HeaderList.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/packages/@vuepress/core/lib/client/components/OutboundLink.vue b/packages/@vuepress/core/lib/client/components/OutboundLink.vue index 65a7ab6f..4acbb9af 100644 --- a/packages/@vuepress/core/lib/client/components/OutboundLink.vue +++ b/packages/@vuepress/core/lib/client/components/OutboundLink.vue @@ -5,11 +5,12 @@ - diff --git a/packages/@vuepress/core/lib/client/components/TOC.vue b/packages/@vuepress/core/lib/client/components/TOC.vue deleted file mode 100644 index 697e68c1..00000000 --- a/packages/@vuepress/core/lib/client/components/TOC.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - diff --git a/packages/@vuepress/core/lib/client/plugins/VuePress.js b/packages/@vuepress/core/lib/client/plugins/VuePress.js index bdb93e1b..40e9608f 100644 --- a/packages/@vuepress/core/lib/client/plugins/VuePress.js +++ b/packages/@vuepress/core/lib/client/plugins/VuePress.js @@ -1,22 +1,18 @@ import Store from './Store' import { - isPageExists, - isPageLoaded, getPageAsyncComponent, - isLayoutExists, - isLayoutLoaded, - getLayoutAsyncComponent + getLayoutAsyncComponent, + getAsyncComponent, + getVueComponent } from '../util' class VuePress extends Store {} Object.assign(VuePress.prototype, { - isPageExists, - isPageLoaded, getPageAsyncComponent, - isLayoutExists, - isLayoutLoaded, - getLayoutAsyncComponent + getLayoutAsyncComponent, + getAsyncComponent, + getVueComponent }) export default { diff --git a/packages/@vuepress/core/lib/client/util.js b/packages/@vuepress/core/lib/client/util.js index e4e483f4..381c51d9 100644 --- a/packages/@vuepress/core/lib/client/util.js +++ b/packages/@vuepress/core/lib/client/util.js @@ -2,36 +2,89 @@ import Vue from 'vue' import layoutComponents from '@internal/layout-components' import pageComponents from '@internal/page-components' +/** + * Create a cached version of a pure function. + */ +function cached (fn) { + const cache = Object.create(null) + // eslint-disable-next-line func-names + return function cachedFn (str) { + const hit = cache[str] + // eslint-disable-next-line no-return-assign + return hit || (cache[str] = fn(str)) + } +} + +/** + * Camelize a hyphen-delimited string. + */ +const camelizeRE = /-(\w)/g +const camelize = cached(str => { + return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : '') +}) + +/** + * Hyphenate a camelCase string. + */ +const hyphenateRE = /\B([A-Z])/g +const hyphenate = cached(str => { + return str.replace(hyphenateRE, '-$1').toLowerCase() +}) + +/** + * Capitalize a string. + */ +const capitalize = cached(str => { + return str.charAt(0).toUpperCase() + str.slice(1) +}) + +/** + * This method was for securely getting Vue component when components + * are named in different style. + * + * e.g. a component named `a-b` can be also getted by `AB`, It's the + * same the other way round + * + * @param {function} getter a function of getting component by name + * @param {string} name component's name + * @returns {Component|AsyncComponent} + */ +export function getComponent (getter, name) { + if (!name) return + if (getter(name)) return getter(name) + + const isKebabCase = name.includes('-') + if (isKebabCase) return getter(capitalize(camelize(name))) + + return getter(capitalize(name)) || getter(hyphenate(name)) +} + const asyncComponents = Object.assign({}, layoutComponents, pageComponents) - -export function isPageExists (pageKey) { - return Boolean(pageComponents[pageKey]) -} - -export function isPageLoaded (pageKey) { - return Boolean(Vue.component(pageKey)) -} +const asyncComponentsGetter = name => asyncComponents[name] +const pageComponentsGetter = layout => pageComponents[layout] +const layoutComponentsGetter = layout => layoutComponents[layout] +const globalComponentsGetter = name => Vue.component(name) export function getPageAsyncComponent (pageKey) { - return pageComponents[pageKey] + return getComponent(pageComponentsGetter, pageKey) } -export function isLayoutExists (layout) { - return Boolean(layoutComponents[layout]) +export function getLayoutAsyncComponent (layout) { + return getComponent(layoutComponentsGetter, layout) } -export function isLayoutLoaded (layout) { - return Boolean(Vue.component(layout)) +export function getAsyncComponent (name) { + return getComponent(asyncComponentsGetter, name) } -export function getLayoutAsyncComponent (pageKey) { - return layoutComponents[pageKey] +export function getVueComponent (name) { + return getComponent(globalComponentsGetter, name) } export function ensureAsyncComponentsLoaded (...names) { return Promise.all(names.filter(v => v).map(async (name) => { - if (!Vue.component(name) && asyncComponents[name]) { - const comp = await asyncComponents[name]() + if (!getVueComponent(name) && getAsyncComponent(name)) { + const comp = await getAsyncComponent(name)() Vue.component(name, comp.default) } })) @@ -129,3 +182,16 @@ export function normalizeConfig (component, rawConfig) { } return rawConfig } + +/** + * Set global info in `window.__VUEPRESS__` for debugging. + * + * @param {string}key + * @param {any} value + */ +export function setGlobalInfo (key, value) { + if (typeof window === 'undefined' || !window.__VUEPRESS__) { + return + } + window.__VUEPRESS__[key] = value +} diff --git a/packages/@vuepress/core/lib/index.js b/packages/@vuepress/core/lib/index.js index e03bf483..cd053664 100644 --- a/packages/@vuepress/core/lib/index.js +++ b/packages/@vuepress/core/lib/index.js @@ -1,6 +1,7 @@ 'use strict' const App = require('./node/App') +const { version } = require('../package') const { logger } = require('@vuepress/shared-utils') function createApp (options) { @@ -11,16 +12,17 @@ function createApp (options) { async function dev (options) { const app = createApp(options) await app.process() - await app.dev() + return app.dev() } async function build (options) { const app = createApp(options) await app.process() - await app.build() + return app.build() } exports.App = App +exports.version = version exports.createApp = createApp exports.dev = dev exports.build = build diff --git a/packages/@vuepress/core/lib/node/App.js b/packages/@vuepress/core/lib/node/App.js index 4b1ab57f..99df7fc2 100755 --- a/packages/@vuepress/core/lib/node/App.js +++ b/packages/@vuepress/core/lib/node/App.js @@ -26,13 +26,6 @@ const createTemp = require('./createTemp') */ module.exports = class App { - static getInstance (...args) { - if (!App._instance) { - App._instance = new App(...args) - } - return App._instance - } - /** * Instantiate the app context with a new API * @@ -48,6 +41,9 @@ module.exports = class App { this.options = options this.sourceDir = this.options.sourceDir || path.join(__dirname, 'docs.fallback') logger.debug('sourceDir', this.sourceDir) + if (!fs.existsSync(this.sourceDir)) { + logger.warn(`Source directory doesn't exist: ${chalk.yellow(this.sourceDir)}`) + } const { tempPath, writeTemp } = createTemp(options.temp) this.tempPath = tempPath @@ -91,7 +87,8 @@ module.exports = class App { } /** - * Load pages, load plugins, apply plugins / plugin options, etc. + * A asynchronous method used to prepare the context of the current app. which + * contains loading pages and plugins, apply plugins, etc. * * @returns {Promise} * @api private @@ -155,12 +152,12 @@ module.exports = class App { .use(require('./internal-plugins/transformModule')) .use(require('./internal-plugins/dataBlock')) .use(require('./internal-plugins/frontmatterBlock')) - .use('@vuepress/container', { + .use('container', { type: 'slot', before: info => `' }) - .use('@vuepress/container', { + .use('container', { type: 'v-pre', before: '
', after: '
' @@ -351,7 +348,14 @@ module.exports = class App { computed: new this.ClientComputedMixinConstructor(), enhancers: this.pluginAPI.getOption('extendPageData').items }) - this.pages.push(page) + const index = this.pages.findIndex(({ path }) => path === page.path) + if (index >= 0) { + // Override a page if corresponding path already exists + logger.warn(`Override existing page ${chalk.yellow(page.path)}.`) + this.pages.splice(index, 1, page) + } else { + this.pages.push(page) + } } /** @@ -381,7 +385,7 @@ module.exports = class App { return current } if (this.themeAPI.existsParentTheme) { - const parent = path.resolve(this.themeAPI.theme.path, filepath) + const parent = path.resolve(this.themeAPI.parentTheme.path, filepath) if (fs.existsSync(parent)) { return parent } @@ -445,9 +449,9 @@ module.exports = class App { } /** - * Start a dev process with correct app context + * Launch a dev process with current app context. * - * @returns {Promise} + * @returns {Promise} * @api public */ @@ -455,20 +459,29 @@ module.exports = class App { this.isProd = false this.devProcess = new DevProcess(this) await this.devProcess.process() - - this.devProcess - .on('fileChanged', ({ type, target }) => { - console.log(`Reload due to ${chalk.red(type)} ${chalk.cyan(path.relative(this.sourceDir, target))}`) - this.process() - }) - .createServer() - .listen() + const error = await new Promise(resolve => { + try { + this.devProcess + .on('fileChanged', ({ type, target }) => { + console.log(`Reload due to ${chalk.red(type)} ${chalk.cyan(path.relative(this.sourceDir, target))}`) + this.process() + }) + .createServer() + .listen(resolve) + } catch (err) { + resolve(err) + } + }) + if (error) { + throw error + } + return this } /** - * Start a build process with correct app context + * Launch a build process with current app context * - * @returns {Promise} + * @returns {Promise} * @api public */ @@ -477,6 +490,7 @@ module.exports = class App { this.buildProcess = new BuildProcess(this) await this.buildProcess.process() await this.buildProcess.render() + return this } } diff --git a/packages/@vuepress/core/lib/node/Page.js b/packages/@vuepress/core/lib/node/Page.js index e04bd50f..0da87830 100644 --- a/packages/@vuepress/core/lib/node/Page.js +++ b/packages/@vuepress/core/lib/node/Page.js @@ -37,7 +37,7 @@ module.exports = class Page { */ constructor ({ - path, + path: _path, meta, title, content, @@ -58,12 +58,16 @@ module.exports = class Page { if (relative) { this.regularPath = encodeURI(fileToPath(relative)) - } else if (path) { - this.regularPath = encodeURI(path) + } else if (_path) { + this.regularPath = encodeURI(_path) } else if (permalink) { this.regularPath = encodeURI(permalink) } + if (filePath) { + this.relativePath = path.relative(context.sourceDir, filePath).replace(/\\/g, '/') + } + this.key = 'v-' + hash(`${this._filePath}${this.regularPath}`) // Using regularPath first, would be override by permalink later. this.path = this.regularPath @@ -85,11 +89,7 @@ module.exports = class Page { enhancers = [], preRender = {} }) { - // relative path - let relPath - if (this._filePath) { - relPath = path.relative(this._context.sourceDir, this._filePath) logger.developer(`static_route`, chalk.cyan(this.path)) this._content = await fs.readFile(this._filePath, 'utf-8') } else if (this._content) { @@ -124,7 +124,7 @@ module.exports = class Page { if (excerpt) { const { html } = markdown.render(excerpt, { frontmatter: this.frontmatter, - relPath + relativePath: this.relativePath }) this.excerpt = html } @@ -146,6 +146,17 @@ module.exports = class Page { this.buildPermalink() } + /** + * name of page's parent directory. + * + * @returns {string} + * @api public + */ + + get dirname () { + return path.basename(path.dirname(this._filePath || this.regularPath)) + } + /** * file name of page's source markdown file, or the last cut of regularPath. * @@ -165,7 +176,19 @@ module.exports = class Page { */ get slug () { - return slugify(this.strippedFilename) + const strippedFilename = this.strippedFilename + + if (/^(index|readme)$/i.test(strippedFilename)) { + const strippedFilename = this.stripFilename( + path.basename(path.dirname(this._filePath || this.regularPath)) + ) + + if (strippedFilename) { + return slugify(strippedFilename) + } + } + + return slugify(strippedFilename) } /** @@ -179,8 +202,7 @@ module.exports = class Page { */ get strippedFilename () { - const match = this.filename.match(DATE_RE) - return match ? match[3] : this.filename + return this.stripFilename(this.filename) } /** @@ -191,7 +213,23 @@ module.exports = class Page { */ get date () { - return inferDate(this.frontmatter, this.filename) + return inferDate(this.frontmatter, this.filename, this.dirname) + } + + /** + * stripped file name. + * + * If filename was yyyy-MM-dd-[title], the date prefix will be stripped. + * If filename was yyyy-MM-[title], the date prefix will be stripped. + * + * @param {string} fileName + * @returns {string} + * @private + */ + stripFilename (fileName) { + const match = fileName.match(DATE_RE) + + return match ? match[3] : fileName } /** diff --git a/packages/@vuepress/core/lib/node/__tests__/prepare/App.spec.js b/packages/@vuepress/core/lib/node/__tests__/prepare/App.spec.js index f33eef16..dbeb1e3c 100644 --- a/packages/@vuepress/core/lib/node/__tests__/prepare/App.spec.js +++ b/packages/@vuepress/core/lib/node/__tests__/prepare/App.spec.js @@ -18,6 +18,7 @@ describe('App', () => { theme: '@vuepress/default', emp: docsTempPath }) + await app.process() expect(app.sourceDir).toBe(docsPath) })) }) diff --git a/packages/@vuepress/core/lib/node/__tests__/prepare/fixtures/docs-dep-theme-without-index/.vuepress/config.js b/packages/@vuepress/core/lib/node/__tests__/prepare/fixtures/docs-dep-theme-without-index/.vuepress/config.js new file mode 100644 index 00000000..81f0fb39 --- /dev/null +++ b/packages/@vuepress/core/lib/node/__tests__/prepare/fixtures/docs-dep-theme-without-index/.vuepress/config.js @@ -0,0 +1,5 @@ +module.exports = { + title: 'Hello VuePress', + description: '# Hello, VuePress!', + theme: 'vuepress-theme-without-index' +} diff --git a/packages/@vuepress/core/lib/node/__tests__/prepare/fixtures/docs-dep-theme-without-index/README.md b/packages/@vuepress/core/lib/node/__tests__/prepare/fixtures/docs-dep-theme-without-index/README.md new file mode 100644 index 00000000..aef89369 --- /dev/null +++ b/packages/@vuepress/core/lib/node/__tests__/prepare/fixtures/docs-dep-theme-without-index/README.md @@ -0,0 +1 @@ +# Hello, VuePress! diff --git a/packages/@vuepress/core/lib/node/build/index.js b/packages/@vuepress/core/lib/node/build/index.js index 666e0f6a..b405108a 100644 --- a/packages/@vuepress/core/lib/node/build/index.js +++ b/packages/@vuepress/core/lib/node/build/index.js @@ -50,8 +50,6 @@ module.exports = class Build extends EventEmitter { */ async render () { - logger.wait('Extracting site metadata...') - // compile! const stats = await compile([this.clientConfig, this.serverConfig]) const serverBundle = require(path.resolve(this.outDir, 'manifest/server.json')) @@ -135,7 +133,7 @@ module.exports = class Build extends EventEmitter { */ async renderPage (page) { - const pagePath = page.path + const pagePath = decodeURIComponent(page.path) readline.clearLine(process.stdout, 0) readline.cursorTo(process.stdout, 0) process.stdout.write(`Rendering page: ${pagePath}`) @@ -145,7 +143,7 @@ module.exports = class Build extends EventEmitter { const pageMeta = renderPageMeta(meta) const context = { - url: pagePath, + url: page.path, userHeadTags: this.userHeadTags, pageMeta, title: 'VuePress', @@ -160,7 +158,7 @@ module.exports = class Build extends EventEmitter { console.error(logger.error(chalk.red(`Error rendering ${pagePath}:`), false)) throw e } - const filename = decodeURIComponent(pagePath.replace(/\/$/, '/index.html').replace(/^\//, '')) + const filename = pagePath.replace(/\/$/, '/index.html').replace(/^\//, '') const filePath = path.resolve(this.outDir, filename) await fs.ensureDir(path.dirname(filePath)) await fs.writeFile(filePath, html) diff --git a/packages/@vuepress/core/lib/node/dev/index.js b/packages/@vuepress/core/lib/node/dev/index.js index 3087a520..ccd1ec5f 100644 --- a/packages/@vuepress/core/lib/node/dev/index.js +++ b/packages/@vuepress/core/lib/node/dev/index.js @@ -176,7 +176,8 @@ module.exports = class DevProcess extends EventEmitter { .use(DevLogPlugin, [{ port: this.port, displayHost: this.displayHost, - publicPath: this.context.base + publicPath: this.context.base, + clearScreen: this.context.options.clearScreen }]) config = config.toConfig() @@ -187,6 +188,11 @@ module.exports = class DevProcess extends EventEmitter { this.webpackConfig = config } + /** + * Create dev server + * @returns {module.DevProcess} + */ + createServer () { const contentBase = path.resolve(this.context.sourceDir, '.vuepress/public') @@ -235,18 +241,32 @@ module.exports = class DevProcess extends EventEmitter { return this } - listen () { - this.server.listen(this.port, this.host, err => { - if (err) { - console.log(err) + /** + * delegate listen call. + * + * @param callback handler when connection is ready. + * @returns {module.DevProcess} + */ + + listen (callback) { + this.server.listen(this.port, this.host, (err) => { + if (typeof callback === 'function') { + callback(err) } }) return this } } +/** + * Resolve host. + * + * @param {string} host user's host + * @returns {{displayHost: string, host: string}} + */ + function resolveHost (host) { - const defaultHost = 'localhost' + const defaultHost = '0.0.0.0' host = host || defaultHost const displayHost = host === defaultHost ? 'localhost' @@ -257,6 +277,13 @@ function resolveHost (host) { } } +/** + * Resolve port. + * + * @param {number} port user's port + * @returns {Promise} + */ + async function resolvePort (port) { const portfinder = require('portfinder') portfinder.basePort = parseInt(port) || 8080 @@ -264,6 +291,14 @@ async function resolvePort (port) { return port } +/** + * Normalize file path and always return relative path, + * + * @param {string} filepath user's path + * @param {string} baseDir source directory + * @returns {string} + */ + function normalizeWatchFilePath (filepath, baseDir) { const { isAbsolute, relative } = require('path') if (isAbsolute(filepath)) { diff --git a/packages/@vuepress/core/lib/node/internal-plugins/palette/index.js b/packages/@vuepress/core/lib/node/internal-plugins/palette/index.js index 7327c4e0..49d162ec 100644 --- a/packages/@vuepress/core/lib/node/internal-plugins/palette/index.js +++ b/packages/@vuepress/core/lib/node/internal-plugins/palette/index.js @@ -31,15 +31,22 @@ module.exports = (options, ctx) => ({ ? `@import(${JSON.stringify(userPalette.replace(/[\\]+/g, '/'))})` : '' + const nullComment = '// null' + // user's palette can override theme's palette. - let paletteContent = themePaletteContent + userPaletteContent + let paletteContent = '// Theme\'s Palette\n' + + (themePaletteContent || nullComment) + + '\n\n// User\'s Palette\n' + + (userPaletteContent || nullComment) if (ctx.themeAPI.existsParentTheme) { const parentThemePalette = path.resolve(ctx.themeAPI.parentTheme.path, 'styles/palette.styl') const parentThemePaletteContent = fs.existsSync(parentThemePalette) ? `@import(${JSON.stringify(parentThemePalette.replace(/[\\]+/g, '/'))})` : '' - paletteContent = parentThemePaletteContent + paletteContent + paletteContent = '// Parent Theme\'s Palette\n' + + (parentThemePaletteContent || nullComment) + + '\n\n' + paletteContent } await writeTemp('palette.styl', paletteContent) diff --git a/packages/@vuepress/core/lib/node/internal-plugins/style/index.js b/packages/@vuepress/core/lib/node/internal-plugins/style/index.js index 2055be69..b8a54871 100644 --- a/packages/@vuepress/core/lib/node/internal-plugins/style/index.js +++ b/packages/@vuepress/core/lib/node/internal-plugins/style/index.js @@ -30,14 +30,23 @@ module.exports = (options, ctx) => ({ ? `@import(${JSON.stringify(userStyle.replace(/[\\]+/g, '/'))})` : '' - let styleContent = themeStyleContent + userStyleContent + const nullComment = '// null' + + // user's styles can override theme's styles. + let styleContent = '// Theme\'s Styles\n' + + (themeStyleContent || nullComment) + + '\n\n// User\'s Styles\n' + + (userStyleContent || nullComment) if (themeAPI.existsParentTheme) { const parentThemeStyle = path.resolve(themeAPI.parentTheme.path, 'styles/index.styl') const parentThemeStyleContent = fs.existsSync(parentThemeStyle) ? `@import(${JSON.stringify(parentThemeStyle.replace(/[\\]+/g, '/'))})` : '' - styleContent = parentThemeStyleContent + styleContent + + styleContent = '// Parent Theme\'s Styles\n' + + (parentThemeStyleContent || nullComment) + + '\n\n' + styleContent } await writeTemp('style.styl', styleContent) diff --git a/packages/@vuepress/core/lib/node/loadTheme.js b/packages/@vuepress/core/lib/node/loadTheme.js index 3cba5c0d..ac4c9587 100755 --- a/packages/@vuepress/core/lib/node/loadTheme.js +++ b/packages/@vuepress/core/lib/node/loadTheme.js @@ -9,7 +9,8 @@ const { path: { resolve, parse }, moduleResolver: { getThemeResolver }, datatypes: { isString }, - logger, chalk + logger, + chalk } = require('@vuepress/shared-utils') const ThemeAPI = require('./theme-api') @@ -32,11 +33,15 @@ const ThemeAPI = require('./theme-api') module.exports = function loadTheme (ctx) { const themeResolver = getThemeResolver() - const theme = resolveTheme(ctx, themeResolver) + if (!theme.path) { - throw new Error(`[vuepress] You must specify a theme, or create a local custom theme. \n For more details, refer to https://vuepress.vuejs.org/guide/custom-themes.html#custom-themes. \n`) + throw new Error( + '[vuepress] You must specify a theme, or create a local custom theme. \n' + + 'For more details, refer to https://vuepress.vuejs.org/guide/custom-themes.html#custom-themes. \n' + ) } + let applyTip = `Apply theme ${chalk.magenta(theme.name)}` theme.entry.name = '@vuepress/internal-theme-entry-file' @@ -46,27 +51,18 @@ module.exports = function loadTheme (ctx) { parentTheme.entry.name = '@vuepress/internal-parent-theme-entry-file' applyTip += chalk.gray(` (extends ${chalk.magenta(parentTheme.name)})`) } + logger.tip(applyTip + ' ...') logger.debug('theme', theme.name, theme.path) logger.debug('parentTheme', parentTheme.name, parentTheme.path) - return new ThemeAPI(theme, parentTheme, ctx) + return new ThemeAPI(theme, parentTheme) } function normalizeThemePath (resolved) { - const { entry, name, fromDep } = resolved + const { entry, fromDep } = resolved if (fromDep) { - const packageRoot = require.resolve(`${name}/package.json`) - const { main } = require(packageRoot) - if (main.endsWith('.vue')) { - // For those cases that "main" field is set to an non-index file - // e.g. `layouts/Layout.vue` - return packageRoot - } else { - // For those cases that "index.js" is not at package root - // e.g. `lib/index.js` (#1362) - return parse(require.resolve(name)).dir - } + return parse(require.resolve(entry)).dir } else if (entry.endsWith('.js') || entry.endsWith('.vue')) { return parse(entry).dir } else { @@ -84,25 +80,44 @@ function resolveTheme (ctx, resolver, ignoreLocal, theme) { let shortcut let entry = {} - // 1. From local - if (!ignoreLocal + /** + * 1. From `.vuepress/theme` directory. + */ + if ( + !ignoreLocal && !fs.existsSync(theme) && fs.existsSync(localThemePath) - && (fs.readdirSync(localThemePath)).length > 0 + && fs.readdirSync(localThemePath).length > 0 ) { path = localThemePath name = shortcut = 'local' logger.tip(`Apply local theme at ${chalk.gray(path)}...`) - // 2. From dep + /** + * 2. From deps or custom local path. + * - vuepress-plugin-foo + * - /path/to/a-theme/index.js + */ } else if (isString(theme)) { + /** + * To let theme resolver get the correct theme name. + */ + if (theme.endsWith('/index.js')) { + theme = theme.replace(/\/index\.js$/, '') + } + const resolved = resolver.resolve(theme, sourceDir) if (resolved.entry === null) { throw new Error(`Cannot resolve theme: ${theme}.`) } + path = normalizeThemePath(resolved) name = resolved.name shortcut = resolved.shortcut + + /** + * 3. fallback + */ } else { return {} } diff --git a/packages/@vuepress/core/lib/node/plugin-api/index.js b/packages/@vuepress/core/lib/node/plugin-api/index.js index 5a9da13a..6dc8a9e3 100644 --- a/packages/@vuepress/core/lib/node/plugin-api/index.js +++ b/packages/@vuepress/core/lib/node/plugin-api/index.js @@ -5,12 +5,12 @@ */ const instantiateOption = require('./override/instantiateOption') -const { flattenPlugin, normalizePluginsConfig } = require('./util') +const { flattenPlugin } = require('./util') const { PLUGIN_OPTION_MAP } = require('./constants') const { moduleResolver: { getPluginResolver }, datatypes: { assertTypes, isPlainObject }, - logger, chalk + logger, chalk, normalizeConfig } = require('@vuepress/shared-utils') /** @@ -22,6 +22,7 @@ module.exports = class PluginAPI { this.options = {} this._pluginContext = context this._pluginQueue = [] + this._loggedPlugins = [] this._initialized = false this._pluginResolver = getPluginResolver() this.initializeOptions(PLUGIN_OPTION_MAP) @@ -135,7 +136,7 @@ module.exports = class PluginAPI { */ useByPluginsConfig (pluginsConfig) { - pluginsConfig = normalizePluginsConfig(pluginsConfig) + pluginsConfig = normalizeConfig(pluginsConfig) pluginsConfig.forEach(([pluginRaw, pluginOptions]) => { this.use(pluginRaw, pluginOptions) }) @@ -214,8 +215,11 @@ module.exports = class PluginAPI { beforeDevServer, afterDevServer }) { - const isInternalPlugin = pluginName.startsWith('@vuepress/internal-') - logger[isInternalPlugin ? 'debug' : 'tip'](pluginLog(pluginName, shortcut)) + if (!this._loggedPlugins.includes(pluginName)) { + const isInternalPlugin = pluginName.startsWith('@vuepress/internal-') + logger[isInternalPlugin ? 'debug' : 'tip'](pluginLog(pluginName, shortcut)) + this._loggedPlugins.push(pluginName) + } this .registerOption(PLUGIN_OPTION_MAP.READY.key, ready, pluginName) diff --git a/packages/@vuepress/core/lib/node/plugin-api/util.js b/packages/@vuepress/core/lib/node/plugin-api/util.js index 706da428..b3c17a50 100644 --- a/packages/@vuepress/core/lib/node/plugin-api/util.js +++ b/packages/@vuepress/core/lib/node/plugin-api/util.js @@ -22,7 +22,7 @@ exports.flattenPlugin = function ( pluginContext, self ) { - const { valid, warnMsg } = assertTypes(pluginOptions, [Object, Boolean]) + const { valid, warnMsg } = assertTypes(pluginOptions, [Object, Array, Boolean]) if (!valid) { if (pluginOptions !== undefined) { logger.warn( @@ -43,6 +43,14 @@ exports.flattenPlugin = function ( // 'Object.create' here is to give each plugin a separate context, // but also own the inheritance context. config = config(pluginOptions, Object.create(pluginContext), self) + const { valid, warnMsg } = assertTypes(config, [Object]) + if (!valid) { + logger.warn( + `[${chalk.gray(shortcut)}] ` + + `Invalid value for plugin: ${warnMsg}` + ) + config = {} + } } // respect name in local plugin config @@ -57,34 +65,3 @@ exports.flattenPlugin = function ( $$options: pluginOptions /* used for test */ }) } - -/** - * Normalize plugins config in `.vuepress/config.js` - * - * @param pluginsConfig - */ - -exports.normalizePluginsConfig = function (pluginsConfig) { - const { valid, warnMsg } = assertTypes(pluginsConfig, [Object, Array]) - if (!valid) { - if (pluginsConfig !== undefined) { - logger.warn( - `[${chalk.gray('config')}] ` - + `Invalid value for "plugin" field : ${warnMsg}` - ) - } - pluginsConfig = [] - return pluginsConfig - } - - if (Array.isArray(pluginsConfig)) { - pluginsConfig = pluginsConfig.map(item => { - return Array.isArray(item) ? item : [item] - }) - } else if (typeof pluginsConfig === 'object') { - pluginsConfig = Object.keys(pluginsConfig).map(item => { - return [item, pluginsConfig[item]] - }) - } - return pluginsConfig -} diff --git a/packages/@vuepress/core/lib/node/theme-api/index.js b/packages/@vuepress/core/lib/node/theme-api/index.js index 2ea634e1..31263ef9 100644 --- a/packages/@vuepress/core/lib/node/theme-api/index.js +++ b/packages/@vuepress/core/lib/node/theme-api/index.js @@ -1,5 +1,9 @@ -const { logger, fs, path: { resolve }} = require('@vuepress/shared-utils') -const readdirSync = dir => fs.existsSync(dir) && fs.readdirSync(dir) || [] +const { + logger, + fs, + path: { resolve } +} = require('@vuepress/shared-utils') +const readdirSync = dir => (fs.existsSync(dir) && fs.readdirSync(dir)) || [] module.exports = class ThemeAPI { constructor (theme, parentTheme) { @@ -30,12 +34,12 @@ module.exports = class ThemeAPI { this.componentMap = this.getComponents() this.layoutComponentMap = this.getLayoutComponentMap() - Object.keys(this.componentMap).forEach((name) => { + Object.keys(this.componentMap).forEach(name => { const { filename, path } = this.componentMap[name] alias[`@theme/components/${filename}`] = path }) - Object.keys(this.layoutComponentMap).forEach((name) => { + Object.keys(this.layoutComponentMap).forEach(name => { const { filename, path } = this.layoutComponentMap[name] alias[`@theme/layouts/${filename}`] = path }) @@ -44,13 +48,9 @@ module.exports = class ThemeAPI { } getComponents () { - const componentDirs = [ - resolve(this.theme.path, 'components') - ] + const componentDirs = [resolve(this.theme.path, 'components')] if (this.existsParentTheme) { - componentDirs.unshift( - resolve(this.parentTheme.path, 'components'), - ) + componentDirs.unshift(resolve(this.parentTheme.path, 'components')) } return resolveSFCs(componentDirs) } @@ -63,15 +63,15 @@ module.exports = class ThemeAPI { if (this.existsParentTheme) { layoutDirs.unshift( resolve(this.parentTheme.path, '.'), - resolve(this.parentTheme.path, 'layouts'), + resolve(this.parentTheme.path, 'layouts') ) } // built-in named layout or not. const layoutComponentMap = resolveSFCs(layoutDirs) - const { Layout = {}, NotFound = {}} = layoutComponentMap + const { Layout, NotFound } = layoutComponentMap // layout component does not exist. - if (!Layout || !fs.existsSync(Layout.path)) { + if (!Layout) { const fallbackLayoutPath = resolve(__dirname, 'Layout.fallback.vue') layoutComponentMap.Layout = { filename: 'Layout.vue', @@ -80,11 +80,11 @@ module.exports = class ThemeAPI { isInternal: true } logger.warn( - `[vuepress] Cannot resolve Layout.vue file in \n ${Layout.path},` - + `fallback to default layout: ${fallbackLayoutPath}` + `[vuepress] Cannot resolve Layout.vue file in \n ${Layout.path}, ` + + `fallback to default layout: ${fallbackLayoutPath}` ) } - if (!NotFound || !fs.existsSync(NotFound.path)) { + if (!NotFound) { layoutComponentMap.NotFound = { filename: 'NotFound.vue', componentName: 'NotFound', @@ -104,25 +104,28 @@ module.exports = class ThemeAPI { */ function resolveSFCs (dirs) { - return dirs.map( - layoutDir => readdirSync(layoutDir) - .filter(filename => filename.endsWith('.vue')) - .map(filename => { - const componentName = getComponentName(filename) - return { - filename, - componentName, - isInternal: isInternal(componentName), - path: resolve(layoutDir, filename) - } - }) - ).reduce((arr, next) => { - arr.push(...next) - return arr - }, []).reduce((map, component) => { - map[component.componentName] = component - return map - }, {}) + return dirs + .map(layoutDir => + readdirSync(layoutDir) + .filter(filename => filename.endsWith('.vue')) + .map(filename => { + const componentName = getComponentName(filename) + return { + filename, + componentName, + isInternal: isInternal(componentName), + path: resolve(layoutDir, filename) + } + }) + ) + .reduce((arr, next) => { + arr.push(...next) + return arr + }, []) + .reduce((map, component) => { + map[component.componentName] = component + return map + }, {}) } /** diff --git a/packages/@vuepress/core/lib/node/util/index.js b/packages/@vuepress/core/lib/node/util/index.js index 20b97a51..1a5d914e 100644 --- a/packages/@vuepress/core/lib/node/util/index.js +++ b/packages/@vuepress/core/lib/node/util/index.js @@ -54,13 +54,16 @@ exports.applyUserWebpackConfig = function (userConfig, config, isServer) { const DATE_RE = /(\d{4}-\d{1,2}(-\d{1,2})?)-(.*)/ exports.DATE_RE = DATE_RE -exports.inferDate = function (frontmatter = {}, filename) { +exports.inferDate = function (frontmatter = {}, filename, dirname) { + let matches + if (frontmatter.date) { return frontmatter.date + } else if (filename && (matches = filename.match(DATE_RE))) { + return matches[1] + } else if (dirname && (matches = dirname.match(DATE_RE))) { + return matches[1] + } else { + return null } - const match = filename.match(DATE_RE) - if (match) { - return match[1] - } - return null } diff --git a/packages/@vuepress/core/lib/node/webpack/DevLogPlugin.js b/packages/@vuepress/core/lib/node/webpack/DevLogPlugin.js index b51927e6..1296a82e 100644 --- a/packages/@vuepress/core/lib/node/webpack/DevLogPlugin.js +++ b/packages/@vuepress/core/lib/node/webpack/DevLogPlugin.js @@ -17,10 +17,13 @@ module.exports = class DevLogPlugin { apply (compiler) { let isFirst = true + const { displayHost, port, publicPath, clearScreen: shouldClearScreen = true } = this.options + compiler.hooks.done.tap('vuepress-log', stats => { - clearScreen() + if (shouldClearScreen) { + clearScreen() + } - const { displayHost, port, publicPath } = this.options const time = new Date().toTimeString().match(/^[\d:]+/)[0] const displayUrl = `http://${displayHost}:${port}${publicPath}` @@ -30,7 +33,7 @@ module.exports = class DevLogPlugin { + ( isFirst ? '' - : `${chalk.gray(`(${displayUrl})`)}` + : `${chalk.gray(`( ${displayUrl} )`)}` ) ) if (isFirst) { @@ -40,7 +43,9 @@ module.exports = class DevLogPlugin { logger.developer(`It took a total of ${chalk.cyan(`${duration}ms`)} to run the ${chalk.cyan('vuepress dev')} for the first time.`) } }) - compiler.hooks.invalid.tap('vuepress-log', clearScreen) + if (shouldClearScreen) { + compiler.hooks.invalid.tap('vuepress-log', clearScreen) + } } } diff --git a/packages/@vuepress/core/lib/node/webpack/createBaseConfig.js b/packages/@vuepress/core/lib/node/webpack/createBaseConfig.js index 1bbd5caf..d1e98962 100644 --- a/packages/@vuepress/core/lib/node/webpack/createBaseConfig.js +++ b/packages/@vuepress/core/lib/node/webpack/createBaseConfig.js @@ -127,7 +127,10 @@ module.exports = function createBaseConfig (context, isServer) { .loader('pug-plain-loader') .end() - if (!siteConfig.evergreen) { + const evergreen = typeof siteConfig.evergreen === 'function' + ? siteConfig.evergreen() + : siteConfig.evergreen + if (!evergreen) { const libDir = path.join(__dirname, '..') config.module .rule('js') @@ -141,6 +144,10 @@ module.exports = function createBaseConfig (context, isServer) { if (/\.vue\.js$/.test(filePath)) { return false } + // transpile all core files + if (/(@vuepress|vuepress-)\/^((?!node_modules).)*\.js$/.test(filePath)) { + return false + } // Don't transpile node_modules return /node_modules/.test(filePath) }).end() @@ -224,12 +231,13 @@ module.exports = function createBaseConfig (context, isServer) { } rule.use('css-loader') - .loader(isServer ? 'css-loader/locals' : 'css-loader') + .loader('css-loader') .options({ modules, localIdentName: `[local]_[hash:base64:8]`, importLoaders: 1, - sourceMap: !isProd + sourceMap: !isProd, + exportOnlyLocals: isServer }) rule.use('postcss-loader').loader('postcss-loader').options(Object.assign({ @@ -306,5 +314,5 @@ function getLastCommitHash () { } function getModulePaths () { - return [path.resolve(process.cwd(), 'node_modules')].concat(module.paths) + return module.paths.concat([path.resolve(process.cwd(), 'node_modules')]) } diff --git a/packages/@vuepress/core/lib/node/webpack/createClientConfig.js b/packages/@vuepress/core/lib/node/webpack/createClientConfig.js index d6a8262c..c4aaae75 100644 --- a/packages/@vuepress/core/lib/node/webpack/createClientConfig.js +++ b/packages/@vuepress/core/lib/node/webpack/createClientConfig.js @@ -7,6 +7,7 @@ module.exports = function createClientConfig (ctx) { const { env } = require('@vuepress/shared-utils') const createBaseConfig = require('./createBaseConfig') + const safeParser = require('postcss-safe-parser') const config = createBaseConfig(ctx) @@ -49,7 +50,7 @@ module.exports = function createClientConfig (ctx) { .use(require('optimize-css-assets-webpack-plugin'), [{ canPrint: false, cssProcessorOptions: { - safe: true, + parser: safeParser, autoprefixer: { disable: true }, mergeLonghand: false } diff --git a/packages/@vuepress/core/lib/node/webpack/createServerConfig.js b/packages/@vuepress/core/lib/node/webpack/createServerConfig.js index 7a43691d..c8b3db63 100644 --- a/packages/@vuepress/core/lib/node/webpack/createServerConfig.js +++ b/packages/@vuepress/core/lib/node/webpack/createServerConfig.js @@ -16,7 +16,7 @@ module.exports = function createServerConfig (ctx) { config .target('node') - .externals([/^vue|vue-router$/]) + .externals([/^(vue|vue-router)$/]) .devtool('source-map') // no need to minimize server build diff --git a/packages/@vuepress/core/package.json b/packages/@vuepress/core/package.json index a71e6054..e7e14e3c 100644 --- a/packages/@vuepress/core/package.json +++ b/packages/@vuepress/core/package.json @@ -1,6 +1,6 @@ { "name": "@vuepress/core", - "version": "1.0.0-alpha.42", + "version": "1.0.4", "description": "Minimalistic doc generator with Vue component based layout system", "main": "lib/index.js", "typings": "lib/types/index.d.ts", @@ -34,28 +34,28 @@ "@types/webpack-chain": "^5.0.1", "@types/webpack-dev-server": "^3.1.2", "@vue/babel-preset-app": "^3.1.1", - "@vuepress/markdown": "^1.0.0-alpha.42", - "@vuepress/markdown-loader": "^1.0.0-alpha.42", - "@vuepress/plugin-container": "^1.0.0-alpha.42", - "@vuepress/plugin-last-updated": "^1.0.0-alpha.42", - "@vuepress/plugin-register-components": "^1.0.0-alpha.42", - "@vuepress/shared-utils": "^1.0.0-alpha.42", - "autoprefixer": "^7.1.2", + "@vuepress/markdown": "^1.0.4", + "@vuepress/markdown-loader": "^1.0.4", + "@vuepress/plugin-last-updated": "^1.0.4", + "@vuepress/plugin-register-components": "^1.0.4", + "@vuepress/shared-utils": "^1.0.4", + "autoprefixer": "^9.5.1", "babel-loader": "^8.0.4", - "cache-loader": "^1.2.2", + "cache-loader": "^3.0.0", "chokidar": "^2.0.3", "connect-history-api-fallback": "^1.5.0", - "copy-webpack-plugin": "^4.5.1", + "copy-webpack-plugin": "^5.0.2", "cross-spawn": "^6.0.5", - "css-loader": "^0.28.11", - "file-loader": "^1.1.11", + "css-loader": "^2.1.1", + "file-loader": "^3.0.1", "js-yaml": "^3.11.0", "lru-cache": "^5.1.1", - "mini-css-extract-plugin": "0.4.4", - "optimize-css-assets-webpack-plugin": "^4.0.0", + "mini-css-extract-plugin": "0.6.0", + "optimize-css-assets-webpack-plugin": "^5.0.1", "portfinder": "^1.0.13", - "postcss-loader": "^2.1.5", - "toml": "^2.3.3", + "postcss-loader": "^3.0.0", + "postcss-safe-parser": "^4.0.1", + "toml": "^3.0.0", "url-loader": "^1.0.1", "vue": "^2.5.16", "vue-loader": "^15.2.4", @@ -63,11 +63,12 @@ "vue-server-renderer": "^2.5.16", "vue-template-compiler": "^2.5.16", "vuepress-html-webpack-plugin": "^3.2.0", + "vuepress-plugin-container": "^2.0.0", "webpack": "^4.8.1", "webpack-chain": "^4.6.0", - "webpack-dev-server": "^3.1.14", + "webpack-dev-server": "^3.5.1", "webpack-merge": "^4.1.2", - "webpackbar": "^2.6.1" + "webpackbar": "3.2.0" }, "engines": { "node": ">=8.6" diff --git a/packages/@vuepress/markdown-loader/index.js b/packages/@vuepress/markdown-loader/index.js index 552ad652..4861d2c5 100644 --- a/packages/@vuepress/markdown-loader/index.js +++ b/packages/@vuepress/markdown-loader/index.js @@ -6,10 +6,11 @@ const { EventEmitter } = require('events') const { getOptions } = require('loader-utils') -const { fs, path, parseFrontmatter, inferTitle, extractHeaders } = require('@vuepress/shared-utils') +const { fs, path, hash, parseFrontmatter, inferTitle, extractHeaders } = require('@vuepress/shared-utils') const LRU = require('lru-cache') const md = require('@vuepress/markdown') +const cache = new LRU({ max: 1000 }) const devCache = new LRU({ max: 1000 }) /** @@ -31,18 +32,26 @@ module.exports = function (src) { // vue-loader, and will be applied on the same file multiple times when // selecting the individual blocks. const file = this.resourcePath - const { content, data } = parseFrontmatter(src) + const key = hash(file + src) + const cached = cache.get(key) + if (cached && (isProd || /\?vue/.test(this.resourceQuery))) { + return cached + } + + const frontmatter = parseFrontmatter(src) + const content = frontmatter.content if (!isProd && !isServer) { - const inferredTitle = inferTitle(data, content) + const inferredTitle = inferTitle(frontmatter.data, frontmatter.content) const headers = extractHeaders(content, ['h2', 'h3'], markdown) + delete frontmatter.content // diff frontmatter and title, since they are not going to be part of the // returned component, changes in frontmatter do not trigger proper updates const cachedData = devCache.get(file) if (cachedData && ( cachedData.inferredTitle !== inferredTitle - || JSON.stringify(cachedData.frontmatterData) !== JSON.stringify(data) + || JSON.stringify(cachedData.frontmatterData) !== JSON.stringify(frontmatter.data) || headersChanged(cachedData.headers, headers) )) { // frontmatter changed... need to do a full reload @@ -51,7 +60,7 @@ module.exports = function (src) { devCache.set(file, { headers, - frontmatterData: data, + frontmatterData: frontmatter.data, inferredTitle }) } @@ -64,8 +73,8 @@ module.exports = function (src) { dataBlockString } = markdown.render(content, { loader, - frontmatter: data, - relPath: path.relative(sourceDir, file) + frontmatter: frontmatter.data, + relativePath: path.relative(sourceDir, file).replace(/\\/g, '/') }) // check if relative links are valid @@ -105,6 +114,7 @@ module.exports = function (src) { + (hoistedTags || []).join('\n') + `\n${dataBlockString}\n` ) + cache.set(key, res) return res } diff --git a/packages/@vuepress/markdown-loader/package.json b/packages/@vuepress/markdown-loader/package.json index 56920bcb..0a9f1976 100644 --- a/packages/@vuepress/markdown-loader/package.json +++ b/packages/@vuepress/markdown-loader/package.json @@ -1,6 +1,6 @@ { "name": "@vuepress/markdown-loader", - "version": "1.0.0-alpha.42", + "version": "1.0.4", "description": "markdown-loader for vuepress", "main": "index.js", "publishConfig": { @@ -18,7 +18,7 @@ "generator" ], "dependencies": { - "@vuepress/markdown": "^1.0.0-alpha.42", + "@vuepress/markdown": "^1.0.4", "loader-utils": "^1.1.0", "lru-cache": "^5.1.1" }, diff --git a/packages/@vuepress/markdown/__tests__/__snapshots__/snippet.spec.js.snap b/packages/@vuepress/markdown/__tests__/__snapshots__/snippet.spec.js.snap index 1514907d..65148982 100644 --- a/packages/@vuepress/markdown/__tests__/__snapshots__/snippet.spec.js.snap +++ b/packages/@vuepress/markdown/__tests__/__snapshots__/snippet.spec.js.snap @@ -1,5 +1,15 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`snippet import snippets when the file has a space in the file path 1`] = ` +
+
 
+
 
+
 

+
export default function () { +// .. +} +`; + exports[`snippet import snippet 1`] = `
export default function () {
   // ..
diff --git a/packages/@vuepress/markdown/__tests__/fragments/code-snippet-with-space-in-path.md b/packages/@vuepress/markdown/__tests__/fragments/code-snippet-with-space-in-path.md
new file mode 100644
index 00000000..659cb258
--- /dev/null
+++ b/packages/@vuepress/markdown/__tests__/fragments/code-snippet-with-space-in-path.md
@@ -0,0 +1 @@
+<<< @/packages/@vuepress/markdown/__tests__/fragments/snippet with spaces.js {1-3}
diff --git a/packages/@vuepress/markdown/__tests__/fragments/snippet with spaces.js b/packages/@vuepress/markdown/__tests__/fragments/snippet with spaces.js
new file mode 100644
index 00000000..575039d1
--- /dev/null
+++ b/packages/@vuepress/markdown/__tests__/fragments/snippet with spaces.js	
@@ -0,0 +1,3 @@
+export default function () {
+  // ..
+}
diff --git a/packages/@vuepress/markdown/__tests__/link.spec.js b/packages/@vuepress/markdown/__tests__/link.spec.js
index c9416201..ee144bc1 100644
--- a/packages/@vuepress/markdown/__tests__/link.spec.js
+++ b/packages/@vuepress/markdown/__tests__/link.spec.js
@@ -10,7 +10,7 @@ const mdL = Md().use(link, {
 dataReturnable(mdL)
 
 const internalLinkAsserts = {
-  // START abosolute path usage
+  // START absolute path usage
   '/': '/',
 
   '/foo/': '/foo/',
@@ -18,7 +18,7 @@ const internalLinkAsserts = {
 
   '/foo/two.md': '/foo/two.html',
   '/foo/two.html': '/foo/two.html',
-  // END abosolute path usage
+  // END absolute path usage
 
   // START relative path usage
   'README.md': './',
diff --git a/packages/@vuepress/markdown/__tests__/snippet.spec.js b/packages/@vuepress/markdown/__tests__/snippet.spec.js
index bd3a23cf..e8e25ea7 100644
--- a/packages/@vuepress/markdown/__tests__/snippet.spec.js
+++ b/packages/@vuepress/markdown/__tests__/snippet.spec.js
@@ -24,4 +24,10 @@ describe('snippet', () => {
     const output = mdH.render(input)
     expect(output).toMatchSnapshot()
   })
+
+  test('import snippets when the file has a space in the file path', () => {
+    const input = getFragment(__dirname, 'code-snippet-with-space-in-path.md')
+    const output = mdH.render(input)
+    expect(output).toMatchSnapshot()
+  })
 })
diff --git a/packages/@vuepress/markdown/index.js b/packages/@vuepress/markdown/index.js
index dd5271d9..fae5948a 100644
--- a/packages/@vuepress/markdown/index.js
+++ b/packages/@vuepress/markdown/index.js
@@ -5,7 +5,6 @@
  */
 
 const Config = require('markdown-it-chain')
-const LRUCache = require('lru-cache')
 const highlight = require('./lib/highlight')
 const { PLUGINS, REQUIRED_PLUGINS } = require('./lib/constant')
 const highlightLinesPlugin = require('./lib/highlightLines')
@@ -15,10 +14,15 @@ const componentPlugin = require('./lib/component')
 const hoistScriptStylePlugin = require('./lib/hoist')
 const convertRouterLinkPlugin = require('./lib/link')
 const snippetPlugin = require('./lib/snippet')
-const tocPlugin = require('./lib/tableOfContents')
 const emojiPlugin = require('markdown-it-emoji')
 const anchorPlugin = require('markdown-it-anchor')
-const { slugify: _slugify, logger, chalk, hash } = require('@vuepress/shared-utils')
+const tocPlugin = require('markdown-it-table-of-contents')
+const {
+  slugify: _slugify,
+  parseHeaders,
+  logger, chalk, normalizeConfig,
+  moduleResolver: { getMarkdownItResolver }
+} = require('@vuepress/shared-utils')
 
 /**
  * Create markdown by config.
@@ -29,11 +33,14 @@ module.exports = (markdown = {}) => {
     externalLinks,
     anchor,
     toc,
+    plugins,
     lineNumbers,
     beforeInstantiate,
     afterInstantiate
   } = markdown
 
+  const resolver = getMarkdownItResolver()
+
   // allow user config slugify
   const slugify = markdown.slugify || _slugify
 
@@ -87,7 +94,11 @@ module.exports = (markdown = {}) => {
       .end()
 
     .plugin(PLUGINS.TOC)
-      .use(tocPlugin, [toc])
+      .use(tocPlugin, [Object.assign({
+        slugify,
+        includeLevel: [2, 3],
+        format: parseHeaders
+      }, toc)])
       .end()
 
   if (lineNumbers) {
@@ -100,22 +111,17 @@ module.exports = (markdown = {}) => {
 
   const md = config.toMd(require('markdown-it'), markdown)
 
-  afterInstantiate && afterInstantiate(md)
-
-  // override parse to allow cache
-  const parse = md.parse
-  const cache = new LRUCache({ max: 1000 })
-  md.parse = (src, env) => {
-    const key = hash(src + env.relPath)
-    const cached = cache.get(key)
-    if (cached) {
-      return cached
+  const pluginsConfig = normalizeConfig(plugins || [])
+  pluginsConfig.forEach(([pluginRaw, pluginOptions]) => {
+    const plugin = resolver.resolve(pluginRaw)
+    if (plugin.entry) {
+      md.use(plugin.entry, pluginOptions)
     } else {
-      const tokens = parse.call(md, src, env)
-      cache.set(key, tokens)
-      return tokens
+      // TODO: error handling
     }
-  }
+  })
+
+  afterInstantiate && afterInstantiate(md)
 
   module.exports.dataReturnable(md)
 
diff --git a/packages/@vuepress/markdown/lib/highlight.js b/packages/@vuepress/markdown/lib/highlight.js
index ea974db1..9f1689a9 100644
--- a/packages/@vuepress/markdown/lib/highlight.js
+++ b/packages/@vuepress/markdown/lib/highlight.js
@@ -39,6 +39,10 @@ module.exports = (str, lang) => {
   if (lang === 'yml') {
     lang = 'yaml'
   }
+  if (lang === 'styl') {
+    lang = 'stylus'
+  }
+
   if (!prism.languages[lang]) {
     try {
       loadLanguages([lang])
diff --git a/packages/@vuepress/markdown/lib/link.js b/packages/@vuepress/markdown/lib/link.js
index 6e8d2a04..48551b4e 100644
--- a/packages/@vuepress/markdown/lib/link.js
+++ b/packages/@vuepress/markdown/lib/link.js
@@ -11,7 +11,7 @@ module.exports = (md, externalAttrs) => {
   let hasOpenExternalLink = false
 
   md.renderer.rules.link_open = (tokens, idx, options, env, self) => {
-    const { relPath } = env
+    const { relativePath } = env
     const token = tokens[idx]
     const hrefIndex = token.attrIndex('href')
     if (hrefIndex >= 0) {
@@ -28,13 +28,13 @@ module.exports = (md, externalAttrs) => {
         }
       } else if (isSourceLink) {
         hasOpenRouterLink = true
-        tokens[idx] = toRouterLink(token, link, relPath)
+        tokens[idx] = toRouterLink(token, link, relativePath)
       }
     }
     return self.renderToken(tokens, idx, options)
   }
 
-  function toRouterLink (token, link, relPath) {
+  function toRouterLink (token, link, relativePath) {
     link[0] = 'to'
     let to = link[1]
 
@@ -44,8 +44,8 @@ module.exports = (md, externalAttrs) => {
 
     // relative path usage.
     if (!to.startsWith('/')) {
-      to = relPath
-        ? url.resolve('/' + relPath, to)
+      to = relativePath
+        ? url.resolve('/' + relativePath, to)
         : ensureBeginningDotSlash(to)
     }
 
diff --git a/packages/@vuepress/markdown/lib/snippet.js b/packages/@vuepress/markdown/lib/snippet.js
index b0b88f18..7713da90 100644
--- a/packages/@vuepress/markdown/lib/snippet.js
+++ b/packages/@vuepress/markdown/lib/snippet.js
@@ -44,7 +44,7 @@ module.exports = function snippet (md, options = {}) {
     const start = pos + 3
     const end = state.skipSpacesBack(max, pos)
     const rawPath = state.src.slice(start, end).trim().replace(/^@/, root)
-    const filename = rawPath.split(/[{\s]/).shift()
+    const filename = rawPath.split(/{/).shift().trim()
     const meta = rawPath.replace(filename, '')
 
     state.line = startLine + 1
diff --git a/packages/@vuepress/markdown/lib/tableOfContents.js b/packages/@vuepress/markdown/lib/tableOfContents.js
deleted file mode 100644
index 5e32161e..00000000
--- a/packages/@vuepress/markdown/lib/tableOfContents.js
+++ /dev/null
@@ -1,83 +0,0 @@
-// reference: https://github.com/Oktavilla/markdown-it-table-of-contents
-
-const defaults = {
-  includeLevel: [2, 3],
-  containerClass: 'table-of-contents',
-  markerPattern: /^\[\[toc\]\]/im,
-  listType: 'ul',
-  containerHeaderHtml: '',
-  containerFooterHtml: ''
-}
-
-module.exports = (md, options) => {
-  options = Object.assign({}, defaults, options)
-  const tocRegexp = options.markerPattern
-
-  function toc (state, silent) {
-    var token
-    var match
-
-    // Reject if the token does not start with [
-    if (state.src.charCodeAt(state.pos) !== 0x5B /* [ */) {
-      return false
-    }
-    // Don't run any pairs in validation mode
-    if (silent) {
-      return false
-    }
-
-    // Detect TOC markdown
-    match = tocRegexp.exec(state.src)
-    match = !match ? [] : match.filter(function (m) { return m })
-    if (match.length < 1) {
-      return false
-    }
-
-    // Build content
-    token = state.push('toc_open', 'toc', 1)
-    token.markup = '[[toc]]'
-    token = state.push('toc_body', '', 0)
-    token = state.push('toc_close', 'toc', -1)
-
-    // Update pos so the parser can continue
-    var newline = state.src.indexOf('\n')
-    if (newline !== -1) {
-      state.pos = state.pos + newline
-    } else {
-      state.pos = state.pos + state.posMax + 1
-    }
-
-    return true
-  }
-
-  md.renderer.rules.toc_open = function () {
-    return vBindEscape``
-  }
-
-  md.renderer.rules.toc_body = function () {
-    return ``
-      + ``
-  }
-
-  md.renderer.rules.toc_close = function () {
-    return ``
-  }
-
-  // Insert TOC
-  md.inline.ruler.after('emphasis', 'toc', toc)
-}
-
-/** escape double quotes in v-bind derivatives */
-function vBindEscape (strs, ...args) {
-  return strs.reduce((prev, curr, index) => {
-    return prev + curr + (index >= args.length
-      ? ''
-      : `"${JSON.stringify(args[index])
-        .replace(/"/g, "'")
-        .replace(/([^\\])(\\\\)*\\'/g, (_, char) => char + '\\u0022')}"`)
-  }, '')
-}
diff --git a/packages/@vuepress/markdown/package.json b/packages/@vuepress/markdown/package.json
index 412180b3..a992c841 100644
--- a/packages/@vuepress/markdown/package.json
+++ b/packages/@vuepress/markdown/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@vuepress/markdown",
-  "version": "1.0.0-alpha.42",
+  "version": "1.0.4",
   "description": "markdown for vuepress",
   "main": "index.js",
   "publishConfig": {
@@ -19,16 +19,16 @@
     "markdown"
   ],
   "dependencies": {
-    "@vuepress/shared-utils": "^1.0.0-alpha.42",
-    "lru-cache": "^5.1.1",
+    "@vuepress/shared-utils": "^1.0.4",
     "markdown-it": "^8.4.1",
     "markdown-it-anchor": "^5.0.2",
     "markdown-it-chain": "^1.3.0",
     "markdown-it-emoji": "^1.4.0",
+    "markdown-it-table-of-contents": "^0.4.0",
     "prismjs": "^1.13.0"
   },
   "devDependencies": {
-    "@vuepress/test-utils": "^1.0.0-alpha.42"
+    "@vuepress/test-utils": "^1.0.4"
   },
   "author": "Evan You",
   "maintainers": [
diff --git a/packages/@vuepress/plugin-active-header-links/README.md b/packages/@vuepress/plugin-active-header-links/README.md
index 44293e9d..8201c2a3 100644
--- a/packages/@vuepress/plugin-active-header-links/README.md
+++ b/packages/@vuepress/plugin-active-header-links/README.md
@@ -2,4 +2,4 @@
 
 > active-header-links plugin for vuepress
 
-See [documentation](https://vuepress.vuejs.org/plugin/official/plugin-active-header-links.html).
+See [documentation](https://v1.vuepress.vuejs.org/plugin/official/plugin-active-header-links.html).
diff --git a/packages/@vuepress/plugin-active-header-links/clientRootMixin.js b/packages/@vuepress/plugin-active-header-links/clientRootMixin.js
index 20ec55e6..06710dd2 100644
--- a/packages/@vuepress/plugin-active-header-links/clientRootMixin.js
+++ b/packages/@vuepress/plugin-active-header-links/clientRootMixin.js
@@ -23,6 +23,13 @@ export default {
         document.body.scrollTop
       )
 
+      const scrollHeight = Math.max(
+        document.documentElement.scrollHeight,
+        document.body.scrollHeight
+      )
+
+      const bottomY = window.innerHeight + scrollTop
+
       for (let i = 0; i < anchors.length; i++) {
         const anchor = anchors[i]
         const nextAnchor = anchors[i + 1]
@@ -31,9 +38,19 @@ export default {
           || (scrollTop >= anchor.parentElement.offsetTop + 10
             && (!nextAnchor || scrollTop < nextAnchor.parentElement.offsetTop - 10))
 
-        if (isActive && decodeURIComponent(this.$route.hash) !== decodeURIComponent(anchor.hash)) {
+        const routeHash = decodeURIComponent(this.$route.hash)
+        if (isActive && routeHash !== decodeURIComponent(anchor.hash)) {
+          const activeAnchor = anchor
+          // check if anchor is at the bottom of the page to keep $route.hash consistent
+          if (bottomY === scrollHeight) {
+            for (let j = i + 1; j < anchors.length; j++) {
+              if (routeHash === decodeURIComponent(anchors[j].hash)) {
+                return
+              }
+            }
+          }
           this.$vuepress.$set('disableScrollBehavior', true)
-          this.$router.replace(decodeURIComponent(anchor.hash), () => {
+          this.$router.replace(decodeURIComponent(activeAnchor.hash), () => {
             // execute after scrollBehavior handler.
             this.$nextTick(() => {
               this.$vuepress.$set('disableScrollBehavior', false)
diff --git a/packages/@vuepress/plugin-active-header-links/package.json b/packages/@vuepress/plugin-active-header-links/package.json
index cedc5abe..2727ee56 100644
--- a/packages/@vuepress/plugin-active-header-links/package.json
+++ b/packages/@vuepress/plugin-active-header-links/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@vuepress/plugin-active-header-links",
-  "version": "1.0.0-alpha.42",
+  "version": "1.0.4",
   "description": "active-header-links plugin for vuepress",
   "main": "index.js",
   "publishConfig": {
diff --git a/packages/@vuepress/plugin-back-to-top/README.md b/packages/@vuepress/plugin-back-to-top/README.md
index bfce48ba..a0ca6c3d 100644
--- a/packages/@vuepress/plugin-back-to-top/README.md
+++ b/packages/@vuepress/plugin-back-to-top/README.md
@@ -2,4 +2,4 @@
 
 > Back-to-top plugin for vuepress
 
-See [documentation](https://vuepress.vuejs.org/plugin/official/plugin-back-to-top.html).
+See [documentation](https://v1.vuepress.vuejs.org/plugin/official/plugin-back-to-top.html).
diff --git a/packages/@vuepress/plugin-back-to-top/package.json b/packages/@vuepress/plugin-back-to-top/package.json
index 031e4808..2a259354 100644
--- a/packages/@vuepress/plugin-back-to-top/package.json
+++ b/packages/@vuepress/plugin-back-to-top/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@vuepress/plugin-back-to-top",
-  "version": "1.0.0-alpha.42",
+  "version": "1.0.4",
   "description": "back-to-top plugin for vuepress",
   "main": "index.js",
   "publishConfig": {
diff --git a/packages/@vuepress/plugin-blog/.npmignore b/packages/@vuepress/plugin-blog/.npmignore
deleted file mode 100644
index 13c38ea3..00000000
--- a/packages/@vuepress/plugin-blog/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-__tests__
-__mocks__
-.temp
diff --git a/packages/@vuepress/plugin-blog/README.md b/packages/@vuepress/plugin-blog/README.md
deleted file mode 100644
index 267ebcd5..00000000
--- a/packages/@vuepress/plugin-blog/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# @vuepress/plugin-blog
-
-> blog plugin for vuepress
-
-See [documentation](https://vuepress.vuejs.org/plugin/official/plugin-blog.html).
-
-
-
-
diff --git a/packages/@vuepress/plugin-blog/enhanceAppFile.js b/packages/@vuepress/plugin-blog/enhanceAppFile.js
deleted file mode 100644
index 98b88de7..00000000
--- a/packages/@vuepress/plugin-blog/enhanceAppFile.js
+++ /dev/null
@@ -1,63 +0,0 @@
-import { findPageByKey } from '@app/util'
-import tagMeta from '@dynamic/tag'
-import categoryMeta from '@dynamic/category'
-
-class Classifiable {
-  constructor (metaMap, pages) {
-    this._metaMap = Object.assign({}, metaMap)
-    Object.keys(this._metaMap).forEach(name => {
-      const { pageKeys } = this._metaMap[name]
-      this._metaMap[name].posts = pageKeys.map(key => findPageByKey(pages, key))
-    })
-  }
-
-  get length () {
-    return Object.keys(this._metaMap).length
-  }
-
-  get map () {
-    return this._metaMap
-  }
-
-  get list () {
-    return this.toArray()
-  }
-
-  toArray () {
-    const tags = []
-    Object.keys(this._metaMap).forEach(name => {
-      const { posts, path } = this._metaMap[name]
-      tags.push({ name, posts, path })
-    })
-    return tags
-  }
-
-  getItemByName (name) {
-    return this._metaMap[name]
-  }
-}
-
-export default ({ Vue }) => {
-  Vue.mixin({
-    computed: {
-      $tags () {
-        const { pages } = this.$site
-        const tags = new Classifiable(tagMeta, pages)
-        return tags
-      },
-      $tag () {
-        const tagName = this.$route.meta.tagName
-        return this.$tags.getItemByName(tagName)
-      },
-      $categories () {
-        const { pages } = this.$site
-        const categories = new Classifiable(categoryMeta, pages)
-        return categories
-      },
-      $category () {
-        const categoryName = this.$route.meta.categoryName
-        return this.$categories.getItemByName(categoryName)
-      }
-    }
-  })
-}
diff --git a/packages/@vuepress/plugin-blog/index.js b/packages/@vuepress/plugin-blog/index.js
deleted file mode 100644
index 697c33fc..00000000
--- a/packages/@vuepress/plugin-blog/index.js
+++ /dev/null
@@ -1,166 +0,0 @@
-const { path, datatypes: { isString }} = require('@vuepress/shared-utils')
-
-module.exports = (options, ctx) => {
-  const { themeAPI: { layoutComponentMap }} = ctx
-  const {
-    pageEnhancers = [],
-    postsDir = '_posts',
-    categoryIndexPageUrl = '/category/',
-    tagIndexPageUrl = '/tag/',
-    permalink = '/:year/:month/:day/:slug'
-  } = options
-
-  const isLayoutExists = name => layoutComponentMap[name] !== undefined
-  const getLayout = (name, fallback) => isLayoutExists(name) ? name : fallback
-  const isDirectChild = regularPath => path.parse(regularPath).dir === '/'
-
-  const enhancers = [
-    {
-      when: ({ regularPath }) => regularPath === categoryIndexPageUrl,
-      frontmatter: { layout: getLayout('Categories', 'Page') }
-    },
-    {
-      when: ({ regularPath }) => regularPath.startsWith('/category/'),
-      frontmatter: { layout: getLayout('Category', 'Page') }
-    },
-    {
-      when: ({ regularPath }) => regularPath === tagIndexPageUrl,
-      frontmatter: { layout: getLayout('Tags', 'Page') }
-    },
-    {
-      when: ({ regularPath }) => regularPath.startsWith('/tag/'),
-      frontmatter: { layout: getLayout('Tag', 'Page') }
-    },
-    {
-      when: ({ regularPath }) => regularPath === '/',
-      frontmatter: { layout: getLayout('Layout') }
-    },
-    {
-      when: ({ regularPath }) => regularPath.startsWith(`/${postsDir}/`),
-      frontmatter: {
-        layout: getLayout('Post', 'Page'),
-        permalink: permalink
-      },
-      data: { type: 'post' }
-    },
-    ...pageEnhancers,
-    {
-      when: ({ regularPath }) => isDirectChild(regularPath),
-      frontmatter: { layout: getLayout('Page', 'Layout') },
-      data: { type: 'page' }
-    }
-  ]
-
-  return {
-    /**
-     * Modify page's metadata according to the habits of blog users.
-     */
-    extendPageData (pageCtx) {
-      const { frontmatter: rawFrontmatter } = pageCtx
-
-      enhancers.forEach(({
-        when,
-        data = {},
-        frontmatter = {}
-      }) => {
-        if (when(pageCtx)) {
-          Object.keys(frontmatter).forEach(key => {
-            if (!rawFrontmatter[key]) {
-              rawFrontmatter[key] = frontmatter[key]
-            }
-          })
-          Object.assign(pageCtx, data)
-        }
-      })
-    },
-
-    /**
-     * Create tag page and category page.
-     */
-    async ready () {
-      const { pages } = ctx
-      const tagMap = {}
-      const categoryMap = {}
-
-      const curryHandler = (scope, map) => (key, pageKey) => {
-        if (key) {
-          if (!map[key]) {
-            map[key] = {}
-            map[key].path = `/${scope}/${key}.html`
-            map[key].pageKeys = []
-          }
-          map[key].pageKeys.push(pageKey)
-        }
-      }
-
-      const handleTag = curryHandler('tag', tagMap)
-      const handleCategory = curryHandler('category', categoryMap)
-
-      pages.forEach(({
-        key,
-        frontmatter: {
-          tag,
-          tags,
-          category,
-          categories
-        }
-      }) => {
-        if (isString(tag)) {
-          handleTag(tag, key)
-        }
-        if (Array.isArray(tags)) {
-          tags.forEach(tag => handleTag(tag, key))
-        }
-        if (isString(category)) {
-          handleCategory(category, key)
-        }
-        if (Array.isArray(categories)) {
-          categories.forEach(category => handleCategory(category, key))
-        }
-      })
-
-      ctx.tagMap = tagMap
-      ctx.categoryMap = categoryMap
-
-      const extraPages = [
-        {
-          permalink: tagIndexPageUrl,
-          frontmatter: { title: `Tags` }
-        },
-        {
-          permalink: categoryIndexPageUrl,
-          frontmatter: { title: `Categories` }
-        },
-        ...Object.keys(tagMap).map(tagName => ({
-          permalink: tagMap[tagName].path,
-          meta: { tagName },
-          frontmatter: { title: `${tagName} | Tag` }
-        })),
-        ...Object.keys(categoryMap).map(categoryName => ({
-          permalink: categoryMap[categoryName].path,
-          meta: { categoryName },
-          frontmatter: { title: `${categoryName} | Category` }
-        }))
-      ]
-      await Promise.all(extraPages.map(page => ctx.addPage(page)))
-    },
-
-    /**
-     * Generate tag and category metadata.
-     */
-    async clientDynamicModules () {
-      return [
-        {
-          name: 'tag.js',
-          content: `export default ${JSON.stringify(ctx.tagMap, null, 2)}`
-        },
-        {
-          name: 'category.js',
-          content: `export default ${JSON.stringify(ctx.categoryMap, null, 2)}`
-        }
-      ]
-    },
-
-    enhanceAppFiles: path.resolve(__dirname, 'enhanceAppFile.js')
-  }
-}
diff --git a/packages/@vuepress/plugin-blog/package.json b/packages/@vuepress/plugin-blog/package.json
deleted file mode 100644
index 7aba87c6..00000000
--- a/packages/@vuepress/plugin-blog/package.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-  "name": "@vuepress/plugin-blog",
-  "version": "1.0.0-alpha.42",
-  "description": "blog plugin for vuepress",
-  "main": "index.js",
-  "publishConfig": {
-    "access": "public"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/vuejs/vuepress.git",
-    "directory": "packages/@vuepress/plugin-blog"
-  },
-  "keywords": [
-    "documentation",
-    "vue",
-    "vuepress",
-    "generator"
-  ],
-  "author": "ULIVZ ",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/vuejs/vuepress/issues"
-  },
-  "homepage": "https://github.com/vuejs/vuepress/packages/@vuepress/plugin-blog#readme"
-}
diff --git a/packages/@vuepress/plugin-clean-urls/.npmignore b/packages/@vuepress/plugin-clean-urls/.npmignore
deleted file mode 100644
index 13c38ea3..00000000
--- a/packages/@vuepress/plugin-clean-urls/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-__tests__
-__mocks__
-.temp
diff --git a/packages/@vuepress/plugin-clean-urls/README.md b/packages/@vuepress/plugin-clean-urls/README.md
deleted file mode 100644
index f9bfc3df..00000000
--- a/packages/@vuepress/plugin-clean-urls/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# @vuepress/plugin-clean-urls
-
-> clean urls plugin for vuepress
-
-See [documentation](https://vuepress.vuejs.org/plugin/official/plugin-clean-urls.html).
diff --git a/packages/@vuepress/plugin-clean-urls/index.js b/packages/@vuepress/plugin-clean-urls/index.js
deleted file mode 100644
index d09d0754..00000000
--- a/packages/@vuepress/plugin-clean-urls/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-module.exports = (options = {}, context) => {
-  const {
-    normalSuffix = '',
-    indexSuffix = '/'
-  } = options
-
-  return {
-    extendPageData (page) {
-      const { regularPath, frontmatter = {}} = page
-      if (frontmatter.permalink) return
-      if (regularPath.endsWith('.html')) {
-        // normal path
-        // e.g. foo/bar.md -> foo/bar.html
-        page.path = regularPath.slice(0, -5) + normalSuffix
-      } else if (regularPath.endsWith('/')) {
-        // index path
-        // e.g. foo/index.md -> foo/
-        page.path = regularPath.slice(0, -1) + indexSuffix
-      }
-    }
-  }
-}
diff --git a/packages/@vuepress/plugin-clean-urls/package.json b/packages/@vuepress/plugin-clean-urls/package.json
deleted file mode 100644
index 4a108248..00000000
--- a/packages/@vuepress/plugin-clean-urls/package.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-  "name": "@vuepress/plugin-clean-urls",
-  "version": "1.0.0-alpha.42",
-  "description": "clean urls plugin for vuepress",
-  "main": "index.js",
-  "publishConfig": {
-    "access": "public"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/vuejs/vuepress.git",
-    "directory": "packages/@vuepress/plugin-clean-urls"
-  },
-  "keywords": [
-    "documentation",
-    "vue",
-    "vuepress",
-    "generator"
-  ],
-  "author": "Shigma <1700011071@pku.edu.cn>",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/vuejs/vuepress/issues"
-  },
-  "homepage": "https://github.com/vuejs/vuepress/packages/@vuepress/plugin-clean-urls#readme"
-}
diff --git a/packages/@vuepress/plugin-container/.npmignore b/packages/@vuepress/plugin-container/.npmignore
deleted file mode 100644
index 13c38ea3..00000000
--- a/packages/@vuepress/plugin-container/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-__tests__
-__mocks__
-.temp
diff --git a/packages/@vuepress/plugin-container/README.md b/packages/@vuepress/plugin-container/README.md
deleted file mode 100644
index fc0b2211..00000000
--- a/packages/@vuepress/plugin-container/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# @vuepress/plugin-container
-
-> markdown container plugin for vuepress
-
-See [documentation](https://vuepress.vuejs.org/plugin/official/plugin-container.html).
diff --git a/packages/@vuepress/plugin-container/__tests__/__snapshots__/index.spec.js.snap b/packages/@vuepress/plugin-container/__tests__/__snapshots__/index.spec.js.snap
deleted file mode 100644
index f67ad8f0..00000000
--- a/packages/@vuepress/plugin-container/__tests__/__snapshots__/index.spec.js.snap
+++ /dev/null
@@ -1,48 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`containers danger.md 1`] = `
-
-

DANGER

-

I am a danger

-
-`; - -exports[`containers markdown-slots.md 1`] = ` - -
    -
  • A Paragraph
  • -
  • Another Paragraph
  • -
- -`; - -exports[`containers tip.md 1`] = ` -
-

TIP

-

I am a tip

-
-`; - -exports[`containers tip-override.md 1`] = ` -
-

提瀺

-

I am a tip

-
-`; - -exports[`containers v-pre.md 1`] = ` -
-

I am a v-pre

-
-`; - -exports[`containers warning.md 1`] = ` -
-

WARNING

-

I am a warning

-
-`; diff --git a/packages/@vuepress/plugin-container/__tests__/fragments/danger.md b/packages/@vuepress/plugin-container/__tests__/fragments/danger.md deleted file mode 100644 index 2f2aa62c..00000000 --- a/packages/@vuepress/plugin-container/__tests__/fragments/danger.md +++ /dev/null @@ -1,3 +0,0 @@ -::: danger -I am a danger -::: diff --git a/packages/@vuepress/plugin-container/__tests__/fragments/markdown-slots.md b/packages/@vuepress/plugin-container/__tests__/fragments/markdown-slots.md deleted file mode 100644 index c6c60ab8..00000000 --- a/packages/@vuepress/plugin-container/__tests__/fragments/markdown-slots.md +++ /dev/null @@ -1,10 +0,0 @@ -::: slot header -# Here might be a page title -::: - -- A Paragraph -- Another Paragraph - -::: slot footer -Here's some contact info -::: diff --git a/packages/@vuepress/plugin-container/__tests__/fragments/tip-override.md b/packages/@vuepress/plugin-container/__tests__/fragments/tip-override.md deleted file mode 100644 index 2ba47c38..00000000 --- a/packages/@vuepress/plugin-container/__tests__/fragments/tip-override.md +++ /dev/null @@ -1,3 +0,0 @@ -::: tip 提瀺 -I am a tip -::: diff --git a/packages/@vuepress/plugin-container/__tests__/fragments/tip.md b/packages/@vuepress/plugin-container/__tests__/fragments/tip.md deleted file mode 100644 index e9b82b19..00000000 --- a/packages/@vuepress/plugin-container/__tests__/fragments/tip.md +++ /dev/null @@ -1,3 +0,0 @@ -::: tip -I am a tip -::: diff --git a/packages/@vuepress/plugin-container/__tests__/fragments/v-pre.md b/packages/@vuepress/plugin-container/__tests__/fragments/v-pre.md deleted file mode 100644 index f1694023..00000000 --- a/packages/@vuepress/plugin-container/__tests__/fragments/v-pre.md +++ /dev/null @@ -1,3 +0,0 @@ -::: v-pre -I am a v-pre -::: diff --git a/packages/@vuepress/plugin-container/__tests__/fragments/warning.md b/packages/@vuepress/plugin-container/__tests__/fragments/warning.md deleted file mode 100644 index 37aa641b..00000000 --- a/packages/@vuepress/plugin-container/__tests__/fragments/warning.md +++ /dev/null @@ -1,3 +0,0 @@ -::: warning -I am a warning -::: diff --git a/packages/@vuepress/plugin-container/__tests__/index.spec.js b/packages/@vuepress/plugin-container/__tests__/index.spec.js deleted file mode 100644 index b1efaa99..00000000 --- a/packages/@vuepress/plugin-container/__tests__/index.spec.js +++ /dev/null @@ -1,36 +0,0 @@ -const { createApp } = require('@vuepress/core') -const { getFragments } = require('@vuepress/test-utils') -import containerPlugin from '..' - -describe('containers', async () => { - let app - - beforeAll(async () => { - app = createApp() - app.options.siteConfig = { - plugins: [ - [containerPlugin, { type: 'tip' }], - [containerPlugin, { type: 'warning' }], - [containerPlugin, { type: 'danger' }], - [containerPlugin, { - type: 'slot', - before: info => `' - }], - [containerPlugin, { - type: 'v-pre', - before: '
', - after: '
' - }] - ] - } - return app.process() - }) - - getFragments(__dirname).forEach(({ name, content: input }) => { - test(name, () => { - const { html } = app.markdown.render(input) - expect(html).toMatchSnapshot() - }) - }) -}) diff --git a/packages/@vuepress/plugin-container/index.js b/packages/@vuepress/plugin-container/index.js deleted file mode 100644 index 6d995b4b..00000000 --- a/packages/@vuepress/plugin-container/index.js +++ /dev/null @@ -1,50 +0,0 @@ -const container = require('markdown-it-container') - -function call (target, ...args) { - if (typeof target === 'function') { - return target(...args) - } else { - return target - } -} - -module.exports = (options, context) => ({ - name: require('./package').name, - - multiple: true, - - extendMarkdown (md) { - const { - validate, - marker, - before, - after, - type = '', - defaultTitle = type.toUpperCase() - } = options - if (!type) return - - let { render } = options - if (!render) { - if (before !== undefined && after !== undefined) { - render = (tokens, index) => { - const info = tokens[index].info.trim().slice(type.length).trim() - return tokens[index].nesting === 1 ? call(before, info) : call(after, info) - } - } else { - render = (tokens, index) => { - const token = tokens[index] - let title = token.info.trim().slice(type.length).trim() || defaultTitle - if (title) title = `

${title}

` - if (token.nesting === 1) { - return `
${title}\n` - } else { - return `
\n` - } - } - } - } - - md.use(container, type, { render, validate, marker }) - } -}) diff --git a/packages/@vuepress/plugin-container/package.json b/packages/@vuepress/plugin-container/package.json deleted file mode 100644 index 44849cc6..00000000 --- a/packages/@vuepress/plugin-container/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "@vuepress/plugin-container", - "version": "1.0.0-alpha.42", - "description": "markdown container plugin for vuepress", - "main": "index.js", - "publishConfig": { - "access": "public" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/vuejs/vuepress.git", - "directory": "packages/@vuepress/plugin-container" - }, - "keywords": [ - "documentation", - "vue", - "vuepress", - "generator" - ], - "dependencies": { - "markdown-it-container": "^2.0.0" - }, - "devDependencies": { - "@vuepress/test-utils": "1.0.0-alpha.42" - }, - "author": "Shigma <1700011071@pku.edu.cn>", - "license": "MIT", - "bugs": { - "url": "https://github.com/vuejs/vuepress/issues" - }, - "homepage": "https://github.com/vuejs/vuepress/packages/@vuepress/plugin-container#readme" -} diff --git a/packages/@vuepress/plugin-google-analytics/README.md b/packages/@vuepress/plugin-google-analytics/README.md index bdf4f502..0a453e0d 100644 --- a/packages/@vuepress/plugin-google-analytics/README.md +++ b/packages/@vuepress/plugin-google-analytics/README.md @@ -2,4 +2,4 @@ > Google analytics plugin for vuepress -See [documentation](https://vuepress.vuejs.org/plugin/official/plugin-google-analytics.html). +See [documentation](https://v1.vuepress.vuejs.org/plugin/official/plugin-google-analytics.html). diff --git a/packages/@vuepress/plugin-google-analytics/package.json b/packages/@vuepress/plugin-google-analytics/package.json index def922ac..1464a75c 100644 --- a/packages/@vuepress/plugin-google-analytics/package.json +++ b/packages/@vuepress/plugin-google-analytics/package.json @@ -1,6 +1,6 @@ { "name": "@vuepress/plugin-google-analytics", - "version": "1.0.0-alpha.42", + "version": "1.0.4", "description": "google-analytics plugin for vuepress", "main": "index.js", "publishConfig": { diff --git a/packages/@vuepress/plugin-i18n-ui/.npmignore b/packages/@vuepress/plugin-i18n-ui/.npmignore deleted file mode 100644 index 13c38ea3..00000000 --- a/packages/@vuepress/plugin-i18n-ui/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -__tests__ -__mocks__ -.temp diff --git a/packages/@vuepress/plugin-i18n-ui/README.md b/packages/@vuepress/plugin-i18n-ui/README.md deleted file mode 100644 index 4d5f7f45..00000000 --- a/packages/@vuepress/plugin-i18n-ui/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# @vuepress/plugin-i18n-ui - -> i18n-ui plugin for vuepress - -See [documentation](https://vuepress.vuejs.org/plugin/official/plugin-i18n-ui.html). diff --git a/packages/@vuepress/plugin-i18n-ui/client.js b/packages/@vuepress/plugin-i18n-ui/client.js deleted file mode 100644 index 6668f698..00000000 --- a/packages/@vuepress/plugin-i18n-ui/client.js +++ /dev/null @@ -1,5 +0,0 @@ -import Layout from './index.vue' - -export default ({ Vue }) => { - Vue.component('I18nUILayout', Layout) -} diff --git a/packages/@vuepress/plugin-i18n-ui/index.js b/packages/@vuepress/plugin-i18n-ui/index.js deleted file mode 100644 index d42003a4..00000000 --- a/packages/@vuepress/plugin-i18n-ui/index.js +++ /dev/null @@ -1,21 +0,0 @@ -const { path } = require('@vuepress/shared-utils') - -module.exports = (pluginOptions = {}, context) => ({ - name: 'i18n-ui', - - // This plugin will be enabled only at development mode. - enabled: !context.isProd, - - enhanceAppFiles: [ - path.resolve(__dirname, 'client.js') - ], - - additionalPages: [ - { - permalink: pluginOptions.permalink || '/i18n/', - frontmatter: { - 'layout': 'I18nUILayout' - } - } - ] -}) diff --git a/packages/@vuepress/plugin-i18n-ui/index.vue b/packages/@vuepress/plugin-i18n-ui/index.vue deleted file mode 100644 index 185c00e8..00000000 --- a/packages/@vuepress/plugin-i18n-ui/index.vue +++ /dev/null @@ -1,154 +0,0 @@ - - - - - diff --git a/packages/@vuepress/plugin-i18n-ui/package.json b/packages/@vuepress/plugin-i18n-ui/package.json deleted file mode 100644 index 3e737fa3..00000000 --- a/packages/@vuepress/plugin-i18n-ui/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "@vuepress/plugin-i18n-ui", - "version": "1.0.0-alpha.42", - "description": "i18n-ui plugin for vuepress", - "main": "index.js", - "publishConfig": { - "access": "public" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/vuejs/vuepress.git", - "directory": "packages/@vuepress/plugin-i18n-ui" - }, - "keywords": [ - "documentation", - "vue", - "vuepress", - "generator" - ], - "author": "ULIVZ ", - "license": "MIT", - "bugs": { - "url": "https://github.com/vuejs/vuepress/issues" - }, - "homepage": "https://github.com/vuejs/vuepress/packages/@vuepress/plugin-i18n-ui#readme" -} diff --git a/packages/@vuepress/plugin-last-updated/README.md b/packages/@vuepress/plugin-last-updated/README.md index 5f08ad1f..f17d98f6 100644 --- a/packages/@vuepress/plugin-last-updated/README.md +++ b/packages/@vuepress/plugin-last-updated/README.md @@ -2,4 +2,4 @@ > last-updated plugin for vuepress -See [documentation](https://vuepress.vuejs.org/plugin/official/plugin-last-updated.html). +See [documentation](https://v1.vuepress.vuejs.org/plugin/official/plugin-last-updated.html). diff --git a/packages/@vuepress/plugin-last-updated/package.json b/packages/@vuepress/plugin-last-updated/package.json index a5d40571..b00b6559 100644 --- a/packages/@vuepress/plugin-last-updated/package.json +++ b/packages/@vuepress/plugin-last-updated/package.json @@ -1,6 +1,6 @@ { "name": "@vuepress/plugin-last-updated", - "version": "1.0.0-alpha.42", + "version": "1.0.4", "description": "last-updated plugin for vuepress", "main": "index.js", "publishConfig": { diff --git a/packages/@vuepress/plugin-medium-zoom/README.md b/packages/@vuepress/plugin-medium-zoom/README.md index 1c701234..4a7bcddd 100644 --- a/packages/@vuepress/plugin-medium-zoom/README.md +++ b/packages/@vuepress/plugin-medium-zoom/README.md @@ -2,4 +2,4 @@ > medium-zoom plugin for vuepress -See [documentation](https://vuepress.vuejs.org/plugin/official/plugin-medium-zoom.html). +See [documentation](https://v1.vuepress.vuejs.org/plugin/official/plugin-medium-zoom.html). diff --git a/packages/@vuepress/plugin-medium-zoom/clientRootMixin.js b/packages/@vuepress/plugin-medium-zoom/clientRootMixin.js index e0a05453..a83e01c9 100644 --- a/packages/@vuepress/plugin-medium-zoom/clientRootMixin.js +++ b/packages/@vuepress/plugin-medium-zoom/clientRootMixin.js @@ -1,4 +1,4 @@ -/* global SELECTOR */ +/* global SELECTOR, OPTIONS */ import './style.css' import zoom from 'medium-zoom' @@ -20,7 +20,7 @@ export default { if (this.zoom) { this.zoom.detach() } - this.zoom = zoom(SELECTOR) + this.zoom = zoom(SELECTOR, OPTIONS) }, 1000) } } diff --git a/packages/@vuepress/plugin-medium-zoom/index.js b/packages/@vuepress/plugin-medium-zoom/index.js index c9a956af..5dbad710 100644 --- a/packages/@vuepress/plugin-medium-zoom/index.js +++ b/packages/@vuepress/plugin-medium-zoom/index.js @@ -2,7 +2,8 @@ const { path } = require('@vuepress/shared-utils') module.exports = (options, context) => ({ define: { - SELECTOR: options.selector || '.content img' + SELECTOR: options.selector || '.theme-default-content :not(a) > img', + OPTIONS: options.options }, clientRootMixin: path.resolve(__dirname, 'clientRootMixin.js') }) diff --git a/packages/@vuepress/plugin-medium-zoom/package.json b/packages/@vuepress/plugin-medium-zoom/package.json index c7c8a08b..c46efb29 100644 --- a/packages/@vuepress/plugin-medium-zoom/package.json +++ b/packages/@vuepress/plugin-medium-zoom/package.json @@ -1,6 +1,6 @@ { "name": "@vuepress/plugin-medium-zoom", - "version": "1.0.0-alpha.42", + "version": "1.0.4", "description": "medium-zoom plugin for vuepress", "main": "index.js", "publishConfig": { @@ -18,7 +18,7 @@ "generator" ], "dependencies": { - "medium-zoom": "^0.4.0" + "medium-zoom": "^1.0.4" }, "author": "ULIVZ ", "license": "MIT", diff --git a/packages/@vuepress/plugin-nprogress/package.json b/packages/@vuepress/plugin-nprogress/package.json index dda392c3..3257894c 100644 --- a/packages/@vuepress/plugin-nprogress/package.json +++ b/packages/@vuepress/plugin-nprogress/package.json @@ -1,6 +1,6 @@ { "name": "@vuepress/plugin-nprogress", - "version": "1.0.0-alpha.42", + "version": "1.0.4", "description": "nprogress plugin for vuepress", "main": "index.js", "publishConfig": { diff --git a/packages/@vuepress/plugin-pagination/.npmignore b/packages/@vuepress/plugin-pagination/.npmignore deleted file mode 100644 index 13c38ea3..00000000 --- a/packages/@vuepress/plugin-pagination/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -__tests__ -__mocks__ -.temp diff --git a/packages/@vuepress/plugin-pagination/README.md b/packages/@vuepress/plugin-pagination/README.md deleted file mode 100644 index a817b661..00000000 --- a/packages/@vuepress/plugin-pagination/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# @vuepress/plugin-pagination - -> pagination plugin for vuepress - -See [documentation](https://vuepress.vuejs.org/plugin/official/plugin-pagination.html). diff --git a/packages/@vuepress/plugin-pagination/enhanceAppFile.js b/packages/@vuepress/plugin-pagination/enhanceAppFile.js deleted file mode 100644 index 20bf67ed..00000000 --- a/packages/@vuepress/plugin-pagination/enhanceAppFile.js +++ /dev/null @@ -1,71 +0,0 @@ -import paginationMeta from '@dynamic/pagination' - -class Pagination { - constructor (pagination, { pages, route }) { - let { postsFilter, postsSorter } = pagination - - /* eslint-disable no-eval */ - postsFilter = eval(postsFilter) - postsSorter = eval(postsSorter) - - const { path } = route - const { paginationPages } = pagination - - paginationPages.forEach((page, index) => { - if (page.path === path) { - this.paginationIndex = index - } - }) - - if (!this.paginationIndex) { - this.paginationIndex = 0 - } - - this._paginationPages = paginationPages - this._currentPage = paginationPages[this.paginationIndex] - this._posts = pages.filter(postsFilter).sort(postsSorter) - } - - get length () { - return this._paginationPages.length - } - - get posts () { - const [start, end] = this._currentPage.interval - return this._posts.slice(start, end + 1) - } - - get hasPrev () { - return this.paginationIndex !== 0 - } - - get prevLink () { - if (this.hasPrev) { - return this._paginationPages[this.paginationIndex - 1].path - } - } - - get hasNext () { - return this.paginationIndex !== this.length - 1 - } - - get nextLink () { - if (this.hasNext) { - return this._paginationPages[this.paginationIndex + 1].path - } - } -} - -export default ({ Vue }) => { - Vue.mixin({ - computed: { - $pagination () { - const { pages } = this.$site - const pagination = new Pagination(paginationMeta, { - pages, route: this.$route - }) - return pagination - } - } - }) -} diff --git a/packages/@vuepress/plugin-pagination/index.js b/packages/@vuepress/plugin-pagination/index.js deleted file mode 100644 index ba27c01b..00000000 --- a/packages/@vuepress/plugin-pagination/index.js +++ /dev/null @@ -1,69 +0,0 @@ -const { path } = require('@vuepress/shared-utils') - -function getIntervallers (max, interval) { - const count = max % interval === 0 ? Math.floor(max / interval) : Math.floor(max / interval) + 1 - const arr = [...Array(count)] - return arr.map((v, index) => { - const start = index * interval - const end = (index + 1) * interval - return [start, end > max ? max : end] - }) -} - -module.exports = (options, ctx) => ({ - enhanceAppFiles: [ - path.resolve(__dirname, 'enhanceAppFile.js') - ], - - ready () { - let { postsFilter, postsSorter } = options - postsFilter = postsFilter || (({ type }) => type === 'post') - postsSorter = postsSorter || ((prev, next) => { - const prevTime = new Date(prev.frontmatter.date).getTime() - const nextTime = new Date(next.frontmatter.date).getTime() - return prevTime - nextTime > 0 ? -1 : 1 - }) - - const { pages } = ctx - const posts = pages.filter(postsFilter) - const { - perPagePosts = 10, - paginationDir = 'page', - firstPagePath = '/', - layout = 'Layout' - } = options - - const intervallers = getIntervallers(posts.length, perPagePosts) - const pagination = { - paginationPages: intervallers.map((interval, index) => { - const path = index === 0 - ? firstPagePath - : `/${paginationDir}/${index + 1}/` - return { path, interval } - }), - postsFilter: postsFilter.toString(), - postsSorter: postsSorter.toString() - } - - ctx.pagination = pagination - pagination.paginationPages.forEach(({ path }, index) => { - if (path === '/') { - return - } - ctx.addPage({ - permalink: path, - frontmatter: { - layout, - title: `Page ${index + 1}` - } - }) - }) - }, - - async clientDynamicModules () { - return { - name: 'pagination.js', - content: `export default ${JSON.stringify(ctx.pagination, null, 2)}` - } - } -}) diff --git a/packages/@vuepress/plugin-pagination/package.json b/packages/@vuepress/plugin-pagination/package.json deleted file mode 100644 index 89fdbf6c..00000000 --- a/packages/@vuepress/plugin-pagination/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "@vuepress/plugin-pagination", - "version": "1.0.0-alpha.42", - "description": "pagination plugin for vuepress", - "main": "index.js", - "publishConfig": { - "access": "public" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/vuejs/vuepress.git", - "directory": "packages/@vuepress/plugin-pagination" - }, - "keywords": [ - "documentation", - "vue", - "vuepress", - "generator" - ], - "author": "ULIVZ ", - "license": "MIT", - "bugs": { - "url": "https://github.com/vuejs/vuepress/issues" - }, - "homepage": "https://github.com/vuejs/vuepress/packages/@vuepress/plugin-pagination#readme" -} diff --git a/packages/@vuepress/plugin-pwa/README.md b/packages/@vuepress/plugin-pwa/README.md index d29abf68..8ddbddef 100644 --- a/packages/@vuepress/plugin-pwa/README.md +++ b/packages/@vuepress/plugin-pwa/README.md @@ -2,4 +2,4 @@ > PWA plugin for vuepress -See [documentation](https://vuepress.vuejs.org/plugin/official/plugin-pwa.html). +See [documentation](https://v1.vuepress.vuejs.org/plugin/official/plugin-pwa.html). diff --git a/packages/@vuepress/plugin-pwa/index.js b/packages/@vuepress/plugin-pwa/index.js index 748f1752..0bbf49e3 100644 --- a/packages/@vuepress/plugin-pwa/index.js +++ b/packages/@vuepress/plugin-pwa/index.js @@ -40,7 +40,8 @@ module.exports = (options, context) => ({ await wbb.generateSW({ swDest: swFilePath, globDirectory: outDir, - globPatterns: ['**\/*.{js,css,html,png,jpg,jpeg,gif,svg,woff,woff2,eot,ttf,otf}'] + globPatterns: ['**\/*.{js,css,html,png,jpg,jpeg,gif,svg,woff,woff2,eot,ttf,otf}'], + ...(options.generateSWConfig || {}) }) await fs.writeFile( swFilePath, diff --git a/packages/@vuepress/plugin-pwa/lib/SWUpdatePopup.vue b/packages/@vuepress/plugin-pwa/lib/SWUpdatePopup.vue index b2e30bdc..f8f62914 100644 --- a/packages/@vuepress/plugin-pwa/lib/SWUpdatePopup.vue +++ b/packages/@vuepress/plugin-pwa/lib/SWUpdatePopup.vue @@ -99,7 +99,7 @@ export default { } .sw-update-popup-enter, .sw-update-popup-leave-to { - opacit: 0; + opacity: 0; transform: translate(0, 50%) scale(0.5); } diff --git a/packages/@vuepress/plugin-pwa/package.json b/packages/@vuepress/plugin-pwa/package.json index a01db310..652471e3 100644 --- a/packages/@vuepress/plugin-pwa/package.json +++ b/packages/@vuepress/plugin-pwa/package.json @@ -1,6 +1,6 @@ { "name": "@vuepress/plugin-pwa", - "version": "1.0.0-alpha.42", + "version": "1.0.4", "description": "pwa plugin for vuepress", "main": "index.js", "publishConfig": { @@ -18,9 +18,9 @@ "generator" ], "dependencies": { - "@vuepress/shared-utils": "^1.0.0-alpha.42", + "@vuepress/shared-utils": "^1.0.4", "register-service-worker": "^1.5.2", - "workbox-build": "^3.1.0" + "workbox-build": "^4.3.1" }, "author": "ULIVZ ", "license": "MIT", diff --git a/packages/@vuepress/plugin-register-components/index.js b/packages/@vuepress/plugin-register-components/index.js index d5927f3f..2def3e73 100644 --- a/packages/@vuepress/plugin-register-components/index.js +++ b/packages/@vuepress/plugin-register-components/index.js @@ -1,16 +1,14 @@ const { fs, path, globby, datatypes: { isString }} = require('@vuepress/shared-utils') function fileToComponentName (file) { - return file - .replace(/\/|\\/g, '-') - .replace(/\.vue$/, '') + return file.replace(/\/|\\/g, '-') } async function resolveComponents (componentDir) { if (!fs.existsSync(componentDir)) { return } - return (await globby(['**/*.vue'], { cwd: componentDir })) + return (await globby(['**/*.vue'], { cwd: componentDir })).map(file => file.slice(0, -4)) } // Since this plugin can ben used by multiple times, we need to @@ -22,7 +20,7 @@ module.exports = (options, context) => ({ multiple: true, async enhanceAppFiles () { - const { componentsDir = [], components = [] } = options + const { componentsDir = [], components = [], getComponentName = fileToComponentName } = options const baseDirs = Array.isArray(componentsDir) ? componentsDir : [componentsDir] function importCode (name, absolutePath) { @@ -30,7 +28,7 @@ module.exports = (options, context) => ({ } function genImport (baseDir, file) { - const name = fileToComponentName(file) + const name = getComponentName(file) const absolutePath = path.resolve(baseDir, file) const code = importCode(name, absolutePath) return code diff --git a/packages/@vuepress/plugin-register-components/package.json b/packages/@vuepress/plugin-register-components/package.json index 5b199b48..a59ed841 100644 --- a/packages/@vuepress/plugin-register-components/package.json +++ b/packages/@vuepress/plugin-register-components/package.json @@ -1,6 +1,6 @@ { "name": "@vuepress/plugin-register-components", - "version": "1.0.0-alpha.42", + "version": "1.0.4", "description": "register-global-components plugin for vuepress", "main": "index.js", "publishConfig": { @@ -24,6 +24,6 @@ }, "homepage": "https://github.com/vuejs/vuepress/packages/@vuepress/plugin-register-components#readme", "dependencies": { - "@vuepress/shared-utils": "^1.0.0-alpha.42" + "@vuepress/shared-utils": "^1.0.4" } } diff --git a/packages/@vuepress/plugin-search/README.md b/packages/@vuepress/plugin-search/README.md index 93c8b2c0..9dbe27de 100644 --- a/packages/@vuepress/plugin-search/README.md +++ b/packages/@vuepress/plugin-search/README.md @@ -2,5 +2,5 @@ > header-based search plugin for vuepress -See [documentation](https://vuepress.vuejs.org/plugin/official/plugin-search.html). +See [documentation](https://v1.vuepress.vuejs.org/plugin/official/plugin-search.html). diff --git a/packages/@vuepress/plugin-search/package.json b/packages/@vuepress/plugin-search/package.json index 4f961337..b23a802d 100644 --- a/packages/@vuepress/plugin-search/package.json +++ b/packages/@vuepress/plugin-search/package.json @@ -1,6 +1,6 @@ { "name": "@vuepress/plugin-search", - "version": "1.0.0-alpha.42", + "version": "1.0.4", "description": "search plugin for vuepress", "main": "index.js", "publishConfig": { diff --git a/packages/@vuepress/shared-utils/__tests__/moduleResolver.spec.ts b/packages/@vuepress/shared-utils/__tests__/moduleResolver.spec.ts index 5f3e9dad..a792c3e0 100644 --- a/packages/@vuepress/shared-utils/__tests__/moduleResolver.spec.ts +++ b/packages/@vuepress/shared-utils/__tests__/moduleResolver.spec.ts @@ -21,7 +21,7 @@ function loadMockModule (name: string) { } function resolveMockModule (name: string) { - return path.resolve(__dirname, `${MOCK_RELATIVE}/${name}`) + return require.resolve(path.resolve(__dirname, `${MOCK_RELATIVE}/${name}/`)) } const fixturesDir = path.resolve(__dirname, 'fixtures') @@ -110,12 +110,14 @@ describe('resolvePlugin', () => { expect(resolved.fromDep).toBe(false) }) - test('from dep', () => { + describe('from dep', () => { const asserts = getBaseAsserts('plugin') for (const { input, output } of asserts) { - const [, name] = output - const resolved = resolvePlugin(input) - expect(resolved.entry).toBe(loadMockModule(name)) + test(input, () => { + const [, name] = output + const resolved = resolvePlugin(input) + expect(resolved.entry).toBe(loadMockModule(name)) + }) } }) @@ -137,12 +139,14 @@ describe('resolvePlugin', () => { describe('resolveTheme', () => { const resolveTheme = themeResolver.resolve.bind(themeResolver) - test('from dep', () => { + describe('from dep', () => { const asserts = getBaseAsserts('theme') for (const { input, output } of asserts) { - const [, name] = output - const resolved = resolveTheme(input) - expect(resolved.entry).toBe(resolveMockModule(name)) + test(input, () => { + const [, name] = output + const resolved = resolveTheme(input) + expect(resolved.entry).toBe(resolveMockModule(name)) + }) } }) diff --git a/packages/@vuepress/shared-utils/package.json b/packages/@vuepress/shared-utils/package.json index b85d1c7e..ce63a29b 100644 --- a/packages/@vuepress/shared-utils/package.json +++ b/packages/@vuepress/shared-utils/package.json @@ -1,6 +1,6 @@ { "name": "@vuepress/shared-utils", - "version": "1.0.0-alpha.42", + "version": "1.0.4", "description": "shared-utils for vuepress", "main": "lib/index.js", "types": "types/index.d.ts", @@ -30,11 +30,11 @@ "chalk": "^2.3.2", "diacritics": "^1.3.0", "escape-html": "^1.0.3", - "fs-extra": "^5.0.0", - "globby": "^8.0.1", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", "gray-matter": "^4.0.1", "hash-sum": "^1.0.2", - "semver": "^5.5.0", + "semver": "^6.0.0", "upath": "^1.1.0" }, "author": "ULIVZ ", diff --git a/packages/@vuepress/shared-utils/src/index.ts b/packages/@vuepress/shared-utils/src/index.ts index 68930027..ade68a6e 100644 --- a/packages/@vuepress/shared-utils/src/index.ts +++ b/packages/@vuepress/shared-utils/src/index.ts @@ -14,6 +14,7 @@ import * as isIndexFile from './isIndexFile' import logger from './logger' import * as moduleLoader from './moduleLoader' import * as moduleResolver from './moduleResolver' +import normalizeConfig from './normalizeConfig' import * as parseEmojis from './parseEmojis' import parseFrontmatter from './parseFrontmatter' import parseHeaders from './parseHeaders' @@ -50,6 +51,7 @@ export { logger, moduleLoader, moduleResolver, + normalizeConfig, parseEmojis, parseFrontmatter, parseHeaders, diff --git a/packages/@vuepress/shared-utils/src/moduleLoader.ts b/packages/@vuepress/shared-utils/src/moduleLoader.ts index b87d1875..911ac963 100644 --- a/packages/@vuepress/shared-utils/src/moduleLoader.ts +++ b/packages/@vuepress/shared-utils/src/moduleLoader.ts @@ -1,8 +1,6 @@ // Midified from https://github.com/vuejs/vue-cli/blob/dev/packages/@0vue/cli-shared-utils/lib/module.js import semver from 'semver' -import path from 'upath' -import fs from 'fs-extra' import env from './env' function resolveFallback (request: string, options: { paths: string[] }) { @@ -40,15 +38,9 @@ const resolve = semver.satisfies(process.version, '>=10.0.0') export function resolveModule (request: string, context: string): string { let resolvedPath - // TODO - // Temporary workaround for jest cannot resolve module path from '__mocks__' - // when using 'require.resolve'. - if (env.isTest && request !== '@vuepress/theme-default') { - resolvedPath = path.resolve(__dirname, '../../../../__mocks__', request) - if (!fs.existsSync(`${resolvedPath}.js`) && !fs.existsSync(`${resolvedPath}/index.js`)) { - throw new Error(`Cannot find module '${request}'`) - } - return resolvedPath + + if (env.isTest) { + return require.resolve(request) } // module.paths is for globally install packages. diff --git a/packages/@vuepress/shared-utils/src/moduleResolver.ts b/packages/@vuepress/shared-utils/src/moduleResolver.ts index ecab531b..93ab58cd 100644 --- a/packages/@vuepress/shared-utils/src/moduleResolver.ts +++ b/packages/@vuepress/shared-utils/src/moduleResolver.ts @@ -76,8 +76,12 @@ class ModuleResolver { this.allowedTypes = allowedTypes this.load = load this.cwd = cwd || process.cwd() - this.nonScopePrefix = `${org}-${type}-` - this.scopePrefix = `@${org}/${type}-` + if (org) { + this.nonScopePrefix = `${org}-${type}-` + this.scopePrefix = `@${org}/${type}-` + } else { + this.nonScopePrefix = `${type}-` + } this.typePrefixLength = type.length + 1 /* - */ this.prefixSlicePosition = this.typePrefixLength + org.length + 1 @@ -197,7 +201,7 @@ class ModuleResolver { const pkg = resolveScopePackage(req) if (pkg) { // speicial handling for default org. - if (pkg.org === this.org) { + if (this.org && pkg.org === this.org) { shortcut = pkg.name.startsWith(`${this.type}-`) ? pkg.name.slice(this.typePrefixLength) : pkg.name @@ -265,6 +269,10 @@ export function resolveScopePackage (name: string) { } } +export const getMarkdownItResolver = (cwd: string) => new ModuleResolver( + 'markdown-it', '', [String, Function], true /* load module */, cwd +) + export const getPluginResolver = (cwd: string): ModuleResolver => new ModuleResolver( 'plugin', 'vuepress', [String, Function, Object], true /* load module */, cwd ) diff --git a/packages/@vuepress/shared-utils/src/normalizeConfig.ts b/packages/@vuepress/shared-utils/src/normalizeConfig.ts new file mode 100644 index 00000000..4c9a8c41 --- /dev/null +++ b/packages/@vuepress/shared-utils/src/normalizeConfig.ts @@ -0,0 +1,28 @@ +import { assertTypes } from './datatypes' +import logger from './logger' +import chalk from 'chalk' + +export default function normalizeConfig (pluginsConfig: any) { + const { valid, warnMsg } = assertTypes(pluginsConfig, [Object, Array]) + if (!valid) { + if (pluginsConfig !== undefined) { + logger.warn( + `[${chalk.gray('config')}] ` + + `Invalid value for "plugin" field : ${warnMsg}` + ) + } + pluginsConfig = [] + return pluginsConfig + } + + if (Array.isArray(pluginsConfig)) { + pluginsConfig = pluginsConfig.map(item => { + return Array.isArray(item) ? item : [item] + }) + } else if (typeof pluginsConfig === 'object') { + pluginsConfig = Object.keys(pluginsConfig).map(item => { + return [item, pluginsConfig[item]] + }) + } + return pluginsConfig +} diff --git a/packages/@vuepress/test-utils/package.json b/packages/@vuepress/test-utils/package.json index 0ae5f75b..d92d6fb4 100644 --- a/packages/@vuepress/test-utils/package.json +++ b/packages/@vuepress/test-utils/package.json @@ -1,6 +1,6 @@ { "name": "@vuepress/test-utils", - "version": "1.0.0-alpha.42", + "version": "1.0.4", "description": "test-utils for vuepress", "main": "index.js", "publishConfig": { @@ -22,13 +22,13 @@ "@babel/preset-env": "^7.0.0", "@types/jest": "^24.0.9", "@vue/test-utils": "^1.0.0-beta.29", - "@vuepress/core": "1.0.0-alpha.42", - "@vuepress/shared-utils": "1.0.0-alpha.42", - "babel-jest": "^24.1.0", - "jest": "^24.1.0", - "execa": "^0.10.0", - "jest-serializer-vue": "^1.0.0", - "ts-jest": "^23.10.5", + "@vuepress/core": "^1.0.4", + "@vuepress/shared-utils": "^1.0.4", + "babel-jest": "^24.7.1", + "execa": "^1.0.0", + "jest": "^24.7.1", + "jest-serializer-vue": "^2.0.2", + "ts-jest": "^24.0.2", "vue": "^2.5.16", "vue-jest": "^4.0.0-beta.1", "vue-template-compiler": "^2.5.16" diff --git a/packages/@vuepress/theme-blog/.npmignore b/packages/@vuepress/theme-blog/.npmignore deleted file mode 100644 index 18f0a334..00000000 --- a/packages/@vuepress/theme-blog/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -__tests__ -__mocks__ \ No newline at end of file diff --git a/packages/@vuepress/theme-blog/README.md b/packages/@vuepress/theme-blog/README.md deleted file mode 100644 index 69cb7a18..00000000 --- a/packages/@vuepress/theme-blog/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @vuepress/theme-blog - -> theme-blog for vuepress (WIP) diff --git a/packages/@vuepress/theme-blog/index.js b/packages/@vuepress/theme-blog/index.js deleted file mode 100644 index 48d7a164..00000000 --- a/packages/@vuepress/theme-blog/index.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - plugins: [ - '@vuepress/blog', - '@vuepress/pagination', - '@vuepress/medium-zoom', - ['@vuepress/search', { - searchMaxSuggestions: 10, - test: null - }] - ] -} diff --git a/packages/@vuepress/theme-blog/layouts/Layout2.vue b/packages/@vuepress/theme-blog/layouts/Layout2.vue deleted file mode 100755 index cde03ada..00000000 --- a/packages/@vuepress/theme-blog/layouts/Layout2.vue +++ /dev/null @@ -1,13 +0,0 @@ - diff --git a/packages/@vuepress/theme-blog/layouts/Tags.vue b/packages/@vuepress/theme-blog/layouts/Tags.vue deleted file mode 100644 index 6b3ff61c..00000000 --- a/packages/@vuepress/theme-blog/layouts/Tags.vue +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/packages/@vuepress/theme-blog/package.json b/packages/@vuepress/theme-blog/package.json deleted file mode 100644 index 374ef48e..00000000 --- a/packages/@vuepress/theme-blog/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "private": true, - "name": "@vuepress/theme-blog", - "version": "1.0.0-alpha.42", - "description": "theme-blog for vuepress", - "main": "index.js", - "publishConfig": { - "access": "public" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/vuejs/vuepress.git", - "directory": "packages/@vuepress/theme-blog" - }, - "keywords": [ - "documentation", - "vue", - "vuepress", - "generator" - ], - "dependencies": { - "@vuepress/plugin-blog": "^1.0.0-alpha.42", - "@vuepress/plugin-medium-zoom": "^1.0.0-alpha.42", - "@vuepress/plugin-pagination": "^1.0.0-alpha.42", - "@vuepress/plugin-search": "^1.0.0-alpha.42" - }, - "author": "ULIVZ ", - "license": "MIT", - "bugs": { - "url": "https://github.com/vuejs/vuepress/issues" - }, - "homepage": "https://github.com/vuejs/vuepress/packages/@vuepress/theme-blog#readme" -} diff --git a/packages/@vuepress/theme-default/README.md b/packages/@vuepress/theme-default/README.md index 0922de15..3475b7d1 100644 --- a/packages/@vuepress/theme-default/README.md +++ b/packages/@vuepress/theme-default/README.md @@ -8,3 +8,4 @@ The default theme has the following plugin built in: - [@vuepress/plugin-active-header-links](https://github.com/vuejs/vuepress/tree/master/packages/@vuepress/plugin-active-header-links) - [@vuepress/plugin-google-analytics](https://github.com/vuejs/vuepress/tree/master/packages/%40vuepress/plugin-google-analytics) +- [@vuepress/plugin-search](https://github.com/vuejs/vuepress/tree/master/packages/%40vuepress/plugin-search) diff --git a/packages/@vuepress/theme-default/components/AlgoliaSearchBox.vue b/packages/@vuepress/theme-default/components/AlgoliaSearchBox.vue index 41b62af2..f4ff3ffb 100644 --- a/packages/@vuepress/theme-default/components/AlgoliaSearchBox.vue +++ b/packages/@vuepress/theme-default/components/AlgoliaSearchBox.vue @@ -35,7 +35,11 @@ export default { // #697 Make docsearch work well at i18n mode. algoliaOptions: Object.assign({ 'facetFilters': [`lang:${lang}`].concat(algoliaOptions.facetFilters || []) - }, algoliaOptions) + }, algoliaOptions), + handleSelected: (input, event, suggestion) => { + const { pathname, hash } = new URL(suggestion.url) + this.$router.push(`${pathname}${hash}`) + } } )) }) diff --git a/packages/@vuepress/theme-default/components/Home.vue b/packages/@vuepress/theme-default/components/Home.vue index 51859500..926428a5 100644 --- a/packages/@vuepress/theme-default/components/Home.vue +++ b/packages/@vuepress/theme-default/components/Home.vue @@ -38,7 +38,7 @@ - +